zoukankan      html  css  js  c++  java
  • 029.再聊C语言

    各位朋友,截止本课为止,我一共录了99集课程。
    总时间大约40个小时。

    相信大家对编程语言的本质有了一定的了解和认识。
    也对机器语言,汇编语言,C语言之间的层层递进封装有了初步的抽象理解。

    每种编程语言都有它独特的语法,越高级越现代的编程语言,语法知识点越多,越灵活。
    比如我们未来要学习的Python,JavaScript,当然可能还会学习Java.


    这是为了能够更让开发者用接近现实生活的方式思维来编程,而非面对机器运行的方式,繁琐的细节最后都丢给了编译器转换成的指令去完成。

    编程语言没有完美之说,正如手机一样,背后的开发者工程师根据时代的变化也在升级编程语言。
    当然编程语言的升级本质就是对编译器支持语法的升级,也有硬件工程师对CPU指令集的升级和优化。
    还有操作系统的升级以及各个硬件性能的升级,如显卡,声卡。



    我们如果要做系统级别的软件,就要对计算机的硬件知识了解。
    而往往做普通应用程序,外挂,黑客,因为很多技术底层都封装了使我们不必过多的考虑太多的硬件知识。

    不过任何软件要想达到一定的效率或者突破瓶颈,最终都要考虑到操作系统,编译器,硬件各方面的支持水准。


    计算机能够听懂理解的所有“话”,叫做指令集,或者说机器语言,已经位于CPU中了。
    比如加减乘除,在内存中和寄存器,硬盘,显卡,声卡中,读写数据等。

    一个CPU的指令集,出厂的时候,指令集就固定了,当然不同的指令集进行不断的组合就会实现越来越多大家难以想象的功能。
    比如播放视频,听音乐,玩游戏,处理工作表格业务,进行网络聊天。

    机器指令格式:操作码
    操作数


    我们写的程序本质就是一堆指令按照一定的顺序去内存中运行。
    再专业点的说法:完成一项特定任务而用某种语言编写的一组指令序列。


    机器不同,指令集也不一样。
    有了汇编语言之后,大家只要学习固定的汇编语言即可。
    至于这套汇编语言最后生成什么样子的机器码,我们不需要关心,因为这是CPU的设计厂商提供的汇编器自己实现转换的。
    这也意味着同样一套汇编指令,在不同指令集的CPU上是不一样的。
    add eax,3

    A款CPU 00101100
    B款CPU 00110001



    汇编语言是机器语言的简写形式,人类总是喜欢举一反三。
    因为设计出汇编语言继而降低了人类编程的成本,提高了效率。
    因为一条汇编指令就可以相当于人类少写了很多1和0集合.
    那么如果再设计一种新的编程语言,一行代码就相当于多条汇编指令的集合。
    1954年,Fortran语言出现了,后来也相继出现了一些其他类似的编程语言。

    程序员的开发效率就提高了不少,最起码不用再考虑从内存,寄存器移动来移动去了,高级语言编译器和操作系统替我们封装遮盖了大量计算机硬件的底层细节。

    这种类型的高级编程语言,我们叫做面向过程的语言。

    高级语言计算机是不能直接执行的,所以需要对应的编译器或者说是翻译程序。
    目的是最终转换成可以让某个操作系统上的加载器能够分析理解按照一定的区域分别存放的CPU指令集。

    我们之前已经给大家演示过GCC编译器,通过cmd控制台人工调用编译器的一个过程。
    同样VS背后也有微软为C语言设计的编译器,我们按运行程序的时候,VS自动替我们调用完成了。
    和我们配置的EditPlus原理是一样的。


    我们再学习C语言语法的时候,之前常常给大家说反汇编代码对应着是什么。
    因为如果只学习语法,不看对应的汇编指令,就容易陷入为了学习语法而学习语法的思维。

    而且有时候,一些语法是特别难以理解的,你看起来感觉结果应该是A,但实际却是B。
    这也是为什么我们学习高级编程语言之前,先学习汇编语言的缘由。

    把知识点连接串联起来。
    并且,以后做从事一些软件安全领域,逆向领域,或者防止自己的软件被破解以及让自己的软件实现一些“特殊”的功用。
    都不可避免的要接触到汇编语言。

    高级语言一旦经过编译器之后,要想分析代码,也只能通过汇编程序了。


    C语言相对于其他编程语言,比如php,java,net,c++,Python,语法是最简洁,精炼的。
    其实也非常好学习,特别是我们通过之前的课程一直锻炼培养大家对内存和CPU的想象抽象能力。

    因为历史各方面等原因,导致我们今天很多编程语言和操作系统以及系统软件都是用C语言开发的。
    开放的源代码当然也是C语言。

    所以很多核心的东西,底层的东西,都不可避免的要接触到C语言。


    包括很多公司的核心研发部分,主要编程语言也是C/C++。
    这也是为什么会了C/C++再学其他很简单, 因为学习C/C++的过程中会牵扯到很多操作系统计算机方面的知识,懂了原理和核心,其他东西都会变得通俗易懂,可以举一反三。
    反之,没有这个基础,不是说不能直接学Java或者Python等编程语言,但如果从事的工作要求技术非常高,就需要牵扯到很多底层的技术实现支持了。

    当然,在程序员中圈子里,也有类似的鄙视链。



    https://www.zhihu.com/question/24270600/answer/27447629



    C语言的应用领域很广泛,从网站后台,到底层操作系统,从多媒体应用到大型网络游戏,均可使用C语言来开发。
    1.网站后台。
    2.图形化界面。
    3.C语言可以其他编程语言要求效率地方高的地方单独编写程序,然后被其他程序调用。
    4.可以开发其他大型游戏的引擎。
    5.还可以开发其他编程语言。
    6.C语言可以写操作系统和驱动程序,并且只能用C语言编写。 Linux操作系统的全部源代码都可以从网上获取到,当然想要看懂还是非常难非常非常难的,要真正了解操作系统之前需要做很多学习准备工作。
    7.任何设备只要配置了CPU,包括洗衣机,路由器,微波炉,手机等芯片微处理器控制,都支持C语言。




    C语言应用范围这么广,但一般普通程序开发者不会接触这个层次的技术开发。
    因为这都是属于非常核心的技术。

    比如游戏引擎,编程语言的设计,编译器的开发,驱动的开发,对数学,英语各方面综合要求能力也非常高。
    具备这样能力的人,都属于程序员的金字塔顶尖了。


    很多人可能在学校学过C语言,觉得好像就是在一个黑洞洞的窗口下写个简单的程序,感觉很乏味。
    觉的C语言好像什么也干不了。

    如果学IOS开发很直观,可以直接做绚丽的APP,因为能亲眼看到。
    学安卓也是这个道理,用C就不知道了。

    跟汽车一样,做方向盘,可以很直观的感受到这个控制汽车的方向行驶。
    做车钥匙可以启动汽车。

    但是发动机,变速箱,传动轴,电喷油路系统,这些隐藏的东西我们很容易忽略。
    其实,不知道大家有没有感觉,我不仅是教大家学习编程,更重要的是教大家学习任何一门技能的学习技巧。
    那就是全大概有个全局模糊上的理论认识,再深入局部层层攻破。





    电脑可以看到键盘,鼠标,显示器,看不到内存,CPU。

    C语言往往实现的就是背后非常重要,但是表面却很容易让人感受不到的工作。
    我们看到的APP,操作系统,编程语言的语法都是外在,看不到很多背后大量的代码在支撑着这些外在的运行。





    IT业,越发达的地方,对研发底层各方面核心技术越重视,越有用武之地。
    微软不招.NET,是因为.NET是C/C++做的。
    Google不招学Java,Android的,因为Java的底层都是C/C++实现的。

    反之一些小地方,侧重于产品快速开发,C语言可能就业都是问题了。



    之前我们已经学习了一些C语言的知识点,结构体,变量,循环,选择判断,字符串,浮点数,编码。
    这些知识点,在所有的编程语言中,都是相通的,包括语法也非常类似,万变不离其宗。

    所以,后面我们学习其他编程语言的时候,很多知识点就不会重复的讲了。
    C语言存在很多年,沉淀下来的代码和资源也非常丰富,使得很多技术问题可以直接借鉴前人留下的经验来解决。


    比如我们要做一顿饭,你是直接买现成的材料看着菜谱做呢?
    还是先去买种子,耕田,种地,施肥,一切从头开始呢?

    各有各的的好处,前者效率高,但对底层细节不清晰。
    后者所有的环节自己都参与了,有一种全局观,但时间太长,成本太高。
    这也是现代社会飞速发展,基于各个行业的细化和分工,使得我们只做好手里的事情,社会的其他各个部分都有不同的人去完成。
    我们的父辈,五谷杂粮什么都认识,换灯泡,修水管,在以前那个时代什么都得自己来。
    我们这一代,可能对电子产品很了解,对生活中的很多技能缺乏了很多。


    突然想起一个电影,很有意思。《金氏漂流记》,看完之后,很多人想吃杂酱面,大家可以去看看。

    回到计算机,我认为如果时间和精力允许的话,我们学习快速开发能够应付工作的编程语言的同时对计算机底层技术也能做到一定程度的了解,这是最好的。

    如果时间很有限,那就不要总是死缠烂打,钻牛角尖了,不懂就不懂,会用手里的工具解决问题也是好的。
    我个人在给一些客户设计软件的时候,一些高手写的源代码我看不懂,我知道它能够输入输出和我预想的一致,我直接复制粘贴拿来用就行了。


    掌握语法不代表成为编程高手。
    你会中文,不代表你可以去起点写热门小说,斗破苍穹,遮天,诛仙
    掌握了英语,也不代表可以完成哈姆雷特。

    会编程技巧和会编程语法是两回事。

  • 相关阅读:
    android布局几点随想
    android_handler(一)
    android surfaView surfaHolder video 播放
    java_synchronized 用法
    android_viewFlipper(一)
    android_handler(二)
    解析pdf文档 (lucene3.5)
    Lucene 搜索(小程序)(Lucene3.5)
    运算符重载(++,<<,>>Data类的重载)
    线程池小程序(Java)
  • 原文地址:https://www.cnblogs.com/xiaodaxiaonao/p/7640094.html
Copyright © 2011-2022 走看看