38、MetaScribe:一款基于Ada的强大工具

MetaScribe:一款基于Ada的强大工具

在软件开发和CASE(计算机辅助软件工程)环境中,常常会遇到数据共享和转换规则实现等难题。例如,在使用FrameKit实现CPN - AMI2(一个基于Petri网的CASE环境)时,就发现不同来源工具间的数据共享存在重大问题,而且在实现转换和程序生成时,缺乏有效的工具支持。为了解决这些问题,MetaScribe应运而生。

1. 背景与需求

在使用FrameKit实现CPN - AMI2时,描述Petri网形式化并声明相关工具后,发现不同来源工具间的数据共享困难,尤其是在FrameKit这样的通用环境中,无法利用形式化的特异性来简化实现。同时,CPN - AMI2实现MARS方法时,转换和程序生成的实现缺乏合适工具。解析器生成器虽有助于语法分析,但转换规则复用困难;专家系统利于定义转换规则,但在I/O和复杂数据结构管理方面表现不佳。因此,需要一个能实现转换引擎的工具,而MetaScribe就是为满足这些需求而设计的。

2. MetaScribe概述

MetaScribe完全用Ada实现,利用Ada语言的特性进行类型检查和错误处理。它能解决类似嵌入式系统软硬件协同设计中特定编译器低成本设计的问题。可将可重定位编译器分为以下几类:
- 自动可重定位编译器 :包含一组开关,需设置以指定目标架构,所有可能的目标架构已内置。
- 用户可重定位编译器 :用户以某种形式向编译器 - 编译器指定目标架构,通常是指令的基本操作表示,编译器 - 编译器据此生成指定架构的编译器。
- 开发者可重定位编译器 :允许开发者修改编译器以针对给定架构进行特定优化,重定位与为任何架构编写新编译器的差异较小,重定位时不添加新的处理器依赖优化功能。

MetaScribe符合后两者的需求,它像解析器生成器一样能根据定制方案对输入规范应用规则,但专注于分层和图形化规范管理,其转换方案由语义模式中的规则组成。它还能根据给定语法格式生成定制输出,参数化过程类似于超泛型概念。

3. MetaScribe的架构

为提高转换引擎元素的可重用性,MetaScribe将输入描述、转换的语义和语法方面分开定义。操作MetaScribe需要描述以下三个元素:
- 形式化定义 :使用MSF元描述语言表达,用户需声明形式化中可能出现的任何实体。
- 语义模式 :使用MSSM语言表达,用户定义要应用于相关形式化的转换规则。
- 语法规则 :使用MSST语言表达,用户定义与相应语义模式中声明的构造函数关联的语法表示。

语义模式由规则组成,生成类似于ASIS的多态语义表示,即语义表达式树。语义表达式树是表达描述语义而无语法信息的树,语义模式可定制,声明的构造函数与描述构造函数表示方式的语法模式相连接。输入规范必须使用根据MSF描述中声明的实体自动定制的MSM数据描述语言编写,转换引擎执行时会进行检查。

4. 形式化描述

MSF元描述语言允许用户声明特定类型规范中可能存在的实体。它是基于对象的描述语言,类分为节点和链接。节点是规范的一部分,链接关联节点,节点和链接可携带存储在属性中的本地信息,规范还可指定全局信息。属性包含字符、字符串、整数等类型的表达式。

以下是一个简单的形式化描述示例,描述了一个由计算机和集线器通过电缆连接的网络:

formalism ('NETWORK_DSC');
// nodes and linkss
entity_list
   COMPUTER : node,
   HUB_16 : node,
   CABLE : link;
// Global attributes
global_attributes
   attribute string  : NET_ID;
end;
// parsed expressions for IP-address description
construction_list (DYNAMIC, STATIC);
// description of nodes and linkss
node (COMPUTER) is
   attribute_list
      attribute string  : NAME;
      attribute expression : IP_ADDRESS;
   end ;
   connectability_list
      with CABLE
         direction in ,
         maximum 1 ;
   end ;
end COMPUTER ;
node (HUB_16) is
   attribute_list
      attribute string  : NAME;
      attribute expression : IP_ADDRESS;
   end ;
   connectability_list
      with CABLE
         direction out ,
         maximum 16 ;
       with CABLE
         direction in ,
         maximum 1 ;
  end ;
end HUB_16 ;
link (CABLE) is
   attribute_list
      none
   end ;
end CABLE ;

MetaScribe使用MSF描述通过MSM数据描述语言定制规范描述。MSM的主要优点是能清晰描述可在内存中对应的数据结构,是一种多态数据描述语言,只进行描述而不偏袒规范的任何方面。转换引擎首先解析MSM描述并映射到内存数据结构,然后应用语义和语法模式中的操作。

5. 语义模式描述

MSSM描述语言允许用户定义要应用于输入规范的转换。MSSM描述由以下三个元素组成:
- 构造函数 :与给定语法模式的链接。
- 规则 :处理输入规范中找到的实体(节点、链接、属性)。
- 静态树 :对应于常量语义表达式树。

MSSM是基于函数的语言,程序单元是规则和静态树,可从单独文件构建语义模式。语义模式的目标是生成语义表达式树,语义表达式树的节点至少包含以下三个字段之一:
- 构造函数
- 字符串
- 整数

以下是一个静态树的示例:

constructor_list is ...
   NUMBER_OF_ENTITIES,
   TYPE_COMPUTER,
   TYPE_HUB;
...
semantic_tree ONE_OBJECT (TYPE   : semantic_constructor,
                          NUMBER : integer) is
    semantic_node ([$smc (TYPE) # #]:
       semantic_leaf ([NUMBER_OF_ENTITIES # # $int (NUMBER)]))
end;

语义规则示例如下,该规则生成一个引用网络中所有计算机的表达式树:

semantic_rule LIST_COMPUTERS (none) return void is
TREE : semantic_tree;
begin
  // Create the root of the result expression-tree
  TREE := create_sm_tree ([ANALYSIS_RESULT #
                              $atrv_str (attribute NET_ID)#]);
  // linking a computer to the description
  message ('Analysis the network...');
  if nb_node_instance (COMPUTER) > 0 then
     for COMP in 1 .. nb_node_instance (COMPUTER) do
        TREE := add_sm_son ($smt (TREE),
                            sm_rule A_RULE (get_node_reference (COMPUTER,
                                                                $int (COMP))));
     end for;
  end if;
  // Applying the syntactic pattern to the result expresion-tree
  generate $smt (TREE) in 'a_file';
  message ('Done...');
  return;
end;
6. 语法模式描述

MSST描述语言允许用户将语法表达式与语义模式中声明的任何构造函数关联。MSST是一种功能语言,由以下两种类型的规则组成:
- 外部规则 :与预定义构造函数关联,可根据语义表达式树节点的构造函数标签隐式调用或显式调用。
- 内部规则 :不与预定义构造函数关联,只能从外部规则显式调用,通常外部规则是多个内部规则的“前端”。

以下是一组用于文本显示语义树的外部规则示例:

syntactic_rule TYPE_COMPUTER is
begin
   put ('number of computers in the network :');
   apply ($1);
end;
syntactic_rule TYPE_HUB is
begin
   put ('number of hubs in the network      :');
   apply ($1);
end;
syntactic_rule NUMBER_OF_ENTITIES is
begin
   put_line ($str_int (0));
end;

这些规则的执行方案是,TYPE_NUM隐式调用语义表达式树第一个子节点中的语义构造函数关联的规则,将整数值转换为字符串并写入相应语义模式中声明的输出。

7. MetaScribe的实现

MetaScribe是一个程序生成器,最初考虑解释方法,但存在执行速度慢和需要实现执行时检查的问题。因此,MetaScribe生成的转换引擎是实现特定转换的特定程序,选择Ada是因为它提供了良好的执行时类型检查机制,所有执行时检查由Ada运行时支持,异常在处理程序中捕获并使用传播机制提供程序栈。

7.1 生成的转换引擎结构

生成的转换引擎由以下六个组件组成(Ada运行时不属于MetaScribe):
- MetaScribe运行时 :执行输入/输出操作并定义适用于转换引擎的所有数据结构,包含一个通用语义表达式树管理器,用于为语义模式中定义的构造函数实例化。
- MSM解析器 :解释输入规范并构建内存表示,语义规则将在其上操作。
- MSF解析器 :动态解释输入形式化的描述。
- 语义模式的实现 :实现语义模式。
- 语法模式的实现 :实现语法模式。
- MetaScribe启动器 :解析MSM输入描述(根据MSF描述进行动态检查),启动语义模式,即系统地将一些规则应用于当前描述,这些规则称为“主规则”,语义模式中至少必须有一个主规则。

生成的转换引擎可轻松插入FrameKit通用CASE环境,是原型化转换工具和程序生成器并在特定方法中进行实验的简单方法。

7.2 语义模式的实现

语义模式由两个包组成:第一个包定义数据结构,第二个包实现语义模式。以下是定义数据结构的包的规范示例:

with GEN_RTM_SEM_TREE;
package STATISTICS_SEM_TREE_MNGR is 
   -- ======================================================================
   -- The type that contains all the predefined semantic constructors
   type STATISTICS_SEMANTIC_CONSTRUCTOR is (XXX_SEM_TREE_NO_ITEM, 
                                            STATISTICS_RID_ANALYSIS_RESULT, 
                                            STATISTICS_RID_NUMBER_OF_ENTITIES, 
                                            STATISTICS_RID_TYPE_COMPUTER, 
                                            STATISTICS_RID_TYPE_HUB);
   -- ======================================================================
   -- Instanciation of the generic unit that defines semantic expresion-trees
   package INTERNAL_STATISTICS_SEM_TREE_MNGR is
            new GEN_RTM_SEM_TREE (STATISTICS_SEMANTIC_CONSTRUCTOR);
   -- ======================================================================
   -- The exception used to generate the propagation stack of errors
   PROPAGATE_ERROR : exception;
end STATISTICS_SEM_TREE_MNGR;

MetaScribe通过其独特的架构和功能,为解决软件开发和CASE环境中的数据共享和转换规则实现问题提供了有效的解决方案,其模块化的设计和基于Ada的实现保证了可重用性和执行时的可靠性。

MetaScribe:一款基于Ada的强大工具

8. MetaScribe的优势与应用场景

MetaScribe在软件开发和CASE环境中展现出了诸多显著优势,使其在多个应用场景中具有重要价值。

8.1 优势分析
  • 高度可定制性 :MetaScribe允许用户根据不同的需求定义形式化、语义模式和语法规则。通过MSF、MSSM和MSST三种语言,用户可以灵活地声明实体、定义转换规则以及关联语法表示,从而实现对输入规范的定制化处理。例如,在不同的网络描述场景中,用户可以根据具体的网络架构和需求,定义不同的节点、链接和属性,以及相应的转换规则和输出格式。
  • 良好的可重用性 :其架构设计将输入描述、语义和语法方面分开定义,提高了转换引擎元素的可重用性。语义模式和语法模式可以独立开发和维护,并且可以在不同的项目中重复使用。此外,语义表达式树的使用也使得数据结构和转换规则的复用更加方便。
  • 强大的类型检查和错误处理 :由于采用Ada语言实现,MetaScribe利用Ada的特性进行执行时类型检查和错误处理。这确保了程序的可靠性和稳定性,减少了运行时错误的发生。当出现异常时,Ada的异常处理机制可以捕获并处理异常,同时提供程序栈信息,方便调试和定位问题。
  • 支持复杂规范处理 :MetaScribe专注于分层和图形化规范管理,能够处理复杂的规范和数据结构。无论是面向对象的模型、网络拓扑结构还是其他复杂的形式化描述,MetaScribe都可以通过语义表达式树和相应的转换规则进行有效的处理和转换。
8.2 应用场景
  • 软件开发中的代码生成 :在软件开发过程中,MetaScribe可以作为代码生成工具,根据特定的模型和规范生成不同语言的代码。例如,根据数据库模型生成SQL代码,或者根据业务流程模型生成编程语言代码。通过定义合适的语义模式和语法规则,可以实现从抽象模型到具体代码的自动转换,提高开发效率和代码质量。
  • CASE环境中的工具集成 :在计算机辅助软件工程(CASE)环境中,不同的工具可能使用不同的形式化和数据结构,导致数据共享和集成困难。MetaScribe可以作为一个中间件,实现不同工具之间的数据转换和集成。例如,将一种建模工具生成的模型转换为另一种工具可以处理的格式,或者将不同工具生成的数据进行整合和分析。
  • 嵌入式系统开发 :在嵌入式系统开发中,需要为不同的处理器架构设计特定的编译器。MetaScribe类似于可重定位编译器,能够根据不同的目标架构定制输出。它可以根据嵌入式系统的硬件特性和需求,生成适合特定处理器的代码,从而降低开发成本和时间。
9. MetaScribe的工作流程

为了更好地理解MetaScribe的使用方法,下面详细介绍其工作流程。

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A(定义形式化):::process --> B(定义语义模式):::process
    B --> C(定义语法规则):::process
    C --> D(编写输入规范):::process
    D --> E(MSM解析器解析输入):::process
    E --> F(MSF解析器解析形式化描述):::process
    F --> G(语义模式处理):::process
    G --> H(语法模式应用):::process
    H --> I(生成输出规范):::process

具体步骤如下:
1. 定义形式化 :使用MSF元描述语言声明形式化中可能出现的实体、属性和全局信息。例如,在网络描述中,定义计算机、集线器和电缆等节点和链接,以及网络ID等全局属性。
2. 定义语义模式 :使用MSSM语言定义转换规则,包括构造函数、规则和静态树。语义模式的目标是生成语义表达式树,描述输入规范的语义。
3. 定义语法规则 :使用MSST语言定义与语义模式中构造函数关联的语法表示。语法规则将语义表达式树转换为具体的输出格式,如文本、代码等。
4. 编写输入规范 :使用根据MSF描述定制的MSM数据描述语言编写输入规范。输入规范描述了具体的实例信息,如网络中计算机和集线器的具体配置。
5. 解析输入和形式化描述 :MSM解析器将输入规范解析为内存表示,MSF解析器动态解释形式化描述。这两个解析器为后续的语义处理提供了基础。
6. 语义模式处理 :根据定义的语义模式,对解析后的输入进行处理。语义模式中的规则将应用于输入规范中的实体和属性,生成语义表达式树。
7. 语法模式应用 :将生成的语义表达式树应用语法规则,将其转换为具体的输出格式。语法规则根据语义表达式树的结构和内容,生成相应的文本或代码。
8. 生成输出规范 :最终生成符合要求的输出规范,如网络统计信息、代码文件等。

10. 总结与展望

MetaScribe作为一款基于Ada的工具,为软件开发和CASE环境中的数据共享和转换规则实现提供了有效的解决方案。它通过独特的架构设计和多种语言的支持,实现了高度的可定制性、可重用性和可靠性。在不同的应用场景中,MetaScribe都能够发挥重要作用,提高开发效率和质量。

然而,MetaScribe也存在一些可以改进的地方。例如,其学习曲线相对较陡,对于初学者来说,掌握MSF、MSSM和MSST三种语言的使用需要一定的时间和精力。未来,可以考虑提供更多的示例和教程,简化用户的学习过程。此外,随着软件开发技术的不断发展,MetaScribe可以进一步扩展其功能,支持更多的形式化和数据结构,以及与更多的工具和平台进行集成。

总体而言,MetaScribe是一款具有潜力的工具,在软件开发和软件工程领域有着广阔的应用前景。通过不断的改进和完善,它将为开发者提供更加便捷、高效的开发体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值