编译原理系列,是在学习本校 "编译技术" 这门课程时,所作记录,参考教材为 《编译技术基础教程》清华大学出版社和《程序设计语言编译原理》国防工业出版社(陈火旺编著)。

1.1 编译程序简介

计算机系统的语言分为三个层次:

  • 机器语言(Machine Language)
  • 难记忆、难编写、难阅读、难改错
  • 计算机可直接理解
  • 例:C706 0000 0002
  • 汇编语言(Assembly Language)
  • 引入助记符
  • 依赖特定机器
  • 编写效率低
  • 例:MOV X,2
  • 高级语言(High-level Language)
  • 接近人类表达习惯,不依赖特定机器
  • 编写效率高
  • 例:x = 2

为了将高级语言和汇编语言程序转换为对应的机器语言程序,必须寻找一种方法——翻译

翻译:讲义中程序设计语言(源语言)所编写的程序(源程序)转变为之等价的另一种程序设计语言(目标语言)的程序(目标程序)的过程。

若源程序是 FORTRAN、Pascal、C、Java 、Objective 这样的高级语言,目标语言是汇编语言或机器语言之类的低级语言,则这样的翻译程序就是编译程序,这样的语言称为编译型语言。

编译程序一般分为以下几种:

  • 诊断编译程序(Diagnostic Compiler)
  • 专门用于帮助程序开发和调试的编译程序
  • 优化编译程序(Optimizing Compiler)
  • 着重于提高目标代码运行效率的编译程序
  • 交叉编译程序(Cross Compiler)
  • 运行编译程序的计算机称为宿主机,运行编译程序所产生目标代码的计算机称为目标机
  • 编译程序产生不同于其宿主机的目标代码
  • 可变目标编译程序
  • 不需要重写编译程序中与机器无关的部分就能改变目标机
  • 预处理程序(Preprocessor)
  • 将不同文件中的源程序模块汇集在一起,又将源程序中的宏语句展开为原始语句并加入到源程序中的程序。
  • 汇编程序(Assembler)
  • 把汇编语言程序转换为机器语言程序的程序
  • 装配连接程序(Loader-linker)
  • 把可装配的机器代码进行装配链接得到绝对机器代码的程序

高级语言除了可以编译执行,亦可以解释执行,如 Python。效率较低。

解释:以源程序为输入,执行过程中不产生目标程序,而是边解释边执行。

既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕。就出现了半编译型语言。比如 C#,C# 在编译的时候不是直接编译成机器码而是中间码,.NET 平台提供了中间语言运行库运行中间码,中间语言运行库类似于 Java 虚拟机。

1.2 编译程序的结构及编译过程

词法分析器(Scanner)

功能:输入源程序,进行词法分析,输出单词符号。

  • 识别出源程序的各个单词符号
  • 删除无用的空白字符和注释
  • 检查拼词错误

单词一般分为 5 种:保留字、标识符、常数、运算符和界符。

如,如下 Pascal 程序片段:

var x,y,z:read;
x := y + z * 60;

词法分析器从左到右扫描输入的字符流,识别出一个个单词符号,并输出其内部表示形式:

则上述程序片段经过词法分析后,输出为:

$var id1,id2,id3:$real;
id1 := id2 + id3 * int1

语法分析器(Parser)

功能:以扫描器输出的单词流为输入,判断整个单词符号串是否构成一个语法上正确的程序。

依据:程序设计语言的语法规则

方法:为源程序构造一个逻辑上的语法树

如:单词符号串 id1 := id2 + id3 * int1

语义分析和中间代码生成器

功能:按照语义规则堆语法分析器识别出来的语法单位进行语义分析并翻译成一定形式的中间代码。

一方面,堆各类语法单位进行静态语义检查,如,变量是否定义、类型是否匹配等。另一翻盖你,若语义正确,根据语法单位的类型分类处理。若为说明语句,则将变量的属性填入符号表;若是可执行语句,则翻译为中间代码。

中间代码(Intermediate Code),是一种含义明确、便于处理的记号系统。通常采用四元式:(序号)(op, arg1, arg2, result)

其中 op 是运算符,arg1 是左操作数,arg2 是右操作数,result 是运算结果。

