编译原理

编译器是将一种语言翻译为另一种语言的计算机程序。编译器将源程序( source language)
编写的程序作为输入,而产生用目标语言( target language)编写的等价程序。

为什么要用编译器

机器语言就是表示机器实际操作的数字代码,如

    C7 06 0000 0002

表示在IBM PC上使用的Intel 8x86处理器将数字2移至地址0 0 0 0(16进制)的指令。这种代码形式很快就被汇编语言( assembly language)代替了。在汇编语言中,都是以符号形式给出指令和存储地址的。例如,汇编语言指令(假设符号存储地址X是0 0 0 0)

    MOV X, 2

汇编语言的编写严格依赖于特定的机器,所以为一台计算机编写的代码在应用于另一台计算机时必须完全重写。前面的汇编语言代码可以写成一个简洁的与机器无关的形式

    x = 2

翻译步骤主要包括:

  • 扫描程序(scanner)
  • 语法分析程序(parser)
  • 语义分析程序(semantic analyzer)
  • 源代码优化程序(source code optimizer)
  • 代码生成器(code generator)
  • 目标代码优化程序(target code optimizer)

扫描程序

扫描程序(scanner)在这个阶段编译器实际阅读源程序扫描程序执行词法分析(Lexical analysis):它将字符序列收集到称作记号(token)的有意义单元中,记号同自然语言。例如在下面的代码:

    a [index] = 4 + 2

这个代码包括了12个非空字符,但只有8个token(记号)

    a 标识符
    [ 左括号
    index 标识符
    ] 右括号
    = 赋值
    4 数字
    + 加号
    2 数字

语法分析程序

语法分析程序从扫描程序中获取记号形式的源代码,并完成定义程序结构的语法分析(syntax analysis),这与自然语言中句子的语法分析类似。语法分析定义了程序的结构元素及其关系。通常将语法分析的结果表示为分析树( parse tree)或语法树(syntax tree)。

语义分析程序

程序的语义就是它的“意思”,它与语法或结构不同。程序的语义确定程序的运行,但是大多数的程序设计语言都具有在执行之前被确定而不易由语法表示和由分析程序分析的特征。这些特征被称作静态语义( static semantic)。分析的典型信息可能是:a是一个整型值的数组,它带有来自整型子范围的下标;index则是一个整型变量。接着,语义分析程序将用所有的子表达式类型来标注语法树,并检查赋值是否使这些类型有意义了,如若没有,则声明一个类型匹配错误。

源代码优化程序

编译器通常包括许多代码改进或优化步骤。绝大多数最早的优化步骤是在语义分析之后完成的,而此时代码改进可能只依赖于源代码。在上例中,我们包括了一个源代码层次的优化机会,也就是:表达式4 + 2可由编译器计算先得到结果6(这种优化称为常量合并( constant folding))。

代码生成器

代码生成器得到中间代码( IR),并生成目标机器的代码。

目标代码优化程序

在这个阶段中,编译器尝试着改进由代码生成器生成的目标代码。这种改进包括选择编址模式以提高性能、将速度慢的指令更换成速度快的,以及删除多余的操作。

前端和后端

将编译器分成了只依赖于源语言(前端( front end))的操作和只依赖于目标语言(后端( back end))的操作两部分。这与将其分成分析和综合两部分是类似的:扫描程序、分析程序和语义分析程序是前端,代码生成器是后端。

TINY 语言

TINY的程序结构很简单,仅是一个由分号分隔开的语句序列。另外,它既无过程也无声明。所有的变量都是整型变量,通过对其赋值可较轻易地声明变量。它只有两个控制语句: if语句和repeat语句。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值