第八章源程序的中间形式

合集下载

编译原理:第八章 符号表

编译原理:第八章 符号表
规定主程序的层次为1主程序中定义的层次为2依次类推名字的类型类型有整型ints字符型chars布尔型bool数组arrays对于无类型的名字填入notype一个布尔量用于标明名字是否为变量形参名当名字是否为变量形参名时填入false其他情况填入true或不填当名字为数组类型或数组变量名时ref指向该数组在数组信息表中的位置
合肥工业大学 计算机与信息学院软件所
表 0.1 符号名表 SNT NAME INFORMATION M 形式参数,整 型,值参数 N 形式参数,整 型,值参数 K 整型,变量
表 0.2 常数表 CT 值 (VALUE) (1) 1 (2) 4
表 0.3 入口名表 ENT NAME INFORMATION (1) INCWAP 二目子程序, 入口四元式:1

ax→
数组下限 数组上限 数组元素的体积 数组本身的体积 当元素为数组时,它指向 数组元素类型 数组的下标类型 该元素数组信息在atab表 中的位置,其他情况为0
合肥工业大学 计算机与信息学院软件所
type a=array[1..10, 1..10] of integer;
name kind typ ref
合肥工业大学 计算机与信息学院软件所
PL 语言编译程序的符号表
1. 表格的定义 名字表(nametab) 程序体表(btab) 层次显示表(display) 数组信息表(atab) 中间代码表(code)
合肥工业大学 计算机与信息学院软件所
1) 名字表(nametab) 名字表nametab:登记程序中出现的各种名 字及其属性
lastpar last psize vsize 0 1

bx→
指向本程序体中最后一个形式参在 本程序体所有局部数据所 指向本程序体中最后一个名字在 本程序体所有形参所需体积、包 nametab 中的位置 需空间大小 nametab 中的位置 括连接数据所占空间

计算机操作系统第八章

计算机操作系统第八章

将每一组含有的盘块数和该组所有的盘块号,记入前一组的第一个盘块的S.free[0]~S.free[99]中。这样,各组的第一个盘块就链接成一个链表。
将第一组的盘块总数和所有的盘块号,记入空闲盘块号栈中,作为当前可供分配的空闲盘块号。
1
2
3
4
UNIX空闲盘块的组织
文件目录是一种数据结构,由若干目录项组成,每个目录项对应其中一个文件的FCB(包括文件名、文件体的物理地址、存取控制信息等),文件体另外存放。文件目录是用于检索文件的,一般的,目录项应包括以下内容:
整个系统只设一张文件目录表,集中存放文件存储器上所有文件的FCB,这是最简单的一种目录结构。目录表存于外存中的某块固定区域,系统初启或需要时调入内存,每个文件的FCB对应目录表中的一项,通过目录表就可以管理该系统中的所有文件,包括对文件的创建、检索和删除等。
两级文件目录
把登记文件的目录分成两级:主文件目录MFD,和用户文件目录UFD 。系统为每个用户各设置一个UFD,登记本用户所有文件的信息,每个UFD相当于一个一级目录;系统再设置一个MFD,用来登记所有用户的用户名及其UFD在外存上的物理地址、长度,物理结构等属性。
01
记录式文件,在逻辑上可看成是一组记录的集合。每个记录由彼此相关的若干个数据项组成。记录式文件中的逻辑记录可依次编号,其序号称为逻辑记录号(简称记录号)。
02
文件逻辑结构
按照文件的逻辑地址顺序存取。在记录式文件中,这种操作体现为按照记录的排列顺序来进行存取。
01
文件的随机存取 随机存取是指允许用户按照记录编号或者某一数据项的值随机存取存取任一记录。
二级索引存储结构
将索引表离散存储,即将索引表本身分为若干个逻辑块,存储在若干物理盘块中,将索引表所占的各盘块号记入另一个索引表——索引表的索引表。这种结构就称两级索引结构。

第八章 语法制导翻译和中间代码生成

第八章 语法制导翻译和中间代码生成

