概述
编译程序:将高级语言的源程序翻译成与之等价的低级语言的目标程序的这样一种程序
源程序运行过程:编译阶段+运行阶段或者编译阶段+汇编阶段+运行阶段
解释程序:以源程序作为输入,但不产生目标程序,解释一条执行一条
汇编程序:用于特定计算机上的汇编语言的翻译程序。有时编译器把汇编语言作为目标语言,然后再由汇编程序将它翻译成目标代码。
连接程序:将分别在不同的目标文件中编译或汇编的代码收集到一个可直接执行的文件中
装入程序:编译器、汇编程序或连接程序生成的代码还不能运行,装入程序处理所有的与指定的基地址有关的可重定位地址,并将修改后的指令和数据放在内存中适当的位置。
预处理程序:预处理程序是在真正的编译开始之前由编译器调用的独立程序。预处理程序可以删除注释、包含其它文件以及执行宏替代。
源程序+初始数据→解释程序→计算结果
源程序→编译程序→初始数据+目标程序+运行系统子程序→计算结果
编译过程
一般分为5个阶段:词法分析→语法分析→语义分析与中间代码产生→优化→目标代码生成
- 词法分析:按照语言的词法规则使用特定的工具将源程序转换成单词符号串
- 语法分析:按照语法规则使用上下文无关文法、确定的下推自动机将单词符号串转换为各类语法范畴 (层次结构分析)
- 语义分析与中间代码产生:按照语义规则使用属性文法将语法范畴进行初步翻译、产生中间代码(中间代码即独立于具体硬件的记号系统,四元式、三元式、逆波兰式等。)
- 优化:按照等价变换规则使用变换方法将中间代码变为更高效的中间代码
- 目标代码生成:将中间代码转换成依赖于机器的目标代码
表格管理程序:登记源程序的各类信息和编译程序各阶段的进展情况,如符号表。
出错处理程序:发现并指出源程序中错误的性质和位置;自动校正错误
遍:对源程序或源程序的中间结果从头至尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序的处理过程称为一遍。可以把一个阶段分为若干遍,也可以把多个阶段合为一遍,通常有一遍和多遍编译程序。
前端(front end):由与源语言有关但与目标机无关的部分组成。
后端(back end):包括与目标机有关的部分。而一般不依赖于源语言,只与中间代码有关的编译阶段。
文法基础
程序语言是符号语言,即一个记号系统,它主要有语法、语义和语用等三方面定义。
语法:是对语言结构的定义(什么样的符号序列是合法的)。任何语言程序都可看成是一定字符集上的一字符串(有限序列),语法定义语言的词法和语法的形式规则。
- 字母表是一个有限的字符集,字符集中的字符是语言程序中可能出现的字符,它们是语言程序单词的组成部分。
- 词法规则定义了语言程序中单词符号的形成规则。即什么样的字符串是一个合法的单词。如标识符、数值常量、运算符等单词的构成规则。
- 语法规则定义了语言程序中语法单位的形成规则。一般语言的语法单位有表达式、语句、分程序、函数、过程和程序等。描述语法规则和进行语法分析的有效工具是上下文无关文法。
语义:描述语言的含义;定义语言的单词符号和语法单位的意义。目前编译程序中常用的语义分析方法是一种基于属性文法的语法制导翻译。即在语法分析的同时对其中识别出的语法单位进行语义的分析与翻译工作;在描述文法的同时为定义的语法范畴加上它们的属性计算规则,属性可以是语法范畴的类型、地址、取值、执行动作等信息。
语用:是从使用的角度去描述语言。定义程序设计技术和语言成分的使用方法,它使语言的基本概念与语言的外界(如数学概念或计算机的对象和操作)联系起来
字母表(alphabet):字母表是元素的非空有穷集合,任何语言的字母表指出了该语言中允许出现的一切符号。
【例如】 ∑ = {a,b,c}
∑是字母表,由 a,b,c 三个元素组成。
C 语言的字母表是字母、数字和若干专用符号组成。
符号(symbol):字母表中的元素称为符号,或称为字符。
【例如】 ∑ = {a,b,c}
a,b,c 是字母表 ∑ 中的符号。
符号串(string):符号的有穷序列称为字符串。符号串总是建立在某个特定字母表上的且只能由字母表上的有穷多个符号组成。不包含任何符号的符号串,称为空符号串,用 ϵ \epsilon ϵ(epsilon)表示
【例如】设有字母表 ∑ = {a,b,c},
则有符号串 a,b,ab,ba,cba,abc,…
(a,b,ab,ba,cba,abc 等都是字母表∑上的符号串)
符号串的连结 catenation:设 x 和 y 是符号串,则串 xy 称为它们的连结。
【例如】设 x = abc,y = 10a,
则 xy = abc10a
则 yx = 10aabc
特别,对任意一符号串 x 有: ϵ x = x ϵ = x \epsilon x=x \epsilon=x ϵx=xϵ=x
集合的乘积 product:设 A 和 B 是符号串的集合,则 A 和 B 的乘积定义为:AB = {xy | x ∈ A, y ∈ B}
【例如】设 A = {a,b}, B = {c,d}
则 AB = {ac,ad,bc,bd}
空集 Φ empty set:Φ 表示不含任何元素的空集 { }
符号串的幂运算 power:设 x 是符号串,则 x 的幂运算定义为:
x 0 = ϵ ; x 1 = x ; x 2 = x x … … x n = x x … x x^0 = \epsilon ;x^1 = x;x^2 = xx……x^n = xx…x x0=ϵ;x1=x;x2=xx……xn=xx…x
集合的幂运算同理,只不过 A 0 = { ϵ } A^0=\{\epsilon\} A0={ ϵ}
集合A的正闭包A+与闭包A:设 A 是符号串的集合,则集合 A 的正闭包 A+ 和闭包 A* 定义为:
A + = A 1 U A 2 U A 3 U … U A n U … A ∗ = A 0 U A 1 U A 2 U A 3 U … U A n U … = { ϵ } U A + A^+= A^1 U A^2 U A^3 U … U A^n U …\\\\ A^* = A^0 U A^1 U A^2 U A^3 U … U A^n U … = \{ \epsilon \} U A^+ A+=A1UA2UA3U…UAnU…A∗=A0UA1UA2UA3U…UAnU…={
ϵ}UA+
【 例 如 】 设 A = { a , b } , 则 A + = { a , b , a a , a b , b a , b b , a a a , a a b , … } A ∗ = { ϵ , a , b , a a , a b , b a , b b , a a a , a a b , … } 【例如】设 A = \{a,b\},则\\\\ A^+ = \{a,b,aa,ab,ba,bb,aaa,aab,…\} \\\\ A* = \{\epsilon,a,b,aa,ab,ba,bb,aaa,aab,…\} 【例如】设A={ a,b},则A+={ a,b,aa,ab,ba,bb,aaa,aab,…}A∗={ ϵ,a,b,aa,ab,ba,bb,aaa,aab,…}
形式语言和文法
形式语言:序列(字符串)的集合称为形式语言。每个形式语言都是某个字母表上按某种规则构成的所有符号串的集合;任何一个字母表上符号串的集合均可定义一个形式语言。
【例如】
C 语言是具有基本符号字母表上的符号串的集合。每个 C 语言程序是基本符号的符号串。
形式语言的描述有两种方法:
- 当语言为有穷集合时,用枚举法来表示语言。
【例】设有字母表 A={a,b,c},则L1 = {a,b,c},L2 = {a,aa,ab,ac},L3 = {c,cc}均表示字母表 A 上的一个形式语言。由于这三个语言均是有限符号串的集合,可以枚举出其全部句子来表示该语言。
- 当语言为无穷集合时,需要设计文法来描述无穷集合的语言。
【 例 】 设 有 字 母 表 ∑ = { 0 , 1 } , 则 ∑ + = ∑ 1 ⋃ ∑ 2 ⋃ ∑ 3 ⋃ … = { 0 , 1 , 00 , 10 , 11 , 01 , 000 , 100 , … } 用 A 表 示 ∑ + , 用 式 子 A → 0 表 示 符 号 串 0 ∈ A 或 A 生 成 符 号 串 0 则 集 合 A 可 表 示 成 : A → 0 ; A → 1 ; A → A 0 ; A → A 1 【例】设有字母表 ∑=\{0,1\},\\\\ 则∑^+ = ∑^1 \bigcup∑2 \bigcup ∑3 \bigcup … = \{0,1,00,10,11,01,000,100,…\}\\\\ 用 A 表示 ∑^+,用式子 A→0 表示符号串 0∈A 或 A 生成符号串 0 则集合 A 可表示成:\\\\A→0;A→1;A→A0;A→A1 【例】设有字母表∑={ 0,1},则∑+=∑1⋃∑2⋃∑3⋃…={ 0,1,00,10,11,01,000,100,…}用A表示∑+,用式子A→0表示符号串0∈A或A生成符号串0则集合A可表示成:A→0;A→1;A→A0;A→A1
显然由 A 生成的符号串属于 ∑+,这就是文法描述语言,它描述了无穷集合的语言。
文法的形式定义:
规则:规则也称产生式,它是一个符号与一个符号串的有序对(A, β \beta β),通常写做A→ β \beta β( 或 A::= β \beta β )
其中 A 是规则左部,是一个符号; β \beta β是规则右部,是一个符号串。→ 或 ::= 表示“定义为”或“生成”,意思是左部符号用右部符号串定义或左部符号生成右部符号串。规则的作用是告诉如何用规则中的符号串生成语言中的序列。一组规则规定了一个语言的语法结构。
非终结符:出现在产生式左部能派生出符号或符号串的那些符号,即每个非终结符表示一定符号串的集合。用大写字母表示或用尖括号把非终结符括起来。
终结符:是不属于非终结符的那些符号,它是组成语言的基本符号,是一个语言的不可再分的基本符号,只出现在产生式右部。通常用小写字母表示。
【例】产生式 A→A1 A→A0
A 是非终结符,0、1 是终结符
文法:文法是规则的非空集合,是一个四元式G =( V N V_N VN, V T V_T VT,P,S),其中:
- V N V_N VN 是一个非空有限集,它的每个元素为非终结符号,
- V T V_T