没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记253(2010)75-88www.elsevier.com/locate/entcs同构语言嵌入的形式化托尼·克拉克1泰晤士河谷大学,圣。MaryLaurence Tratt2伯恩茅斯大学,Poole,Dorset,BH 12 5BB,英国摘要实现语法上不同的领域特定语言(DSL)的成本可以通过将它们均匀地嵌入到宿主语言中并与其编译器合作来降低。当前的同构嵌入方法要么限制多个DSL的嵌入以提供安全保证,要么允许嵌入多个DSL但迫使用户处理互操作性负担。在本文提出了μ演算,它允许参数化语言嵌入被指定并进行分析。通过将问题简化到其核心要素,我们能够展示如何在同构嵌入上下文中定义多个表达性语言嵌入。我们进一步展示了如何定义具有安全保证的关键词:领域特定语言,形式语言规范,语言嵌入1介绍领域特定语言(DSL)是用于帮助实现重复出现的问题的微型语言将一种特定的语言确定为“DSL”在一定程度上是主观的;直观地说,它是一种有自己的语法和语义的语言,但它比典型的GPL(如Java)更小,更不通用。DSL的前提很简单:一个简单的、预先的成本允许以低成本、可靠和可维护的方式创建系统类别[16]。DSL有着悠久的历史,尽管它们通常有不同的名称[1]。传统的、广泛使用的DSL,如UNIXmake程序和yacc解析系统,已经被实现为独立系统,1tony. tvu.ac.uk2laurie@tratt.net1571- 0661 Crown版权所有© 2010由Elsevier B. V.出版 在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2010.08.03376T. 克拉克湖Tratt/Electronic Notes in Theoretical Computer Science 253(2010)75精简的编程语言编译器和虚拟机合二为一;相关的实现成本和缺乏实际的可重用性阻碍了DSL的创建[10]。独立实现的另一种方法是嵌入,其中DSL在宿主编程语言中“托管”;换句话说,宿主语言的语法使用DSL语法进行扩展。这种嵌入的一个简单示例是SQL DSL;通过使用DSL而不是外部数据库,可以获得几个优点,例如SQL语法错误的静态检测和将外部值安全插入SQL语句。几十年来,语言扩展一直是语言研究者的目标(见例如[12]),但大多数早期的工程师无法防止语言及其扩展之间的意外和不必要的交互[5]。后来的方法,虽然在很大程度上是理论性的,但确实表明某些形式的语言扩展可以避免这些问题[3,4]。最近,DSL嵌入方法,如Applugo [2],XMF [6,7],Converge [17],Metalua [9]和其他(例如,[14,8,13])表明这是一种可行的方法。DSL嵌入技术可以分为异构或同构[17]。简单地说,异构嵌入(例如,当编译宿主语言的系统和实现嵌入的系统不同时相比之下,均匀嵌入(例如,Converge、Metalua、XMF)使用语言异构嵌入的优点是它可以应用于任何宿主语言和任何嵌入式语言。然而,这意味着异构嵌入系统通常很少或根本不知道它们嵌入的语言的语义,这意味着这种技术很难扩展[17]。此外,异构技术通常假设单个DSL嵌入到单个宿主语言中:多个不同的DSL必须手动焊接在一起,以便创建不支持语法错误的单个异构嵌入然而,同构嵌入本质上限于特定的宿主语言,但通常能够更好地保证嵌入的安全性,允许嵌入更大和更复杂的DSL同构嵌入也没有对在一种宿主语言中嵌入多个DSL或使DSL彼此交错的概念性限制在实践中,当前的同构嵌入技术限制了多个DSL可以嵌入的程度,而无需求助于笨拙的黑客[9]。例如,Metalua允许多个DSL嵌入其中,但需要全局解析器的操作;不能保证不同的扩展将和平共存,甚至不能保证单个扩展是格式良好的。另一方面,Converge允许多个DSL共存,并强制执行合理的安全保证,但这样做是通过使DSL在语法上令人不快地不同,并使DSL彼此之间的嵌入非常困难。我们认为,同质嵌入的概念承诺和目前的实际现实之间的距离在很大程度上是因为缺乏根据,T. 克拉克湖Tratt/Electronic Notes in Theoretical Computer Science 253(2010)7577语言嵌入在同质环境中的基本理论的立场本文提出了描述和分析同构语言嵌入的μ该演算扩展了λ演算,使其具有定义和使用语言嵌入的功能,允许可参数化的语言定义范围为源文件的一部分,并且可以任意嵌套在彼此之间。本文的结构如下:第2节定义了μ-演算的语法和语义,并展示了如何精确地定义嵌入式语言;第3节描述了语言嵌入的不同类别以及它们如何在演算中编码;第4节展示了如何使用演算定义具有多个嵌入的语言以及如何表示安全标准;最后,第5节总结了对进一步工作的分析和讨论。2μ: 一种嵌入微积分的μ演算是λ演算的扩展,支持嵌入式语言。新的语言可以通过定义它们的语法、动态语义以及它们与宿主语言执行上下文的关系来添加到μ嵌入式语言的定义和随后的使用采用μ演算中的标准结构的形式。本节定义了微积分,并定义了语言是如何嵌入其中的。它的结构如下:2.1 定义了演算的语法,并提供了一个使用的例子;语言是根据它们的抽象语法嵌入的;第2.2节定义了一个表示μ演算抽象语法的数据类型;第2.3节定义了μ演算的语义,将它嵌入到它本身。2.1概述μ-演算的语法是:E::=表达式V型变星| fu n (V)E函数|EE应用程序|ifEthenEelseE条件|(E,E,E)语言定义|langE:T[C]语言嵌入T::=.语法类型C::=...原始文本μ包含传统的λ演算,加上语言定义和语言嵌入组件。语言定义将语言语言嵌入允许在宿主演算中使用语言。本质上,语言定义定义了解释器和从主机解释器到嵌入式语言解释器的翻译。语言嵌入是在宿主语言提供的上下文中使用定义78T. 克拉克湖Tratt/Electronic Notes in Theoretical Computer Science 253(2010)75更具体地说,语言定义三元组(eval,load,unload)定义了:一个求值器eval,它根据语言的状态对语言进行求值;一个加载器load,它从宿主语言状态映射到嵌入语言状态;一个卸载器unload,它将嵌入状态转换回宿主状态。下面是如何使用微积分的概述//定义一个类似SQL的嵌入式语言. type SQL=. //SQL 的 类 型 定 义 letsql = ( evalSQL ,loadSQL,unloadSQL)哪里evalSQL =. loadSQL=. unloadSQL =.//定义一个嵌入式的类HTML语言.type HTML =. //HTML的类型定义lethtml =(evalHTML,loadHTML,unloadHTML)哪里...//使用两个嵌入的语言定义。//执行数据库查询以生成所有//(name,age)pairs foradults...让结果=lang sql:SQL[SELECT name,age from Customer WHERE age> 18]在//中生成显示结果的HTML表格. lang html:HTML[对于姓名,结果中的年龄
名称/TD> | 年龄 /TD> |