目标代码
5
语义分析
语义分析的任务:在词法分析和语法分析的基础上,
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
分析所写源程序的含义,在理解含义的基础上为生成 相应的目标代码作好准备或直接生成目标代码。 1)静态语义检查 例:类型检查、运算、维数、越界 2)语义翻译(具体的动作) 例:语句的翻译(中间代码或目标代码生成)
16
简化定义
对每个产生式,设属性定义性出现的集合为
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
若Xi是产生式左部非终结符(即i=0),则称属性 Xi.a是综合属性(Synthesized Attributes) 若Xi出现在产生式的右部(即i≠0 ),则称Xi.a是 继承属性(Inherited Attributes)
2
教学内容
第一节
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
属性文法 语法制导翻译概论 中间代码的形式 简单赋值语句的翻译 布尔表达式的翻译 控制语句的翻译 说明语句的翻译 数组和结构的翻译
3
第二节 第三节 第四节 第五节 第六节 第七节 第八节
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
2.组成
语法树上的每个节点的所有属性在依赖图上各有 一个节点,如果属性y依赖于属性x,那么从x的节点 到y的节点有一条有向边。 【注】如果语法树一节点的属性y依赖某个节点的属 性x,那么属性y的语义产生式的计算必须在属性x的 语义产生式的计算之后进行。 24
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
13
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
3、文法规则number→number digit ,表明文法的个 数不止一个。我们必须表示出这个文法规则左边符 号的值和右边符号的值之间的关系。通过使用下标 进行区分,将文法写成如下形式: number1→number2 digit

软件工程(第五版)--习题及答案---第八章

软件工程(第五版)--习题及答案---第八章

一、判断题1、(√)使用括号改善表达式的清晰性。

2、(×)对递归定义的数据结构不要使用递归定义的过程。

3、(×)尽可能对程序代码进行优化。

4、(√)不要修改不好的程序,要重新编写。

5、(√)不要进行浮点数的相等比较。

6、(×)应尽可能多地使用临时变量。

7、(√)利用数据类型对数据值进行防范。

8、(×)用计数方法而不是用文件结束符判别批量数据输入的结束。

9、(×)程序中的注释是可有可无的。

10、(√)使用有意义的标识符。

11、(×)应尽量把程序编写的短一些。

12、(×)应尽量使用goto语句。

二、选择题1、在编码中首先要考虑的是(B)。

A、程序的执行效率B、程序的可读性C、程序的一致性D、程序的安全性2、(D)。

不属于序言性注释内容的是A、模块设计者B、修改日期C、程序的整体说明D、语句功能3、序言性注释应置于文件或模块的(A)位置。

A、起始B、结束C、中间D、起始和中间4、如果编写系统软件,可选用的语言是(C)。

A、FoxProB、COBOLC、CD、FORTRAN5、选择程序设计语言不应该考虑的是(B)。

A、应用领域B、语言的功能C、用户的要求D、用户的使用水平6、与编程风格有关的因素不包括(D)。

A、源程序文档化B、语句构造C、输入输出D、程序的编译效率7、最早用于科学计算的程序设计语言是(C)。

A、PROLOGB、SmalltalkC、FORTRAND、COBOL8、功能性注释的主要内容不包括(B)。

A、程序段的功能B、模块的功能C、数据的状态D、语句的功能9、对建立良好的编程风格,下面描述正确的是(A)。

A、程序应简单、清晰、可读性好B、符号名的命名只要符合语法即可C、充分考虑程序的执行效率D、程序的注释可有可无10、源程序中应包含一些内部文档,以帮助阅读和理解程序,源程序的内部文档通常包括合适的标识符、注释和(A)。

操作系统第八章

操作系统第八章
当用户程序被装入内存时,一次性实现逻辑地址到物理
地址的转换,以后不再转换。 优点
比较简单,无需硬件机构支持。
在程序执行前全部装入内存 程序的存储空间只能是连续的一片区域,不能再移动 难于实现程序的共享
早期的计算机系统中使用
静态地址重定位
0 0
100
LOAD 1,500
5000
第8章 内存管理
目的:内存有限,有效地对内存进行管理 内容:
地址与地址绑定 覆盖与交换 内存分配方法
连续分配 分页 分段 段页式
8.1 背景


程序必须装入主存才能执行 输入队列 – 在磁盘上等待调入内存以便执行的进程形成 了输入队列。 一般是从输入队列中选一个进程并装入内存; 进程在执行时,会访问内存中的指令和数据。 进程终止时,其占用内存地址将被释放。 用户程序在执行前,需要经过好几个步骤: 编辑:敲入命令,存放在文件中,如file.c 编译:将源程序编程目标代码 链接:将编译后的一组目标模块及它们所需的库函 数装配成一个完整的装入模块的过程 装入:将程序装入到内存中 运行:


在将目标程序装入内存时,与地址相关的各项均不作修改, 便于程序装入后在内存中的迁移。有利于紧缩、碎片问题的 解决。 容易实现程序的共享。 现在的计算机系统都采用这种方法,它是虚拟存储的基础。
动态地址重定位


基址寄存器中(BR) 的值加上逻辑地址产 生一个物理地址 得到的结果与界限寄 存器的值比较
50K Total: 190K Resident 20K Overlay 0 50K Total: 110K
C 30K D 20K E 40K
F 30K
Overlay 1 40K

web课程设计含源程序

web课程设计含源程序

web课程设计含源程序一、课程目标知识目标:1. 让学生掌握Web设计的基本原理,理解HTML、CSS和JavaScript等核心技术;2. 学会使用主流的Web开发工具,能够独立编写、修改和调试简单的Web 页面;3. 了解Web前端框架的作用,学会使用至少一种框架进行页面布局和响应式设计;4. 理解Web后端开发的基本概念,了解服务器端语言和数据库的基本操作。

技能目标:1. 培养学生具备独立设计和开发静态Web页面的能力;2. 培养学生运用前端框架进行响应式页面设计的能力;3. 培养学生具备基本的Web后端开发能力,能够实现简单的数据交互;4. 培养学生具备良好的代码编写习惯,能够撰写结构清晰、易于维护的源程序。

情感态度价值观目标:1. 激发学生对Web开发的兴趣,培养其主动探索、自主学习的精神;2. 培养学生的团队协作意识,使其学会与他人共同解决问题,共同完成任务;3. 培养学生具备良好的职业道德,尊重他人的知识产权,遵循开源协议;4. 引导学生关注Web技术的发展趋势,培养其创新意识和持续学习的习惯。

课程性质:本课程为实践性较强的学科,要求学生在掌握基本理论知识的基础上,注重动手实践,培养实际开发能力。

学生特点:本课程针对的学生群体为具备一定计算机基础知识和编程能力的初中生,他们对新鲜事物充满好奇,善于接受新技术,但需加强团队协作和自主学习能力的培养。

教学要求:结合学生特点,注重理论与实践相结合,强调动手实践,提高学生的实际开发能力。

同时,关注学生的情感态度价值观培养,使其在学习过程中形成良好的职业道德和持续学习的习惯。

在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. Web基础知识:HTML、CSS、JavaScript基本语法与用法,包括文本、图像、链接、列表、表格等元素的使用,以及样式定义、布局控制和基本交互功能实现。

教材章节:第一章至第三章。

2. 前端框架:介绍Bootstrap、Vue.js等主流前端框架的原理与使用方法,重点学习响应式布局设计和组件化开发。

编译第8章

编译第8章
–是一种接近形式化的语义描述方法 –长于描述静态语义、短于描述动态语义 –每个语法符号有相应的属性符号 –每个产生式有相应的计算属性的规则:
• 属性变量=属性表达式
1、属性文法定义
属性文法(attribute grammar)是一个三元 组:A=(G,V,F),其中 G:是一个上下文无关文法 V:有穷的属性集,每个属性与文法的一个终结符或非 终结符相连,这些属性代表与文法符号相关信息, 如它的类型、值、代码序列、符号表内容等等 .属 性与变量一样,可以进行计算和传递。属性加工 的过程即是语义处理的过程。 F:关于属性的属性断言或一组属性的计算规则(称为 语义规则) . 断言或语义规则与一个产生式相联,只 引用该产生式左端或右端的终结符或非终结符相 联的属性.
addtype
id3
addtype
例5-4:real id1,id2,id3 的分析树和属性计算
8.3 中间代码的形式
何谓中间代码: 源程序的一种内部表示,不依赖目标机的 结构,易于机械生成目标代码的中间表示。 为什麽要此阶段 逻辑结构清楚; 利于不同目标机上实现同一种语言; 利于进行与机器无关的优化; 这些内部形式也能用于解释;
• 语义处理
–例:变量的存储分配 –例:表达式的求值 –例:语句的翻译(中间代码的生成)
• 总目标:生成等价的中间代码
语义处理方法
• 对应每一个产生式编制一个语义子程序, 当一个产生式获得匹配时,调用相应的 语义子程序实现语义检查与翻译。 • 在产生式的右部的适当位置,插入相应 的语义动作,按照分析的进程,执行遇 到的语义动作。
8)若把语义子程序改成产生某种中间代 码的动作,就能在语法分析制导下,随 着分析的进展逐步生成中间代码。 9)若把语义子程序改成产生某种机器的 汇编语言指令,就能随着分析的进展逐 步生成某机器的汇编语言代码。

