编译器
编译器是什么?
介绍编译器之前,我们先介绍翻译程序的概念,所谓翻译程序,就是把一种语言翻译成另一种语言的程序,这是一个比较广的概念,如中文翻译成英文,c++翻译成机器码。
而编译程序,也就是编译器呢,就是将一种高级语言翻译成更低级语言的翻译程序。这里的高级、低级就是与机器的接近程度。高级语言如C/C++、Java、Python更抽象,不与具体的指令集直接相关;而低级语言则依赖于具体的机器平台对应的指令集,比如x86汇编、arm汇编。
为什么需要编译器
为什么需要编译器?因为汇编太复杂、开发效率太低,且高度平台相关,所以需要更加抽象,更易于人类理解使用的高级语言,但特定的计算机在设计时,硬件已经规定了一套能够识别的指令集合,即指令集架构(Instruction Set Architecture, ISA),计算机只能识别该符合其ISA的指令。所以我们想要让高级语言在计算机上执行时,必须经历一个翻译过程。
例子:
编译器的结构
首先编译器的输入是高级语言的源代码,其实就是文本文件,即一个字符串;编译器的输出是能在目标机器上执行的机器码,或者汇编代码;从输入得到输出,编译器主要包含以下步骤:
- 词法分析 (字符串—> token流)
- 语法分析 (token流—> 若干语法结构)
- 中间代码生成 (语法结构–>根据语义得到中间表示)
- 优化 (中间代码–> 更好的中间代码)
- 目标代码生成 (中间代码–>目标机器上的机器码或汇编)