编译就是翻译,将机器语言翻译成另一个机器语言(例如高级语言翻译成低级语言(例如汇编),低级语言翻译成机器语言(二进制))

编译让计算机理解高级语言并且执行,编译让计算机更理解人,编译提供了人类新的思考方式

编译的翻译只能作用于形式语言

编译器和解释器

编译器将源程序编译成目标的程序

解释器接收源程序与输入,执行并且返回输出

混合编译器通常需要2次编译,第一次编译将源程序翻译成目标程序,第二次编译时,将目标程序与输入一起放到虚拟机来处理执行(虚拟机用于跨平台,来处理复杂的执行环境)

即时编译器,将源程序编译成机器码后再执行

交叉编译:在一个平台上编译产生多个平台的可执行程序

编译的过程

关注度分离

词法分析(分词,分析词法)

语法分析(将词分析的结果分析成抽象语法树的过程,也就是AST(Abstract Syntax Tree)),语法分析器被叫为parser

语义分析:分析抽象语法的语法是否合法

根据抽象语法树生成的三地址码进行存储,传输,优化

根据三地址码生成机器码(有一些还需要把机器码编译成可执行应用)

词法分析:将程序的字符流转换为符号流,分析符号,并且给予描述

例如:let a = 1

词法分析后得到

let: Keyword a: Variable =: Operator 1: Integer

词法分析器会将关键字抽离,并且对每个字符作描述

词法分析器得到返回值是符号元组,符号又叫词法单元(Token)

词法:构造语句的方法(哪些是具备词性(根据词的特点来区分的语法分类,例如动词,名词等等),哪些是具备词语(具有意义的词,关键字)),通常使用正则表达式来描述词法,使用状态机来实现正则表达式

字母表(alphabet):某个编程语言中允许的全部字符

串(string)是某个编程语言中的字母序列

词法分析器将源程序的字符流进行分析,通正则文法过来找到这些词汇,并且给予词性,如果存在不支持的词汇,则报错(也就是分词)

词法分析器使用了一种叫有限自动机(有限状态机,deterministic finite automaton, DFA)的算法,在分析字符串时,当遇到了关键字时,会改变状态

有限自动机和图灵机很相似,不过有限自动机只能读取,无法进行计算

例如:a == 1

当识别扫描到a时,会处于标识符状态,直到遇到了==,就会切换到比较运算符状态,然后再识别1,知道该值是数值字面量

语法分析

语法分析的过程就是在词法分析的基础上分析程序的语法结构,这个语法结构是树状的,这个树叫抽象语法树(Abstract Syntax Tree,AST),树节点是语法单元,可通过递归下降算法或者自底向上算法来构造该树状

语法制导翻译