zoukankan      html  css  js  c++  java
  • 4.10、番外篇:程序员和编译器之间的暧昧

    4.10.1编程工作的演进史

    4.10.1.1、CPU需要的知识0和1组成的二进制数据

    • (1)不管编程怎么变,最终编程得到的可执行二进制程序都是给CPU运行的。CPU需要的只是按照CPU设计是按照CPU的规律排布的一串二进制1和0组成的数字(机器码)。CPU根本不关系这些二进制怎么来的。
    • (2)这些二进制可能是一个很厉害的程序员直接用1和0拼出来的,也可以是用汇编语言编写最终编译得到的,也可以是用C语言最终编译得到的,也可以是用java, C#、PHP等语言编写然后解释得到的。
    • (3)编程工作的演进其实是一直是在处理上一个层次段位,就是使用何种语言编写程序(用某种语言进行编程),如何把这种程序的源代码转成二进制(编译器)。
    • (4)CPU接收到一串1010序列后如何达到工作目的的,这就是设计制造CPU的公司要考虑的事情了

    4.10.1.2、早期的纸卡打孔编程者

    • (1)早期的时候,CPU也很简单,指令集很少,二进制位也不多,那时候编译器也没被发明,编程语言也没被发明,那时候直接写二进制直接编程的
    • (2)最早的编程,没有语言也没有编译器,程序员直接使用二进制和机器(CPU)对话。
    • (3)这种方式的坏处就是不容易扩展,随着CPU的进一步复杂化,指令变多,指令位数变多,编程难度呈现出几何倍数增长,人的大脑慢慢跟不上这个节奏。

    4.10.1.3、编程工作的第一次革命:有二进制码到汇编语言

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

    MOV     1010101010101010

    SUB      0101010101010101

    • (2)有了汇编语言之后,程序员就不用再去记忆二进制序列。编程时,只需要用汇编指令来编程就可以。汇编指令就是一个符号(符号由文字构成,如MOV),因为人脑天生对符号更加友好。
    • (3)用汇编语言编写的源程序不能直接给CPU运行,必须通过一个翻译的过程,把源代码翻译成二进制序列给CPU,翻译的过程就叫做汇编,执行翻译这个动作的就是汇编器。

    4.10.1.4编程工作的第二次革命:由汇编发展到C语言

    • (1)汇编语言也有一些不尽如人意的地方。譬如没有可移植性。在这个CPU上写的汇编程序无法在另外一个CPU上运行。因为汇编语言是和CPU一一对应的
    • (2)为了可移植性发明了高级语言,第一个高级语言就是C语言,C语言更加靠近人的思维,为人的思维发明了很多CPU没有的东西。譬如数组,最终的目的就是降低编程的难度,让高级语言更加接近人的思维,然后通过编译器、汇编器等翻译器将这些源代码翻译成二进制然后给CPU运行。

    4.10.1.5、革命无穷尽、层次变化更多

    • (1)C语言纸上还有更高级语言,譬如:C++、java 、C#、bash等。越往上越靠近人的思维,越往上语言本身提供的封装越多,越往上编程难度月底,语言掌握起来越容易

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

    4.10.2.1、CPU只认识二进制机器指令

    • (1)CPU是最终干活的,而CPU只认识只接受二进制

    4.10.2.2、人类喜欢符号而不是二进制

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

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

    • (1)编译器降低了编程难度。编译器的代表就是编程语言,每一种语言都有对应的编译器,这个编译器的作用就是把这种语言的源文件变异成可执行程序
    • (2)关键是:有了编译器(高级语言)之后,程序员就不再盯着CPU而是盯着编译器(编程语言、编程语言的语法),所以我们学习编程的关键就变成了学习编译器的习性,也就是编程语言的语法。

    4.10.2.4、发明一门语言关键在于发明它的编译器

    • (1)编程语言的关键就是编译器。yacc和lex工具就是用来发明编程语言的。
    • 4.10.2.5、高级语言与低级语言的差别

    • (1)越高级的语言越靠近人类思维,越低级的语言越靠近机器的需要
    • (2)人与机器总劳动量(总复杂度)守恒。人要是复杂一点,机器就简单一点。人简单一点,机器就复杂一点。这个规律句描述了一个真理:编程语言越简单,人类的劳动量越小,编译器设计起来更加复杂。编程语言越复杂,程序员使用起来越麻烦,则编译器设计越简单,CPU执行效率越高。

    4.10.3、像编译器一样思考吧

    4.10.3.1、语法是什么?语法就是编译器的习性

    (1)编译器反应在编程中就是语法

    譬如1:

    for(i = 0; i<10;i++);

    {

      xxx;

    }

    譬如2:

    //C语言编程实现,大于0则返回1,等于0则返回0;

    int i;      !!i;

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

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

    极客式写法:      !!i;   

    4.10.3.2、习得一门语言就像认识一个朋友

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

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

    4.10.3.3、学习编程语言要懂得换位思考

    (1)预处理中处理程序的注释、空行。

    4.10.3.4、注意实践中的摸索和总结

    (1)要点一:在实践中

    (2)要点二:摸索,大胆假设,小心求证

    (3)要点三:总结

  • 相关阅读:
    querySelectorAll和getElementsByClassName获取元素的区别
    移动端的点透事件
    formidable处理node.js的post请求
    Node中流的概念
    关于Node.js中的路径问题
    前端设计模式——原型模式
    JavaScript中的循环和闭包
    为什么给函数表达式添加函数名
    作为一个初学者如何简单地理解闭包
    JS的with关键字到底是什么?
  • 原文地址:https://www.cnblogs.com/jxjl/p/7265706.html
Copyright © 2011-2022 走看看