C语言程序设计(第八章)

C语言程序设计(第八章)
字符读写函数fgetc()和fputc()是以字符(字节)为单位
的读写函数。 每次可从文件读出或向文件写入一个字符。
第八章
1.读字符函数fgetc()
fgetc() 函数的功能是从指定的文件中读一个字符,函
数调用的形式为:
字符变量 = fgetc(文件指针);
例如:
ch = fgetc(fp);
的意义是从打开的文件fp中读取一个字符并送入ch中 。
(1)字符读/写函数 :fgetc()/fputc()
(2)字符串读/写函数:fgets()/fputs()
(3)数据块读/写函数:freed/()fwrite()
(4)格式化读/写函数:fscanf()/fprinf()
以上函数原型都在头文件stdio.h中加以声明。
第八章
8.5.1字符读/写函数 :fgetc()/fputc()
关闭文件则断开指针与文件之间的联系,禁止再对该文
件进行操作。
第八章
8.3.1 文件打开的函数fopen()
open函数用于打开一个文件,其调用的一般形式为: 文件指针名 = fopen(文件名, 使用文件方式);
“文件指针名”:必须是被说明为FILE 类型的指针变量。
“文件名”:被打开文件的文件名,“文件名”是字符串常 量、字符数组或字符指针。 “使用文件方式”:指文件的类型和操作要求。
/* 输出系统提示信息 */
上面程序段的意义是,如果返回的指针为空,表示不能 打开test.dat文件,则给出提示信息“打开文件test.dat出 错!”,然后输出系统提示信息,当用户从键盘敲任一键后 执行exit(1)退出程序 。
第八章
8.3.2 文件关闭的函数fclose()
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
既然是“抽象机”,就是表示它并不是实际的物 理目标机器而通常是虚拟的一台“堆栈计算机”。该 堆栈式计算机主要由若干寄存器、一个保存程序指 令的储存器和一个堆栈式数据及操作存储组成。
北京航空航天大学软件工程研究所
11
寄存器有:
1.PC-程序计数器 2.NP-New指针,指向“堆”的顶部。“堆”用来存放由NEM
赋值语句的波兰表示:A:=F*3.1416*R*(H+R)
AF3.1416*R*HR+*:=
北京航空航天大学软件工程研究所
3
if语句的波兰表示
有如下if语句:if <expr> then <stmt1> else <stmt2> 波兰表示为 :<expr><label1>BZ<stmt1><label2>BR<stmt2>
栈底 运行栈
当前模块动 记录(数据段)
堆 常量区
堆低
北京航空航天大学软件工程研究所
13
运行P-code的抽象机没有专门的运算器或 累加器,所有的运算(操作)都在运行栈的栈顶进 行,如要进行d:=(a+b)*c的运算,生成P-code序 列为:
栈底:
SP
运行栈
a单元 b单元 c单元 d单元
a
b 栈顶
三元式 (1)*, C, D (2)/ ,(1),E (3)+,B,(2) (4):=,A,(3) (5):=,F,(1)
北京航空航天大学软件工程研究所
9
四元式表示
操作符 操作数1 操作数2 结果
结果:通常是由编译引分的临时变量,可由编译程序 做一个寄存器或主存单元。
例: (A+B)*(C+D)-E
显然,生成抽象机P-code的编译程序时很 容易移植的。
北京航空航天大学软件工程研究所
5
8.2 N-元表示
在该表示中,每条指令由n个域所组成,通常第一 个域表示标识符,其余位操作符。
常用的n元表示是: 三元式 四元式
三元式
操作符 左操作符 右操作符
表达式的三元式:w*x+(y+z)
(1)*, w, x (2)+, y, z (3)+, (1), (2)
北京航空航天大学软件工程研究所
4
波兰表示为 :<expr><label1>BZ<stmt1><label2>BR<stmt2> 由if语句的波兰表示可生成如下的目标程序框架:
<expr> BZ label1 <stmt1> BR label2 label1:<stmt2> label2:
其他语言结构很容易将其翻译成波兰表示,使 用波兰表示优化不是十分方便。
间接三元式:
为了便于在三元式上作优化处理,可使用间接三元式
三元式的执行次序用另一张表表示,这样在优化时(三 元式位置的变更实际是执行顺序的变化),三元式可以 不变,而仅仅改变其执行顺序表。
北京航空航天大学软件工程研究所
8
例: A:=B+C*D/E F:=C*D
用间接三元式表示为:
操作 1.(1) 2.(2) 3.(3) 4.(4) 5.(1) 6.(5)
第八章:源程序的中间形式
• 8.1 波兰表示 • 8.2 N-元表示 • 8.3 抽象机代码
北京航空航天大学软件工程研究所
1
8.1 波兰表示
一般编译程序都生成中间代码,然后再生成目 标代码,主要优点是可移植(与具体目标程序无关), 且易于目标代码优化。有多种中间代码形式:
波兰表示 N-元表示 抽象机代码
BZ:二目操作符,如果<expr>的计算结果为0 <false>,则 产生一个<label1>的转移,而label1是<stmt2>的头一 个符号
BR:一目操作符,它产生一个< label2>的转移,而<label2> 是一个紧跟在<stmt2>后面的符号(即使if语句后的第 一个语句的头一个符号)
:
北京航空航天大学软件工程研究所
其中:BMZ:是二元操作符,测 试第二个域的值,若<0,则按 第3个域的地址转移,若为正值 则该指令作废。 BR:一元操作符,按第3个域作 无条件转移。
7
使用三元式也不便于代码优化,因为优化要删除 一些三元式,或对某些三元式的位置要进行变更,由 于三元式的结果(表示为编号),可以是某个三元式的 操作数,随着三元式位置的变更也将作相应的修改, 很费事。
取a LODa
取b LODb
+
ADD
取c LODc
*
MUL
送d STOd
P-code实际上是波兰表示形式的中 间代码
北京航空航天大学软件工程研究所
14
编译程序生成P-code指令程序后,我们可 以用一个解释执行程序(interpreter)来解释执 行P-code,当然也可以把P-code再变成某一机 器的目标代码。
+, A, B, T1 +, C, D, T2 *, T1, T2, T3 一,T3, E, T4
北京航空航天大学软件工程研究所
式中,T1,T2,T3 为临时变量,由四 元式优化比较方便
10
8.3 抽象机代码
许多pascal编译系统生成的中间代码是一种称为 P-code的抽象代码,P-code的“P”即“Pseudo”。
波兰表示 算术表达式:
F*3.1416*R*(H+R)
转换成如波兰表示:F3.1416*R*HR+*
北京航空航天大学软件工程研究所
2
由中缀表达式翻译为波兰表示算法很容易实现, 只需要设一个操作符栈,当读到操作数时,就立即 输出该操作数,当扫描到操作符时,与栈顶操作符 比较优先级,若栈顶操作符优先级高于栈外,则输 出该栈顶操作符,反之,则栈外操作符入栈。对于 赋值语句,则需规定赋值符号的优先级低于其他操 作符,所以:
北京航空航天大学软件工程研究所
第三个三元 式中的操作数(1) (2)不是第(1)和第 (2)条三元式的计 算结果。
6
条件语句的三元式:
If x>y then z:=x;
else z:=y+1;
(1) 一, x, y (2) BMZ, (1), (5) (3) :=, Z, X (4) BR, , (7) (5) +, Y, 1 (6) :=, Z, (5) (7) :
生成的动态数据。 3.SP- 运行栈指针,存放所有可按源程序的数据声明直接
寻址的数据。 4.BP-基地址指针,即指向当前活动记录的起始位置指针。 5.其他,(如MP-栈标志指针,EP-极限栈指针等)
北京航空航天大学软件工程研究所12源自计算机的存储大致情况如下:
P-code指令
BP
SP
PC
NP
程序指令存储器
相关文档
最新文档