我想问一下mps和xtext在互相之间的优势以及编写语言时的主要特点。我知道使用mps时可以直接编辑AST,而xtext则使用解析器。我读过这样的一个优点,使用AST允许为您正在创建的语言扩展多种语言,但我不完全明白这是什么意思,能否进一步解释一下,并说明为什么某人需要扩展多种语言?
我还读到过AST可以剔除模糊代码,那它是如何做到这一点的呢?
我知道MPS和Xtext都有下划线和高亮显示代码等功能,它们是否还有其他与代码验证有关的功能?
它们的其他主要区别和常规特性也可以提出来吗?
我想问一下mps和xtext在互相之间的优势以及编写语言时的主要特点。我知道使用mps时可以直接编辑AST,而xtext则使用解析器。我读过这样的一个优点,使用AST允许为您正在创建的语言扩展多种语言,但我不完全明白这是什么意思,能否进一步解释一下,并说明为什么某人需要扩展多种语言?
我还读到过AST可以剔除模糊代码,那它是如何做到这一点的呢?
我知道MPS和Xtext都有下划线和高亮显示代码等功能,它们是否还有其他与代码验证有关的功能?
它们的其他主要区别和常规特性也可以提出来吗?
我没有使用Xtext的实际经验,所以我将主要谈论MPS。
Xtext和MPS都是语言工作台,因此它们有自己的架构用于元建模抽象语法(概念结构),一些定义具体语法(符号)的方式,以及定义生成器(M2M或M2T转换)或较少使用的解释器的方式。然后,它们提供了IDE本身,具有高亮显示、智能操作(如重构和上下文错误修复)、高级搜索和导航(转到声明等)、检查错误(类型错误、静态代码分析、检查已定义的约束和规则、检查基数、数据流分析)等等。因此,验证选项很多。我提到的是MPS中的内容,不确定Xtext是否提供所有功能。但是,所有这些功能都组织在所谓的方面中,您可以在总结表中检查每个方面的简要描述。
正如您所提到的,MPS使用了一种投影编辑器。投影编辑器可以直接操作AST,后基于解析器的智能IDE(如IntelliJ)能够为您提供智能操作,例如重构和跳转到声明等,只是因为它们在内存中解析语言并在幕后构建AST。投影式编辑器则跳过了解析步骤。
因此,MPS具有非常良好的语言模块化、组合性和可扩展性。您提到了
您需要区分使用语言和扩展语言的区别(如果您对此更感兴趣,Völter谈到了关于语言的4种组合技术:引用、扩展、重用和嵌入)。使用语言只是能够在其中编写程序的能力。如果您扩展一种语言,这有点像继承,您可以向其添加新概念,例如创建一个新类型的Java(BL)语句。这在MPS中附带的标准语言中也已经完成。例如,您有checkedDots语言,它使用操作允许为您正在创建的语言扩展多种语言[...]为什么有人想要扩展多种语言
.?
将BL扩展为null-safe(类似于C#中的null-conditional运算符?.
)。那么为什么要扩展语言呢?因为您可以使用新构造,添加新功能或语法糖。 BL中的另一个可用语言是元组语言,它具有索引和命名元组。然后还有集合语言,它有点类似于Java Stream API。所有这些小语言都是扩展,您可以通过简单的Ctrl+L开始使用它们。您还可以将另一种语言嵌入到您的语言中-在Java代码中使用SQL语句内部的正则表达式。
MPS中的另一种语言依赖是拥有“生成目标”语言。MPS中的生成器工作方式是将您的语言句子(即模型)转换为另一种MPS语言。您可以发明自己的小语言,或实现LOLcode并设置生成器将其转换为有效的Java代码。但是,这种语言必须已经存在于MPS中,因此如果MPS中没有Python实现,则无法将其生成为Python。另一种选择是生成文本(M2T),这样您就可以理论上生成Python源代码,或者只是打印LOLcode。
投影式与基于解析器的编辑器之间的第二个重大区别在于,后者本质上仅支持文本表示法。也许有一些外部工具可以使用。另一方面,MPS提供了文本、表格、符号(数学符号)和图形(图表)表示法。可以按照概念或整个“文件”(程序)的方式切换视图。
然而,并非一切都是完美的。投影式编辑器有一些限制或需要解决的挑战。投影式编辑器中的挑战分析指出主要存在可用性和基础设施集成方面的问题。这些问题在MPS中大多已得到解决,例如关于基础设施,您可以使用一个很好的VCS差异/合并工具。对于自动/命令行构建,有一种语言可以生成Ant。Gradle或Maven不能直接与MPS配合使用,但可以通过Ant实现。关于可用性,“MPS需要一段时间才能熟悉,但之后其可用性与ParEs相当。”3 您应该使用称为GrammarCells的语言(可通过MPS-extensions或mbeddr.platform获得),这使得构建良好的编辑器变得容易(主要用于算术表达式),否则默认情况下必须按前缀顺序输入概念(首先是+
,而不是数字)。在MPS中,无法随意放置注释。无法建立对不存在节点的引用...(请参见3中的表格1)
一般来说,你只能在MPS中工作。默认情况下,它并不是真正的可移植性,除非你明确定义生成器来生成可移植输出。如果你想输入一个程序,你可以编写一个剪贴板处理程序,在其中放置你的解析器,或者你可以更改AST存储的格式(从XML到可能直接使用你的语言,但这又需要一个解析器来读取)。我目前正在开发一种solution,它可以从一个YAJCo模型中导入MPS语言(基于模型的解析器生成器,其中输入不是语法,而是表示语义模型的Java类)。然后,你可以导入一个句子(文件),它将创建和填充一个模型(AST)。从MPS程序中,你可以生成Java源代码来填充原始的Java类,如果需要。
顺便说一下,mbeddr项目已经实现了从ECore的导入查看此处