Jetbrains MPS 相对于 Xtext 的优势

Advantages Jetbrains MPS has over Xtext

想问下mps和xtext的优势和写语言的主要特点。我知道在使用 mps 时,您是在直接编辑 AST,而 xtext 使用解析器。我已经阅读了使用 AST 的优点允许为您正在制作的语言扩展多种语言,我真的不明白这意味着什么,可以进一步解释为什么有人想要扩展多种语言吗?

我还读到 AST 删除了不明确的代码,它是怎么做到的?

我知道 MPS 和 xtext 都具有下划线和突出显示代码等功能,它们还有其他与代码验证相关的功能吗?

欢迎提供它们的任何其他主要差异和一般特征?

我没有使用 Xtext 的实际经验,所以我将主要讨论 MPS。

LWB

Xtext 和 MPS 都是语言工作台,因此它们有自己的模式,用于对抽象语法(概念结构)进行元建模,以某种方式定义具体语法(符号) ) 和一些定义生成器(M2M 或 M2T 转换)或不太常见的解释器的方法。然后他们为 IDE 本身提供高亮显示、重构和上下文错误修复等智能操作、高级搜索和导航(转到声明等)、检查错误(类型错误、静态代码分析、检查定义的约束& 规则、检查基数、数据流分析),... 所以是的,有很多验证选项。我已经提到了 MPS 中的内容,不确定 Xtext 是否提供了所有内容。但是,所有这些功能都组织在 so-called 方面 中,您可以在 summary table which shortly describes each aspect.

中查看

投影编辑器

如您所述,MPS 使用 投影编辑器。你直接操作 AST,parser-based post-IntelliJ smart IDE 能够为你提供重构和去声明等智能操作,只是因为它们解析内存中的语言并构造一个无论如何,AST 在幕后。投影编辑器跳过解析步骤。

避免歧义

它根本不使用解析器,因此拥有解析器的所有缺点都消失了。首先,语言开发人员不需要是语法分析方面的专家,所以你不需要专门聘请他们。但最好的胜利是拥有 无限的语言可组合性 。正如您所提到的,这是通过完全避免语法中可能出现的歧义来实现的(MPS 不使用语法,而是使用模型)。假设您使用语言 A 和语言 B。为了演示,假设两种语言都扩展了 BaseLanguage(缩写 BL,Java 的 MPS-equivalent),并且它们都定义了一个要记录的语句。概念 a 记录到 stderr,b 记录到文件。然而,ab 都有一个 相同的 具体语法(即 MPS 中的编辑器定义),它只是说 log。现在,如果您有一个解析器并且它遇到标记 log 它无法确定该概念来自哪种语言,因此它是模棱两可的 - 即使是 look-ahead 解析器也无法做到这一点。在投影编辑器中,这不会发生,因为只有投影是相同的,并且在幕后,AST 有一个 ab 的实例(你可以认为它总是使用 a 的整个 FQN class 在 Java 中,只是包隐藏在 IDE 中,因此您可以使用来自不同包的相同名称的 class。 “歧义”在用户写的时候解决了:当他写 log 时,一个下拉菜单清楚地显示其中一个是 a 而另一个是 b (也许甚至显示一个描述,上面写着“记录到文件”/“记录到标准错误”)。

模块化

因此,MPS 具有非常良好的语言模块化、可组合性和可扩展性。你提到了

allows for multiple languages to be extended for the language you are making [...] why would someone want to extend multiple language

您需要区分使用一种语言和扩展它 (如果你有兴趣更多Völter谈谈关于语言的4种组合技术:引用,扩展,重用和嵌入)。使用语言只是能够在其中编写程序。如果你扩展一门语言,它有点像继承,你向它添加新的概念,f.e。创建一种新类型的 Java (BL) 语句。它也已使用 MPS 随附的标准语言完成。例如,checkedDots 语言使用操作 .? 扩展 BL,即 null-safe(类似于 C# 中的 null-conditional 运算符 ?.)。那么为什么 扩展一种语言?因为您可以使用新结构、添加新功能或语法糖。 BL 中的另一种 ready-to-use 语言是元组语言,它既有索引元组也有命名元组。然后是集合语言,kind-of 替换了 Java Stream API。所有这些小语言都是扩展,您可以通过简单的 Ctrl+L 开始使用。您还可以在您的语言中嵌入另一种语言 - 在 Java 代码中的 SQL 语句中使用正则表达式。

世代

MPS 中的另一种语言依赖是具有“生成目标”语言。 MPS 中的生成器以将语言句子(即模型)转换为另一种 MPS 语言的方式工作。您可以发明自己的小语言,或实施 LOLcode 并设置生成器以将其转换为有效的 Java 代码。但是,这种语言必须已经存在于 MPS 中,因此如果 MPS 中没有 Python 实现,则无法将其生成到 Python。另一种选择是生成文本(M2T),这样你理论上可以生成 Python soure 代码,或者只打印 LOLcode as-is.

多个符号

投影编辑器与 parser-based 编辑器的第二大区别是后者本质上只支持文本符号。也许您可以使用一些外部工具。另一方面,MPS 提供文本、表格、符号(数学符号)和图形(图表)符号.可以根据概念或整个“文件”(程序)将您的观点从一种表示法转换为另一种表示法。

缺点

但也不全是玫瑰。投影编辑器有一些局限性或需要解决的挑战。有一个analysis of challenges in projectional editors,主要指出可用性基础设施集成。它们大多在 MPS 中得到解决,f.e。关于基础架构,您有一个很好的 VCS diff/merge 工具。对于 automatic/cmd 版本,有一种语言可以生成 Ant。 Gradle 或 Maven 不直接与 MPS 一起工作,而是通过 Ant。关于可用性“MPS需要 while to used, but then its usability is comparable to ParEs."3 You should use a language called GrammarCells (available through MPS-extensions or mbeddr.platform) which makes it easy to build good editors (mainly for arithemtic expressions), otherwise by default you must enter concepts in prefix order (+ first, not the number). Comments in MPS cannot be placed willy-nilly. Cannot establish references to non-existing nodes... (see the Table 1. in 3)

MPS 目前没有web-based 版本。不过,有一些计划。 Jetbrains 在 WebMPS 上工作,然后是 modelix.

便携性

一般情况下,您只能在 MPS 中工作。默认情况下,它不是真正可移植的,除非您明确定义生成可移植输出的生成器。如果你想输入一个程序 ,你可以编写一个 paste-handler 你可以放置你的解析器的地方,或者 你可以改变存储 AST 的格式(来自 XML 可能直接使用您的语言,但这将再次需要解析器来读取)。我目前正在研究 solution which enables to import an MPS language from a YAJCo 模型(model-based 解析器生成器,其中输入不是语法,而是表示语义模型的 Java classes)。然后你可以导入一个句子(文件)来创建和填充模型(AST)。从 MPS 中的程序,您可以生成 Java 源代码,如果您需要它,可以填充原始 Java classes。

顺便说一下,mbeddr 项目已经实现了从 ECore 导入 check here

词典

  • M2M = 模型到模型
  • M2T = 模型到文本