通常语义分析和中间代码生成阶段的工作通常穿插在语法分析中来完成。

代码优化器

功能:对中间代码进行优化处理。

代码优化的主要依据是程序的等价变换原则。常用的优化方法主要包括合并已 知量、删除公共子表达式、删除无用代码、代码外提等。

目标代码生成器

功能:将中间代码翻译成目标代码。

表格管理

编译程序在工作过程中需要管理一系列的表格,以登记源程序的各类信息和编译各阶段的进展情况。

当扫描器识别出一个名字(标识符)后,将会把该名字填入到 符号表中,但此时并不能够确定名字的全部属性,这些属性要在后续编译的各个阶段才能逐步补充完整。例如,名字的类型等信息要在语义分析时才能确定,而名字的地址信息可能要到目标代码生成时才能确定。

错误处理

通常,源程序中的错误分为语法错误和语义错误两大类。

  • 语法错误
  • 源程序中不符合语法规则或词法规则的错误
  • 可在词法分析或语法分析阶段检测出来
  • 例如,“非法字符”之类的错误可在词法分析时检测出来
  • “括号不 匹配”、“缺少;”之类的错误可在语法分析时检测出来
  • 语义错误
  • 源程序中不符合语义规则的错误
  • 一般可在语义分析阶段检测出来
  • 有的语义错误却要在运行时才能检测出来
  • 例如,说明错误、作用域错误、类型不一致等错误可在语义分析时检测出来。

术语

前端(front end):主要依赖于源语言而与目标机器无关的编译阶段。如:词法分析、语法分析、语义分析、中间代码生成、部分优化工作、与前端有关的出错处理工作和符号表管理工作。

后端(back end):依赖于目标机而一般不依赖于源语言,只与中间代码有关的编译阶段。如:目标代码生成,以及相关出错处理和符号表操作。

遍(Pass):对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。每一遍扫视可完成上述一个阶段或多个阶段的工作。

编译程序的构造

编辑程序的构造的三个前提:

  • 源语言:编译程序的处理对象
  • 目标语言与目标机:编译长须处理的结果和运行环境
  • 编译方法与工具

六种编译程序的构造方法:

  1. 直接用机器语言或汇编语言编写。常用于编译程序核心代码的编写。
  2. 用汇编语言编写编译程序。
  3. 用高级语言编写编译程序。这是最普遍的方法。
  4. 自编译(自展)方式。先对语言的核心部分构造一个小小的编译程序(可 以用低级语言来实现),再以它为工具构造一个能够编译更多语言成分的较大的编 译程序,如此扩展下去,就像滚雪球一样,越滚越大,最终形成人们所期望的整个 编译程序。
  5. 用编译工具自动生成部分或整个程序。有些工具能用于自动产生扫描器(如 LEX),有些可用于自动产生语法分析器(如 YACC),有些甚至可用来产生整个编 译程序,这些都是以对源程序和目标语言(或机器)的形式描述作为输入来自动产 生编译程序的。
  6. 移植。将某种语言的编译程序从一种类型的机器转移到另一种类型的机器 上并能正常运行的过程。

