概论

编译原理笔记第一部分,内容参考:北航软院教师邵兵课堂课件及内容、张莉著《编译原理及编译程序构造》、国防工业出版社的《编译原理——学习指导与典型题解析》、AlvinZH的学习笔记以及个人理解

目前是包含了全部内容的版本,后续会推出精简版和复习知识点版

如有建议或错误错误欢迎在评论中指出或联系我:QQ:847590417

阅读目录

1.1 编译的一些基本概念

1.2 编译的全过程

1.3 编译程序的构造

1.4 编译程序的前后处理器

1.5 编译技术的应用

1.1 编译的一些基本概念

低级语言(Low level language)

– 字位码、机器语言、汇编语言

– 特点:与特定的机器有关,功效高,但使用复杂、繁 琐、费时、易出错。

高级语言

– Fortran、Pascal、C语言等

– 特点:不依赖具体机器,移植性好,对用户要求低,易使用,易维护等。

源程序:用编译语言或高级语言编写的程序

目标程序(目标代码):用目标语言所表示的程序,目标语言:没有硬性规定,可以是某种机器的汇编语言、机器语言,也可以是介于源语言和机器语言之间的“中间语言”。

翻译程序:将源程序转换为目标程序的程序成为翻译程序。它是指各种语言的翻译器,是汇编程序、编译程序以及各种变换程序的总称

三者关系:源程序是翻译程序的输入,目标程序是翻译程序的输出

汇编程序:

源程序用汇编语言书写,经过翻译程序得到用机器语言表示的程序吗,这时的翻译程序就称之为汇编程序,这种翻译过程称为“汇编”

编译程序:

源程序用高级语言书写,加工后得到目标程序,这种翻译过程称为“编译”

汇编程序和编译程序都是翻译程序,只是就爱共对象不同,汇编语言格式件单和机器语言有一一对应关系,所以汇编程序要做的翻译工作比编译程序简单得多。

从源程序到真正使用程序有两个阶段:编译、运行

编译或汇编阶段即源程序通过编译程序、汇编程序等翻译程序变为目标程序

运行阶段即通过向目标程序和其运行子程序之中输入数据然后得到输出数据

解释程序:对源程序进行解释执行的程序,对变异的道德中间语言进行解释执行的程序。源程序转化为解释程序:

1.2 编译的全过程

将高级语言程序翻译成等价的目标程序的过程,一般分为五个基本阶段:

词法分析,语法分析,语义分析和生成中间代码,代码优化,生成目标程序

1.词法分析:

分析和识别单词

即扫描源程序(字符串),根据语言的此法规则分析并识别单词,并以某种编码形式输出。

单词:是语言的基本语法单位,一般语言有四大类单词:语言定义的关键字或保留字,标识符(变量名字),常数(常量),分界符(运算符、特殊符号)。词即最小的有意义的单词。

该赋值语句便可识别出9个单词

2.语法分析:

根据相应语言的文法,分析并识别出各种语法成分,如表达式、各种说明、语句、过程、函数等,并进行语法正确性检查。

利用这种文法,语法分析便可根据其将<>中的内容给识别出来,并进行语法检查,如有错误则会输出错误信息。

3.语义分析、生成中间代码:

对识别出的各种语法成分进行语义分析,并产生相应的中间代码

中间代码时一种介于源语言和目标语言之间的中间语言形式,生成的目的:1.便于做优化处理,2.便于编译程序的移植(不必依赖于目标计算机,便于转换成其他形式)

中间代码的形式:编译程序设计者可以自己设计,常用的有四元式、三元式、逆波兰表示等。

例如:

首先识别出是赋值语句,然后分析与以上的正确性,正确后生成中间代码

四元式(三地址指令):

4.代码优化:

从四元式形式的中间代码可知,第一句是常量的计算,所以为了进行优化可以在编译时计算出结果放在工作单元中,这样不必每次都生成目标指令计算。

然后还可以对临时工作单元的数量进行优化:T2变为T1,此时便可减少一个单元的使用。

5.生成目标程序:

生成中间代码后,便很容易生成目标程序(地址指令序列)了,这部分工作和机器关系很密切,所以需要根据具体机器进行。在这部分工作需要注意充分利用累加器,生成时也可进行优化处理。(该过程需要保持语义的等价性)

1.3 编译程序的构造

1.3.1 逻辑结构

根据逻辑功能不同,可将编译过程划分为五个基本阶段,相对应可以将实现整个编译过程的编译程序划分为五个逻辑阶段:

五个阶段都要做两件事:建表和查表和出错处理,即编译程序中都要包括表格管理和出错处理两部分

表格管理(建表和查表):

即及时的把源程序中的信息和编译过程中所产生的信息登记在表格中,而在随后的编译过程中同时又要不断地查找这些表中的信息,编译过程贯穿着建表和查表的工作。

出错处理:

规模较大的源程序难免有多种错误,编译程序必须要有出错处理的工作,即能诊断出错误,并向用户报告错误性质和位置,以便用户修改源程序。出错处理能力的优劣是衡量编译程序质量好坏的一个重要指标。

如上便是典型编译程序的七个逻辑部分,五个逻辑阶段加上两个一直需要进行的工作。

1.3.2 遍(pass)

遍:对源程序(包括源程序的中间形式)从头到尾扫描一次,并作有关的加工处理,生成新的源程序中间形式或目标程序,通常称之为一遍:

一次遍就是完成五个基本阶段的工作,需要经过几次扫描处理

一次扫描就可完成整个编译工作的称为“一遍扫描编译程序”,一遍扫描的编译程序以语法分析程序为核心。

分遍可为编译程序的移植创造条件,主要缺点是增加了不少的重复性工作。

