一种基于契约式设计的Java编译器实现方法

文档序号:6346195阅读:235来源:国知局
专利名称:一种基于契约式设计的Java编译器实现方法
技术领域
本发明涉及一种基于契约式设计的Java编译器实现方法,此技术主要通过在原有的Java编译器上进行一定加工与改造,使VeriJava语法能够在之中进行编译,并能够在编译过程中验证语言的逻辑正确性。
背景技术
在Eiffel项目中,Betrand Meyer提出了基于契约式的设计方法(Design byContract)来提高软件的可靠度。通过使用DBC的设计方式:可以减少分离开发各组件系统的常规逻辑测试强度,并可以细化错误的出处以更快地找到错误所在,同时与文档的接口定义可以保持严格地一致性。这一设计形式通过对设计方式严密和逻辑的定义,保证了软件开发与设计的一致与协调。DBC充分鼓励程序员思考诸如“例程的先验条件是什么”这样的问题,帮助了程序员将概念及逻辑流程充分理清。Java作为一个大范围应用的编程语言以及面向对象类型语言的典型性代表,使用其作为开发语言的程序与系统正大量出现。但是由于Java语言本身的限制,造成在开发基于Java语言的系统过程中,不可避免地遇到很多团队协作、语言歧义等问题。即使在经常交流与沟通的情况下,也可能产生理解上的偏差。设计文档的详细与否固然会影响开发过程,但即使再详细的文档也会由于各类人的因素而造成一定的问题。于是,软件开发人员在开发过程中借助于一些定义的形式化语言与工具对所开发的系统进行一定定义,并通过严格的数学逻辑证明以表达其语义的唯一性。虽然形式化语言的产生对程序的开发过程起着极大的作用和影响,但是在软件系统的开发过程中,开发人员的人为思考及编写行为仍然会对代码的逻辑准确性起决定性的作用,而在这一阶段中形式化语言无法起到很好的规范与检验作用,因此,将DBC与开发语言紧密地结合起来,就成为了一个非常迫切且有效的方法。VeriJava是一次对于语言的扩展,作为一种新的语言,目前尚未有编译器及编程环境支持,因此,设计并开发一个支持verijava的编译器及相关工具是非常迫切并必要的。由于verijava是对Java语言的一次扩展,他对于Java语言本身并没有做任何改变,仅仅是通过在语言层面上加上契约形式的约束,使其符合DBc的方式,因此,VeriJava编译器也实现了对原Java编译器的扩展,采用一种结合的方式,将VeriJava的契约解析与原Java语言相分离,通过一定的分析方法及转换方法将其转换为标准的Java语言,并一同送入标准Java编译器进行编译。契约将会以方法的形式嵌入Java程序中,使编译后的文件包含了契约的约束,同时也可以在普通的Java环境中运行。

发明内容
基于上述问题,特此发明一种基于契约式设计的Java编译器实现方法;是通过一个基于VeriJava语法与语义检查、验证的编译器,试图在编译阶段通过对方法,类等先决条件与后置条件的验证,在逻辑上保证方法的正确性。
具体实施方法1.编译器架构:由于Verijava是对Java语言的一次扩展,在编译器的架构设计上,也采用了对原有Java编译器进行扩展的方式,比起重新开发一个完整的编译器来说,这样即保证了不会遗漏原有的特性,又可以在将来对契约式语法进行一定的扩展。其编译器的架构主要分为了三大部分:I) Verijava解析器与编织器:该部分为整个编译器的骨架。所有的源代码将首先通过这一解析器,随后被其分为两大部分:一部分是Veri Java中所包含的契约式扩展语言,另一部分则是用户所编写的标准Java代码。虽然代码在这一部分进行了分离,但是他们之间仍然存在着联系,这一联系主要由该解析器维持。在分离之后,解析器会将契约送入契约解析器,而将Java源代码进行解析并包装入类。在契约解析器完成其工作后,通过维持的两者的联系重新将两者编织在一起,并以流的形式输出到最终的编译器中。2)契约解析及翻译器:该部分主要针对新扩展的契约部分,通过对契约式语言的解析,随后翻译为对应的Java代码并输出。这一部分是整个编译器的核心部分。他通过可扩展的编程架构,以关键字为单位,对契约进行了循环式解析。在编译器内部包中提供了所有的关键字解析器与关键字列表,将契约中所包含的关键字均翻译为Java方法嵌入在源Java程序中,以try-catch形式验证契约并抛出自定义契约检查错误。同时,根据在VeriJava解析器中所维持的联系,对应地输出相应的代码,以避免不一致性。3) Java编译器:该部分接受Verijava解析器所输出的文件流,将其输出的标准Java代码编译为class文件并保存。这样,一个包含契约的标准Java文件就编译完成了。2.契约的转换与解析;在编译器所做的大部分的工作中,契约的解析与转换无疑是最重要的部分。如何使契约能够在编译后依然验证方法的完整性及语义的正确性,以及如何使契约元缝地嵌入代码,而不对原有代码产生大量性能方面的影响?对于契约的转换与解析,这些是非常必要及关键的。I)契约的解析:契约的解析是契约转换的前提条件,也是正确识别Veri Java语法的关键技术。在VeriJava语法中,先决条件与后置条件均可以被缺省,并且VeriJava向下兼容普通标准Java程序,因此直接定位关键字位置与关键字所在语句比较困难,因此在契约的解析这一过程中,采用了 Java的面向对象的特性,利用继承的关系,通过读取一个关键字列表的配置文件,对所有关键字进行了正则表达式的匹配。当然,这一匹配过程并非针对所有源代码,而仅仅是在关键字可能出现的地方进行了一定量的扫描与匹配,因此即提高了效率,也使整体架构保存了可扩展性,为将来的关键字扩展与具体实现留下了必要的接口与空间。当关键字在源程序中被匹配时,相关关键字所对应的解析器将被调用。契约解析器将对应语句传递给关键字解析器,并等待其返回结果。关键字解析器在收到调用请求后,利用关键字名与写在配置文件中的映射列表进行反射,直接调用该关键字所对应的解析方法,直至送入关键字解析器内部。2)契约的转换:契约在进行解析器后,就进入了转换的过程。每一个契约关键字所对应的语句都是在关键字解析后进行转换的。我们采用了以try-catch为基础的转换方式,将契约的先决条件,后置条件转换为标准的Java代码。同时,编译器内部会自动将对应的错误信息编织入该代码内,使契约能够在实际运行时发挥其真正的作用。
首先,编译器将检查契约的格式,契约格式的不正确性将使编译器在编译过程中直接抛出异常并停止编译。编译器支持缺省的契约形式,也即可以省略部分或全部关键字。因此,一个标准的Java程序也可以被送入编译器中进行编译。其次,在通过契约检查之后,编译器会对各契约进行转换,对每一个条件均转换为相应的try-catch语句块,并返回给解析器。契约的这一转换形式可以使其有效地融入源代码中,同时也不会引起太多的性能支出与空间支出。由于在进行契约检查时抛出的错误与异常均由编译器内部自定义,因此对于契约的检查也可以方便地在将来进行一定的扩展。3.编译合并与输出;当契约的转换完成时,所有的转换代码与原Java代码将被一同输送入编织器中,并进行对应的合成与调整。编织器将会根据各关键字转换器所返回的转换后的契约以及Verijava解析器所保存的Java代码进行直接编织。由于关键字转换器并不将代码嵌入,而仅仅是将对应的代码返回,编织器将会通过该解析器被调用的位置,直接将代码对应的嵌入代码中。在经过编织器后,代码已被编织为标准的Java代码,这些代码将被直接送人标准Java编译器中进行编译并输出为.class文件。这些文件可以在标准的Java环境下运行,当然,在契约检查部分需要包含所提供的自定义契约错误包等。编译完成后的文件支持在实际运行时将实时地检查契约,并将不符合契约的调用抛出。通过这一形式保证了在运行时的契约检查与校验。我们开发了一个静态验证器,可以通过这一验证器进行静态验证。通过在原有的Java编译器上进行一定加工与改造,使VeriJava语法能够在之中进行编译,并能够在编译过程中验证语言的逻辑正确性。通过基于DBc的方式,Verijava不仅仅能使开发人员在编写过程中及时找到设计错误或代码错误,也可以使契约的验证等更具备灵活性与易用性,通过契约可以使开发过程中的错误减小,并促进各开发部门或人员之间的协调与沟通,更好地完善开发过程。编译器的实现架构保留了一定的扩展性,对于新关键字或新契约检查错误等均留有相应的接口,并通过以XML形式提供的列表对关键字进行维护,这些设计架构均保证了未来的可扩展性与伸缩度。最终的输出代码亦可以在普通的JRE环境下运行,具有非常好的兼容性。
权利要求
1.一种基于契约式设计的Java编译器实现方法:该方法主要是此技术主要通过在原有的Java编译器上进行一定加工与改造,使VeriJava语法能够在之中进行编译。
2.根据权利要求1的基于契约式设计的Java编译器实现方法,此方法主要包含二大块即:编译器架构、契约的转换与解析。
3.根据权利要求2的基于契约式设计的Java编译器实现方法;首先在编译器架构中分为VeriJava解析器与编织器:该部分为整个编译器的骨架。所有的源代码将首先通过这一解析器,随后被其分为两大部分:一部分是VeriJava中所包含的契约式扩展语言,另一部分则是用户所编写的标准Java代码;其次是契约解析及翻译器:该部分主要针对新扩展的契约部分,通过对契约式语言的解析,随后翻译为对应的Java代码并输出,最后是)Java编译器:该部分接受VeriJava解析器所输出的文件流,将其输出的标准Java代码编译为class文件并保存。
全文摘要
一种基于契约式设计的Java编译器实现方法通过实现一个基于VeriJava语法与语义检查、验证的编译器,试图在编译阶段通过对方法,类等先决条件与后置条件的验证,在逻辑上保证方法的正确性,帮助开发人员在开发的过程中及时找到设计错误或协调沟通问题,促进交流与理解,使开发过程更为完善。
文档编号G06F9/45GK103092668SQ20111034498
公开日2013年5月8日 申请日期2011年11月1日 优先权日2011年11月1日
发明者杨际荣 申请人:镇江华扬信息科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1