【问题标题】:Advantages Jetbrains MPS has over XtextJetbrains MPS 优于 Xtext 的优势
【发布时间】:2020-11-23 01:36:54
【问题描述】:

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

我也读过 AST 删掉了模棱两可的代码,它是怎么做到的?

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

欢迎他们的任何其他主要区别和一般特征?

【问题讨论】:

标签: eclipse dsl xtext mps


【解决方案1】:

我没有 Xtext 的实践经验,所以我将主要谈谈 MPS。

LWB

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

投影编辑器

正如您所提到的,MPS 使用投影编辑器。您直接操作 AST,基于解析器的 post-IntelliJ 智能 IDE 能够为您提供智能操作,例如重新定义和去声明等,只是因为它们解析内存中的语言并在幕后构建 AST。投影编辑器跳过解析步骤。

避免歧义

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

模块化

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

允许为您正在制作的语言扩展多种语言 [...] 为什么有人要扩展多种语言

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

一代

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

多种符号

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

缺点

但这并不全是玫瑰。投影编辑器有一些限制或需要解决的挑战。有一个analysis of challenges in projectional editors 主要指出可用性基础设施集成。它们大多在 MPS 中解决,f.e.关于基础架构,您有一个很好的 VCS 差异/合并工具。对于自动/cmd 构建,有一种生成 Ant 的语言。 Gradle 或 Maven 不能直接使用 MPS,而是通过 Ant。关于可用性“MPS 需要 虽然习惯了,但它的可用性与 ParEs 相当。"3 你应该使用一种称为 GrammarCells 的语言(可通过MPS-extensionsmbeddr.platform 获得),这样可以轻松构建好的编辑器(主要用于算术表达式),否则默认情况下您必须按前缀顺序输入概念(+ 首先,而不是数字)。MPS 中的评论不能随意放置。不能建立对不存在节点的引用。 .(见3中的表1)

MPS 目前没有基于网络的版本。不过,也有一些计划。 Jetbrains 在 WebMPS 上工作,然后是 modelix

便携性

通常,您只能在 MPS 中工作。默认情况下,它不是真正可移植的,除非您明确定义产生可移植输出的生成器。如果你想输入一个程序,你可以编写一个粘贴处理程序,你可以在其中放置你的解析器,或者你可以改变存储AST的格式(从XML到可能直接你的语言,但这将再次需要解析器来读取)。我目前正在研究solution,它可以从YAJCo 模型(基于模型的解析器生成器,其中输入不是语法,而是代表语义模型的Java 类)导入MPS 语言。然后,您可以导入一个创建和填充模型 (AST) 的句子(文件)。如果需要,您可以从 MPS 中的程序生成填充原始 Java 类的 Java 源代码。

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

字典

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

【讨论】:

    猜你喜欢
    • 2013-09-11
    • 2012-09-20
    • 1970-01-01
    • 2014-03-06
    • 2011-02-05
    • 2010-11-15
    • 2012-04-20
    • 2011-03-27
    • 1970-01-01
    相关资源
    最近更新 更多