其结构为:

start pass到over pass(SP,OP大概是这个意思)

1.3.3 前端和后端

根据编译程序各部分的功能可将编译程序分成前端和后端

前端:和源程序、源语言有关的这一部分、包括词法分析、语法分析、语义分析、中间代码生成、代码优化这些分析部分

后端:和目标机有关的部分,包括目标程序生成,和目标机有关的优化这些综合部分

划分的原因:

这是一种传统方法,可以实现采用同一个编译程序的前端,金改写后端便可生成不同目标机上的相同源语言的编译程序,并且还可以前后端并行进行工作。

1.4 编译程序的前后处理器

左为前,右为后

源程序:多文件、宏定义和红调用,包括文件

目标程序:一般为汇编程序或可重定位的机器代码

1.5 编译技术的应用

语法制导的结构化编译器,程序格式化工具,软件测试工具,程序理解工具,高级语言的翻译工具等等。

转载于:https://www.cnblogs.com/doUlikewyx/p/11524683.html

#编译原理# 概论(一)相关推荐

  1. 编译原理期末复习—第一章概论

    后续会更新编译原理其他章节(有问题请指正) 文章目录 前言 一.程序设计语言的发展 1.机器语言 2.汇编语言 3.程序设计语言 二.基本术语解释 前言 参考了<编译原理>王生原,张素琴等 ...

  2. 【编译原理】编译原理系统学习与实践系列文章汇总目录(持续更新中)

    本文属于「编译原理」系列文章的汇总目录,这一系列正式开始于2021/10/22,着重于「编译原理的学习与实践」.众所周知,编译原理难学难精,因此本系列将至少持续到作者本人「精通编译原理」为止(笑).由 ...

  3. 学了编译原理能否用 Java 写一个编译器或解释器?

    16 个回答 默认排序​ RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...

  4. 对学习编译原理的看法

    我认为编译原理这本书是一门与代码做斗争的课程,学习编译原理能够追寻程序设计语言的本质,了解计算机各种语言编译的原理.学习了编译原理能够更加深入的了解计算机各种高级语言使用的原理,能使自己更加容易更加好 ...

  5. 《OpenMP编译原理及实现技术》摘录

    内容摘自<OpenMP编译原理及实现技术>第2章 代码测试环境:Windows7 64bit, VS2010, 4核机. 可以说OpenMP制导指令将C语言扩展为一个并行语言,但OpenM ...

  6. 编译原理(六)自底向上分析之LR分析法

    自底向上分析之LR分析法 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 基本概念 1. LR分析:从左到右扫描(L)自底向上进行规约(R),是规范规约,也即最右推导(规范推导) ...

  7. 编译原理上机实习c语言小子集编译程序的实现报告,编译原理上机实习指导书(2015-11修改).pdf...

    <编译原理上机实习>指导书 一.上机实习目的 理解编译程序的构造原理,掌握编译程序的构造方法与技术.通过实习,使学生既加深对 编译原理基础理论的理解,又提高动手能力,特别是提高软件设计能力 ...

  8. 我看过的编译原理方面的好文章

    本文不定期更新,最后更新于2019-7-6 编译原理 编译原理三大经典书籍(龙书 虎书 鲸书) 前端为什么要会正则表达式 - 知乎 一次性搞懂JavaScript正则表达式之引擎 - 掘金 没有AST ...

  9. 添物 不花钱学计算机及编程(预备篇)— 编译原理

    编译原理是将一门语言翻译为另一门语言的学科.如果您只是想当个简单的程序员是可以不用学习的,或者有个了解就可以.但是如果您想更好的发展,就要很好的掌握了. 这门课程最大的特色就是,要自己写代码学习,不能 ...

最新文章

  1. html产品列表页的设计,产品列表页.html
  2. charapter 1
  3. 10个让人厌烦的编程语言
  4. 上海哪个图书馆营业时间最长
  5. Hibernate视频学习笔记(3)常用映射标签及属性
  6. 每日一笑 | 实名举报校长拿两份工资!
  7. cdn厂商 同兴万点_CDN进入牌照时代 工信部规范和清理CDN市场
  8. pcap封包修改服务器数据,tcprewrite批量修改pcap数据报文
  9. 安装Kibana报错[warning][admin][elasticsearch] Unable to revive connection: http://localhost:9200/
  10. 手机上有没有学python的软件-如何优雅的在手机上进行Python编程
  11. 浅谈操作系统是如何工作的及简单的进程调度的linux实现
  12. 一个小小的发现--音频也八卦
  13. 软件工程课程实践-用户操作手册
  14. html自定义属性jquery怎么拿到,jquery 获取自定义属性(attr和prop)的实现代码
  15. linux自动升级关闭,Ubuntu关闭内核自动更新
  16. 优盘扩容修复 u盘工具
  17. 上月和本月对比叫什么_统计学中与上个月比叫什么
  18. 日本警方称地震造成3676人死亡7843人下落不明
  19. C++为什么空格无法输出_47个快捷键、50个CAD技巧,终于知道为什么别人用CAD总比我快了!...
  20. Geometric Distortion Correction 畸变矫正

热门文章

  1. akoj-1291-决战21点(C#)
  2. java、C语言数组反转
  3. android onkeydown()简介
  4. 安卓各大应用商店上架注意事项汇总
  5. Vue 实现 Hover 功能( mouseover 与 mouseenter 的区别)
  6. ai不同形状的拼版插件_Illustrator(AI)自动拼版脚本 V1.5下载(编组对象的复制位移)...
  7. Shopify payments二次验证
  8. 微分电路与积分电路分析
  9. 互联网体育健康猫触雷之败:留给了创业者什么警示?
  10. Python数据分析之Pandas库