




免费预览已结束,剩余51页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章程序语言的性质 2 语言的形式化模型 BNF为描述程序设计语言的属性提供了一种很好的手段 但并不是充分的手段 BNF回答了程序看起来象什么 但没有回答程序是做什么的 形式化模型采用精确的数学模型来刻画研究对象 为研究 分析和操纵研究对象提供严谨的数学工具和手段 本章将介绍下列形式化模型 形式文法 乔姆斯基文法分级语言的语义 属性文法 指称语义程序的验证 3 4 1语言的形式化性质 乔姆斯基分级文法语言的能力 4 乔姆斯基分级文法 文法由非终结符 终结符 开始 非终结 符 及产生式构成文法的类别3型文法 正则文法 定义词法的模型2型文法 BNF文法 上下文无关文法1型文法 上下文有关文法0型文法 5 3型文法 正则文法 为词法分析器提供模型 这类文法的大多数性质都是可判定的如 能产生什么样的串 给定串是否属于文法规定的语言 语言中的串是否有限等正则文法可以产生形如an的串 其中a为有限字符序列正则文法只能计数有限数常用于关键字或单词扫描 6 2型文法 上下文无关文法 产生式的形式为 X 其中 可以是终结符和非终结符的任意序列同样 这类文法的大多数性质都是可判定的如 能产生什么样的串 给定串是否属于文法规定的语言 语言是否为空等可用来计数和比较两个项 产生形如ancbn的串可以用堆栈来实现可用来自动产生程序的语法分析树2型和3型文法的相关问题都已基本上得到解决 7 1型文法 上下文有关文法 产生式的形式为 其中 任意非终结符串 是终结符和非终结符的任意序列 但 中的符号个数应不多于 的符号个数从开始符开始导出的串的长度是递增的在生成串时 需要使用固定数量的存储空间 例如识别上下文无关文法无法识别的串ancnbn上下文有关文法太复杂 很难用于程序设计语言人们对上下文有关文法的很多特征还不太清楚 8 0型文法 非限定型文法 对产生式的形式 没有任何限制可用来识别任意可计算的函数其大多数性质都是不可判定的 返回 9 不可判定性 不同类型的文法越来越复杂 产生的语言也越来越复杂 但是否说明计算机解决问题的能力可以越来越强 没有限制 例如 能否编写一个C语言程序来判断另一个C语言程序能否结束 但这基本上是不可能的 这不是编程人员的问题 而是因为计算机所基于的数学模型本身的局限性而导致的 10 图灵机 一般来说 用一种语言编写的程序也可以用其他另一种语言来实现 那么是否存在某个程序 只能用某种语言来实现 而用其他语言就无法实现 如果没有 那么有哪些程序是其它程序设计语言无法表示的 为什么还需要那么多种不同的语言 如果我们将能够表示所有计算的语言都称为通用语言 那么是不是所有语言都是通用语言 如果是 是否存在更简单的通用语言 11 图灵机的结构 图灵机是一种用来定义可计算函数的抽象计算机图灵机只有一个单一的数据结构 即一个称为 带子 的可变长线性数组带子被分为很多格 每格上只包含一个字符图灵机还有一个指针变量 称为 读出头 它总是指向带子上的某个格 12 图灵机的操作 图灵机只提供几个简单的操作 读出头所指定位置的字符可以被读出或被修改 程序可以根据读出的值进行转移 读出头可以左右移动 如果读出头移动到带子的最末端 则自动在带子上加上一格 并赋予一个空字符作为初始值 13 图灵机的运行 图灵机开始运行时 带子上存放输入数据 读出头指向输入数据的最左端的字符 图灵机根据预先编好的操作序列读写带子上的数据 或移动读出头 如果最终能够停机 则带子上的内容就是最后的输出结果 14 图灵机的能力 任意可计算函数都可以用图灵机计算出来 Church论题 图灵机等价于0型文法确定型图灵机等价于非确定型图灵机 15 停机问题 是否存在某个通用的算法 它能够断定任意给定的图灵机在任意的输入下能否停机 停机问题是不可判断的 即不存在这样的通用算法 任意一个不可判断的问题 都等价于停机问题 结论 任何一种程序设计语言都可能代替其它语言程序设计语言不存在质的区别 只有量的区别 如是否优美 易用 高效等任何一种程序设计语言都有它存在的理由 返回 16 4 2语言的语义 程序设计语言基本上都是以上下文无关文法 特别是LR k 文法 的核心设计的 但语法分析已经不再是人们感兴趣的研究问题了 现在的问题是如何确定程序的含义 即语义 17 语言的语义 语言的手册必须定义语言中每个结构的含义 包括单独结构的含义以及和其他结构组合时的含义 语言提供了不同结构 用户 为了写正确的程序 预测语句的执行效果 和实现者 正确地实现语言 需要这些结构的精确定义 大多数语言中 形式文法用于定义语法 一段文字或例子用于定义语义 但定义是不精确的 有二义性 不同作者可能有不同理解 语义定义问题还是理论研究的目标 但至今没有令人满意的解答 已有各种形式方法用于语义定义 18 语义建模 1 文法模型 对定义语言的BNF文法进行扩展 给出程序的语法分析树 从树中抽取出附加信息 属性文法便是抽取附加信息的一种方式 19 语义建模 2 命令或操作模型 定义程序如何在某虚拟机上执行 通常描述为一自动机 但比语法用的简单自动机远为复杂 自动机有内部状态 对应程序执行时的内部状态 包括所有变量的值 执行程序本身 以及各种系统定义的数据结构 20 语义建模 2 命令或操作模型 一组形式定义的操作用于刻划自动机内部状态如何改变 此外还需定义程序文本如何翻译成自动机的初始状态 语言的操作定义对语言如何实际执行给出了相当直接的抽象 也可能提出一个更抽象的模型 作为语言的软件解释的基础 70年代的VDL ViennaDefinitionLanguage 是一个操作方法 它扩展语法分析树已包含机器解释器 计算的状态是程序树加上描述机器中所有数据的树 每条语句的执行使树的状态发生变化 21 语义建模 3 作用型模型 试图直接构造每个程序的函数的定义 采用层次式的构造方式 程序中每个基本的或程序员定义的操作代表一个数学函数 语言的程序控制结构用于将这些函数复合为更大的序列 代表表达式和语言 语句序列和条件分叉表示为个体函数构造而成的函数 循环通常表示为递归函数 最终 为整个程序导出一个完整的函数模型 指称语义归于此类 22 语义建模 4 公理模型 使用谓词演算 每个语法结构的语义被描述为公理或推导规则 用于导出结构的执行效果 从一个初始假设开始 假设输入变量满足一定的约束 在程序语句执行后 使用公理和推导规则来推导其他变量值需满足的限制 最终 程序的结果被证明满足希望的约束 描述了它们的值和输入值的关系 如Hoare的公理语义 23 语义建模 5 规约模型 描述实现程序的各个函数的关系 只要我们可以证明一个实现符合了所有的函数间的关系 则称实现相对于规约是正确的 代数数据类型是形式规约的一种形式 例如 实现栈的程序 S表示栈 则有公理 pop push S x S任何一个实现如果能保持这种关系 则称是栈的正确实现 24 语义模型 小结 上述各种形式语义模型各有优点 但均不能称为完全实用的和适用的 各有其适合范围 操作语义为语言的实现提供了一种形式模型 但对用户来说太细节公理语义易于理解 但很难用来定义复杂的程序设计语言 且缺乏对语言实现的支持 返回 25 语义建模 属性文法 这是最早的开发语义模型的工作之一 其思想是对分析树中的每个结点关联一个函数 从而给出结点的语义内容 属性文法的创建过程是为文法中的每一条规则都定义相关的语义函数 继承属性是一个函数 它将树中非终结符值和树中更高层的非终结符值相关联 换言之 任何规则右端的非终结符的函数值是左端非终结符的函数 综合属性是一个函数 它将左端非终结符和右端非终结符的值相关联 这些属性在树中向上传递信息 即从树中下层信息进行 综合 26 属性文法 例 考虑算术表达式的简单文法 E T E TT P T PP I E 其语义通过文法中非终结符间的关系集合定义 如 下面函数生成该文法生成的任意表达式的值 产生式属性E E TValue E1 V E2 V T E TV E V T T T PV T1 V T2 V P T PV T V P P IV P 数I的值P E V P V E 27 属性文法 下图是一个属性树 它给出了表达式2 4 1 2 值 28 属性文法 属性文法可用于在语法树中传递语义信息 例如 声明信息可以通过语言的声明产生式收集 沿树向下传的符号表信息可用于生成表达式代码 下面属性可加到非终结符和来创建一个程序中声明的名字集合 产生式属性 decl set declaration1 declaname decl decl set declaration2 decl set declaration decl name decl declarexdecl name decl x decl declareydecl name decl y decl declarezdecl name decl z这是综合属性 包含程序中声明的名字集合 该属性可以沿树向下传递 成为继承属性 用于正确地生成数据的代码 29 属性文法的使用 首先创建语法分析树 属性文法假设你已经知道表达式是如何推导出来的 它并不关心是如何分析推导出来的 定义属性的函数可以是任意给定的 因此定义属性的过程完全是手工完成的 如果只有综合属性 并且文法是LR k 那么 属性文法可以用来在语法分析时自动产程中间代码 这就是YACC如何工作的 它利用属性文法来计算所有非终结符的值 在构造分析树时 非终结符的信息逐层向上传递给分析树上层的非终结符 语法分析完毕 所有属性的值将计算出来 返回 30 指称语义 指称语义是一种用来描述程序设计语言的语义的作用型语义模型指称语义基于 演算 31 演算 演算是一种和图灵机的计算能力相当的理论计算模型 演算可以作为程序设计语言的函数调用的模型Algol和Lisp都采用来 演算的函数调用语义指称语义是对 演算的扩充 它将 演算扩充为一种通用的数据类型理论 32 演算的表达式 表达式可以递归地定义如下 变量名为 表达式如果M为一个 表达式 则 x M也是一个 表达式如果F和A都是 表达式 则 FA 也是 表达式 其中F为操作符 A为操作数 形式语法 expr id id expr expr expr x相当于申明参数变量x 没有申明的变量为自由变量 否则为约束变量 x M相当于函数申明 其中x相当于M的参数 例如 x x x x xy x y x x y y 33 表达式的操作 表达式只有一种操作 约简 FA 约简相当于将A作为实际参数 替换F的形式参数的所有出现 x MA M 相当于用A替换M中x的所有自由出现 例如 x xy y x xy x x x xy y注意 约简并不一定能简化原来的 表达式 x xx x xx x xx x xx 34 指称语义 指称语义的基本思想是定义一个语义函数 指称函数 把程序的意义映射到某种意义清晰的数学对象 就像用中文解释英文 作为被指的数学对象可以根据需要选择对于简单的程序语言 一种很自然的选择是把程序的语义定义为 指称为 从状态到状态的函数 定义语义就是定义好每个程序对应的函数 程序的状态由标识符到值的映射集合构成S id value 35 指称语义 表达式的语义 e S val语句的语义 s S S程序的语义 m val val 36 指称语义 设 为程序的当前状态表达式的语义常数 n n变量 x x 算术表达式 e1 e2 e1 e2 语句的语义赋值语句 x e x e 复合语句 s1 s2 s2 s1 条件语句 ifbthens1elses2 if b then s1 else s2 程序的语义 m val val 返回 37 程序验证 在编程时 人们越来越关心程序的正确性和可靠性 人们在设计程序设计语言时 也希望通过增加新的特征来增强程序的正确性和可靠性 我们可以用程序语义 按以下方式来探讨程序的正确性问题 给定程序P 其含义是什么 即 它的规范描述S是什么 给定规范描述S 开发实现了该规范描述的程序P规范描述S和程序P是否完成了相同的功能 执行了相同的函数 相当于语义建模问题 软件工程的核心问题 程序验证的核心问题 38 程序验证 测试不能保证程序的正确性如果能找到不依赖于测试的保证程序正确性的方法 产生的程序就能更加可靠 程序计算了一个函数如果能给出该函数的规范描述 并且能够根据程序知道它到底计算了一个什么样的函数 那么 如果能够证明程序所计算的函数与给定的函数等价或相同 就能证明程序的正确性 而不需再测试 39 形式化的规范描述 任一程序都可以表示成流程图基调 函数名 定义域 值域fun1 S1andP1 S3fun2 S1andnot P1 S3fun3 S3andnot P3 S4fun4 S3andP3 S4S2andP2 S4S2andnot P2 S3 40 形式化的规范描述 续 这样 程序可以看成是一个定义在其基本成分上的复杂函数 C fun1 fun2 fun3 fun4 p1 p2 p3 S1 S4如果我们能够形式化地推导出上述关系 那么我们就能够从数学上证明 给定S1 程序将终止于状态S4 但是 证明非常困难 另外 在证明时 我们总是想证明程序和某个给定的形式化规范等价 但问题是 如果没有给出规范描述 程序是否正确 可能就没有了意义 41 公理化验证 用谓词逻辑公式来刻画程序的语义 用谓词演算来验证程序的正确性 TonyHoare在1969年提出的 每个程序都遵循某种形式化的公理定义 实证 Validation 通过一系列测试数据的测试 展示程序满足了其规范描述 验证 Verification 根据程序结构 通过形式化的讨论 展示程序满足了其规范描述 Validation一般认为需要执行程序 而verification不需要 42 谓词逻辑公理 P1 S P2 表示如果P1为真 则在S执行并终止后 P2将为真 如果A为真 则B也为真 逻辑公理 组合顺序1顺序2 P S1 Q Q S2 R 组合语句 P S1 S2 R P S R R Q 增加后置条件 P S Q P R R S Q 增加前置条件 P S Q 43 语句类型的公理 条件语句1条件语句2While循环语句赋值语句 P B S Q P not B Q P ifBthenS Q P B S1 Q P not B S2 Q P ifBthenS1elseS2 Q P B S P P whileBdoS P not B 其中P为不变式 P e x e P x P x 为x的谓词 44 公理化的程序证明 给定程序 s1 s2 s3 s4 sn及其规约 P和QP为前置条件Q为后置条件通过证明下列的谓词来证明 P s1 sn Q P s1 p1 p1 s2 p2 pn 1 sn Q 反复运用组合公理 产生 P s1 sn Q 45 例子 B 0 1X B2Y 03whileX 0do4begin5Y Y A6X X 17end Y AB 即 给定非负的B 证明当程序终止时 Y A B 46 证明过程概要 一般通过回溯来进行 首先 找到循环的不变式 Y为乘积的一部分 X为剩下的乘数因此 Y和X A必须是所需的乘机 即不变式Y X A A B就是建议的不变式可以试着用 Y X A A BandX 0 作为不变式 47 证明 赋值语句公理 6 Y X 1 A A BandX 1 0 X X 1 Y X A A BandX 0 赋值语句公理 5 Y A X 1 A A BandX 1 0 Y Y A Y X 1 A A BandX 1 0 组合公理 5 6 Y A X 1 A A BandX 1 0 Y Y A X X 1 Y X A A BandX 0 数学定理 Y X A A BandX 0 Y A X 1 A A BandX 1 0 顺序语句公理 Y X A A BandX 0 Y Y A X X 1 Y X A A BandX 0 数学定理 Y X A A BandX 0 and X 0 Y X A A BandX 0顺序语句公理 Y X A A BandX 0 and X 0 Y Y A X X 1 Y X A A BandX 0 用 来代替 While循环语句公理 Y X A A BandX 0 whileX 0doY Y A X X 1 Y X A A BandX 0 andnot X 0 48 证明 续 数学定理 Y X A A BandX 0 andnot X 0 Y X A A BandX 0 Y AB顺序语句公理 Y X A A BandX 0 whileX 0doY Y A X X 1 Y A B 赋值语句公理 0 X A A BandX 0 Y 0 Y X A A BandX 0 赋值语句公理 0 B A A BandB 0 X B 0 X A A BandX 0 组合公理 0 B A A BandB 0 X B Y 0 Y X A A BandX 0 数学定理 B 0 0 B A A BandB 0顺序语句公理 B 0 X B Y 0 Y X A A BandX 0 组合公理 B 0 program Y A B 49 公理化验证 小结 需要为语言的所有特征建立公理 能否也为简单数组 过程调用 参数等建立公理 即使是要证明小程序也很困难 要证明大型程序就更困难了 还不能很好地处理非数学方面的问题 处理起来极端困难 很难自动化 而手工又会导致大量错误 但是准确 能够清楚地区别 程序是什么 以及 程序是如何解决问题 它是大多数其他验证方法的基础 包括半形式化的规范表示法 对于关键应用 付出的代价还是值得的 50 程序验证 只有程序正确性的验证过程能够自动化 程序验证才有实际意义但要证明那些没有结构化的程序 以及那些具有复杂结构的程序的正确性 非常困难 基本上是不可能的 程序验证工作的研究成果通常用来指导程序设计语言的设计例如 在C 中加断言等 51 ML概述 ML 元语言 是一种函数式语言 其程序的形式与C或Pascal相似 ML由RobinMilner于1970年代中期开发 是一种机器辅助形式化证明的机制 ML也可以作为一种通用符号操纵语言 1983 该语言中加入了模块等概念 并经过重新设计 形成了现在的标准ML ML是一种具有静态类型 强类型 和函数式执行的语言 但类型不必由程序员来指定 ML程序由若干个函数定义构成 每个函数的类型是静态的 函数可以返回任意类型的值 因为是函数型的语言 变量的存储与C或Fortran语言的很不相同 ML可以通过其类型系统支持多态 还支持数据抽象 52 ML程序例子 1fundigit c string int ord c ord 0 2 Storevaluesasalistofcharacters 3funSumNext V ifV then print nSum 0 4else print hd V 5SumNext tl V digit hd V 6funSumValues x string int SumNext explode x 7funProcessData 8 letvalinfile open in data sml 9valcount digit input infile 1 10in11print SumValues input infile count 12end 13print n 53 把一个列表颠倒过来的函数 datatypelist a b c d e hd x 列表的头 或第一个元素tl x 列表的尾
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 英语动词时态的运用与辨析教学教案:小学英语教学中重点难点解析
- 交通卡支付系统技术开发合作合同
- 办公设备租赁与技术支持服务合同
- 棕色卡通初三开学第一课
- 语言之美:七年级英语语法教学
- 合同管理文档模板合同审核高效工具
- 早教田径运动会课件
- 教师培训需求与实施计划表
- 古诗文对仗技巧及其运用:高中语文写作辅导教案
- 医疗器械销售与配送协议
- LED电子显示屏系统设计方案
- 全册(教案)人教精通版英语五年级下册
- 2024年山东高速投资控股限公司校园招聘9人重点基础提升难、易点模拟试题(共500题)附带答案详解
- 大学生新时代劳动教育教程全套教学课件
- JT-GQB-015-1998公路桥涵标准钢筋混凝土圆管涵洞
- 新质生产力-讲解课件
- 2024年西安陕鼓动力股份有限公司招聘笔试冲刺题(带答案解析)
- 2024年四川发展(控股)有限责任公司招聘笔试冲刺题(带答案解析)
- 居住建筑节能设计标准(节能75%)
- 垃圾分类巡检督导方案
- 乳制品配送服务应急处理方案
评论
0/150
提交评论