MetaScribe与Ada95/O2绑定:数据处理与持久化的技术探索
1. MetaScribe工具介绍
MetaScribe是一款能够快速生成转换引擎的工具。转换引擎是一种程序,它可以解析输入规范,并通过应用转换规则生成输出规范,可用于构建程序生成器或简化CASE环境(如FrameKit)中数据表示的标准化。
MetaScribe的运行信息可在 http://www - src.lip6.fr/metacribe 上找到。它已被用于从高级半形式化规范生成Petri网或Java程序,实验结果令人满意,目前还在ODAC项目中用于处理从高级代理导向规范到Petri网的转换。
2. 语义和句法模式的实现
2.1 语义表达式树管理器
使用该管理器实例化特定转换引擎处理语义树表达式的原语。实现语义模式组过程和函数的包对应规则和静态语义树,为避免文件过大,原语主体存于单独文件。以下是静态语义树 ONE_OBJECT
的生成代码示例:
separate (STATISTICS_SEM_ENTITIES)
function SMT_STATISTICS_ONE_OBJECT (TYPE : in STATISTICS_SEMANTIC_CONSTRUCTOR;
NUMBER : in INTEGER) return RTM_SEM_TREE is
TMP_TAB : SUB_SEM_TREE_STORAGE;
begin
TMP_TAB := CREATE_RTM_SEM_TREE (CREATE_RTM_SEM_NODE (ITS_TYPE => TYPE,
ITS_INT_VALUE => NUMBER));
TMP_TAB := ADD_SON_TO_CURRENT_NODE (TMP_TAB, CREATE_RTM_SEM_TREE (
CREATE_RTM_ST_NODE (ITS_TYPE => STATISTICS_RID_NUMBER_OF_ENTITIES)));
return TMP_TAB;
exception
when PROPAGATE_ERROR =>
FK_PUT_MSG (MESSAGE => "propagated in ->SMT_STATISTICS_ONE_OBJECT");
raise ;
when others =>
FK_PUT_MSG (MESSAGE => "Huge problem in ->SMT_STATISTICS_ONE_OBJECT");
raise PROPAGATE_ERROR;
end SMT_STATISTICS_ONE_OBJECT;
此代码使用实例化的语义表达式树管理器原语构建特定树,并设置异常处理程序来处理问题。在调试模式下,子程序的开始和结束会自动生成跟踪信息。
2.2 句法模式实现
句法模式由一个包含所有句法规则的包组成。为避免文件过大,规则主体存于单独单元,由于句法规则不返回值(用于在输出中打印字符串),通过过程实现。以下是句法规则 TYPE_COMPUTER
的生成代码示例:
with STATISTICS_SEM_ENTITIES,
SYN_GENERATOR_RUNTIME;
use STATISTICS_SEM_ENTITIES,
SYN_GENERATOR_RUNTIME;
separate (SYNT_PATTERN_TEXT_DISPLAY_FOR_STATISTICS)
procedure SYR_STATISTICS_TEXT_DISPLAY_TYPE_COMPUTER (SEM_TREE : in RTM_SEM_TREE) is
begin
SYN_RTM_PUT (FILE_IN_MEM, TO_VSTRING ("number of computers in the network :"));
APPLY_SYNTACTIC_RULE (CURRENT_GOTO_SON (SEM_TREE, 1));
exception
when PROPAGATE_ERROR =>
FK_PUT_MSG (MESSAGE =>
"propagated in ->SYR_STATISTICS_TEXT_DISPLAY_TYPE_COMPUTER");
raise ;
when others =>
FK_PUT_MSG (MESSAGE =>
"Huge problem in ->SYR_STATISTICS_TEXT_DISPLAY_TYPE_COMPUTER");
raise PROPAGATE_ERROR;
end SYR_STATISTICS_TEXT_DISPLAY_TYPE_COMPUTER;
句法规则应用时需要一个语义表达式树作为参数,输出文件由语义规则调用句法模式时设置为 “当前输出”。显示函数(如 SYN_RTM_PUT
)属于MetaScribe运行时,导航指令(如 $<int>
)由实例化的语义表达式树管理器实现。异常处理程序用于检测表达式树构建中的问题,跟踪模式可跟踪句法规则的所有输入语义表达式树。
2.3 应用函数的实现
应用函数分为显式和隐式应用。显式应用对应标准过程调用,隐式应用通过以下过程实现:
procedure APPLY_SYNTACTIC_RULE (SEM_TREE : in RTM_SEM_TREE) is
begin
case GET_RTM_ST_NODE_TYPE (CURRENT_CONTENT (SEM_TREE)) is
when STATISTICS_RID_ANALYSIS_RESULT =>
SYR_STATISTICS_TEXT_DISPLAY_ANALYSIS_RESULT (SEM_TREE);
when STATISTICS_RID_NUMBER_OF_ENTITIES =>
SYR_STATISTICS_TEXT_DISPLAY_NUMBER_OF_ENTITIES (SEM_TREE);
when STATISTICS_RID_TYPE_COMPUTER =>
SYR_STATISTICS_TEXT_DISPLAY_TYPE_COMPUTER (SEM_TREE);
when STATISTICS_RID_TYPE_HUB =>
SYR_STATISTICS_TEXT_DISPLAY_TYPE_HUB (SEM_TREE);
when XXX_SEM_TREE_NO_ITEM =>
raise SYNT_PTRN_APPLY_ERROR;
end case ;
exception
when PROPAGATE_ERROR =>
FK_PUT_MSG (MESSAGE => "propagated in ->APPLY_SYNTACTIC_RULE");
raise ;
when others =>
FK_PUT_MSG (MESSAGE => "Huge problem in ->APPLY_SYNTACTIC_RULE");
raise PROPAGATE_ERROR;
end APPLY_SYNTACTIC_RULE;
该过程基于枚举类型对语义树当前节点的规则标签进行动态应用。
3. Ada95/O2绑定与数据持久化
3.1 项目背景与目标
项目旨在提出一种高效解决方案,用于保存、恢复和交换数据。利用持久化概念将应用程序上下文保存到面向对象数据库(OODBMS)O2中,并从数据库中检索数据,借助O2的互连功能进行数据交换。已开发Ada与O2的绑定原型,使用O2数据库管理系统版本4.6和Ada 95(gnat编译器3.10p),在sparc station ultra 1和solaris 2.5环境下运行,并进行了性能测试。
项目还扩展了持久化研究结果,以管理与其他面向对象语言(如C++、Java)的持久化环境,实现异构语言编写的应用程序之间的数据交换。例如,可将Ada应用程序创建的数据可视化任务委托给Java应用程序,使通过网络访问数据的应用程序更易实现。
3.2 持久化定义
- Ada 83中的持久化 :Ada是强类型语言,每个要处理的数据需与类型化标识符关联。在Ada中,持久化定义为允许三元组(标识符、数据、类型)在程序运行时之后仍然存在的属性。程序数据环境由程序中声明的标识符、标识符类型和与之关联的数据组成,持久数据环境是程序数据环境在程序运行结束后仍存在的部分。可通过有向图结构表示程序数据环境,持久环境是由标识符、关联数据和标识符类型定义的子图。
- Ada 95中的持久化 :引入对象概念后,为了保留程序的一致性,需要改进 “通过可达性传播持久化” 的规则。数据 ‘d’ 要持久化,必须与类型相同或为其祖先的数据或标识符关联。因此,持久化重新定义为允许四元组(标识符、类型、数据、数据标签)在运行时之后存在的属性。并且,类型的所有属性都必须持久化,才能存在持久实例。
3.3 持久环境属性
M. Atkinson提出持久系统应满足的属性:
1. 与类型系统和创建正交;
2. 通过继承或可达性传播持久化;
3. 行为透明。
项目的持久环境满足后两个规则和创建正交性,但不完全与类型系统正交,需要在相应包中包含特殊Ada代码以创建持久实例,仅对新类型创建确保正交性。此外,还为Ada语言添加了第四条规则:将持久化集成到编程语言中不应涉及语言的任何更改,以避免标准化语言修改带来的问题。
3.4 原型原理
选择使用面向对象数据库管理系统O2,因为Ada更接近面向对象数据模型,且O2符合对象数据库管理组(ODMG)标准,可提高应用程序之间的互操作性。
Ada/O2耦合基于O2的应用程序编程接口(API),前提是接口语言(这里是Ada)支持C语言接口。实现Ada持久化的步骤如下:
1. 设计和实现一组工具,用于连接Ada应用程序和O2数据库管理系统,包括物理连接、事务管理、列表、集合和包管理,以及解决Ada和O2类型之间的阻抗不匹配问题。
2. 为程序员提供两个生成系统:
- 第一个生成系统生成一组对应O2类和O2数据库的Ada包。
- 第二个生成系统生成O2类。
以下是实现Ada持久化的流程示意图:
graph LR
A(Ada应用程序) --> B(工具集)
B --> C(O2数据库管理系统)
D(生成系统1) --> E(Ada包)
F(生成系统2) --> G(O2类)
E --> A
G --> C
4. 比较研究与应用示例
4.1 语言与OODBMS的比较研究
为了实现异构语言应用程序之间的数据交换,对Java语言、Ada语言和O2 OODBMS进行了比较研究。研究发现,O2 OODBMS可以作为Java和Ada之间的数据交换的通用平台。原因在于O2遵循对象数据库管理组(ODMG)的建议,这些建议为多个OODBMS之间或OODBMS与使用CORBA标准的应用程序之间的互连提供了便利。
下面是一个简单的比较表格:
| 特性 | Ada | Java | O2 OODBMS |
| ---- | ---- | ---- | ---- |
| 类型系统 | 强类型,编译时静态设置 | 强类型,运行时类型检查 | 支持复杂对象类型 |
| 对象概念 | 支持对象概念,可扩展类型 | 纯面向对象语言 | 基于对象模型管理数据 |
| 持久化支持 | 通过绑定O2实现持久化 | 可借助外部工具实现持久化 | 原生支持持久化数据管理 |
4.2 应用示例:飞机模拟器数据管理
以飞机模拟器为例,展示Ada95/O2绑定在实际应用中的数据管理。飞机模拟器可能涉及大量的传感器数据、飞行参数等,需要高效地保存和恢复这些数据。
-
数据保存 :使用Ada应用程序收集飞机模拟器的数据,通过Ada/O2绑定将数据存储到O2数据库中。具体步骤如下:
- 初始化O2数据库连接,使用之前设计的工具集建立物理连接。
- 将收集到的数据封装为符合O2类定义的对象。
- 调用O2 API将对象存储到数据库中。
-
数据恢复 :在需要时,从O2数据库中恢复数据。步骤如下:
- 再次初始化O2数据库连接。
- 根据需求查询数据库,获取相应的数据对象。
- 将数据对象转换为Ada程序可处理的格式。
以下是一个简单的流程图,展示了飞机模拟器数据保存和恢复的过程:
graph LR
A(飞机模拟器) --> B(Ada应用程序)
B --> C(数据封装)
C --> D(存储到O2数据库)
E(需要数据时) --> F(查询O2数据库)
F --> G(数据转换)
G --> H(Ada应用程序使用数据)
5. 总结与优势分析
5.1 研究总结
本文介绍了MetaScribe工具在生成转换引擎方面的应用,包括语义和句法模式的实现以及应用函数的处理。同时,详细阐述了Ada95/O2绑定在数据持久化方面的研究,包括持久化的定义、持久环境的属性以及原型的实现原理。通过比较研究,证明了O2 OODBMS可以作为Java和Ada之间的数据交换平台,并通过飞机模拟器的应用示例展示了其实际应用。
5.2 优势分析
- 数据交换灵活性 :通过O2 OODBMS作为中间平台,实现了Ada和Java等异构语言应用程序之间的数据交换,使得不同语言的优势得以充分发挥。例如,Ada适合编写复杂算法,而Java在网络应用和可视化方面具有优势。
- 持久化管理 :利用持久化概念,将应用程序的数据环境保存到数据库中,方便数据的恢复和重用,提高了软件的设计效率和质量。
- 标准化与互操作性 :O2遵循ODMG标准,增强了应用程序之间的互操作性,使得不同系统之间的数据交换更加便捷。
综上所述,MetaScribe工具和Ada95/O2绑定为数据处理和持久化提供了有效的解决方案,在实际应用中具有重要的价值。