(计算机应用技术专业论文)基于解释器的数据库存储过程研究.pdf_第1页
(计算机应用技术专业论文)基于解释器的数据库存储过程研究.pdf_第2页
(计算机应用技术专业论文)基于解释器的数据库存储过程研究.pdf_第3页
(计算机应用技术专业论文)基于解释器的数据库存储过程研究.pdf_第4页
(计算机应用技术专业论文)基于解释器的数据库存储过程研究.pdf_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 i 摘摘 要要 随着社会信息化程度不断加深, 国产数据库神舟 oscar 在国内不同行业得到了 广泛应用,同时用户对数据库管理系统的要求也越来越高。相对于国际上主流的数 据库管理系统,神舟 oscar 还有很大差距,迫切需要功能扩展和升级。存储过程在 数据库管理系统中占有十分重要的地位,通过存储过程可以将一部分应用逻辑从客 户端转移到服务器端,同时通过过程控制语言提高存储过程模块化程度,从而有效 的提高应用系统的开发和运行效率。 根据“神舟 oscar 数据库存储过程”这一课题的需要,给出了基于解释器的存 储过程实现方法。 存储过程语言 ploscar(procedure language for oscar)实现了过程控制语句 和 sql 语句的结合, 不仅具有 sql 语言访问关系型数据库的强大能力,而且具有控 制语句执行的过程性。 针对存储过程语言的特点, 对实现方法进行了讨论, 在 oscar 的体系结构的基础上,确定了 ploscar 的设计原则和目标,给出了基于解释器的 ploscar 总体设计。 ploscar 总体上分为两大部分,创建时预编译和解释执行。深入分析了 ploscar 实现中的几项关键技术。为了完成存储过程在数据库内部的存储,扩充了 数据库系统表;在词法分析,语法分析过程中结合静态和动态符号表解决了 ploscar 变量的嵌套作用域;为了实现模块间的松散耦合,编译阶段和解释执行阶 段 sql 语句和过程语句处理流程不同;存储过程重载的实现;执行过程中为了提高 效率,引入了存储过程缓冲池的概念。 在已经实现的存储过程基础上做了性能测试,表明存储过程的设计达到了预定 的目标,使数据库性能得到了提高。 关键词关键词:数据库,存储过程,预编译,解释执行 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 ii abstract with the deepening society information, national database shenzhou oscar is widely applied in many different industries. in the meanwhile, the users have increasingly high demands to dbms. compared to international mainstream dbms, shenzhou oscar has a long way to go and urgently needs function expansion and upgrade. sp (stored procedure) plays an important role in dbms. through sp, some application logic can be transferred from customer side to server side. at the same time, the encapsulation of stored procedure achieves modularization, thus the efficiency of application system development is improved. focusing on the subject of shenzhou oscar stored procedure, this paper puts forward a realizing method of sp based on interpreter. sp language ploscar realizes the combination of process control sentence with sql sentence, which not only has the power of sql language accessing relation database, but also the process of module language. due to characteristics of stored procedure language, this paper firstly discusses the realization methods. on the basis of oscar system achitechture, it sets ploscar design principles and goals and gives the general design of ploscar based on interpreter generally speaking, ploscar is made up of two parts, pre-compilation when creation and explanation execution. this article introduces several crucial technologies in ploscar realization. in order to achieve database inner storage of stored procedure, it enriches system tables. it solves the nested scope of ploscars variables and practical visibility with dynamic and static symbol tables during the process of lexical and syntax analysis. in order to realize loose coupling of modules, different processing method in sql sentence and module sentence is adopted during compilation and explanation execution period; the realization of function overloading in stored procedure; in order to improve efficiency in execution process, the concept of buffer pool of stored procedure is introduced. finally, on the basis of realized stored procedure, the performance test is made and it shows that the stored procedure design reaches the goal and the dbms performance is improved. key words:dbms,stored procedure,pre-compilation,explanation exectution 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 1 1 绪绪 论论 神舟 oscar 数据库管理系统是我国拥有自主知识产权的企业级、大型通用关 系型数据库管理系统。 神舟 oscar 采用关系数据模型作为核心数据模型, 支持 sql 通用数据库库查询语言,提供标准的 odbc、jdbc、oledb/ado 和.net 等数据 访问接口,并具有海量数据管理和大规模并发处理能力。系统功能完善、性能稳定, 被广泛应用于各类企事业单位、政府机关的信息化建设。其安全版增加了高强度身 份认证、基于标签的强制访问控制、数据加密存储、可信路径、独立审计中心等关 键安全特性。 近几年来,神舟 oscar 已经在各个行业得到了大量应用,但是随着基于数据 库的应用逻辑日益复杂, 用户需求也不断提高, 神舟 oscar 本身的问题也不断显现。 如不支持存储过程,缺乏触发器功能以及缺乏对一些新的应用,如多媒体存储和检 索,数字地图等空间信息存储和检索,全文检索等功能的支持,这都给神舟 oscar 进一步推广应用带来了障碍。 这就迫切需要神舟 oscar 数据库进行功能扩展以满足 更复杂和新型应用的需求。 本论文所要进行的研究工作就是结合 “神舟 oscar 数据 库功能扩展”而进行的,目的就在于要增加神舟 oscar 数据库支持存储过程 ploscar(procedure language for oscar)的功能模块。 1.1 研究背景研究背景 1979 年 oracle 公司首先提供商用的 sql, ibm 公司在 db2 数据库系统中也 实现了 sql(structured query language) 。sql 自从 ibm 公司推出以来,就得到了 广泛的应用。 1986 年 10 月, 美国 ansi 采用 sql 作为关系数据库管理系统的标准语言(ansi x3. 135-1986),后为国际标准化组织(iso)采纳为国际标准。 1989 年,美国 ansi 指定了关系数据库管理系统的 sql 标准语言,称为 ansi sql 89。 1992 年,iso 和 ansi 委员会完成了标准 international standard iso/iec 9075:1992(ansi x3.135-1992) ,简称 sql921。sql92 标准对 sql 89 的一些定义 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 2 进行了完善,并且增加了许多新的功能,成为现行的国际标准。 目前,所有主要的关系数据库管理系统都支持 sql92 标准。 数据库查询语言 sql(structured query language)是标准的关系型数据库 (ralational database management systems)的一种非过程结构化查询语言,有很强 的表达能力。它利用一些简单的句子来存取数据库的内容,使用户只关心需要的结 果,而不用关心取得结果的过程。 sql 的一些功能特性专门用来处理和检验关系型数据。例如,下述的 sql 语句 将从数据库表 students 中删除所有专业(major)是生物(biology)的学生记录: delete from students where major =biology ; sql 是第四代语言,这就意味着该语言会描述应该做些什么,但是不会描述如 何去做。 如在上面的 delete 语句中,用户不知道在操作时数据库将如何决定哪个学生 主修生物。用户可以假设数据库将循环处理所有的学生记录,以便决定要删除的是 哪些表项。这些处理细节都被数据库系统所隐蔽,用户将无法知晓。 第三代语言,例如 c 和 cobol,在本质上是更偏重于过程处理。使用第三代语 言编写的程序在解决问题时使用的是一步接一步的算法。例如,用户可能会以下述 方式实现 delete 操作: loop over each student record if this record has major = biology then delete this record; end if; end loop; 像 sql 这样的第四代语言是相当简单的(与第三代语言相比较)并且提供了较 少的命令。他们也将用户与底层的基本数据结构和算法隔离开来。 但是 sql 语言不支持顺序、条件、循环等控制,即使是最简单的应用系统,仅 仅利用 sql 也很难实现。在这些情况下,使用第三代语言中的过程性结构对于表达 所需要的程序还是非常有用的。 随着模块化程序的设计思想不断发展和普及,数据库应用的开发人员希望数据 库的开发语言能够支持过程化结构,函数调用。因此人们提出,应将过程结构引入 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 3 到数据库管理系统开发语言之中2-4,这就产生了存储过程语言。 存储过程是 sql 语句和控制流语句的预编译集合5,以一个名称存储在数据库 中,并作为一个模块(module)处理。存储过程支持变量、顺序、条件和循环等控 制结构。通过定义参数,存储过程具有很强的模块化处理的特征,同时具有批处理 的能力,从而使得存储过程具有多方面的优势6: 1模块化 在单个存储过程中执行一系列 sql 语句, 可以从自己的存储过程内调用其它存 储过程,这可以使应用逻辑模块化,使得代码清晰,易于调试。 2支持触发器 随着数据库应用的不断发展,又逐渐产生了对数据库一些特殊需求。这些需要 主要来源于以下几个方面: (1). 能够根据表中数据的变化,自动完成相关操作的处理; (2). 实现复杂的非标准的数据完整性检查和约束; (3). 完成复杂非标准的数据库中相关表的级联更改; (4). 实现复杂的事务规则及一些相关数据的收集和统计。 对于这些需求,只通过存储过程又很难实现。因为存储过程需要被显式调用, 而这些操作往往需要自动触发,而且触发条件又非常复杂。这样就产生了对触发器 的需求7。触发器有助于完成强制引用完整性,以便在添加、更新或删除表中的行时 保留表之间已定义的关系。它比数据库本身标准的完整性约束有更精细和更复杂的 数据控制能力。 触发器实际上是一种特殊的存储过程。一般的存储过程必须通过显式的调用, 而且可以通过预先定义好的输入和输出参数,完成数据在过程之间的传递8。而触发 器则是对 dml(data manipulation language)语言在相应的表上通过事先定义好的 触发条件来完成调用的。当条件满足时,触发器被自动调用执行;如果条件不满足, 触发器则不被触发,处于一种静止状态。由于两者存在很大的共性,差别只是在调 用的方式上。因此,触发器可以转换为在特定条件下,系统调用相应的存储过程来 实现。因此本文中研究的存储过程实现对于触发器具有同样的意义。 3减少网络负载 目前许多数据库应用程序的构建都使用客户机/服务器模式。无论是单独执行 sql 语句或者直接使用嵌入式 sql 语言,都需要从客户端将这些语句发送到服务器 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 4 上,另外对于一些统计和批量数据处理操作,处理过程中还要有大量的结果集从服 务器传送到客户端。尤其是在多用户并发的环境下,会增大网络的流量。而存储过 程是存储在数据库中,并在数据库服务器上执行,除了调用和返回结果以外,与客 户端并不发生通信。对于那些访问数据库比较频繁,结果集较大,业务处理很复杂 的操作,采用存储过程可以大大减少网络流量和与客户端的交互,使事务处理速度 加快,吞吐量增加。一个需要数百行过程语言完成的操作简化为一句过程调用,大 大减少了网络上的流量。 sql 语言调用与存储过程调用示意图如图 1.1 所示: 客户端应用程序 注:表示进程间通讯 sqlsqlsql oscar数据库服务器 客户端应用程序 exec test(); create procedure test() as end; oscar数据库服务器 sql 调用 存储过程调用 图 1.1 sql 调用与存储过程调用示意图 甚至当客户机和服务器同时运行在一台机器上时,整个机器性能也能提高,在 这种情况下,不存在什么网络,但是将 sql 打包会获得更简单的对数据库进行更少 次数的调用,从而使得应用程序的执行更快。 4降低软件开发成本 由于存储过程可以重复使用,可以减少数据库开发人员开发的工作量。对数据 库进行复杂操作时(如对多个表进行 update,insert,select,delete 时), 可将这些复杂操作用存储过程封装起来与数据库提供的事务处理结合起来使用,在 逻辑上保证数据的一致性9。 同时,也可以在某个存储过程内调用其它的存储过程,使程序的逻辑得到简化, 增强可读性。 存储过程可由数据库编程方面有专长的人员创建,并可独立于程序源代码而单 独修改。通过参数的传递,可以增加灵活性,相同的存储过程,可以根据不同的输 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 5 入值返回不同的信息。 5提高数据库性能 由于单独的 sql 语句都必须由数据库服务器独立运行,因此客户端应用需要把 每条查询发送到数据库服务器,等待它处理这个查询,接受结果,做一些运算,然 后才能向服务器发送下一条查询语句。所有这些动作都会产生进程间通讯,并且如 果客户端在另外一台机器上,还会导致大量的网络开销。 如果使用了存储过程,就可以把逻辑上相关联的一系列运算和查询在数据库服 务端组成一个块。这样就拥有了过程语言的能力并且简化了 sql 的使用,从而节约 了运行时间和网络开销,实现性能的明显提升。 sql 语句执行时,每次都要在服务器上对其进行解析和优化,性能上损失较大, 而且服务器的负担也较重。如果能象其它编译语言,编译一次就可以多次执行,就 可以解决性能上的问题。存储过程就可以满足这个需求。在创建存储过程时,即对 其 sql 语句进行编译和优化,将编译好的结果保存在数据库中。在首次执行该过程 后,可以使用该过程在内存中的版本。如果存在大量的数据库访问的操作或重复执 行,存储过程将比过程语言的批量执行要快。 6避免死锁 如果整个数据库事务在一个请求中处理,那么可以简化死锁的发生条件。使用 存储过程就可以达到上述效果,并且还可以减少锁的持有时间,潜在地减小发生死 锁的可能性。一种避免死锁的方法是按照一致的顺序访问数据库资源,例如按字母 顺序。通过使用存储过程可以较容易地做到这一点10。 7提高数据库安全性 在应用中 sql 语句的执行权是比较难于管理的,虽然可以通过对表、视图等对 象进行管理,但仍然比较复杂和难于实现。有了存储过程,即使用户不拥有存储过 程所访问表的权限,也可以通过将存储过程的执行权限授予给指定的用户来完成, 简化了权限管理11。 1.2 国内外发展概况国内外发展概况 iso 在 iso/iec 9075-4:1999(e)标准(简称 sql99)中引入了模块12(module) 的概念,用模块化语言定义数据库对象,它可以定义在服务器端也可以定义在客户 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 6 端。sql 标准允许模块(module)指定所使用的程序设计语言 pl(programming language) 。sql92/99 中都允许使用多种模块化语言,包括 ada、c、cobol、 fortran、pascal 等。sql99 中还包括了 sql。 sql99 中制定了一个用于编写存储过程的标准,在这个标准中,存储过程被称 为持久性存储模块 psm(persistent stored modules)13。 该标准说明数据库系统中存储过程语言主要包括如下内容: (1). 支持 sql 标准语句; (2). 变量和游标声明的语法和语义; (3). 变量和参数赋值; (4). 流程控制语句,包括条件语句,用于循环和分支的控制结构; (5). 异常和错误处理。 在 sql99 发布之前,不同的 dbms 都提供了自己私有的“sql 过程语言” 。例 如,sybase 和 sql server 首先在其产品中引入了过程 sql 语言 t-sql14,而后这项 技术在其他两个产品中sybase adaptive server和sql server中都得到了继承和增强。 目前使用的主流数据库厂商都实现了各自的存储过程语言。国外的数据库厂商, 如 oracle 称其相应的产品为 pl/sql5, sql server 称其相应产品为 transact-sql15; db2 支持一种相当接近 sql/psm 的版本16;informix 则提供了 spl17。 国内的数据库厂商也都提供了存储过程功能,如达梦的 dmpl/sql(da meng procedure language sql)18,人大金仓 kingbasees 提供的 sp(stored procedure) 19,东大阿尔派 openbase 提供的存储过程。 这些过程语言都是在 sql 语言的基础上进行了扩展,增加了变量的声明,变量 的赋值,增加了选择,循环和顺序结构,增加了例外处理等。使其成为一种计算完 备的语言,能够根据需要处理更为复杂的逻辑和运算。 1.3 本论文研究工作本论文研究工作 本论文所研究的内容是如何在已有的 oscar 数据库系统中增加专门处理存储 过程语言的模块,以实现存储过程与 oscar 系统的松散耦合,保证 oscar 系统其 他功能不受存储过程模块的影响。 参照存储过程实现标准,以 oracle 中的存储过程语言 pl/sql20-22为原型, 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 7 基本实现了 oscar 数据库中存储过程语言 ploscar,包括对标准 sql 语句的支 持、过程控制语句的支持、变量声明和传递的支持、子程序和递归调用的支持等。 论文对 ploscar 的实现方法进行了分析研究,给出了 ploscar 的整体设计, 并在一些关键技术上进行了研究和实现,初步实现了基于树结构解释器的存储过程 语言。研究内容如下: 1基于解释器的存储过程机制分析与总体设计 对比编译型存储过程和解释型存储过程的优缺点,确定了基于解释器的存储过 程实现方案。分析了解释器的各个阶段,从词法分析、语法分析到解释执行。 ploscar 兼有过程式语句和 sql 语句的特点,而 sql 语句在现有的 oscar 中已 经有很好的支持,如何充分利用现有模块,通过增加过程控制语句,结合 oscar 中的 sql 引擎、基本数据类型模块、通用类型转换模块,尽量从功能性角度将整个 ploscar 划分为不同模块,嵌入到现行 oscar 体系结构中,降低 ploscar 实现 的复杂性。 2存储过程语言 ploscar 的实现 ploscar 中除了 sql 语句部分,还有大量过程控制语句方面的特性,支持常 量、变量的定义、变量作用域局部性原则。这些都与编译过程中符号表的组织和管 理相关;如何解决存储过程在数据库系统表中的存储;存储过程创建过程中和执行 过程中形参和实参结合的不同方式,存储过程重载的实现,数据类型之间转换规则 及其实现;存储过程子程序调用和递归调用在编译阶段和运行阶段如何实现;为了 提升数据库性能,服务器端多次重复执行存储过程时,这里应考虑尽量减少存储过 程的编译次数,类似于操作系统中为了减少 io 次数而进行的内存管理,如何设计一 次编译多次运行。 1.4 论文组织结构论文组织结构 本文共分五章,各章的内容和组织如下: 第 1 章介绍了研究的背景、国内外相关产品现状、相关标准以及本论文需要解 决的问题。 第 2 章分析了 ploscar 语法结构,需要实现的目标。研究了实现存储过程的 两种解决方案;确定了基于解释器的存储过程实现方法,给出了将过程控制语句和 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 8 sql 语句分开处理机制;分析了存储过程解释执行所需要的步骤,将整个过程分为 预编译阶段和解释执行阶段;结合存储过程需要实现的目标,给出了各个阶段的解 决方案;最后在 oscar 现行体系结构的基础上,给出了 ploscar 总体结构。 第 3 章讨论了 ploscar 实现过程中的关键技术。包括存储过程在系统表中的 保存格式;函数重载的概念和解决方法;参数传递和过程控制语句解释执行流程; 存储过程在运行过程中数据类型转换规则和解决方案;在存储过程内部为了实现子 程序调用,设计了“执行状态”栈;讨论了子程序调用和递归调用处于运行阶段时, 存储过程中间代码在内存中的引用方式。 第 4 章对已经实现的存储过程做了性能测试,验证了存储过程执行速度明显快 于单个 sql 语句,操作越多,性能表现越明显。说明了存储过程可以提高数据库服 务器的响应时间,使性能有较大的提升。 第 5 章结束语。对全文的工作进行总结,并提出了目前仍然存在的问题以及下 一步工作努力的方向。 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 9 2 基于解释器的存储过程方案分析与设计基于解释器的存储过程方案分析与设计 2.1 存储过程语言存储过程语言 ploscar 的分析的分析 ploscar23是 procedural language for oscar 的缩写。正如其名字所表达的, ploscar 通过增加了用在其他过程性语言中的结构来对 sql 进行了扩展。 ploscar 是一种与 oscar 数据库服务器紧密结合的过程化的程序设计语言。 从语言的特征看,ploscar 参照 sql99 中存储过程标准,不仅具有 sql 语言 访问关系型数据库的强大能力,而且具有控制语句执行的过程性。从程序的存放位 置看,ploscar 弥补了 sql 语句保存在客户端的局限,将一组相关联的数据查询 语句保存在服务端,减少了网络访问开销。 ploscar 的范式定义如下: create or replace procedure proc_name ( ) return data_type as language ploscar : = , : = param_name in | out | inout data_type default | := literal : = begin end ; 语句块由声明段和执行过程段两部分组成。不允许包括 ddl 语句、 connect/disconnect 语句、动态 sql 语句、commit/rollback 语句。语 句块中不区分大小写。执行过程段以 begin 开始,以 end 结束。 2.1.1 ploscar 组成结构组成结构 ploscar 主要包括 4 种结构: 1块结构 ploscar 是一种块结构的语言。ploscar 存储过程定义的所有文本都必须是 一个块。一个块用以下方法定义: 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 10 declare declarations begin statements end; 一个块的语句段里的任何语句都可以是一个子块。子块可以用于逻辑分组或者 把变量局部化为作用于一个比较小的语句组。 2变量和常量 ploscar 支持常量和变量的使用。 需要使用的常量和变量必须在块的声明段中 声明。声明后的常量或变量可以被 ploscar 语句引用。常量和变量的作用范围服 从局部性原则,即声明的常量和变量只在当前块中起作用,在子块中声明的同名常 量或变量被优先认为是子块中的常量或变量。 变量支持的数据类型有:一般标量类型(如 integer,char, time) ,复合 类型(如 rowtype, record) ,大对象类型(如 blob, clob) 。变量可以有 缺省值,也可以声明为非空。以下是几个变量声明的例子: quantity integer default 32; - 声明变量 quantity 为整型, 缺省值是 32。 company_name %type; - 声明为表 company 字段 name 的类 型。 ploscar 可以通过赋值语句或 sql 语句对变量进行赋值。 常量的声明与变量相似,只是在类型声明前增加了一个保留字 constant。并 且一定要为常量赋初始值。 3控制结构 控制结构是 ploscar 对 sql 最重要的扩充。通过增加流程控制语句, ploscar 不仅可以有效地操纵 oscar 数据, 而且用户可以通过条件控制以及循环 控制语句操纵访问数据的过程。 (1). 条件控制 在程序运行过程中经常需要根据不同的情况做出不同的处理动作。if 语句的使 用可以很好的满足这种需求。 (2). 循环控制 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 11 ploscar 中提供了非常完备的循环控制语句:loop、while 以及 for。通 过在一段程序的首尾添加循环关键字,用户可以非常容易让这段程序多次执行。而 且还提供了 exit 语句能够无条件或有条件地退出循环。 4游标 ploscar 通过游标(cursor)来命名一个工作区并访问存放在其中的信息。 ploscar 通过游标提供了一种从函数返回一个结果集的手段。 支持从函数返回结果 集被多行查询返回的行的集合成为结果集。如果不想一次执行整个查询,可以设置 一个封装该查询的游标,然后每次读取几行查询结果,这样做的一个原因是在结果 集包含数量非常大的行时避免内存耗尽。函数可以返回一个它创建的游标的引用, 从而允许调用者读取各行。这就使得函数可以返回一个结果集。 2.1.2 ploscar 特性分析特性分析 1支持三种类型的参数:in,out,inout。表示参数输入/输出模式。 (1). in 表示输入型变量, 其值由调用者传入, 在函数执行过程中保持不变。 (2). out 表示输出型变量,初始值为 null,其值可在函数执行过程中改 变,在函数返回时将传给调用者。对于注明为 out 参数的,其输入是 没有意义的,数据库会忽略输入,同时所有的 out 参数被初始化为 null。 (3). inout 表示输入输出型变量,初始值为调用者设置,其值可变,在函 数返回时将传给调用者。 2ploscar 支持子程序调用和递归调用,如果是直接递归调用,则递归层次 受存储过程缓冲池的大小限制。最多支持 32 个不同存储过程的嵌套调用。 3ploscar 支持函数重载。即通过输入参数的不同,同一个函数名称可以对 应到多个函数实现。 4依赖性检查在运行中进行,即采用了延迟绑定的方法。 2.2 可行性分析可行性分析 ploscar 实际上是一个语言处理系统的设计。语言处理系统有两种:编译程序 和解释程序。 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 12 编译程序把整个源程序(源程序的文件)转换成目标文件(机器码的文件) ,这 个过程称作编译。编译之后目标文件的运行就与编译系统无关了。使用编译程序翻 译源程序的语言是编译式的语言。如果 ploscar 按照编译程序设计,则通过把 ploscar 过程编译为本地代码,存储过程首先被解释为 c 代码,然后使用 c 编译 器对其进行编译,并链接到相应的服务器进程中。 这种方式执行速度较快, 对于存储过程中的过程控制语句和 sql 语句同等对待。 但是没有利用到 oscar 中现有模块,sql 引擎处理机制,由此造成实现复杂。同 时由于存储过程中的一些数据类型、sql 语句直接依赖于数据库中其他表结构,一 旦数据库中与存储过程相关的表结构发生改变,就要对存储过程重新编译以检查语 义是否正确。这种方式虽然执行速度块,但是一旦数据库表结构变更,就会重新执 行编译动作,而编译过程非常费时,由此造成效率低下。 另一种则是解释程序24。解释程序在工作的各个时刻都只涉及到源程序的个别 部分,而不涉及到整个源程序。它把源程序中待执行的语句转换成中间代码,并解 释执行中间代码。在源程序执行时,解释程序必须不停地工作,边解释边执行。如 果 ploscar 按照解释程序设计,那么 ploscar 源代码先被编译为执行引擎可处 理的中间代码,然后由集成在 oscar 中的执行器(ploscar executor)解释执行 相应的中间代码。 这种方式可以区别对待ploscar中的过程控制语句和sql语句, 将ploscar 中解析出来的 sql 语句直接交给 oscar 中原有的 sql 引擎处理, 在数据类型转换 机制上也可直接利用 oscar 内建数据类型转换规则,这样就可以充分利用 oscar 现有模块,ploscar 只需要关注除去 sql 语句以外的过程控制部分。这种方式虽 然执行速度较编译方式慢,但由于存储过程中数据类型、sql 语句依赖于数据库中 其他表结构,一次编译往往不能解决问题。因此从总体上考虑,在执行效率和实现 难度上,解释型的存储过程语言实现是最佳方案。 一个完整的解释执行系统包括:词法分析、语法分析、语义分析、符号表、中 间代码生成、解释执行等步骤。其流程如图 2.1 所示: 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 13 词法分析 开始 语法分析 语义分析 中间代码生成 解释执行器 结束 符号表 错误处理 预编译阶段 解释执行阶段 图 2.1 解释执行系统的阶段 按照存储过程的特性分析,实现存储过程还涉及到一个关键问题:过程语言存 储方法选择。 存储过程的存储方法主要有两种,即:单源码方式和源码+预编译方式。前者仅 在数据库中保存存储过程的源码,而后者则保存存储过程定义的源码和编译后的执 行单元。 由存储过程支持的数据类型可知,存储过程中许多数据类型大量依赖于数据库 中其他表结构,例如 ploscar 可以通过%rowtype 和%type 来引用数据表的行 类型和字段类型。当数据库中相应表或列的类型发生改变时,这些变量的数据类型 会自动随之改变。如果选择后者存储方式,因为用户随时都可能修改一个表结构 (alter table) ,因此执行时并不能保证 ploscar 中与数据库相关的数据类型 是否发生改变,也就不能保证每次执行结果的正确。 因此 ploscar 选择第一种存储方式。 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 14 2.3 ploscar 预编译预编译 2.3.1 词法分析词法分析 词法分析的主要任务25是从程序源代码(ascii 码)中提取分析出标识符 (token) ,以提供给后续的语法分析程序使用,同时词法分析还要对符号表操作。 词法分析程序完成的是编译第一阶段的工作,在 ploscar 中它被设计成一个 子程序,每当语法分析程序需要一个单词时,就调用该子程序。词法分析程序从源 程序文件中读入一些字符,直到识别出一个单词,或者直到下一个单词的第一个字 符为止。这种方式,使得词法分析程序和语法分析程序放在同一遍中,即在此两个 阶段中,只需要对源输入语句进行一次扫描。 作为编译程序的输入,无论是 sql 语句还是过程语句都仅仅是由一个个常数组 成的字符串,词法分析程序需要将这种形式的语句转化为便于编译程序其余部分进 行处理的内部格式。因此词法分析程序需要完成的任务如下: (1). 识别出源程序的各个语法单位; (2). 滤除无用的空白字符、制表符、回车字符以及其他与输入介质相关的非实 质性字符; (3). 过滤掉源程序中的注释; (4). 进行词法检查,如果出现错误,记录出错信息并报告。 其中提到的语法单位即是前面提到的标识符(token)。一般来说,程序设计语言 单词符号可以分成五种,它们分别是基本字(也称为关键字)、标识符、常数、运算符 以及界符。经由词法分析程序识别出的单词符号输出时常常采用二元式表示:(单词 种别,单词自身的值)。单词种类是语法分析需要的信息,而单词自身的值则是编译 其它阶段需要的信息。 一般来说,程序设计语言单词的语法都能用正则表达式(也称为正规式)来描述。 因此,词法分析大都是将用来说明单词结构的正则表达式编译或转化为相应的有限 状态自动机(fsa: finite state automation),最终通过构造的有限状态自动机识别出被 正则表达式说明的单词。上述过程可以用图 2.2 表示: 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 15 正则表达式 目标代码 dfanfa 图 2.2 正则表达式与有穷自动机的转换 因为词法分析部分已有非常成熟的理论体系,因此围绕词法分析已经有大量计 算机自动生成工具,其中 linux 下 lex 正是基于上述理论构造的词法分析工具之一, 在编译器构造领域应用非常广泛,ploscar 也采用 lex 作为词法分析工具。 lex 输入文件由 3 个部分26组成:定义(definition)集、规则(rule)集以及辅 助程序集(auxiliary routine)或用户程序( user routine)集。这 3 个部分由位于新 一行第 1 列的双百分号分开,因此 lex 输入文件的格式如下所示: 辅助定义的部分 % 识别规则部分 % 用户子程序部分 为了正确理解 lex 如何解释这样的输入文件,就必须记住该文件的一些部分是 正则表达式信息,lex 利用这个信息指导构成它的 c 输出代码,而文件的另一部分 则是提供给 lex 的真正的 c 代码,lex 会在适当的位置逐字地将它插入到输出代码 中。 lex 的工作原理是将源程序中的正规式转换成相应的确定有限自动机, 而相应的 动作则插入到词法分析子函数 yylex 中适当地方。 2.3.2 语法分析语法分析 语法分析程序是 ploscar 预编译阶段的核心部分。语法分析程序的作用是识 别由词法分析程序给出的单词符号(token)序列是否是符合 ploscar 给定文法的 正确句子。具体来说,它的任务27包括在由词法分析程序产生的符号序列中确定 ploscar 的语法结构,以及构造出表示该结构的语法树。由此可以看出语法分析程 序也可以看作一个函数,该函数把由词法分析程序生成的符号序列作为输入,并以 生成的语法树作为它的输出。这里提到的符号序列不是显式的输入参数,而是当语 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 16 法分析过程需要下一个符号的时候,调用设计成函数形式的词法分析程序,从而得 到所需的符号。 语法树的结构在很大程度上依赖于 ploscar 特定的语法结构,它被定义为动 态数据结构。该结构的每个节点都由一个记录组成,而这个记录的域包括了编译阶 段后面过程所需的特性。 2.3.3 语义分析语义分析 语义分析的主要任务28就是对语法分析所识别出的各类语法范畴, 分析其含义。 在预编译阶段,编译系统只能完成静态语义分析(static semantic analysis) 。在 ploscar 模块中,语义分析包括构造符号表、记录函数参数,变量声明中建立的名 字的含义,在表达式和语句中进行类型推断和类型检查以及在变量的类型转换作用 域内判断它们的正确性。 语法分析和语义处理可以通过使用编译程序自动产生工具 yacc(yet another compiler-compiler)来实现。yacc 输入用户提供的语言的语法描述规格说明,基于 lalr(1)语法分析的原理,自动构造一个该语言的语法分析器,同时它还能根据规格 文件中给出的语义规范建立相应的语义检查。 借助于 lex 与 yacc,可以构造出一个完整、规范、高效的编译程序。lex 生成 的词法扫描器从输入文本流中找到一种语言的词汇模式,然后在动作代码中返回代 表该词汇模式的标记(token);yacc 生成的语法解析器程序则接收由词法扫描器返回 的标记,多个标记可以形成标记序列,这些标记序列就可以表述出输入文本流中的 语法模式。lex 与 yacc 相结合29,流程图如图 2.3 所示,构造并输出一棵表示语法 结构的语法树。 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 17 flex规则文件 flex 被处理语言 的源程序 用c语言描述的词法 分析程序yylex() c编译器 词法分析程序 词法错误 单词符号 (token) yacc规则文件 yacc 用c语言描述的词法 分析程序yyparse() c编译器 语法分析程序 语法错误 语法树 (syntax tree) 图 2.3 flex 与 yacc 流程图 2.3.4 符号表管理符号表管理 在预编译阶段涉及到如何存放和查找各种标识符属性信息的问题,在最初的编 译器设计中,标识符的属性信息直接存放在语法树中的相应节点上。由于在程序中 对变量标识符的引用非常频繁,因此在语法分析和语义检查阶段不得不频繁搜索和 遍历整个语法树结构,以期找到第一次声明该变量的节点,获取该变量的各种属性 信息。为了提高查找效率,引入了符号表机制。 在编译程序中符号表是一个典型的目录数据结构,用来集中存放语言程序中出 现的有关标识符的属性信息,这些信息反映了标识符的语义特征属性。在词法分析 及语法在分析过程中不断积累和更新表中的信息,并在词法分析到语义分析的各阶 段,按各自的需要从表中获取不同的属性信息。具体说来,符号表作用如下: (1). 收集符号属性 编译程序扫描标识符声明部分,收集有关标识符的属性,并在符号表中建立标 识符相应的属性信息。 (2). 支持常量和变量的嵌套作用域原则。 类似于 pascal 或者 c 中变量作用域定义,即声明的常量和变量只在当前块中 起作用,在子块中声明的同名常量或变量被优先认为是子块中的常量或变量。通过 符号表的组织和管理,设计特定的变量查找算法,用以支持常量和变量的嵌套作用 华 中 科 技 大 学 硕 士 学 位 论 文 华 中 科 技 大 学 硕 士 学 位 论 文 18 域原则。 (3). 上下文语义的合法性检查的依

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论