编译器的发展史

编译器的工作就是将用代码编写的源程序翻译为计算机可以执行的目标程序,例如.c编译后生成.exe
前面会涉及一些基础,可以直接看第四标题的内容

机器语言

计算机刚发明的时候人们通过各种开关和电缆来编写程序。这时候的程序是真正的二进制,例如000110101011。
后来做出了改进,把程序打在穿孔带上,让机器读取。但本质还是没有改变,还是在使用二进制编程。下面举一个例子:
0001表示加
1010表示寄存器a
1011表示寄存器b
那么把a和b的值加起来放在a,就是0001 1010 1011
当时的程序员比大熊猫还稀少,每天脑子里除了0就是1

汇编语言

既然二进制这么难记,人们就想到了给这些指令记一个好记的名字
0001:add
1010:a
1011:b
这样子就变成了,add a b
但计算机太笨了,只能执行二进制,所以汇编器出来了,用来把汇编语言转换为机器语言

高级语言

机器语言和汇编语言一直被统一称为低级语言
人类一直探索一种更高级的语言来写程序。这个语言应该是面向人而不是面向机器。
能使用变量来存放数据,而不是寄存器:int a=10;
能用表达式来表示自己的意图:a++;
能用判断语句来处理分支:if(a>=0) ;else a=-a;
能用循环语句:for(int i=1;i<=100;i++) sum+=i;
能定义一个函数处理一段多次使用的操作:int getmax(){}
编译器的工作就是把高级语言翻译成机器语言

编译器的操作

我们先看看编译的过程:

源程序
语法分析
语义分析
中间代码生成
代码优化
代码生成
目标程序

词法分析:
简单来说,就是删除语句中的空格,建立一张符号表,例如sum+=i;
在这里插入图片描述语法分析:把符号表根据语法规则组建成一棵语法树
在这里插入图片描述
语义分析:判断标识符的类型、作用域是否正确,运算是否合法,取值范围是否有问题等等

中间代码生成:
temp1=id1+id4;
id1=temp1;

翻译成汇编语言:
MOV R1 id1;sum的值放入寄存器R1
MOV R2 id4;i的值放入寄存器R2
ADD R2 R1;R1和R2的值相加,放入R1
MOV id1 R1;把R1的值放入id1

接下来就是汇编成二进制了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章