<自考学习记录> 课程代码6370《编译技术》<3>

编译程序的结构
在1.2中写到的5个阶段是编译程序工作时的动态特征。
编译程序的结构可以按照5个阶段的任务分模块进行设计。

图片来源:https://blog.csdn.net/MapleSky2017/article/details/78157596
该图为比较典型的编译程序的结构设计图,该图清楚的表现了数据的转换过程。
图中的词法分析程序、语法分析程序(语义分析程序)、中间代码生成程序、代码优化程序、目标代码生成程序将分别完成1.2中写到的5个阶段的编译任务,每个阶段的输出为下一个阶段的输入。第一阶段的输入为源程序,最后阶段的输出为目标程序。
注:每个阶段的工作都与表格管理程序和出错处理程序这两个模块相关。
词法分析程序又称扫描器语法分析程序(语义分析程序)又称分析器
有的编译程序在识别出各类语法单位后,构造并输出一棵表示语法结构的语法树,然后根据语法树进行语义分析和中间代码产生。
还有许多编译程序在识别出语法单位后并不能真正构造语法树,而是调用相应的语义子程序,这种编译程序中扫描器分析器中间代码生成程序三者并非是截然分开的,而是互相穿插的,这样可以大大提高编译程序自身的工作效率。
编译过程中源程序的各种信息被保留在种种不同的表格里,编译各阶段的工作都涉及到构造、查找或更新有关表格,因此在编译程序中需要有一组管理各种表格的程序。
如果源程序有错误,编译程序应设法发现错误,把有关出错信息报告给用户,这部分工作是由专门的一组程序(命名:出错处理程序)来完成。
一个好的编译程序应能最大限度的发现源程序中的各种错误,准确指出错误性质和发生错误的地点,并且能将错误所造成的影响限制在尽可能小的范围内,使得源程序可以继续编译其余部分,以便进一步发现其他可能的错误,出错处理程序与编译的各个阶段都有联系,前三段尤为密切。

PS:要在某台机器上为某种语言构造一个编译程序,必须掌握以下三方面内容。
1.源语言,对被编译的语言要深刻的理解其结构和含义。
2.目标语言,假定目标语言是机器指令,那么就必须搞清楚硬件的系统结构和操作系统功能。
3.编译方法,把一种语言程序翻译成另一种语言的程序。

我作为一个抄书党,希望的是我个人能够把书中的每一个角落都看到并能产生自己的理解。
请大家多实践,多练习,效果会更好,一起努力,一起进步(??????)??

原文地址:http://blog.51cto.com/13550568/2113989

时间: 2024-07-31 14:33:22

<自考学习记录> 课程代码6370《编译技术》<3>的相关文章

&lt;自考学习记录&gt; 课程代码04737《C++程序设计》&lt;1&gt;

1.1 初识C++的函数和对象1.C++和C语言的关系C++是一种优秀的高级程序设计语言,它是以C语言为基础而逐渐发展起来的.C++语言既保留了传统结构化程序设计方法,又对流行的面向对象程序设计方法提供了完整的支持.此外,C++语言还具有许多C语言不支持的新功能和新特性.具体区别我觉得这里讲的更详细,各位没事可以瞅瞅:C语言和C++ C?的区别在什么地方?https://www.zhihu.com/question/216102432.函数原型和命名空间函数原型函数原型类似函数定义时的函数头,为

&lt;自考学习记录&gt; 课程代码03708《中国近代史纲要》&lt;1&gt;

反对外国侵略斗争YP战争前的的中国和世界1.1 YP战争前的中国政治:实行高度中央集权的封建君主专制制度.经济:封建土地所有制占主导地位.基本生产结构:小农经济(小农经济的特征是个体家庭为单位并与家庭手工业相结合的自给自足的自然经济).文化:以儒家思想为核心.社会:社会结构:是族权和政权相结合的封建宗法等级制度,核心是宗族家长制.家长制含义:https://baike.baidu.com/item/%E5%AE%B6%E9%95%BF%E5%88%B61.2 从乾隆皇帝后清王朝由盛转衰(晚清的危

学习记录:gcc/g++ 编译与链接

