CN110149800A - 一种用于处理与源程序的源代码相关联的抽象语法树的装置 - Google Patents
一种用于处理与源程序的源代码相关联的抽象语法树的装置 Download PDFInfo
- Publication number
- CN110149800A CN110149800A CN201580078525.XA CN201580078525A CN110149800A CN 110149800 A CN110149800 A CN 110149800A CN 201580078525 A CN201580078525 A CN 201580078525A CN 110149800 A CN110149800 A CN 110149800A
- Authority
- CN
- China
- Prior art keywords
- code
- data structure
- abstract syntax
- syntax tree
- target application
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/47—Retargetable compilers
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及一种用于处理与源程序的源代码相关联的抽象语法树的装置(100),所述抽象语法树包括多个节点,所述装置(100)包括:代码虚拟器(101),用于:基于预定映射数据结构,将所述抽象语法树的多个节点与目标应用编程接口的多个调用相关联,所述预定映射数据结构指示多个节点与多个调用之间的语义关联;基于所述多个节点生成虚拟化代码,所述虚拟化代码指示所述目标应用编程接口的多个调用。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及用于对源程序的源代码进行编译的编译器。
背景技术
可以采用不同架构的编译器对源程序的源代码进行编译。编译器可以处理采用源语言编写的源程序,并且可以提供采用目标语言编写的等同程序。
大多数编译器通常只接受一种源语言,并且提供仅采用一种目标语言的等同程序。少数编译器被设计用于接受各种源语言,并且提供采用各种目标语言的等同程序。此类编译器通常被称为编译器-编译器。通常,编译器-编译器接受附加输入,该附加输入指定源语言、转换规则和其他参数,并且允许开发人员更改其实现形式,以反映新语言的规范和转换规则。
由于计算机和软件的应用越来越广,增加编程语言的多样性以及开发新的领域特定语言(domain specific language,简称DSL)成为最近的趋势。通常,应用采用几种不同的语言进行编写,并且针对应用程序的特定部分定义了新的领域特定语言。目前,集成开发平台用于处理各种语言。在US 7076772 B2中,描述了用于多语言可扩展编译器框架的系统和方法。在定义新语言时,开发人员通常会重复使用其他语言定义的概念和模块。然而,这种方法基于对开发环境的结构和内部构造的深入了解,而且指定新语言不是一项容易的任务。提高新语言规范的生产力、可靠性和可维护性的方法以及高效编译器是非常需要的。
发明内容
本发明的目的是提供一种用于处理与源程序的源代码相关联的抽象语法树的有效概念。
该目的是通过独立权利要求的特征来实现的。根据附属权利要求、描述以及附图,进一步的实施形式是显而易见的。
本发明基于以下发现:可以应用代码虚拟器,以便提供指示目标应用编程接口的多个调用的虚拟化代码。可以基于与源程序的源代码相关联的抽象语法树生成虚拟化代码,所述抽象语法树例如可以由用于解析源代码的解析器提供。
虚拟化代码能够语义上等同于源程序的源代码,因此可以有效地表示源程序。因此,虚拟化代码允许减少计算机内使用的内存空间。此外,虚拟化代码能够通过解释器有效地解释源程序的语义,所述解释器例如用于调试。此外,虚拟化代码允许评估器进行有效的处理,该评估器产生适合用于生成可执行机器代码的中间表示。评估器可以基于分级评估的概念。
根据第一方面,本发明涉及一种用于处理与源程序的源代码相关联的抽象语法树的装置,所述抽象语法树包括多个节点,所述装置包括:代码虚拟器,用于:基于预定映射数据结构,将所述抽象语法树的多个节点与目标应用编程接口的多个调用相关联,所述预定映射数据结构指示多个节点与多个调用之间的语义关联;基于所述多个节点生成虚拟化代码,所述虚拟化代码指示所述目标应用编程接口的多个调用。因此,实现了用于处理与源程序的源代码相关联的抽象语法树的有效概念。
所述装置可以是编译器,用于对源程序的源代码进行编译。所述预定映射数据结构可以是预定映射表。所述虚拟化代码可以是与源代码相关联的中间表示。
所述虚拟化代码可以指示所述目标应用编程接口的多个调用,从而有效地表示源程序的语义。目标应用编程接口可以与领域特定语言(domain specific language,简称DSL)相关联。
根据第一方面所述的装置,在第一种实现形式中,所述代码虚拟器还用于基于预定语义数据结构将所述多个节点与所述多个调用相关联,所述预定语义数据结构指示所述目标应用编程接口的语义规范。因此,可以有效地考虑目标应用编程接口的语义规范。
根据第一方面或第一方面的任一前述实现形式所述的装置,在第二种实现形式中,所述虚拟化代码语义上等同于所述源程序的源代码。因此,可以提供源程序的完整的语义表示。
根据第一方面或第一方面的任一前述实现形式所述的装置,在第三种实现形式中,所述装置还包括:精简器,用于基于所述预定映射数据结构来确定与多个节点相关联的多个名称和多种类型,并且将所述多个名称和多种类型附加到所述多个节点。因此,可以有效地执行基于抽象语法树的名称和类型解析。
根据第一方面的第三种实现形式所述的装置,在第四种实现形式中,所述精简器还用于基于预定语义数据结构来确定与多个节点相关联的多个名称和多种类型,所述预定语义数据结构指示所述目标应用编程接口的语义规范。因此,可以更有效地执行基于抽象语法树的名称和类型解析。所述预定语义数据结构可以由代码虚拟器和精简器处理。
根据第一方面或第一方面的任一前述实现形式所述的装置,在第五种实现形式中,所述装置还包括:解析器,用于解析源程序的源代码,以获得包括多个节点的抽象语法树。因此,可以有效地提供抽象语法树。解析器可以由解析器生成器提供。
根据第一方面或第一方面的任一前述实现形式所述的装置,在第六种实现形式中,所述虚拟化代码是面向对象虚拟化代码。因此,所述虚拟化代码可以后期绑定到目标应用编程接口。根据第一方面或第一方面的前述任一种实现形式所述的装置,在第七种实现形式中,所述装置还包括:解释器,用于语义上解释虚拟化代码。因此,可以有效地实现虚拟化代码的直接语义执行。解释器可用于源程序的高效调试。解释器可以执行与目标应用编程接口的后期绑定。
根据第一方面或第一方面的前述任一种实现形式所述的装置,在第八种实现形式中,所述装置还包括:评估器,用于基于所述虚拟化代码生成与所述源程序相关联的中间表示,所述中间表示包括所述目标应用编程接口的多个调用。因此,可以有效地执行基于中间表示的优化和/或代码生成。
根据第一方面的第八种实现形式所述的装置,在第九种实现形式中,所述中间表示包括指示图形的图形数据结构,所述图形包括多个图形节点,所述多个图形节点包括所述目标应用编程接口的多个调用。因此,可以有效地表示虚拟化代码的语义。
可以如文献WO 2015/012711 A1所述实施分级评估,该文献的全部内容通过引用并入本文。特别地,用于构建图形数据结构的方法可以用于提供中间表示,通过符号可以识别所述图形数据结构的多个图形节点。
根据第一方面的第八种实现形式或第九种实现形式所述的装置,在第十种实现形式中,所述中间表示语义上等同于所述虚拟化代码。因此,可以提供虚拟化代码的完整的语义表示。
根据第一方面的第八种实现形式至第十种实现形式所述的装置,在第十一种实现形式中,所述装置还包括:代码生成器,用于基于所述中间表示生成可执行机器代码,所述可执行机器代码可由计算机的处理器执行。因此,源程序可以由计算机有效地执行。
根据第一方面的第十一种实现形式所述的装置,在第十二种实现形式中,所述装置还包括:优化器,用于针对所述可执行机器代码的预定性能指标来优化所述中间表示。因此,可以提高可执行机器代码的性能。所述预定性能指标可以指示可运行机器代码的运行时间和/或使用的内存。
根据第二方面,本发明涉及一种用于处理与源程序的源代码相关联的抽象语法树的方法,所述抽象语法树包括多个节点,所述方法包括:代码虚拟器基于预定映射数据结构,将所述抽象语法树的多个节点与目标应用编程接口的多个调用相关联,所述预定映射数据结构指示多个节点与多个调用之间的语义关联;所述代码虚拟器基于所述多个节点生成虚拟化代码,所述虚拟化代码指示所述目标应用编程接口的多个调用。因此,实现了用于处理与源程序的源代码相关联的抽象语法树的有效概念。
所述方法可以由所述装置执行。所述方法的进一步特征直接来自所述装置的功能。
根据第二方面所述的方法,在第一种实现形式中,所述方法还包括:代码虚拟器基于预定语义数据结构将所述多个节点与所述多个调用相关联,所述预定语义数据结构指示所述目标应用编程接口的语义规范。因此,可以有效地考虑目标应用编程接口的语义规范。
根据第二方面或第二方面的任一前述实现形式所述的方法,在第二种实现形式中,所述虚拟化代码语义上等同于所述源程序的源代码。因此,可以提供源程序的完整的语义表示。
根据第二方面或第二方面的任一前述实现形式所述的方法,在第三种实现形式中,所述方法还包括:精简器基于所述预定映射数据结构来确定与多个节点相关联的多个名称和多种类型;精简器将所述多个名称和多种类型附加到所述多个节点。因此,可以有效地执行基于抽象语法树的名称和类型解析。
根据第二方面的第三种实现形式所述的方法,在第四种实现形式中,所述方法还包括:所述精简器基于预定语义数据结构来确定与多个节点相关联的多个名称和多种类型,所述预定语义数据结构指示所述目标应用编程接口的语义规范。因此,可以更有效地执行基于抽象语法树的名称和类型解析。
根据第二方面或第二方面的任一前述实现形式所述的方法,在第五种实现形式中,所述方法还包括:解析器解析源程序的源代码,以获得包括多个节点的抽象语法树。因此,可以有效地提供抽象语法树。
根据第二方面或第二方面的任一前述实现形式所述的方法,在第六种实现形式中,所述虚拟化代码是面向对象虚拟化代码。因此,所述虚拟化代码可以后期绑定到目标应用编程接口。根据第二方面或第二方面的前述任一种实现形式所述的方法,在第七种实现形式中,所述方法还包括:解释器语义上解释虚拟化代码。因此,可以有效地实现虚拟化代码的直接语义执行。
根据第二方面或第二方面的前述任一种实现形式所述的方法,在第八种实现形式中,所述方法还包括:评估器基于所述虚拟化代码生成与所述源程序相关联的中间表示,所述中间表示包括所述目标应用编程接口的多个调用。因此,可以有效地执行基于中间表示的优化和/或代码生成。
根据第二方面的第八种实现形式所述的方法,在第九种实现形式中,所述中间表示包括指示图形的图形数据结构,所述图形包括多个图形节点,所述多个图形节点包括所述目标应用编程接口的多个调用。因此,可以有效地表示虚拟化代码的语义。
根据第二方面的第八种实现形式或第九种实现形式所述的方法,在第十种实现形式中,所述中间表示语义上等同于所述虚拟化代码。因此,可以提供虚拟化代码的完整的语义表示。
根据第二方面的第八种实现形式至第十种实现形式所述的方法,在第十一种实现形式中,所述方法还包括:代码生成器基于所述中间表示生成可执行机器代码,所述可执行机器代码可由计算机的处理器执行。因此,源程序可以由计算机有效地执行。
根据第二方面的第十一种实现形式所述的方法,在第十二种实现形式中,所述方法还包括:优化器针对所述可执行机器代码的预定性能指标来优化所述中间表示。因此,可以提高可执行机器代码的性能。
根据第三方面,本发明涉及计算机程序,包括计算机程序代码,用于当在计算机上执行时,执行所述方法。因此,所述方法可通过自动和重复的方式执行。所述装置可以被可编程地布置来执行计算机程序。
本发明可以以硬件和/或软件形式来实现。
附图说明
本发明实施例将结合以下附图进行描述,其中:
图1示出了根据一实施例的用于处理与源程序的源代码相关联的抽象语法树的装置的图;
图2示出了根据一实施例的用于处理与源程序的源代码相关联的抽象语法树的方法的图;
图3示出了用于将源程序的源代码编译成可执行机器代码的通用结构的图;
图4示出了采用集成开发环境的两阶段开发方法的图;
图5示出了根据一实施例的用于处理与源程序的源代码相关联的抽象语法树的装置的图;
图6示出了根据一实施例的装置内的源代码、虚拟化代码和中间表示之间的语义等同关系的图。
具体实施方式
图1示出了根据一实施例的用于处理与源程序的源代码相关联的抽象语法树的装置100的图。抽象语法树包括多个节点。
该装置100包括:代码虚拟器101,用于:基于预定映射数据结构,将所述抽象语法树的多个节点与目标应用编程接口的多个调用相关联,所述预定映射数据结构指示多个节点与多个调用之间的语义关联;基于所述多个节点生成虚拟化代码,所述虚拟化代码指示所述目标应用编程接口的多个调用。
图2示出了根据一实施例的用于处理与源程序的源代码相关联的抽象语法树的方法200的图。抽象语法树包括多个节点。
该方法200包括:基于预定映射数据结构,将所述抽象语法树的多个节点与目标应用编程接口的多个调用相关联201,所述预定映射数据结构指示多个节点与多个调用之间的语义关联;基于所述多个节点生成203虚拟化代码,所述虚拟化代码指示所述目标应用编程接口的多个调用。
下面描述了装置100和方法200的进一步实现形式和实施例。装置100和方法200允许领域特定语言(domain specific language,简称DSL)的语义调试。
图3示出了用于将源程序的源代码编译成可执行机器代码的通用结构的图。该图涉及编程语言实现的结构。
通用结构包括以下块,按如下顺序进行处理:解析器301、用于名称和类型解析的精简器303、优化器305和代码生成器307。通用结构通常包括这四个块。此外,可以提供执行器309来执行目标可执行机器代码。通过计算机硬件或解释器可以实现执行器309。
编译器-编译器可以在不同程度上使块301-307中的一些块的设计自动化。对于解析器301,例如可以通过解析器生成器实现高水平的自动化。解析器生成器可以接受语言语法规范,可选地,可以接受内部程序表示的具体信息。解析器301的输出可以是源程序的中间表示(intermediate representation,简称IR),也称为抽象语法树(abstract syntaxtree,简称AST)。可以使用进一步的方法来提供抽象语法树。
由于名称和类型解析的规则和算法可能很大程度上因语言而异,第二个块即用于名称和类型解析的精简器303的构建可以更少自动化。然而,在一个应用中联合使用几种语言可以假定这些语言的名称和类型解析规则有很多共同点。精简器303的某种自动化构建可以通过构建块和/或模块的库来实现,该库可以用于为特定的领域特定语言设计精简器303。现代编程语言的名称和类型解析在一定程度上可以被参数化。在编译源程序的模块时,精简器303可以不使用其他程序模块的整个代码。相反,精简器可以接受其他模块满足的接口的描述。例如,在基于Java的环境中,可以在类文件、jar文件以及具有接口源代码的Java文件中提供接口。精简器的这些特征可以用于本发明实施例中,并且可以被参数化。
优化器305可以被构建用于各种编程语言的中间表示。例如,可以使用LLVM优化框架,该LLVM优化框架可以接受C语言、C++语言、Java语言以及其他命令式和/或面向对象语言等。代码生成器307可以不依赖于源语言的细节,可以被设计用于一类中间表示,并且可以依赖于计算模型和/或计算机架构的原始操作。代码生成器可以根据低级可执行机器代码或更高级代码生成代码,可以使用定义用于表达语言语义的基本语义概念的目标应用编程接口。
因此,语言语法和相关概念的规范在一定程度上可以自动化。另一方面,从名称和类型解析到代码生成的语义概念的规范可能需要额外的努力。本发明实施例应用统称为多级编程或简单分级的技术。有不同的技术来实现分级,例如分级评估。
在用于编译的通用结构中,编程语言的扩展在中间块方面尤其困难。编程语言,特别是特定的领域特定语言,不可能一步就完成创建。编程语言可以通过语言特征的逐步添加和用于编译的通用结构的扩展来逐步创建。例如,当新基本语义概念被添加到计算模型并且可以被表示为目标应用编程接口中的新原始操作时,会出现添加编程语言的特征的期望。然后,会出现扩展编程语言和编译器的任务。
该任务可以包括通过新操作实现语言语法的扩展和块的修改,例如从解析到代码生成的块的修改。当采用方便的语法定义和解析器生成器实现解析器301时,可以容易地改变语言语法。其他块303-307的修改可能更加费力,因为可能没有通用方便的方法,并且这些块可能通过临时决定来构建。
期望可以有一种编译器的有效结构,以便使该任务变得容易,提高生产力,以及降低构建和演进新编程语言特别是能够快速改变的领域特定语言的成本。此外,期望可以有用于名称和类型解析的精简器303和优化器305的有效结构,能够允许采用关于领域特定语言的名称和类型解析的特定信息以及通过抽象语法树的节点与后端操作之间的映射进行参数化。
此外,源代码的双模式评估也有可能得不到集成开发环境(integrateddevelopment environment,简称IDE)的支持,但是在采用通用结构进行编译的实践中可能是非常需要的。常见的集成开发环境可以提供围绕一种或多种编程语言的编译器和/或解释器的用户界面。由于编译器可能具有编译步骤的线性排序,因此用户只能在编译之后运行和调试程序。
由于许多程序可以采用并行化硬件,因此可以包括并行运行的部件,所以可能难以调试此类并行化程序。同时,开发并行化程序的方法可以是使用具有确定性语义的高级抽象。这种决定论可以使语义调试成为集成开发环境的特殊执行模式。语义调试可以同时由编译器和集成开发环境直接支持。本发明实施例采用系统的方法,以在集成开发环境中实现双模式评估。图4示出了采用集成开发环境的两阶段开发方法的图。两阶段开发方法可以等同地称为双模式开发方法。
本发明实施例采用两阶段开发方法能够实现生产性的、便宜且容易的领域特定语言的语义规范,并且为各种领域特定语言提供可扩展结构。
本发明实施例实现了一种有效的编译器,该编译器可以通过如下方式进行参数化:编程语言的开发者不仅可以指定语言语法和相关概念,而且可以指定包括目标应用编程接口的规范等语义概念,该目标应用编程接口可以定义语言的原始操作,以及抽象语法树的节点与目标应用编程接口之间的映射。此外,给定目标应用编程接口和映射规范,可以执行领域特定语言的完整的名称和/或类型解析,这可以基于面向对象概念,并且可以容易地与例如Java等面向对象语言进行集成。
当扩展目标语言时,例如当使用附加原语和结构扩展领域特定语言实现时,前端可以相应地自适应此更改。因此,可以在前端自动提供新特征。前端可以反映在后端指定的语义。此类编译器可以被认为是编译器-编译器,因为其可以允许领域特定语言的语义规范及其语法规范。此外,可以支持集成开发环境中的双模式或两阶段程序评估。除了编译之外,这种双模式评估还可以允许实现语义调试。因此,可以消除重复工作,即语义的单个规范既可以用于语义调试,也可以用于编译。
图5示出了根据一实施例的用于处理与源程序的源代码相关联的抽象语法树的装置100的图。装置100形成如结合图1所描述的装置100的可能实现。装置100包括代码虚拟器101、精简器501、解析器503、解释器505、评估器507、优化器509和代码生成器511。此外,还提供了执行器513。
领域特定语言的源代码可以由解析器503解析,以便提供抽象语法树。精简器501可以基于抽象语法树执行名称和/或类型解析,以便获得具有名称和类型信息的抽象语法树。精简器501可以考虑预定映射数据结构,例如,抽象语法树的节点与目标应用编程接口的调用之间的映射表;和/或预定语义数据结构,例如领域特定语言的语义规范。代码虚拟器101可以基于具有名称和/或类型信息的抽象语法树生成虚拟化代码,所述虚拟化代码可以代表具有目标应用编程接口的调用的单个版本的代码。代码虚拟器101可以考虑预定映射数据结构,例如,抽象语法树的节点与目标应用编程接口的调用之间的映射表;和/或预定语义数据结构,例如领域特定语言的语义规范。解释器505可以语义上解释虚拟化代码,例如,用于实现语义调试。解释器505可以处理提供的数据。解析器503、精简器501、代码虚拟器101和解释器505可以形成前端。
评估器507可以是分级评估器,并且可以基于虚拟化代码生成中间表示。优化器509和代码生成器511可以基于中间表示共同提供可执行机器代码。执行器513可以通过提供的数据来执行可执行机器代码。评估器507、优化器509、代码生成器511和执行器513可以形成后端。在一实施例中,后端接受虚拟化代码作为输入,该虚拟化代码作为源程序的虚拟化表示。中间表示可以由评估器507通过构建图形数据结构采用分级评估来提供。虚拟化代码可以由生成源程序的中间表示的评估器507,例如分级评估器执行。优化器509进行的优化和/或代码生成器511进行的代码生成可以采用标准方法来实现,或者可以采用图形重写规则作为分级评估过程的一部分来实现。
解释器505可以是语义调试器,其可以接受虚拟化代码并且可以执行包含在虚拟化代码内的语义功能。这些语义功能可以从预定语义数据结构中获取,所述预定语义数据结构指示前端内代码虚拟化期间的领域特定语言的语义规范。
虚拟化代码的属性是其可以同时允许语义评估和分级评估。语义评估可用于实现语义调试。分级评估可用于为后端的后续阶段生成中间表示。虚拟化代码可以包括目标应用编程接口的调用。通过选择目标应用编程接口的相应版本可以实现相应的虚拟化代码操作模式,例如分级评估的语义。
目标应用编程接口可以采用例如Java等面向对象语言进行指定,也可以采用支持后期绑定机制的其他语言进行指定。目标应用编程接口可以是通用的,这意味着如在Java中,变量参数的类型和方法的结果可能具有类型参数,或者可以擦除这类信息,并且可以根据通用数据类型,例如Java中的对象对目标应用编程接口进行指定。
前端包括用于名称和/或类型解析的精简器501和代码虚拟器101。这些块可以接受预定映射数据结构和/或预定语义数据结构作为输入。预定语义数据结构例如可以以面向对象代码或接口对象的形式指示目标应用编程接口的规范。预定映射数据结构可以指示源代码的抽象语法树的节点与目标应用编程接口的相应调用之间的映射作为与抽象语法树的节点相关联的语义功能的实现。前端可以通过精简器501执行源代码的完整的名称和/或类型解析,包括由领域特定语言的语义规范指定的那些语言结构。
特定编程语言的开发人员可能仅提供领域特定语言的语义规范。他可能不会实现语言的名称和/或类型解析算法,包括参数化多态类型的解析,例如泛型。该实现可以由装置100授权。当扩展领域特定语言的语义规范时,即领域特定语言的实现现在支持附加原语和/或构造时,前端可以相应地自适应该改变。因此,在前端自动提供新特征。前端可以反映在后端指定的语义。在本发明一实施例中,提供了前端和后端的子划分,功能与用于编译的通用结构的功能不同。
总之,可以使用可由解析器生成器提供的解析器503。解析器503的输出可以是抽象语法树。此外,可以使用用于名称和/或类型解析的精简器501,其可以执行例如Java等面向对象语言的解析。其还可以通过源语言的原始操作与目标应用编程接口的方法调用之间的映射进行参数化。给定这些参数,精简器501能够对领域特定语言的语义规范给出的所有语言结构执行全名称和/或类型解析。可以采用代码虚拟器101,其可以针对所提供的领域特定语言的映射和语义规范将抽象语法树转换为目标应用编程接口的调用。可选地,可以使用虚拟化代码的解释器505,其可以在没有执行优化和/或代码生成的情况下允许虚拟化代码的语义执行。例如,解释器505可以用于调试。解释器505例如可以采用后期绑定将目标应用编程接口的接口方法与特定实现进行绑定,该特定实现可以允许直接执行来自领域特定语言的语义规范的所有语义功能。
可以应用可以进行虚拟化代码的分级评估的评估器507,例如分级评估器。在内部,评估器可以进行图形数据结构的构建,其可以将目标应用编程接口的接口方法与用于生成中间表示的特定实现进行绑定。在通过这种解释器执行虚拟化代码之后,可以构建中间表示,该中间表示可以语义上等同于虚拟化代码,因此可以等同于源程序的源代码。为了指定不同的输出表示或目标语言,语言的开发人员可以定义不同版本的分级评估器库。
可以如文献WO 2015/012711 A1所述实施分级评估,该文献的全部内容通过引用并入本文。特别地,用于构建图形数据结构的方法可以用于提供中间表示,通过符号可以识别所述图形数据结构的图形节点。在一实施例中,程序操作通过类的对象采用面向对象编程语言来表示,该类可以形成从图形数据结构的基本节点类开始发展来的层次体系。可以基于在图形数据结构中的图形节点中实现的工厂方法设计模式,通过调用与图形数据结构中的现有图形节点相关联的工厂方法来产生图形数据结构的新图形节点。通过符号可以识别图形数据结构的图形节点。根据代理设计模式,符号可以用作图形数据结构中的图形节点的代理。
由评估器507公开的目标应用编程接口可以作为面向对象语言的接口或作为运行时接口对象提供。可选地,可以采用优化器509和/或代码生成器511。
本发明实施例允许通过指定用于编译的通用结构的输入来定义编译器。该输入可以是目标应用编程接口的规范,领域特定语言的语义规范,以及抽象语法树的节点与目标应用编程接口的调用之间的映射的规范。本申请的作者可以知道并理解本申请的语法和语义。这可能比开发或修改用于实现的特定代码更简单、更不容易出错,该开发或修改用于实现的特定代码可能是容易出错的,并且可能基于了解编译器的所有内部构件,即使编译器是采用高级语言实现的。
本发明实施例使得能够更便宜和更有成效地开发和演进领域特定语言和相应的编译器。本发明实施例允许系统地实现两阶段或双模式集成开发环境以及允许实现语义调试。代码虚拟化允许同源代码的替代解释,这可以简化从原型到生产就绪代码的转换。
图6示出了根据一实施例的装置100内的源代码PSRC,虚拟化代码PVIRT和中间表示PIR之间的语义等同关系的图。装置100形成如结合图1和图5所描述的装置100的可能实现。装置100包括代码虚拟器101、精简器501、解析器503、解释器505、评估器507、优化器509和代码生成器511。此外,还提供了执行器513。
本发明实施例将用于实现领域特定语言的块分成两部分:前端和后端。功能可能与用于编译的通用结构的功能不同。精简器501可以提供有抽象语法树与目标应用编程接口之间的预定映射数据结构。精简器501的输出可以被转换成称为虚拟化代码的特定中间表示。
虚拟化代码可以包括目标应用编程接口的调用,其可以实现用于调用特定域的语义功能或原语的机制。虚拟化代码可以是面向对象虚拟化代码,其可以后期绑定到目标应用编程接口的不同实现。每个绑定可以实现不同的评估模式,这里可以支持至少两种模式。首先,可以支持语义评估或解释,以实现语义调试。其次,可以支持分级评估或中间表示生成,以实现代码编译。针对常见方法,用于名称和/或类型解析的精简器501可以有两个附加的参数:预定语义数据结构,指示目标应用编程接口的规范,以及预定映射数据结构,指示抽象语法树的节点与目标应用编程接口的调用之间的映射的规范。代码虚拟器101可以提供有相同的两个参数,并且可以产生虚拟化代码。
分级评估可以满足以下等式:
PSRC(DATA)=PVIRT(DATA)=PIR(DATA)
其中,
PSRC表示程序P的源代码;
PVIRT=CodeVirtualization(PSRC)表示程序P的虚拟化代码;
PIR=StagedEvaluation(PVIRT)表示程序P的生成的中间表示;
DATA表示提供的数据。
上述等式可以保持,其中PSRC(DATA)、PVIRT(DATA)和PIR(DATA)使用提供的数据来表示相应代码的相应评估。
在常用方法中,不提供对两阶段开发的支持,第一阶段是语义验证,第二阶段是性能剖析。在本发明一实施例中,特定域的新的领域特定语言的作者可以使用后端目标应用编程接口来描述域操作,然后可以使用所描述的集成开发环境,从而能够在调试器中运行领域特定语言的代码,并在运行时为目标平台生成机器可执行代码。在通用方法中,程序员在开发并行化程序时会重复工作。本发明实施例支持两阶段或双模式开发工作流程。在常用方法中,前端和后端的耦合可能使得难以为给定后端实现替代前端。在本发明实施例中,通过将后端暴露为应用编程接口,可以容易地为现有后端添加替代前端。也有可能将许多后端与单个前端相结合。
在整个说明书中,使用以下定义和首字母缩略词。
抽象语法树(abstract syntax tree,简称AST)是指用于表示源代码的抽象语法结构的树形数据结构。抽象语法树的每个节点可以表示在源代码中出现的结构。应用编程接口(application programming interface,简称API)是指一组例如程序、功能和方法等子例程的规范,这些子例程被调用以便与某些子系统进行互操作。通常,就面向对象语言而言,应用编程接口是指一组接口。目标应用编程接口是指在目标代码中使用的一组原始操作的规范。这些操作可以是语言语义的基本构建块,并构成了语言运行时系统的应用编程接口(application programming interface,简称API)。
编译器是指处理源程序的源代码并生成可执行机器代码的计算机程序。编译器-编译器是指可以从语言和机器的形式描述的特定形式中创建解析器、解释器或编译器的工具。编译时间是指编译器运行时执行的概念和操作。可执行机器代码是指一系列机器代码指令,该机器代码指令将由计算机的处理器执行,以执行给定任务。
通用程序是指按照待指定的后期类型编写的程序,在作为参数提供的特定类型需要时,所述待指定的后期类型被实例化。这种方法允许编写常用功能或类型,这些功能或类型在使用时可以仅在其操作类型的集合上不同,从而减少重复。解释器是指直接执行采用编程或脚本语言编写的指令,而无需事先将这些指令批量编译成机器语言的计算机程序。
中间表示(intermediate representation,简称IR)是指一种数据结构,其可以在编译器内部用于表示源程序,并且可以在输出可执行机器代码之前允许进行分析和转换。中间表示可以是具有节点内的特定信息的图形或树形数据结构。如果给定输入数据,中间表示可以包括用于评估程序的所有信息,因此中间表示的评估可以被认为是执行源程序的等同方式。后期绑定或动态绑定是指在运行时通过名称查找对象所调用的方法的一种计算机编程机制。
在面向对象编程(object-oriented programming,简称OOP)中,方法涉及与类相关联的子例程或过程。方法可以定义在程序运行时由关联类的实例呈现的行为。方法可以在运行时具有特殊属性,它们可以访问存储在与它们相关联的类的实例中的数据,从而能够控制实例的状态。面向对象语言(object-oriented language,简称OOL)是指支持面向对象编程(object-oriented programming,简称OOP)的计算机编程语言。面向对象编程是指使用对象(通常为类的实例)的编程范例,包括数据域和方法以及它们的交互,以便设计应用程序和计算机程序。编程技术可以包括数据抽象、封装、消息传递、模块化,多态性和继承等功能。参数多态性是指编程语言的属性,采用该编程语言表达的类型可能具有参数。参数化多态类型是指可能具有参数的采用编程语言的类型。运行时是指在编译后执行程序时执行的概念和操作。
源代码是指采用特定编程语言的源程序的文本表示。源程序是指可用作编译器的输入的程序。该程序可以被转换成可执行机器代码。分级代码可以与分级程序表示相关。用于源程序P的分级代码可以是程序P',使得P'的评估产生语义上等同于程序P的中间表示。在分级评估中,执行程序的结果可以是中间表示(intermediate representation,简称IR),而不是产生数据值。该中间表示可以包括跟踪程序中按照顺序使用的所有操作的数据结构。目标代码是指将源代码编译成的编程语言代码。目标代码可以是低级代码,例如可执行机器代码,或者是更高级代码,例如包括面向对象语言等常规编程语言中的代码。
虽然已详细地描述了本发明及其优点,但是应理解,可以在不脱离如所附权利要求书所界定的本发明的精神和范围的情况下对本发明做出各种改变、替代和更改。
Claims (15)
1.一种用于处理与源程序的源代码相关联的抽象语法树的装置(100),其特征在于,所述抽象语法树包括多个节点,所述装置(100)包括:
代码虚拟器(101),用于:
基于预定映射数据结构,将所述抽象语法树的多个节点与目标应用编程接口的多个调用相关联,所述预定映射数据结构指示多个节点与多个调用之间的语义关联;
基于所述多个节点生成虚拟化代码,所述虚拟化代码指示所述目标应用编程接口的多个调用。
2.根据权利要求1所述的装置(100),其特征在于,所述代码虚拟器(101)还用于基于预定语义数据结构将所述多个节点与所述多个调用相关联,所述预定语义数据结构指示所述目标应用编程接口的语义规范。
3.根据前述权利要求中任一项所述的装置(100),其特征在于,所述虚拟化代码语义上等同于所述源程序的源代码。
4.根据前述权利要求中任一项所述的装置(100),其特征在于,还包括:
精简器(501),用于基于所述预定映射数据结构来确定与多个节点相关联的多个名称和多种类型,并且将所述多个名称和多种类型附加到所述多个节点。
5.根据权利要求4所述的装置(100),其特征在于,所述精简器(501)还用于基于预定语义数据结构来确定与多个节点相关联的多个名称和多种类型,所述预定语义数据结构指示所述目标应用编程接口的语义规范。
6.根据前述权利要求中任一项所述的装置(100),其特征在于,还包括:
解析器(503),用于解析源程序的源代码,以获得包括多个节点的抽象语法树。
7.根据前述权利要求中任一项所述的装置(100),其特征在于,所述虚拟化代码是面向对象虚拟化代码。
8.根据前述权利要求中任一项所述的装置(100),其特征在于,还包括:
解释器(505),用于语义上解释虚拟化代码。
9.根据前述权利要求中任一项所述的装置(100),其特征在于,还包括:
评估器(507),用于基于所述虚拟化代码生成与所述源程序相关联的中间表示,所述中间表示包括所述目标应用编程接口的多个调用。
10.根据权利要求9所述的装置(100),其特征在于,所述中间表示包括指示图形的图形数据结构,所述图形包括多个图形节点,所述多个图形节点包括所述目标应用编程接口的多个调用。
11.根据权利要求9或10所述的装置(100),其特征在于,所述中间表示语义上等同于所述虚拟化代码。
12.根据权利要求9至11所述的装置(100),其特征在于,还包括:
代码生成器(511),用于基于所述中间表示生成可执行机器代码,所述可执行机器代码可由计算机的处理器执行。
13.根据权利要求12所述的装置(100),其特征在于,还包括:
优化器(509),用于针对所述可执行机器代码的预定性能指标来优化所述中间表示。
14.一种用于处理与源程序的源代码相关联的抽象语法树的方法(200),其特征在于,所述抽象语法树包括多个节点,所述方法(200)包括:
基于预定映射数据结构,将所述抽象语法树的多个节点与目标应用编程接口的多个调用相关联(201),所述预定映射数据结构指示多个节点与多个调用之间的语义关联;
基于所述多个节点生成(203)虚拟化代码,所述虚拟化代码指示所述目标应用编程接口的多个调用。
15.一种计算机程序,其特征在于,包括计算机程序代码,用于当在计算机上执行时,执行根据权利要求14所述的方法(200)。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/RU2015/000218 WO2016163901A1 (en) | 2015-04-07 | 2015-04-07 | An apparatus for processing an abstract syntax tree being associated with a source code of a source program |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110149800A true CN110149800A (zh) | 2019-08-20 |
CN110149800B CN110149800B (zh) | 2021-12-14 |
Family
ID=54366491
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201580078525.XA Active CN110149800B (zh) | 2015-04-07 | 2015-04-07 | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN110149800B (zh) |
WO (1) | WO2016163901A1 (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110825384A (zh) * | 2019-10-28 | 2020-02-21 | 国电南瑞科技股份有限公司 | 一种基于llvm的st语言编译方法及编译系统和编译器 |
CN111091612A (zh) * | 2019-10-09 | 2020-05-01 | 中国船舶重工集团公司第七0九研究所 | 一种抽象目标码架构的着色语言机器码生成方法及装置 |
CN112346730A (zh) * | 2020-11-04 | 2021-02-09 | 星环信息科技(上海)股份有限公司 | 一种中间表示的生成方法、计算机设备及存储介质 |
CN112698819A (zh) * | 2019-10-22 | 2021-04-23 | 北京信普飞科科技有限公司 | 面向树化对象编程程序设计方法、装置及存储介质 |
CN112799677A (zh) * | 2021-02-05 | 2021-05-14 | 北京字节跳动网络技术有限公司 | 一种编译期的hook方法、装置、设备及存储介质 |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11301224B1 (en) | 2019-04-30 | 2022-04-12 | Automation Anywhere, Inc. | Robotic process automation system with a command action logic independent execution environment |
US11113095B2 (en) | 2019-04-30 | 2021-09-07 | Automation Anywhere, Inc. | Robotic process automation system with separate platform, bot and command class loaders |
US11243803B2 (en) * | 2019-04-30 | 2022-02-08 | Automation Anywhere, Inc. | Platform agnostic robotic process automation |
US11614731B2 (en) | 2019-04-30 | 2023-03-28 | Automation Anywhere, Inc. | Zero footprint robotic process automation system |
US11334467B2 (en) | 2019-05-03 | 2022-05-17 | International Business Machines Corporation | Representing source code in vector space to detect errors |
CN110457065B (zh) * | 2019-08-14 | 2023-11-07 | 中国工商银行股份有限公司 | 用于获得可兼容多版本系统的应用的方法及装置 |
US11640282B2 (en) * | 2019-10-24 | 2023-05-02 | Here Global B.V. | Method, apparatus, and system for providing a broker for data modeling and code generation |
CN111240772A (zh) * | 2020-01-22 | 2020-06-05 | 腾讯科技(深圳)有限公司 | 一种基于区块链的数据处理方法、装置及存储介质 |
CN111367527B (zh) * | 2020-02-18 | 2023-03-28 | 北京字节跳动网络技术有限公司 | 一种语言处理的方法、装置、介质和电子设备 |
CN114090964A (zh) * | 2021-11-18 | 2022-02-25 | 北京五八信息技术有限公司 | 代码处理方法、装置、电子设备及可读介质 |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1509433A (zh) * | 2001-05-11 | 2004-06-30 | ���������˼�빫˾ | 把传统软件应用程序转换为现代面向对象系统的方法和系统 |
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
CN101261604A (zh) * | 2008-04-09 | 2008-09-10 | 中兴通讯股份有限公司 | 一种软件质量评价装置及软件质量评价的定量分析方法 |
CN101286132A (zh) * | 2008-06-02 | 2008-10-15 | 北京邮电大学 | 一种基于软件缺陷模式的测试方法及系统 |
CN102073589A (zh) * | 2010-12-29 | 2011-05-25 | 北京邮电大学 | 一种基于代码静态分析的数据竞争检测方法及系统 |
JP2011113147A (ja) * | 2009-11-24 | 2011-06-09 | Nomura Research Institute Ltd | ソース解析プログラム、プリプロセッサ、レキサ、および構文木解析プログラム |
CN103258159A (zh) * | 2011-12-16 | 2013-08-21 | 德商赛克公司 | 可扩展和/或分布式授权系统和/或提供类似的方法 |
WO2013157008A2 (en) * | 2012-04-18 | 2013-10-24 | Gizmox Ltd. | Code migration systems and methods and an online solutions store |
CN104182267A (zh) * | 2013-05-21 | 2014-12-03 | 中兴通讯股份有限公司 | 编译方法、解释方法、装置及用户设备 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7076772B2 (en) | 2003-02-26 | 2006-07-11 | Bea Systems, Inc. | System and method for multi-language extensible compiler framework |
CN105593815B (zh) | 2013-07-23 | 2019-08-20 | 华为技术有限公司 | 在编译器中构建基于图的中间表示的方法 |
-
2015
- 2015-04-07 WO PCT/RU2015/000218 patent/WO2016163901A1/en active Application Filing
- 2015-04-07 CN CN201580078525.XA patent/CN110149800B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1509433A (zh) * | 2001-05-11 | 2004-06-30 | ���������˼�빫˾ | 把传统软件应用程序转换为现代面向对象系统的方法和系统 |
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
CN101261604A (zh) * | 2008-04-09 | 2008-09-10 | 中兴通讯股份有限公司 | 一种软件质量评价装置及软件质量评价的定量分析方法 |
CN101286132A (zh) * | 2008-06-02 | 2008-10-15 | 北京邮电大学 | 一种基于软件缺陷模式的测试方法及系统 |
JP2011113147A (ja) * | 2009-11-24 | 2011-06-09 | Nomura Research Institute Ltd | ソース解析プログラム、プリプロセッサ、レキサ、および構文木解析プログラム |
CN102073589A (zh) * | 2010-12-29 | 2011-05-25 | 北京邮电大学 | 一种基于代码静态分析的数据竞争检测方法及系统 |
CN103258159A (zh) * | 2011-12-16 | 2013-08-21 | 德商赛克公司 | 可扩展和/或分布式授权系统和/或提供类似的方法 |
WO2013157008A2 (en) * | 2012-04-18 | 2013-10-24 | Gizmox Ltd. | Code migration systems and methods and an online solutions store |
CN104182267A (zh) * | 2013-05-21 | 2014-12-03 | 中兴通讯股份有限公司 | 编译方法、解释方法、装置及用户设备 |
Non-Patent Citations (4)
Title |
---|
ARVIND K. SUJEETH等: "Delite: A Compiler Architecture for Performance-Oriented Embedded Domain-Specific Languages", 《ACM TRANSACTIONS ON EMBEDDED COMPUTING SYSTEMS》 * |
TIARK ROMPF等: "Scala-Virtualized: linguistic reuse for deep embeddings", 《HIGHER-ORDER AND SYMBOLIC COMPUTATION》 * |
XIAO LI等: "The Source Code Plagiarism Detection Using AST", 《2010 INTERNATIONAL SYMPOSIUM ON INTELLIGENCE INFORMATION PROCESSING AND TRUSTED COMPUTING》 * |
胡才华: "基于网格的UDLC语言编译器的实现", 《中国优秀博硕士学位论文全文数据库(硕士)信息科技辑》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111091612A (zh) * | 2019-10-09 | 2020-05-01 | 中国船舶重工集团公司第七0九研究所 | 一种抽象目标码架构的着色语言机器码生成方法及装置 |
CN111091612B (zh) * | 2019-10-09 | 2023-06-02 | 武汉凌久微电子有限公司 | 一种抽象目标码架构的着色语言机器码生成方法及装置 |
CN112698819A (zh) * | 2019-10-22 | 2021-04-23 | 北京信普飞科科技有限公司 | 面向树化对象编程程序设计方法、装置及存储介质 |
CN110825384A (zh) * | 2019-10-28 | 2020-02-21 | 国电南瑞科技股份有限公司 | 一种基于llvm的st语言编译方法及编译系统和编译器 |
CN112346730A (zh) * | 2020-11-04 | 2021-02-09 | 星环信息科技(上海)股份有限公司 | 一种中间表示的生成方法、计算机设备及存储介质 |
CN112799677A (zh) * | 2021-02-05 | 2021-05-14 | 北京字节跳动网络技术有限公司 | 一种编译期的hook方法、装置、设备及存储介质 |
CN112799677B (zh) * | 2021-02-05 | 2023-09-12 | 北京字节跳动网络技术有限公司 | 一种编译期的hook方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN110149800B (zh) | 2021-12-14 |
WO2016163901A1 (en) | 2016-10-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110149800A (zh) | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 | |
US7962904B2 (en) | Dynamic parser | |
US8607206B2 (en) | Automatic synchronous-to-asynchronous software application converter | |
Rumpe et al. | Monticore 5 language workbench. edition 2017 | |
US9600243B2 (en) | Sharing of first class objects across multiple interpreted programming languages | |
Moldovan et al. | AG: Imperative-style Coding with Graph-based Performance | |
US9164744B2 (en) | Method and system for program building | |
CN108628635A (zh) | 获取参数名和局部变量名的方法、装置、设备及存储介质 | |
US8122440B1 (en) | Method and apparatus for enumerating external program code dependencies | |
US10416972B1 (en) | Generating closures from abstract representation of source code | |
US20090328016A1 (en) | Generalized expression trees | |
US20160246622A1 (en) | Method and system for implementing invocation stubs for the application programming interfaces embedding with function overload resolution for dynamic computer programming languages | |
Fritzson et al. | Towards Modelica 4 meta-programming and language modeling with MetaModelica 2.0 | |
Larsen et al. | Tensorflow graph optimizations | |
Lopes et al. | A safe-by-design programming language for wireless sensor networks | |
Gotti et al. | IFVM Bridge: A Model Driven IFML Execution. | |
CN108369499B (zh) | 一种代码虚拟化系统和方法 | |
Dantas et al. | Towards aspect-oriented programming for context-aware systems: A comparative study | |
McNamara | Rust in Action | |
Samoylov | Learn Java 12 Programming: A step-by-step guide to learning essential concepts in Java SE 10, 11, and 12 | |
US8843906B1 (en) | Inferring data types from compiler call site | |
Roo | Towards more robust advice: Message flow analysis for composition filters and its application | |
Chang et al. | Support NNEF execution model for NNAPI | |
US11972237B1 (en) | Member invocation declarative interception | |
Buuren | Domain-specific language testing framework |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |