首页 > 代码库 > 了解编译器
了解编译器
编译器就是将"一种语言(通常为高级语言)"翻译为"另一种语言(通常为低级语言)"的程序。一个现代的编译器主要的工作流程:源代码->预处理器->编译器->目标代码->连接器->可执行程序。
高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读,运行的。编译器将汇编或高级计算机语言源代码作为输入,翻译成目标语言机器代码的等价程序。源代码一般为高级语言,而目标则是机器语言的目标代码,有时也称作机器代码。
编译是从源代码到能直接被计算机或虚拟机执行的目标代码的翻译过程。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码,又被叫做反编译器。
典型的编译器输出是由包含入口点的名字和地址,以及外部调用的机器码组成的目标文件。一组目标文件,不必是同一编译器产生,胆使用的编译器必须采用同样的输出格式,可以连接在一起并生成可以由用户直接执行的EXE。
处理器作用是通过带入预定义等程序段将源程序补充完整。
前端主要负责解析输入的源代码,由语法分析器和语意分析器系统协同工作。语言分析器负责把源代码中的单词找出来,语意分析器把这些分散的单词按余弦定义好的语法组装成有意义的表达式语句,函数等等。例如a = b + c,语意分析器按定义的语法,先把他们组装成表达式"b+c",再组装成"a = b+c"的语句。前端还负责语义的检查,例如检测参与运算的变量是否同一类型的,简单的错误处理。最终的结果常常是一个抽象的语法树。
后端主要负责分析,优化中间代码以及生成机器代码。所有的编译器分析,优化,变型都可以分为两大类:函数内,还是函数间进行。
常见的编译分析有函数调用树,控制流程图,以及在此基础上的变量定义-使用,使用-定义链,变量别名分析,指针分析,数据依赖分析。
程序分析结果是编译器优化和程序变形的前提瞧见。常见的优化和变形有:函数内嵌,无用代码删除,标准化循环结构,循环体展开,循环体合并、分裂数组填充。优化和变形的目的是减少代码的长度,提高内存,缓存的使用率,减少读写磁盘,访问网络数据的频率。
机器代码的生成是优化变形后的中间代码转换成机器指令的过程。现代编译器主要采用生成汇编代码的策略,而不直接生成二进制的目标代码。
正则表达式 有限状态机
了解编译器