编译原理(1)总结

2022-03-17 13:38:19 浏览数 (1)

  本科是网络工程,由于没有学<<编译原理>>这门课,打算两个月把国科大的编译原理梳理完,把其中我认为的精髓概括一下,三天一篇,作为笔记。

一、什么是编译程序

  为了了解什么是编译程序,首先了解下翻译程序是什么:

把某一种语言程序(称为源语言程序)等价地转换为另一种语言程序(目标语言程序)的程序。

  而编译程序就是一种翻译程序。它把某一种高级语言程序等价转换为另一种低级语言程序(如汇编语言或机器语言)的程序。   编译程序还有以下分类:

  • 诊断编译程序(Diagnostic Complier,帮助程序员排错)
  • 优化编译程序(Optimizing Complier,提高目标代码执行效率)
  • 交叉编译程序(Cross Complier)

两个概念:

  • 宿主机(运行编译程序的机器)
  • 目标机(运行目标源程序的机器) 一般来说,宿主机和目标机是同一类型机器,如果不同,则叫做交叉编译程序,如在Windwos交叉编译可在Linux上运行的程序。
  • 可变目标编译程序(Retargetable Complier)

  还有一种翻译程序——解释程序(Interpreter),即把源语言的源程序作为输入,但不产生目标程序,而是边解释边执行源程序。

二、为什么要学习编译原理

  • 理解计算系统
  • 设计计算系统
  • 训练计算思维
    • 抽象
    • 自动化
    • 问题分解
    • 递归
    • 权衡
    • 保护、冗余、容错、纠错和恢复
    • 利用启发式推理来寻求解答
    • 在不确定情况下的规划、学习和调度
    • ......

三、编译过程

  编译程序是怎样把高级语言(如C )翻译成低级语言的(如机器指令)的?

The complier can translate a program from source language to target language.

  以把英文翻译为中文为例。

  • 识别出句子中的单词——词法分析
  • 分析句子的结构——语法分析
  • 根据句子的含义进行初步翻译——中间代码产生
  • 对译文进行修饰——优化
  • 写出最后的译文——目标代码产生
1. 词法分析

  任务:对源程序字符串进行扫描和分解,识别出单词符号。   原则:构词规则   工具:有限自动机

2. 语法分析

  任务:在词法分析的基础上,根据语法规则把单词符号分解成各类语法单位(语法范畴)   原则:语法规则   工具:上下文无关文法

3. 中间代码产生

  任务:对各类语法单位按语言的 语义进行初步翻译。   原则:语义规则   工具:属性文法   中间代码:三元式、四元式、树...

4. 优化

  任务:对前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码。   原则:等价变换规则

4. 目标代码产生

  任务:把中间代码变换成特定机器上的目标代码。   原则:依赖于硬件系统结构和机器中指令的具体含义

  目标代码三种形式

  • 汇编指定代码:需要进行汇编
  • 绝对指定代码:可直接运行
  • 可重定位指令代码:需要链接

四、编译程序的结构

五、编译程序的开发

1. 使用机器语言

优点:可针对具体机器,充分发挥计算机的系统功能(使用某些特殊指令)、生成的程序效率高。 缺点:可读性极差、可维护性极低、开发效率极低、可移植性极低。

2.使用汇编语言

优点:机器指令语义化,有一定可读性。可针对具体机器,充分发挥计算机的系统功能(使用某些特殊指令)、生成的程序效率高。 缺点:需要相应汇编器,可读性差、可维护性低、开发效率低、可移植性低。

3.使用高级语言

  如果已存在某种高级语言(如C ,已存在C 的编译器和汇编器)。现假设新语言为S,目标语言为T,实现语言为I,那么,可以利用现有的I语言为编程工具,编写从S语言到T语言的编译器,这样,一种新的语言S就产生了。因此,高级语言的产生过程最开始一定是由机器语言迭代产生的。

优点:程序易读、易理解、易维护、编码效率高。 缺点:不能精准控制目标代码的生成,目标代码执行效率可能不高,可通过插入目标代码方式解决。(如在C/C 中通过内联汇编实现,C#通过EMIT写IL代码实现)

0 人点赞