编译原理(王生源第三版)第一章学习笔记(含第一章习题)
1.什么是编译程序
翻译程序/翻译器:它读入用某种语言编写的程序(源程序),翻译成一个与之等价的另一种语言编写的程序(目标程序),这两种语言分别称为源语言和目标语言。
编译程序/编译器:源语言类似Pascal或C那样的高级语言,目标语言是像汇编语言或机器语言那样的低级语言,则这种翻译程序称做编译程序。
解释程序/解释器:它以该语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序本身。
编译程序和解释程序的区别:
- 二者本质区别在于是否生成目标代码
- 编译型代表:C&C++ C# Java 解释型代表:Shell,JavaScript,SQL
- 编译型语言的源代码有错误编译不通过,无法生成课执行代码,更无法执行程序
- 解释型语言只有执行时才会判断是否出错,即使一句出错,也可以继续执行下一句
- 编译型语言执行效率上大大由于解释器
2.编译过程和编译程序的结构
2.1词法分析
这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词,又称扫描器。
单词符号:基本字,标识符,常数,算符和界符
词法规则用正规式和有限自动机描述(第三章)
2.2语法分析
- 单词符号串→语法单位
- 语法分析所依据的是语言的语法规则,即描述程序结构的规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。语法规则用上下无关文法描述(第4,5,6章)
- 语法单位:短语,句柄,句子,程序段和程序
- 程序的结构通常是由递归规则表示的,可以用如下的规则来定义表达式:
- 任何标识符是表达式
- 任何常数(整常数、实常数)是表达式
- 若表达式1和表达式2都是表达式,那么:表达式1+表达式2 表达式1*表达式2 (表达式1)都是表达式 类似地,语句也可以递归地定义,如(1)标识符 :=表达式 是语句。(2)while(表达式)do 语句和if(表达式)then 语句 else语句都是语句
2.3语义分析
语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。
语义检查:变量是否定义,类型是否正确(第7,8章部分内容)
按照语义规则对语法分析器归约出的语法单位进行语义分析,并把它们翻译成一定形式的中间代码。
2.4中间代码生成
所谓中间代码是一种结构简单,含义明确的记号系统,这种记号系统可以设计为多种多样的形式,重要的设计原则为两点,一是容易生成,而是容易将它翻译成目标代码。
四元式中间代码(第7,8章):
形式为(运算符,运算对象1,运算对象2,结果)
2.5代码优化
这一阶段的任务是对前一阶段产生的中间代码进行变换或进行改造,目的是使生成的目标代码更为高效,即省时间和省空间。
对中间代码进行优化处理(第10章)
2.6目标代码生成
这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。(第10章)
2.7“遍”的概念
编译程序通常被组成若干遍。所谓遍就是对源程序或源程序的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序
2.8表格管理程序和出错处理程序
表格管理:符号表管理
用来登记源程序中出现的每个名字及其属性,如常量名,变量名,过程名等
如果是变量名,其属性有类型、内存大小、地址等(第8章)
出错处理:用来发现程序中的错误
程序中的错误分为语法错误和语义错误
语法错误在词法分析(非法字符)和语法分析(括号不匹配)时检测
语义错误在语义分析时检测(类型错误)
2.9编译前端和后端
前端相同,后端不同,在不同的目标机器上运行相同的语言
前端不同,后端相同,在不同的语言编译成相同的中间语言
3.解释程序和一些软件工具
集成开发环境
编译程在高级诧言发展的早期,这些程序设计工具往往是独立的,缺乏整体性,而丏也缺乏对软件开发全生命周期的支持。随着软件技术的不断发展,现在人们越来越倾向于构造集成化的软件开发环境 (IDE, IntegratedDevelopment Environment) 。一个集成化的程序设计环境的特点是,它将相互独立的程序设计工具集成起来,以便为程序员提供完整的、一体化的支持,从而迚一步提高程序开发效率,改善程序质量。
4.课后习题:
1.解释下列术语
编译程序:将源语言是像FORTRAN/Pascal或C那样的高级语言翻译成与之等价的类似汇编语言或机器语言那样低级语言,这样的翻译程序称作编译程序。
源程序:是指未经编译过的,按照一定的程序设计语言规范书写的,人类可读的文本文件。
目标程序:目标程序:指源程序经编译可直接被计算机运行的机器码集合(二进制代码)
编译程序的前端:主要依赖于源语言和目标机无关。
编译程序的后端:与源语言无关,与目标机有关,依赖于中间代码
2.编译程序有哪些主要构成部分?各自主要的功能是什么?
6个阶段:
词法分析:这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词,又称扫描器。
语法分析:是在词法分析的基础上将单词序列分解成各类语法短语,如“程序”、“语句”、“表达式”等。
语义分析:审查源程序有无语义错误,为代码生成阶段收集类型信息
中间代码生成:所谓中间代码是一种结构简单,含义明确的记号系统,这种记号系统可以设计为多种多样的形式,重要的设计原则为两点,一是容易生成,而是容易将它翻译成目标代码。
代码优化:这一阶段的任务是对前一阶段产生的中间代码进行变换或进行改造,目的是使生成的目标代码更为高效,即省时间和省空间。
目标代码生成:这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。
3.什么是解释程序?它与编译程序的主要不同是什么?
解释程序:它以该语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序本身。
编译程序和解释程序的区别:二者本质区别在于是否生成目标代码
4..对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、代码生成)报告的。
(1)else没有匹配的if——语法分析
(2)数组的下标越界——语义分析
(3)使用的函数没有定义——语义分析
(4)在数中出现非数字字符——词法分析
编译原理(王生源第三版)第一章学习笔记(含第一章习题)相关推荐
- CSS3秘笈第三版涵盖HTML5学习笔记6~8章
第二部分----CSS实用技术 第6章,文本格式化 指定备用字体: font-family:Arial,Helvetica,sans-serif; 当访问者没有安装第一种字体时,浏览器会在列表中继续往 ...
- CSS3秘笈第三版涵盖HTML5学习笔记13~17章
第13章,构建基于浮动的布局 使用的是float(浮动)属性 注:float:none值将取消所有浮动,通常只用来取消元素中已经应用的浮动. 切记:不需要给正文的div设计宽度,即使设计成固定宽度也不 ...
- 编译原理个人作业--第五章——基于 编译原理 国防工业出版社 第三版
1 文法 G 1 G_1 G1为 E → E + T ∣ T T → T ∗ F ∣ F F → ( E ) ∣ i E\rightarrow E+T|T\\ T\rightarrow T*F|F\ ...
- matlab快速入门案例及常用技巧 | 《matlab数学建模方法与实践(第三版)》学习笔记
目录 快速入门案例: 解决流程: 具体实现: 一.获取数据 二.数据探索和建模 三.分享结果 常用技巧 一.常用标点功能 二.常用操作指令 三.指令编辑操作键 四.matlab数据类型 五.开发模式 ...
- 北邮通信原理公开课 杨鸿文老师 课程学习笔记【第一课 信号】
第一课 实信号 1.信号表示:s(t),s代表的是电压 2.正弦波表示: 功率是A的平方/2(可见下面的介绍) 3.矩形脉冲: rect(t/T)=u(t+T/2)-u(t-T/2),u(t)是单位阶 ...
- 汇编语言(王爽第三版) 实验5
汇编语言(王爽第三版) 实验5 由图可见: 第一问:cpu执行程序,程序返回前,ds一直未变,所以data段中的数据不变. 第二问:cpu执行程序,程序返回前,cs=1CD5,SS=1CD4,DS=1 ...
- 编译原理上机实习c语言小子集编译程序的实现报告,合肥工业大学编译原理实验报告(完整代码版)...
<合肥工业大学编译原理实验报告(完整代码版)>由会员分享,可在线阅读,更多相关<合肥工业大学编译原理实验报告(完整代码版)(58页珍藏版)>请在人人文库网上搜索. 1.计算机与 ...
- 编译原理练习题(第三章)
编译原理练习题(第三章) 一. 二. 三. 四.
- 单片机原理及应用第三版课后答案张毅刚
单片机原理及应用第三版张毅刚答案 内容简介 本书为"十二五"普通高等教育本科*规划教材单片机原理及应用第三版课后答案,全书详细介绍了美ATMEL公司的增强型AT89S52单片机的硬 ...
- 大数据技术原理与应用 第三版 林子雨 期末复习(二) Hadoop HDFS HBase
大数据技术原理与应用 第三版 林子雨 期末复习(二) Hadoop HDFS HBase Hadoop生态系统 HDFS HDFS结构 块 Name Node与Second Name Node与Dat ...
最新文章
- Django 数据库ORM 操作 - 字段的类型和参数
- 开启nginx状态监控
- 好奇,我们常用的 Integer 内部为什么会去实现 Comparable 接口,他的作用是什么?...
- TX-LCN分布式事务框架开发文档
- WebAssembly生态将完善网络安全性
- C/C++查找一定范围内的素数(筛法)
- 诺基亚正式收购阿朗:物联网时代再出发
- php echo 大括号,PHP中echo输出中存在括号()的处理
- Ubuntu执行脚本报错-bash: ./send.py: /usr/bin/python: bad interpreter: Permission denied
- windows版本redis搭建集群步骤
- SpringBoot2.6.5整合CXF框架
- 恒指期货高手背后的辛酸付出谁又能懂
- Direct3D 11 Devices 之 Using Direct3D 11 feature data to supplement Direct3D feature levels
- uniapp不是自定义导航栏的情况下,点击返回按钮直接返回首页
- 5G/NR 5G核心网(5GC)之网络功能和实体
- 网友8年观察楼市得出11大房价经验 高手在民间
- python 循环控制语句结束_孤荷凌寒自学python第十五天python循环控制语句
- 郊区春游(NC16122)状压dp
- android开发笔记之sh脚本
- vscode在html看到图片的插件_PPT做得又慢又丑?低调分享3款PPT辅助插件,轻松制作炫酷PPT...
热门文章
- 趋势防毒墙网络版的安装部署(officescan)
- 今天居然中了MSN病毒。
- dSPACE软件简单使用
- MUD是永远不会结束的,因为它就是人生(转)
- 【教程】Edraw Max(亿图图示)基本操作图文详解
- 计算机找不到spoon文件,windows重装系统没有找到spoon.sys修复spoon.sys文件损坏方法...
- Python如何连mysql数据库教程
- linux 开机启动项文件夹,linux开机启动项设置
- 删除任务管理器中的启动项
- scan ip和vip的关系疑惑