第2章PL设计概述-程序设计语言原理

合集下载

程序设计语言PL0

程序设计语言PL0

EBNF定义的PL/0语法
condition = "odd" expression | expression ("="|"#"|"<"|">"|"<="|">=") expression.
A conditional is a relational expression or an "odd" test.
A statement is an assignment statement, a procedure call, a compound statement, an if statement, a while statement, or empty. Both if and while statements have conditionals.
2.EBNF定义的PL/0语法
program = block ".".
A program is a block.
block = [ "const" ident "=" number { "," ident "=" number } ";" ] [ "var" ident { "," ident } ";" ] { "procedure" ident ";" block ";" } statement.
3. PL/0语法图
PL/0语法图
PL/0语法图
PL/0语法图
注意

程序设计的语言原理是什么

程序设计的语言原理是什么

程序设计的语言原理是什么程序设计的语言原理是一种用于编写计算机程序的规范、语法和语义规则的体系。

它定义了程序员如何使用特定的语言来描述计算机任务及操作过程。

程序设计语言的原理涉及到计算机科学和语言学等多个领域,包括编译器、解释器、语言运行环境等。

程序设计语言的原理不仅仅是一套编写程序的规则,更是一种表达和交流计算机任务的工具。

它的设计目标是使得程序员可以更加方便、高效地编写、调试和维护程序,同时使程序更具可读性和可移植性。

程序设计语言的原理主要包括以下几个方面:1. 语法规则:程序设计语言的语法规则定义了如何书写程序的语句、表达式和结构。

它规定了程序员可以使用的关键字、运算符、数据类型等,并且定义了这些元素如何组合成有效的程序。

语法规则尽量设计得简洁、易读,以方便程序员理解和书写程序。

2. 语义规则:语法规则只规定了程序的结构,而语义规则则进一步定义了程序元素的含义和行为。

语义规则通常包括类型检查、运算规则、作用域和生命周期等方面。

它保证了程序在执行过程中的正确性和一致性,避免了一些常见的错误和不确定性。

3. 数据结构和算法:程序设计语言的原理还涉及到数据结构和算法的设计。

数据结构定义了程序中存储和操作数据的方式,而算法则描述了解决问题的步骤和过程。

良好的数据结构和算法设计可以提高程序的效率和可维护性,减少资源消耗和开发成本。

4. 编译和解释:程序设计语言的原理还包括编译器和解释器的设计与实现。

编译器将程序源代码转换为机器代码,而解释器则逐行解释执行源代码。

编译器和解释器都需要根据语言规范将程序映射到机器指令,同时进行一系列的语法和语义检查,以保证程序的正确性和安全性。

5. 语言工具和库:程序设计语言的原理也与编程工具和库密切相关。

编程工具如集成开发环境(IDE)、调试器等可以提供开发、测试和调试程序的功能,而库(Library)提供了一组常用的函数和数据结构,简化了程序员的开发工作。

语言工具和库的设计需要考虑到语言的特点和需求,以提高程序员的生产效率。

程序设计概述

程序设计概述

• (6)LISP(List Processor)语言。 • 是一种人机交互式的符号处理语言,是在人工智能领域广泛应用的一 种程序设计语言。 • (7)dBASE 语言。 • 是由dBASE 数据库管理系统提供的用于数据处理的结构化程序设计语 言,类似的还有FoxBASE,INFORMIX 等。这类语言提供的命令(语句) 功能很强,这样就无需描述运算的详细过程。例如排序,若用一般的 高级语言编程需若干条语句,在这里只要一条命令即可完成。因此人 们又称这类语言为 4GL(第四代语言)。特别适合非专业技术人员 使用。 • (8)C++。 • 是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检 查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设 计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多 种程序设计风格。 • (9)Java • 是由Sun Microsystems公司于1995年5月推出的Java程序设计语言 (以下简称Java语言)和Java平台的总称。用Java实现的HotJava浏 览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、 Internet计算。
• 从计算机程序的用途角度再来看计算机程 序的另外一个描述: 程序=数据结构+算法 总的来说,计算机程序的用途可以概括为 是对信息的处理。数据是信息的载体,数 据结构是指数据在计算机中的表示,算法 是指解决某个问题的方法,通常是一种用 来加工处理对应数据的方法,一般表示为 一组指示计算机每一步动作的有序指令。
• 程序所描述的过程往往是一个有顺序的过程。 • 打仗时(不管是实战还是演习),进攻一个阵地,那么整 个攻占阵地的程序一般可以描述如下: • ①设计进攻方案,确定时间安排。 • ②火力准备(炮火会先对要进攻的阵地一阵狂轰乱炸,称 作火力准备,持续时间通常较长,根据具体情况而视,少 则几分钟半个小时,多则一两个小时)。 • ③步兵开始地面推进。 • ④攻占整个阵地。

工程设计语言 p语言

工程设计语言 p语言

工程设计语言 p语言PLC常用程序设计语言,工程师必须会!在可编程控制器中有多种程序设计语言,它们是梯形图语言、布尔助记符语言、功能表图语言、功能模块图语言及结构化语句描述语言等。

梯形图语言和布尔助记符语言是基本程序设计语言,它通常由一系列指令组成,用这些指令可以完成大多数简单的控制功能,例如,代替继电器、计数器、计时器完成顺序控制和逻辑控制等,通过扩展或增强指令集,它们也能执行其它的基本操作。

功能表图语言和语句描述语言是高级的程序设计语言,它可根据需要去执行更有效的操作,例如,模拟量的控制,数据的操纵,报表的报印和其他基本程序设计语言无法完成的功能。

功能模块图语言采用功能模块图的形式,通过软连接的方式完成所要求的控制功能,它不仅在可编程序控制器中得到了广泛的应用,在集散控制系统的编程和组态时也常常被采用。

由于它具有连接方便、操作简单、易于掌握等特点,为广大工程设计和应用人员所喜爱。

根据可编程器应用范围,程序设计语言可以组合使用,常用的程序设计语言是:梯形图程序设计语言、布尔助记符程序设计语言(语句表)、功能表图程序设计语言、功能模块图程序设计语言、结构化语句描述程序设计语言、梯形图与结构化语句描述程序设计语言、布尔助记符与功能表图程序设计语言、布尔助记符与结构化语句描述程序设计语言。

1.梯形图(Ladder Diagram)程序设计语言梯形图程序设计语言是用梯形图的图形符号来描述程序的一种程序设计语言。

采用梯形图程序设计语言,程序采用梯形图的形式描述。

这种程序设计语言采用因果关系来描述事件发生的条件和结果。

每个梯级是一个因果关系。

在梯级中,描述事件发生的条件表示在左面,事件发生的结果表示在后面。

梯形图程序设计语言是最常用的一种程序设计语言。

它来源于继电器逻辑控制系统的描述。

在工业过程控制领域,电气技术人员对继电器逻辑控制技术较为熟悉,因此,由这种逻辑控制技术发展而来的梯形图受到了欢迎,并得到了广泛的应用。

编译原理答案(前三章)

编译原理答案(前三章)

编译原理答案(前三章)第 1 章引论第 1 题解释下列术语:答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。

(2)源程序:源语言编写的程序称为源程序。

(3)目标程序:目标语言书写的程序称为目标程序。

(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。

通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。

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

(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。

第 2 题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。

答案:一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。

其各部分的主要功能简述如下。

词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。

语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。

语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。

中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。

中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。

目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。

表格管理程序:负责建立、填写和查找等一系列表格工作。

表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。

第2章 简介PL0

第2章 简介PL0

数据类型
整型
说明类型
(1)常量说明(全局) (2)变量说明; (3)过程说明。
• 标识符(字母开始的字母数字串)的有效长度 是10 • 数字最多为14位 • 过程无参,可嵌套(最多三层)定义,可递归 调用 • 变量的作用域同PASCAL • 13个保留字:if, then, while, do, read, write, call, begin, end, const, var, procedure, odd
±°¥ Ê µ Ç µ ´ Ç ²Î Ô Ì ò á ÷ ø Ê ñ ª ´ ³ Ð ½ Ê ² '.'£ ¿ Y ´ Ì ò Ð Ô ³ Ð Ö Ç ñ Ð í ó ¿ Ê ²Ó ´ Î £ N ôà â Í ù Ì µ Ó ½ Ê ¸ ³ INTERPRET â Ê ´ ½ Í Ö Ð Ä ±³ Ð ¿ ê Ì ò Y
"semicolon","period","becomes","beginsym","endsym","ifsym",
"thensym","whilesym","writesym","readsym","dosym","callsym", "constsym","varsym","procsym"};
因子 factor
语法图
程序
分程序
分程序
const
.
ident ,
=
number
; var ident

; ;

pl0语言简介

pl0语言简介

4
#define #define #define #define #define #define #define #define #define #define #define
becomes beginsym endsym ifsym thensym whilesym dosym callsym constsym varsym procsym
0x80000 0x100000 0x200000 0x400000 0x800000 0x1000000 0x2000000 0x4000000 0x8000000 0x10000000 0x20000000
enum object { constant, variable, proc }; enum fct { lit, opr, lod, sto, cal, Int, jmp, jpc }; typedef struct{ enum fct f; // function code long l; // level long a; // displacement address } instruction; /* lit 0, a : load constant a opr 0, a : execute operation a lod l, a : load variable l, a sto l, a : store variable l, a cal l, a : call procedure a at level l Int 0, a : increment t-register by a jmp 0, a : jump to a jpc 0, a : jump conditional to a */ char ch; unsigned long sym; char id[al+1]; long num; long cc; long ll; long kk, err; long cx; char line[81]; // // // // // // last character read last symbol read last identifier read last number read character count line l包括标准输入和输出)操作有较大区别。 (9)两种语言的注释形式不同。 (10)由于 int 是 C 语言的关键字,因此中间语言指令的操作码 int 被改成 Int。 (11)改写版本中增加了制表符作为单词的分隔符,因为现在大家已经习惯用制表符。 带来的问题是编译器报错的箭头所指位置可能不准确。 Niklaus Wirth 设计的编译器中有一些不影响大局的小问题 (也许是 Niklaus Wirth 有意为 之) ,我们也没有修改。例如: (1)没有检查一个分程序中的名字是否重复声明,导致出现重复声明的名字时,默认 的是最后出现的那一个。 (2)按附录 1.1 节的文法,常量定义和变量声明用逗号分隔,但实际情况是用分号分 隔也被认可。 (3)无符号整数超过一定位数时,以报告编号为 30 而不是 31 的错误更为准确。 下面是编译器两个文件 pl0.h 和 pl0.c 的代码。 (1)文件 pl0.h #include <stdio.h> #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define norw txmax nmax al amax levmax cxmax nul ident number plus minus times slash oddsym eql neq lss leq gtr geq lparen rparen comma semicolon period 11 100 14 10 2047 3 2000 0x1 0x2 0x4 0x8 0x10 0x20 0x40 0x80 0x100 0x200 0x400 0x800 0x1000 0x2000 0x4000 0x8000 0x10000 0x20000 0x40000 // // // // // // // no. of reserved words length of identifier table max. no. of digits in numbers length of identifiers maximum address maximum depth of block nesting size of code array

2-3-习题(含解答)

2-3-习题(含解答)

2-3 习题(含解答)目录第1章编译原理概述 (1)第2章PL/O编译程序的实现 (4)第3章文法和语言 (4)第4章词法分析 (13)第5章自顶向下语法分析方法 (28)第6章自底向上优先分析 (39)第7章LR分析 (42)第8章语法制导翻译和中间代码生成 (60)第9章符号表 (67)第10章目标程序运行时的存储组织 (70)第11章代码优化 (73)第12章代码生成 (76)综合练习一 (79)综合练习二 (84)综合练习三 (90)综合练习四 (95)综合练习五 (101)综合练习六 (107)第1章编译原理概述一、选择题1.一个编译程序中,不仅包含词法分析,语法分析,中间代码生成,代码优化,目标代码生成等五个部分,还应包括 (1) 。

其中, (2) 和代码优化部分不是每个编译程序都必需的。

词法分析器用于识别 (3) ,语法分析器则可以发现源程序中的 (4) 。

(1) A.模拟执行器 B.解释器 C.表格处理和出错处理 D.符号执行器(2) A.语法分析 B.中间代码生成 C.词法分析 D.目标代码生成(3) A.字符串 B.语句 C.单词 D.标识符(4) A.语义错误 B.语法和语义错误 C.错误并校正 D.语法错误2.程序语言的语言处理程序是一种 (1) 。

(2) 是两类程序语言处理程序,他们的主要区别在于 (3) 。

(1) A.系统软件 B.应用软件 C.实时系统 D.分布式系统(2) A.高级语言程序和低级语言程序 B.解释程序和编译程序C.编译程序和操作系统D.系统程序和应用程序(3) A.单用户与多用户的差别 B.对用户程序的查错能力C.机器执行效率D.是否生成目标代码3.汇编程序是将翻译成,编译程序是将翻译成。

A.汇编语言程序B.机器语言程序C.高级语言程序D. A 或者BE. A 或者CF. B或者C4.下面关于解释程序的描述正确的是。

(1) 解释程序的特点是处理程序时不产生目标代码(2) 解释程序适用于COBOL 和 FORTRAN 语言(3) 解释程序是为打开编译程序技术的僵局而开发的A. (1)(2)B. (1)C. (1)(2)(3)D.(2)(3)5.高级语言的语言处理程序分为解释程序和编译程序两种。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第18页
词法和词法分析
• 构成程序的基本词法元素包括标识符、运算符、字面量、注释等。 复杂的词(标识符、各种字面量)需要明确定义的构词法,即词法 • 处理源程序的第一步是词法分析: – 编译器处理表示源程序的字符序列,根据词法规则做词法分析,将 源程序切分为符合词法的段,识别出源程序的有意义单词(token) – 词法分析得到一个(表达被分析的源程序的)单词流,流中各单词 标明了词法类别(是“标识符”,“整数”,“加号”,“左括 号”,等等) – 词法分析中抛弃所有无保留价值的分隔符(如空白符)和噪声词 例:对 int main (void) { return 0; } 做词法分析得到的单词序列是: "int" "main" "(" "void" ")" "{" "return" "0" ";" "}" 共10个单词 类别:标识符,左/右圆括号,左/右花括号,整数,分号
第8页
语言设计:目标演化
• 语言设计中需要考虑的另外一些重要问题: – 正常处理的异常/错误处理的良好集成(在产品软件的程序里, 处理错误和各种特殊情况的代码占很大的比例,可能达70%)
– 对于程序的易修改可维护性的支持
– 对于并发程序设计的支持,用什么样的机制支持并发程序设计。 这方面的问题将长期成为语言研究和设计的热点问题
•简单 Simplicity
•高效 Efficiency •灵活性 Flexibility •可扩充性 Extensible •可重用性 Reusable
第10页
•可读性好 Readability •程序质量 Quality •安全性 •并发
2.3 设计准则
• 频度准则:越常用越简单 • 结构一致:程序结构和计算的逻辑结构一致,可读、方便 • 局部性 Locality:
第3页
从内存代表x的地址中取出
值放在运算器中。
加1,将结果放入x地址中。
2.1 表示与抽象
儿子10岁 女儿8岁 母亲35岁 几年后儿 女岁数之 和大于等 于母亲?
u=m-s-d
每人每年增1岁每增 一年比较一次,满足
read(m,s,d); u=m-s-d; print(u) read(m,s,d); u=0; while(m+u>s+d+2u) u++; print(u);
第19页
词法分析
• 词法分析通常采用最长可能原则,确定可能成为单词的最长字符串。 例:staticint是一个标识符,而不是关键字static 和int x+++y (C语言)的分析结果是:x,++,+,y;而不是x,+,++,y x+++++y 是x, ++, ++, +, y(语法错,++ 的运算对象非左值) 早期的Fortran 中存在复杂的词法问题。例如: DO 10 I = 1.5 意思类似于C 语言的DO10I = 1.5 而DO 10 I = 1,5是枚举循环头部, 类似于C 的for (I = 1; I < 5; ++I) ... 后来的语言都避免了这类问题,保证单词很容易识别(能局部识别) 人们已经开发了许多帮助构造词法分析器的自动工具,如lex/flex等
第7页
语言设计:目标演化
2. 提供支持复杂程序所需的高级组织的机制,支持大型程序开发模块机 制(信息隔离和屏蔽),支持分别编译的机制,支持程序的物理组织 3. 支持软件重用,包括软件中的部分的重用,支持通用的基本程序库。 Pascal 失败之处之一就是忽略了库的开发。C/Fortran 都做得很好。Ada 、C++ 和Java 的设计都特别考虑了对库的支持。许多新语言定义了功能 非常丰富的标准程序库。 − 支持库开发:库是最基本的重用方式。是否支持库开发,决定了 语言能否大范围使用。支持用户和第三方供应商开发各种扩充的和专 用的库 − 支持某些层次或者方式的软件部件概念 问题:库开发或者部件是否需要本语言之外的功能? OO 概念可能在上面许多方面起作用,因此成为复杂软件开发的重要方法
– 只有全局变量 Basic
– 不鼓励全局变量 Pascal, C – 无全局变量函数式 Java • 词法内聚 Lexical Coherence : 变量在使用处就近声明(Pascal 声明和语句严格分开) ((lambda (x y) (let ((x 3.5) (y (+ a 2))) (+ (* x y) ((+ (* x y) (- x y))) (- x y))) 3.5 (+ a 2))
• 在字符序列观点向上一层,是把一个程序看着一些词法元素的 序列
– 由程序的字符序列得到词法元素序列的过程就是词法分析
第17页
词法元素
• 标识符:文字形式的词法对象,用于表示 – 语言里的关键字 – 程序对象的名字 • 关键字:语言规定了特殊意义的标识符,如 C 中的 if,while,for • 保留字:语言中规定了特殊意义,而且不允许程序员用于其他用途的标识 符。C 语言的关键字都是保留字,Fortran 没有保留字 • 运算符:有预定义意义的特殊字符或特殊字符序列(可能有标识符) – 运算符的语义就是语言定义的运算(操作),如 Java 的 new – 常规语言用运算符表示各种算术、逻辑运算 • 分隔符:用于分隔程序里的不同词法元素的特殊符号或标识符 – 空格,换行和制表符等,通常作为语法元素的分隔符
λx.λy.((x*y)+(x-y) 3.5 (a+2)
第11页

•语法一致性
GO TO (L1, L2, …, Ln), I GO TO N, (L1, L2, …, Ln) I={1..n}
ASSIGN Li TO N •安全性Security
N={L1...Ln}
语言—编译系统自动找出安全漏洞,不能弥补也要支持 安全性→强类型,即每个计算操作运算之前类型必须确定
文法 产生符合语法的语言(句子集合)规则,如:
• • • • • • G=(S,N,T,P) S∈N,T∩N=Φ* T是终结符号串的有限集。N是非终结符号串的有限集。 T∩N = Φ,即它们是不相交的。S是起始符号串, S∈N。 P是产生式,一般形式是: α→β α,β∈(T∪N)* “→”表示左端可推导出右端, 如α→β, α→Υ, α→δ则可写为:α→β|Υ|δ 如果产生式将语言的非终结符中的每一个标记都推得为终 结符号, 则这一组产生式集即为该语言的全部文法。
– 深层问题
例:C程序里的if 之后是不是左括号,括号是否配对
– 上下文关系 例:变量使用前是否有定义,使用是否符合类型的要求 例:使用变量的值之前,变量是否已经初始化
语言的语法定义通常只描述1(程序形式中的上下文无关部分) 编译程序通常检查条件1和2,有人称2 为“静态语义”
第22页
2.4.1.1 文法
第5页
语言设计:目标演化
• Fortran 设计中最主要的考虑是易用性(与机器和汇编语言比较) 和高效实现,特别关注程序能翻译成高效执行的代码,因为这样 才可能被接受(今天Fortran 仍高效)。 • 随着计算机变得越来越快,越来越便宜,效率问题虽然还是很重 要,但重要性已大大下降。易用性方面的考虑仍非常明显: – 提高程序设计工作的效率 – 帮助人们提高程序(软件)的质量,可靠性 – 设法支持某些高级的软件设计技术 • 语言最主要作用是用于描述所需要的计算过程。为此需要:
C 留给程序员 过程参数不检查 一般不安全
第12页

•正交性和正规性(Orthogonality & Regularity)
正交: 每个语言特征都是独立的, 增减不影响其它
正规: 每一约定或规则无一例外 不正规:数组不能作返回值, 不能赋值 函数不能做参数 不正交→不正规
第13页

•数据隐藏 (Data hiddening) 封装,以名字封装内部数据设计者可见使用者不可见 局部性不一定封装,如: Do 10 I=1, 10, 2
• 同一程序的高级语言表示、经翻译后的 汇编码表示、机器码表示就是该程序在 不同抽象层次上的表示。
第2页
2.1 表示与抽象
• 程序在不同抽象层次表示的关系 • 例:x = x + 1在机器码上就有两种方法。
从内存代表x的地址中取出 值放在运算器中。 加1,将结果放于某临时单元。 将临时单元内容做类型检查 (必要时转换)并放入x中。
第9页
2.2 PL设计目标
定义一组能表示某种范型的特征集,每个特征有严格定 义并可在机器上高效实现,程序员可灵活运用这些特征表 达它所希望的任何计算。 •模型有力 Model Power •语义清晰 Semantic Clarity •移植性好 Portability •方便 Convenience
m s d u
指令集
条件即所求。
客观世界
问题抽象
模型世界
数学模型 模拟模型
程序世界
以程序世界术语 表示描述模型
机器世界
以机器的术语 实现程序
图2-1 计算机解题的四个世界

第4页
2.2 PL设计目标
定义一组能表示某种范型的特征集,每 个特征有严格定义并可在机器上高效实现, 程序员可灵活运用这些特征表达它所希望的 任何计算。
– Java采用Unicode字符集,ASCII之外的字符可用于注释、标识符、字符 和 字符串字面量 – C未规定字符集,要求基本字符集包含大小写字母、数字和29个特殊字 符,其他字符可用在注释、字符和字符串常量里,效果由具体实现解释
相关文档
最新文档