标签(空格分隔): 未分类
简单的说,一个编译器就是一个程序,它可以阅读以某一种语言(源语言)编写的程序,并把该程序翻译称为一个等价的,用另一种(目标语言)编写的程序。
编译器的重要任务之一是报告它在翻译过程中发现的错误。
解释器(interpreter)
是另一种常见的语言处理器。直接利用源代码和输入来产生输出。
Java 结合了编译和解释过程。
为了更快地完成输入和输出的处理,有些被称为
即使(just in time,JIT)
编译器的JAVA编译器在运行中间程序处理输入的那一刻,首先把字节码翻译为机器语言,而不用解释器,这样能加快速度。
出了编译器之外,创建一个可执行的目标程序还需要一些其他程序。
预处理器(preprocessor)
的程序独立完成。 编译器
可能产生一个汇编语言作为输出。 汇编器(assembler)
的程序进行处理,生成可重定位的机器代码。链接器(linker)
解决外部内存地址的问题。加载器(loader)
把所有的可执行目标文件加载进内存执行。编译器由两部分组成:分析部分和综合部分
分析(analysis)
部分把源程序分解为多个组成要素,并在这些要素之上加入语法结构。然后,它使用这个结构来创建该源程序的一个中间表示。
符号表(symbol table)
的数据结构中。符号表和中间表现形式一起传送给综合部分。
综合(synthesis)
部分根据中间表示和符号表中的信息构造用户期待的目标程序。
分析部分
经常被称为编译器的前端
,而综合部分
被称为后端
。编译器的第一个步骤称为词法分析(lexical analysis)
或扫描(scanning)
。
词法分析器读入组成源程序的字符流
,并且将它们组织成为有意义的词素(lexeme)
的序列
词素
,词法分析器产生如下形式的词法单元(token)
例子: position = initial + rate * 60
经过词法分析后转变为
从技术上讲,60应该被描述为
,4指向符号表中对应于60的条目。
语法分析(syntax analysis)
或解析(parsing)
。
根据词法分析的结果,进行语法分析,结果一般是一颗语法树
等语法结构,如图1-7。
编译器的后续步骤使用这个语法结构来帮助分析源程序,并生成目标程序。在第四章,我们将使用上下文无关文法来描述程序设计语言的语法结构,
语义分析器(semantic analyzer)
使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致。同时收集类型信息,并把信息存放在语法树或符号表中,以便在随后的中间代码中使用。
这就是语义分析中一个十分重要的功能,具体例子就是图中的inttofloat
。
我们将在第六章详细介绍。
将语法树等中间形式翻译为三地址代码
的中间形式。
第六章我们将将详细介绍。
机器无关的代码优化步骤试图改进中间代码,以便生成更好的目标代码。
以下是个简单的例子
生成类汇编语言
的目标语言,
上面代码忽略了对源程序中的标示符进行存储分配的重要问题。
我们将在第七章看到,编译器在中间代码生成或代码生成阶段对有关存储器分配的决定,和运行时刻的存储组织方式依赖于被编译的语言。
符号表管理记录源程序变量过程的各种信息
类似与平衡树红黑树之类的数据结构,便于查询。
(其实就是所谓的前后端分离的意思)
前端步骤可以当做一趟,根据中间代码生成目标代码的后端也可以看做一趟。
前端趟和后端趟根据目标自由搭配。
NOMAD
,用于数据库查询的SQL
Prolog
和OPS5
函数式语言
,约束逻辑式语言
属于此类。复杂多变的程序设计语言,对编译器及编译器设计人员也提出了极大的考验。
本书将会告诉我们编译器设计的根本思想和方法论。
接收一个问题,抓住问题的关键特性的数学抽象表示,并用数学方法解决他。
基本的几个模型
二进制翻译
编译器技术可以用于把一个机器的二进制代码翻译成另一个机器的二进制代码,使得可以在一个机器上运行原本为另一个指令集编译的程序。
硬件合成
不仅仅大部分软件是用高级语言描述。大部分硬件设计也是使用高级硬件描述语言描述的。这些语言有Verilog
和VHDL
. 硬件设计通常通常是在寄存器传输层(Register Transfer Level,RTL)
描述.
数据查询解释器
编译然后模拟
public
,private
,protecte
Algol 60
使用