gcc/g++ 编译与链接 编译与链接的过程可以分解为四个步骤:预处理.编译.汇编.链接 预处理:源代码文件和相关的头文件,被预处理器cpp预处理成一个后缀为 .i 的文件(选项:-E) 编译:把预处理完的文件进行一系列的词法分析.语法分析.语义分析以及优化后,产生相应的汇编代码文件,后缀为 .s,(选项 :-S ) 汇编:把编译阶段生成的 .s 文件转成二进制目标代码,后缀为.o,(选项:-c) 链接:把每个源代码模块独立地编译,然后按照要将它们"组装"起来.链接的主要内容就是把各个

Android开发技术周报183学习记录

Android开发技术周报183学习记录 教程 Android性能优化来龙去脉总结 记录 一.性能问题常见 内存泄漏.频繁GC.耗电问题.OOM问题. 二.导致性能问题的原因 1.人为在ui线程中做了轻微的耗时操作,导致ui线程卡顿. 2.layout过于复杂,无法在16ms完成渲染.使用RelativeLayout替换LinearLayout,说是可以减少布局层次,然而,现在不再建议使用RelativeLayout,因为ConstraintLayout才是一个更高性能的消灭布局层级的神器.Co

TP框架代码学习 学习记录 3.2.3

文件:think.class.php PHP提供register_shutdown_function()这个函数,能够在脚本终止前回调注册的函数,也就是当 PHP 程序执行完成后执行的函数.register_shutdown_function 执行机制是:PHP把要调用的函数调入内存.当页面所有PHP语句都执行完成时,再调用此 函数.注意,在这个时候从内存中调用,不是从PHP页面中调用,所以上面的例子不能使用相对路径,因为PHP已经当原来的页面不存在了.就没有什么相对路 径可言.注意:regis

android防反编译技术初体验——混淆

这几天做项目要做混淆,所以搜集资料学习了下,这次主要记录混淆的步骤,如有需要改正和完善的地方,还麻烦能够指出,大家共同进步o(* ̄▽ ̄*)ブ 1.项目防反编译技术步骤: a) 加密. b) 混淆. c) 加壳(加固); 2.加密:对信息进行摘要计算,然后摘要值用私钥进行验签,重要数据使用rsa非对称加密: 3.混淆:Android Studio开发工具自身集成了Java语言的ProGuard技术,对java代码有压缩.优化.混淆.预检的功能,AcFlash项目的Android端使用了ProGua

JVM学习记录-线程安全与锁优化(二)

前言 高效并发是程序员们写代码时一直所追求的,HotSpot虚拟机开发团队也为此付出了很多努力,为了在线程之间更高效地共享数据,以及解决竞争问题,HotSpot开发团队做出了各种锁的优化技术常见的有:自适应自旋锁(Adaptive Spinning).锁消除(Lock Elimination).锁粗化(Lock Coarsening).轻量级锁(Lightweight Locking)和偏向锁(Biased Locking)等. 自旋锁与自适应自旋 互斥同步对性能最大的影响是阻塞的实现,线程的挂

JS继续学习记录(一)

JS继续学习记录(一) 总感觉自己的js code写的还算可以,但是又深知好像只知道一些皮毛,所以打算仔细记录一下js晋级学习过程,日日往复 先记录一下自己目前对js的了解吧(20180828) js作为脚本语言,包括核心语法,dom,bom三部分组成. 1.核心语法:变量,函数的定义,一些js内置对象的调用,如array,如json,基本数据类型,引用数据类型若干,各自的用法云云. 2.dom对象:html的页面对象的封装,封装成的dom对象内包括html的基础属性,衍生属性,监听器,绑定函数

程序的机械级表示学习记录

程序的机械级表示学习记录 X86的三代寻址方式 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全. 8086的分段模式. IA32的带保护模式的平坦模式. 对于机械级编程的两种重要抽象 ISA:机械级程序的格式和行为,定义为指令集体系结构,它定义了处理器状态.指令的格式,以及每条指令对状态的影响. 虚拟地址:机器级程序使用的存储器地址,提供的存储器模型看上去是一个非常大的数组.存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来的. 在GCC中获得汇编代码与反汇编 获得汇编代码: