中文

包含新语言构造名称绑定的用户定义运算符

编程语言 2017-04-03 v1

摘要

用户定义的语法扩展对于实现具有良好代码可读性的嵌入式领域特定语言 (EDSL) 非常有用。它们允许 EDSL 作者定义领域自然表示法,这通常不同于宿主语言语法。如今,关于强大的用户定义语法扩展已有若干研究工作。一种有前景的方法是使用用户定义的运算符。用户定义的运算符是具有用户定义语法的函数。它可以被视为无需宏即可实现的语法扩展。用户定义运算符的一个优点是运算符可以被静态类型化。编译器可以在使用运算符之前发现运算符定义中的类型错误。此外,编译器可以利用静态类型来解决语法歧义。然而,用户定义运算符很难实现涉及静态名称绑定的语言构造。名称绑定是名称与值(或内存位置)之间的关联。我们的探究是是否能够设计一个涉及新的自定义名称绑定的用户定义运算符系统。本文提出了一个名为 dsl class 的用户定义运算符的模块系统。dsl class 类似于 Java 中的普通类,但它包含的是运算符而不是方法。我们使用运算符来实现自定义名称绑定。例如,我们使用零元运算符来模拟变量名。dsl class 的一个实例,称为 dsl object,将表达名称绑定的环境具体化。程序员可以通过指定 dsl object 处于活动的位置来控制实例运算符的作用域。我们扩展了宿主类型系统,使其能够表达 dsl object 的激活。在我们的系统中,绑定的名称通过类型参数传播到 dsl object。这使我们能够实现涉及静态名称绑定的用户定义语言构造。本文的一个贡献是我们揭示了可以将管理名称及其作用域的系统与像 Java 这样的面向对象语言的模块和类型系统集成。这允许我们通过采用基于预期类型的及早消歧来实现所提出的系统,从而使编译时间可以接受。及早消歧在解析器运行时修剪掉语义无效的抽象解析树 (AST),这是必需的,因为解析器可能会为同一源代码生成大量可能有效的 AST。我们实现了 ProteaJ2,这是一种基于 Java 的编程语言,它支持我们的提案。我们描述了一种采用及早消歧进行快速解析的解析方法,并讨论了其时间复杂度。为了展示我们提案的实用性,我们进行了两个微基准测试以查看编译器的性能。我们还展示了 dsl class 的几个用例,以证明 dsl class 可以表达各种语言构造。我们的最终目标是让程序员能够向宿主语言添加任何类型的新语言构造。为此,程序员应该能够在宿主语言中定义新的语法、名称绑定和类型系统。本文表明程序员可以定义前两者:他们自己的语法和名称绑定。

关键词

引用

@article{arxiv.1703.10861,
  title  = {User-Defined Operators Including Name Binding for New Language Constructs},
  author = {Kazuhiro Ichikawa and Shigeru Chiba},
  journal= {arXiv preprint arXiv:1703.10861},
  year   = {2017}
}