10_程序员和编译器之间的暧昧

本文探讨了编程工作的历史,从早期的直接二进制编程到汇编语言的发明,再到C语言和更高层次的高级语言的出现,强调了编译器在连接程序员和CPU间的桥梁作用,以及编程语言复杂性与编译器设计的关系。
摘要由CSDN通过智能技术生成

编程工作的演进史

  1. CPU需要的只是1和0组成的二进制数据

    • 不管编程怎么变,最终编程得到的可执行二进制程序都是给CPU运行的

      CPU需要的只是按照CPU设计时的规律(机器指令)排布的一串二进制1和0组成的数字(机器码),CPU根本不关心这些二进制是怎么来的。

    • 这些二进制可能是一个很厉害的程序员直接用1和0拼出来的;

      也可以是用汇编语言编写最终编译得到的;

      也可以是用C语言编写最终编译得到的;

      也可以是用java C# php bash等语言编写然后解释得到的;

    • 编程工作的演进其实一直是在处理上一个层次段落:就是使用何种语言编写程序(用某种语言进行编程),然后如何把这种程序源代码转成二进制(编译器的发明)。

    • CPU接收到一串1010序列后如何工作达到目的,这就是设计制造CPU的公司要考虑的事情了,与软件工程师完全无关

  2. 早期的纸卡打孔编程者

    • 最早期的时候,CPU也很简单,指令集很少,二进制位数也不多。那时候编译器也没被发明,编程语言也没被发明,那时候就是用二进制直接编程的。

    • 总结:最早的编程没有语言也没有编译器,程序员直接使用二进制和机器(CPU)对话。

      这种方式的坏处就是不容易扩展,随着CPU的进一步复杂化,指令的变多,指令位数的变多,编程难度呈几何倍数增长。人的大脑慢慢就跟不上这个节奏。

  3. 编程工作的第一次革命:由二进制机器码到汇编语言

    第一次革命就是:发明了汇编语言。汇编语言的本质就是用一个符号来代替一串二进制

    MOV 10101010101010
    SUB	01010101010101
    

    有了汇编语言之后,程序员就不用再去记忆二进制序列了。编程时只需要用汇编指令来编程即可,汇编指令就是一个符号(符号就是由文字构成的,如MOV)。因为人类大脑天生对文字符号更加友好,因此用符号编程更简单。

    用汇编语言编写的源程序不能直接给CPU运行,必须通过一个翻译过程,把源代码翻译成二进制序列才能给CPU。这个翻译的过程就叫汇编,执行翻译动作的就是汇编器。

  4. 编程工作的第二次革命:由汇编语言到C语言

    汇编语言也有一些不尽如人意的地方,譬如:没有可移植性

    在这个CPU上写的汇编程序无法直接在另一个CPU上运行。因此汇编语言是和CPU一一对应的。

    为了可移植性于是乎发明了高级语言。第一个高级语言就是C语言。C语言进一步靠近人的思维,为人的思维发明了很多CPU没有的东西,譬如数组。最终的目的就是降低编程难度,让高级语言更接近人的思维,然后通过编译器、汇编器等的翻译将这些源代码变成二进制然后给CPU运行。

  5. 革命无穷尽、层次变更多

    在C语言之上还有更高级语言,譬如:C++、Java、C#、bash等。越往上越靠近人的思维,越往上语言本身提供的封装越多,越往上编程难度越低、语言的掌握越容易。

程序员、编译器、CPU之间的三角恋

  1. CPU只认识二进制机器指令

    CPU是最终干活的,而CPU只认识只接受二进制。

  2. 人类喜欢符号而不是二进制

    人类的大脑本身不喜欢二进制而喜欢符号、文字。
    人类和机器之间天生有代沟,于是乎编程不容易。

  3. 连接人(程序员)与机器(CPU)的桥梁:编译器

    • 编译器降低了编程难度。编译器的代表就是编程语言,每一种编程语言都有对应的编译器这个编译器的作用就是把这种语言的源文件编译成可执行程序

    • 关键是:有了编译器(高级语言)之后,我们程序员就不再盯着CPU(二进制),而是改为盯着编译器(编程语言、编程语言的语法),所以我们学习编程的关键变成了学习编译器的习性,也就是编程语言的语法

      编译器的习性,即编程语言的语法

  4. 发明一门语言关键就在于发明它的编译器

    编译语言的关键就是编译器

    yacc和lex工具就是用来发明编程语言的。

  5. 高级语言与低级语言的差别

    • 越高级的语言越靠近人类思维;越低级的语言越靠近机器的需要。

      • 人与机器总劳动量(总复杂度)守恒。

        • 人要是复杂一点机器就可以简单一点;

        • 人简单一点机器就需要复杂一点。

          这个规律描述的就是:编程语言越简单,人使用起来越简单,编译器设计起来就更复杂;编程语言越复杂、程序员使用起来越麻烦,则编译器设计越简单,CPU执行效率越高。

像编译器一样思考吧

  1. 语法是什么?语法就是编译器的习性

    编译器反应在编程中就是语法。

    譬如1:

    for (i=0; i<10; i++);
    {
    	xxx;
    }
    

    譬如2:

    int i;		!!i;
    

    解析:!在C语言中是逻辑取反的意思,逻辑取反意思就是0取反就是1,不是0的数取反就是0.

    问题:让你用C语言编程实现:如果一个数i是0则返回0,如果不是0则返回1

    一般实现: if (i == 0){return 0;} else{return 1;}

    或者可以用三母运算符: (i==0)?(0):(1);

    极客式写法: !!i;

  2. 习得一门语言就像认识一个朋友

    从新开始认识一个人到成为好朋友,这里面要经历:时间、共事。

    学习一门编程语言也需要:时间、实践(共事)

  3. 学习编程语言要懂得换位思考

    预处理中处理程序注释、空行。

  4. 注意实践中的摸索和总结

    要点一:在实践中

    要点二:摸索

    要点三:总结

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值