编译器简介
Last updated
Last updated
高级语言:类似于数学定义或自然语言的简洁形式。接近人类表达习惯,不依赖于特定机器,编写效率高
汇编语言:引入助记符。依赖于特定机器,非计算机人员使用受限制,编写效率依然很低
机器语言:与人类表达习惯相去甚远
预处理器:把存储在不同文件中的源程序聚合在一起,把被称为宏的缩写语句转换为原始语句。
可重定位(Relocatable):让内存中存放的起始位置L不是固定的
链接器:将多个可重定位的机器代码文件(包括库文件)链接到一起,解决外部地址问题
加载器:修改可重定位地址;将修改后的指令和数据放到内存中适当的位置
起始地址 + 相对地址 = 绝对地址
编译器:读入以某种语言 (源语言) 编写的程序,输出等价的用另一种语言 (目标语言) 编写的程序,通常目标程序是可执行的。
解释器:直接利用用户提供的输入,执行源程序中指定的操作。不生成目标程序,而是根据源程序的语义直接运行。
混合编译器:Java语言的处理结合了编译和解释,Java源程序编译成字节码(bytecode)中间表示,然后在虚拟机上解释执行。
请简述编译器和解释器的主要区别:编译器和解释器都是⽤于将⾼级语⾔代码转换为低级代码(通常是机器代码或字节码)的⼯具,但它们在执⾏这⼀任务时有⼏个关键区别。
编译器通常⼀次性地将整个源代码转换为⽬标代码,⽣成⼀个可执⾏⽂件。这个可执⾏⽂件可以在没有源代码的情况下独⽴运⾏。
解释器则是逐⾏或逐块地读取源代码,然后⽴即执⾏它,⽽不⽣成⼀个独⽴的可执⾏⽂件。
由于编译器⽣成了优化过的⽬标代码,所以运⾏速度通常更快。解释器更易于调试,因为它允许逐⾏执⾏和修改代码。
分析部分(前端/Front end)
把源程序分解成组成要素,以及相应的语法结构。使用这个结构创建源程序的中间表示,同时收集和源程序相关的信息,存放到符号表。
综合部分(后端/Back end)
根据中间表示和符号表信息构造目标程序,同时对目标程序进行分析、优化。
简要描述编译器前端和后端的主要区别:
编译器前端主要负责语法检查、语义检查、和初步的代码⽣成,包括词法分析、语法分析、 和语义分析等。它通常与源语⾔紧密相关,但与⽬标机器⽆关。⽽后端主要负责代码优化和⽬标代码⽣成,它通常与源语⾔⽆关,但是与⽬标机器紧密相关。
每趟读入一个输入文件,产生一个输出文件
步骤(Phase)是逻辑组织方式,趟和具体的实现相关,可以将多个步骤组合成趟