编译的前端与后端
概念上我们有时候把编译程序分成编译前端和编译后端。
编译前端
前端主要由源语言有关但与目标机无关的那些部分组成,通常包括词法分析、语法分析、语义分析与中间代码的产生,有的代码优化工作也可以包括在前端。
编译后端
后端包括编译程序中与目标机有关的那些部分,如与目标机有关的代码优化和目标代码生成等。
通常后端不依赖源语言而仅仅依赖于中间语言。编译程序的构造工具是什么?
以前人们构造编译程序大多数采用的是机器语言或汇编语言,现在只有为了充分发挥各种不同硬件系统的效率,为了满足各种不同的具体要求,才会采用这种工具来构造编译程序(或编译程序的“核心”部分)。现在越来越多采用高级语言来构造编译程序。
自编译方式
先对语言的核心部分构造一个小小的编译程序(可用低级语言实现),再以它为工具构造能编译更多语言成分的较大编译程序,如此不断扩展,最后形成整个编译程序(滚雪球),这种通过一系列自展途径而形成的编译程序的过程叫做自编译过程。
构造工具
现在人们已经建立了多种编制部分编译程序或者整个编译程序的有效工具。构造编译程序的工具称为编译程序-编译程序、编译程序产生器或翻译程序书写系统。
编译原理的概述:(总结)
编译程序就是把高级语言源程序生成为汇编代码的过程,生成的汇编代码再由汇编器连接器等生成目标机器上的可执行代码。
一般编写高级语言编译程序采用自举形式,如,C语言编译器首先由其他语言如汇编语言编写,再有生成的目标EXE程序对编写的C语言程序进行自我编译,调试后即为第一个C语言编译程序的编写过程,即自举。
而如今,我们已经有了C语言编译程序,可以直接用C语言编译自己用C语言编写的编译程序,再用生成的可执行文件编译自己即可。
总体,
词法分析->语法分析->语义分析->(中间代码生成)->目标代码生成
其中,为了生成的代码的可移植性,采用了中间代码形式,由于目标机器的指令集不同,生成的机器码也不同,但我们可以用中间代码作为机器代码生成的程序集,所以中间代码不是必需的,但是为了方便起见,一般编译程序都会采用中间代码,如三地址码,四元式,语法树等。
语法分析:
在语法分析过程中,主要是对文法的熟悉掌握,一般采用LL(1)分析法或者递归下降子程序方法,但递归下降子程序需要对文法进行变换,不能有左递归且同一非终结符的产生式select集合不能相交,在语法分析过程中也可以检查出错误,如C语言中的分号缺失,语句形式错误等,重点是填写符号表。
语义分析:
包含了语法分析中不能检查出的错误,比如数组赋值形式错误等,还包含了语法翻译制导技术,在特定的时机产生中间代码。由于本人能力有限,只写过四元式的中间代码,主要思想与逆波兰式的思想相似,特定时机,特定入栈。