“C 语言高级主题。附加内容 – 程序员和编译器之间的歧义”
第一部分,章节目录
4.10.1.编程史
4.10.2.程序员、编译器和 CPU 之间的三角恋
4.10.3.像编译器一样思考
第二部分,章节介绍
4.10.1.编程史
本节从程序员工作的演进史出发,从本质上分析编程的本质,有助于理解程序员、程序和机器之间的关系。
4.10.2.程序员、编译器和 CPU 之间的三角恋
本节分析程序员、编译器和机器(CPU)之间的关系,目的是让大家从本质上认识编译器的作用,从而了解编译器的行为以及对我们程序编写的约束。
4.10.3.像编译器一样思考
本节为结语,在前两节分析的基础上提出一个观点,即程序员只有像编译器一样思考,才能使程序运行正确、更快、更好。
第三部分c聊天程序源码,上课记录
4.10.1.编程史
4.10.1.1、CPU只需要1和0组成的二进制数据
(1)无论编程如何变化,最终编程得到的可执行二进制程序都是由CPU运行的。CPU需要的只是一串按照规则排列的二进制1和0(机器指令)当 CPU 被设计为数字(机器码)时,CPU 并不关心二进制文件是怎么来的。
(2)这些二进制文件可能由非常强大的程序员用 1 和 0 直接拼出;也可以用汇编语言编译;也可以用 C 语言编译;或者用语言编写和解释如java C# php bash;
(3)编程工作的演进其实一直在处理下一个层次的段落:用什么语言来写程序(用某种语言编程),然后怎么把这个程序的源代码转成二进制(编译器发明)。
(4)CPU接收到一系列1010序列后如何工作以达到目的,这是设计制造CPU的公司要考虑的,与软件工程师无关。
4.10.1.2、早期纸卡打卡程序员
(1)最早的时候,CPU也很简单,指令集很少,二进制数也不多。那个时候编译器还没发明,编程语言也没发明。那个时候,二进制直接编程。
(2)总结:最早的编程没有语言和编译器,程序员直接用二进制与机器(CPU)对话。
(3)这种方法的缺点是不容易扩展。随着CPU的进一步复杂化,指令数量和指令位数增加,编程难度成倍增加。人类大脑慢慢地遵循着这个节奏。
4.10.1.3、编程的第一次革命:从二进制机器码到汇编语言
(1)第一次革命是:汇编语言的发明。汇编语言的本质就是用符号代替一串二进制。
MOV 010
(2)有了汇编语言,程序员再也不用记忆二进制序列了。编程时只需要用汇编指令来编程,汇编指令就是一个符号(符号是由字组成的,例如 MOV )。因为人脑天生对文字符号更友好c聊天程序源码,所以用符号编程更容易。
(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:
对于 (i=0; 我
{
xxx;
}
例如2:
诠释我;!!我;
分析: !在 C 语言中,它意味着逻辑反转。逻辑取反是指0取反为1,非0数取反为0.
问题:让你用C语言编程:如果一个数i为0,返回0,如果不是0,返回1
一般实现: if (i == 0){ 0;} else{ 1;}
或者您可以使用三元运算符: (i==0)?(0):(1);
极客写作:!!i;
4.10.3.2、学习一门语言就像认识一个朋友
(1)从新的开始认识一个人到成为好朋友,你要经历:时间,一起努力。
(2)学习一门编程语言还需要:时间、练习(一起工作)
4.10.3.3、学习编程语言需要同理心
(1)处理器注释,预处理中的空白行。
4.10.3.4、注重实践中的探索与总结
(1)第 1 点:在实践中
(2)第 2 点:探索
(3)第 3 点:总结
文章来源:http://www.toutiao.com/a7039696422329139750/