编译原理语义分析_编译原理 第一章 绪论相关推荐

  1. sqlite数值长度超过7位出错_数值计算方法 第一章 绪论

    一.数值计算方法概览 1.研究对象:数值问题--有限个输入数据(问题的自变量.原始数据)与有限个输出数据(待求解数据)之间函数关系的一个明确无歧义的描述. 例如,求解微分方程的符号解即可看做无限输出, ...

  2. 人工智能原理——第一章 绪论

    人工智能原理--第一章 绪论 文章目录 人工智能原理--第一章 绪论 1.1 人工智能的发展 人工智能的发展 – 孕育期 人工智能的发展 – 摇篮期 人工智能的发展 – 发展期(1970-1979) ...

  3. 《通信原理》复习笔记1----第一章绪论

    系列文章链接目录 一.<通信原理>复习笔记1----第一章绪论 二.<通信原理>复习笔记1----第一章绪论相关例题 三.<通信原理>复习笔记3----第三章随机过 ...

  4. c++语言编程,一个电灯两个开关控制,[理学]四川大学计算机学院精品课程_面向对象程序设计C++课件_游洪越_第一章绪论.ppt...

    [理学]四川大学计算机学院精品课程_面向对象程序设计C课件_游洪越_第一章绪论 主讲教师: 游洪跃 个人主页: /~youhongyue 邮件地址: youhongyao@ 教材:<C++面向对 ...

  5. 数字图像处理--冈萨雷斯第4版--第一章 绪论

    数字图像处理--冈萨雷斯版--第一章 绪论 第一章 绪论 1.1 什么是数字图像处理 1.2 数字图像处理的起源 1.3 数字图像处理技术应用领域实例 1.3.1 伽马射线成像 1.3.2 X射线成像 ...

  6. 模拟电子技术基础 第一章 绪论

    第一章 绪论 1.1电子器件与电子电路发展史概要 1.1.1电子管的发明 1904年,电子管又名真空管,其工作原理是在抽成真空的玻璃管内放置一个灯丝和若干个金属电极,当灯丝通电加热后,是金属内电子获得 ...

  7. 传感器检测技术及仪表笔记01第一章 绪论

    第一章 绪论 1.1 检测技术及仪表的地位与作用 1.1.1 检测仪表的地位与作用 1.检测的定义 2.检测仪表的地位与作用 3.检测方法 1.2 传感器概述 1.2.1 传感器的基本概念 1.传感器 ...

  8. 数字图像处理第三版(冈萨雷斯)——第一章绪论

    数字图像处理第三版(冈萨雷斯)--第一章绪论 一.主要目的 二.关于什么是数字图像处理的几个重要概念 2.1 强度或灰度: 2.2 数字图像: 2.3 数字图像处理: 2.4 像素: 2.5 低级.中 ...

  9. 西瓜书读书笔记整理(二)—— 第一章 绪论

    第一章 绪论 第一章 绪论 1.1 引言 1. 什么是机器学习 2. 机器学习的主要内容 3. 模型与模式 1.2 基本术语 1. 数据集 / 训练集 / 验证集 / 测试集 2. 示例 / 样本 3 ...

最新文章

  1. 抛弃注意力,比EfficientNet快3.5倍,类Transformer新模型跨界视觉任务实现新SOTA
  2. 互联网高薪的原因、现状、未来,还值不值得进来?
  3. RDF -- 资源描述框架
  4. springboot 应用中静态资源下载
  5. Bootstrap中模态框多层嵌套时滚动条问题
  6. java安全 ——JAAS(Java 认证和授权服务)开发指南
  7. PWN-PRACTICE-BUUCTF-23
  8. CSAPP--信息的表示与处理
  9. LA 3695 Distant Galaxy
  10. TensorFlow HOWTO 2.2 支持向量回归(软间隔)
  11. android半透明闪退,(Android)react-native-splash-screen实践-解决react-native打包好后启动白屏的问题...
  12. python 数学期望_数学期望(离散型和连续型)
  13. 10个线程同时执行i++操作1000次,如何保证结果是1w
  14. 最新MT2503平台技术资料集锦
  15. 关于永洪BI Kerberos机制的详细介绍
  16. Webservice接口调用工具类
  17. 计算机键盘换挡键,换挡键alt电脑键盘上的用处有哪些
  18. 打造前端MAC工作站(五)让我们熟悉一下 MAC 命令行吧!
  19. 创意简约土木黑灰配色PPT-朴尔PPT
  20. d2l.train_ch3函数,将输入数据转化为该函数所接受的格式

热门文章

  1. HDU1259 ZJUTACM【模拟】
  2. Bailian1017 装箱问题【贪心】
  3. UVA11150 Cola【数学】
  4. 【线程安全】—— 单例类双重检查加锁(double-checked locking)
  5. Elo rating system(Elo 打分体系)
  6. TensorFlow 学习(十一)—— 正则(regularizer)
  7. 推理集 —— 物品与动物
  8. 条件概率与条件概率举例
  9. utilities(C++)——单例(Singleton) (使用智能指针 shared_ptr)
  10. node将当前文件上传到服务器,以编程方式将文件从node.js上传到另一个Web服务器...