不同语言工作台工具(如Xtext和MPS)的优缺点是什么?

17

有没有人使用过Xtext、Spoofax和JetBrains的MPS等语言工作台工具?我想尝试其中的一个,但很难找到这些不同工具的好比较。每个工具的优缺点是什么呢?

我想构建生成Python代码的DSLs,因此特别想听听那些在Python中使用过这些工具的人的经验(所有三个工具似乎都集中在Java上...为什么呢?)。这些DSL主要是为了自己使用,所以我更关心的是定义语法和编写代码生成器的KISS而不是构建漂亮的IDE。能够对DSL进行类型检查/静态分析也是相当不错的。

我有一点害怕走得太远,撞墙后意识到我的所有代码都无法移植到其他地方-这些工具有这样的风险吗?尤其是MPS看起来有点可怕,因为据我所知,您并不真正生成基于文本的语法,而是为AST构建专门的编辑器。


1
我打算开始探索Spoofax,因为它似乎由一个非常丰富的程序转换语言(Stratego)支持,我猜这实际上是构建DSL的核心... - josh
1
所以目前我已经将选择缩小到使用Stratego / Spoofax或在Python中构建自己的解析器/解释器(通过ANTLR)或类似工具之间。我的感觉是主要权衡是,Stratego提供了更好的操作AST的范例,但编写-构建-测试周期不会那么干净,因为我需要输出Python代码,然后执行代码,而不是将整个应用程序保留在Python中。 - josh
6个回答

19

Markus Voelter在se-radio和Software ArchitekTOUR播客中对这三种技术进行了比较,做得相当不错。 基本思路是Xtext使用最广泛,因此最稳定和文档化,并且它基于流行的Eclipse平台和建模生态系统 - EMF。另一方面,它是基于解析器的,并在内部使用ANTLR,这意味着您可以定义的语法类型有限,而且语言不能轻松地组合。

Spoofax是一种学术产品,在这三个中使用最少。它也是基于解析器的,但内部使用自己的解析器生成器,这允许语言组合。

Jetbrains MPS是基于投影的,这为语言设计师提供了很大的自由度,并允许语言组合。*它还有坚实的支持。缺点可能是学习曲线。

这些工具都不是以Java作为代码生成器的目标语言。 Xtext使用纯文本的Xpand模板。我不太清楚Spoofax中的代码生成如何工作。MPS有其基础语言,据说是Java的子集,但有不同的替代方案。

我个人使用Xtext,因为它简单成熟,但是由其设计所限制的强大限制使其不是一个很有前途的选择。


2
谢谢,这正是我想要的比较。自从我提出这个问题以来,我已经深入研究了Spoofax,并且它的代码生成部分非常引人注目:它为您提供了一个强大的函数语言来操作和转换AST。因此,目前这一点超过了其他工具更优秀的社区/支持,至少对于我的项目来说是这样。 - josh

7

两周前我选择了XText,但我对Spoofax一无所知。 我的第一印象是:Xtext非常简单和高效。 我用30分钟完成了我的第一个真实(但非常简单)项目,我生成了一个graphviz点图和html报告。 我不喜欢MPS,因为我更喜欢纯文本源文件和目标文件。


5

还有其他的系统可以完成这种工作。如果您的目标是构建工具,您不一定要寻找集成工具的IDE;有时您可以找到更好的工具,这些工具专注于实用性而不是IDE集成。

考虑任何一个纯程序转换工具:

  • TXL(实用、单一范例)
  • Stratego(在被移植到Eclipse之前的Spoofax)
  • Rascal(研究型,很多方面都设计得非常好)
  • DMS软件重构工具包(恰好是我的;商业化;用于DSL/传统语言分析和转换,包括C++)

所有这些工具都提供了定义DSL并进行转换的良好机制。

真正重要的是执行“解析后生活”的支持机制。


2
请看Markus Völter的书,它对这三种技术进行了全面比较。 http://dslbook.org XText非常好维护,但这并不意味着它没有问题。实现类型系统、作用域和代码生成并不像宣传的那么容易。
Spoofax是无扫描仪的(简化语法组合)。文档不是很好,但似乎很完整。
MPS是投影式的。它在语言组合方面有优点,在编辑方面有缺点。支持多个AST编辑器,甚至将很快支持一个漂亮的图表编辑器。基础语言文档不是很好。类型系统、作用域、检查都处理得很好。模型到模型转换由求解器完成。我的同事使用它时抱怨模型到文本语言。(我的观点是,M2M也不是那么直观。)
几年前,微软有一个OSLO项目。MGrammar和尤其是Quadrant非常有前途。可以在表格、表单、文本或图表视图中表示您的模型。但突然他们取消了该项目(也许开发人员被解雇了)。

2
我已经尝试了几天的Xtext,虽然这个工具看起来很有前途,但最终我还是对它与Eclipse生态系统的紧密集成以及为解决应该在开箱即用的代码生成器的无头运行问题而必须经历的痛苦感到失望。请参见此处,了解一些必须经历的琐碎细节(甚至在Xtext网站上也没有得到充分的文档支持,而是在博客上,这意味着它是一个特别的补丁,在下一个版本中可能会出现问题)。
半年后再看看是否在这方面有所改进。

1
也许现今最好的比较不同语言工作台的地方是 http://www.languageworkbenches.net/,而且在那里 http://www.languageworkbenches.net/past-editions/ 展示了一组语言工作台如何为一个特定领域创建 DSL 的相似任务。
更新于2022年: 由于链接失效并且有关该主题的新文章已经发布,请参阅上述网站: https://web.archive.org/web/20160324201529/http://www.languageworkbenches.net/

关于语言工作台的文章评论包括:1)现状:https://link.springer.com/chapter/10.1007/978-3-319-02654-1_11和2)经验评估:https://hal.archives-ouvertes.fr/file/index/docid/706841/filename/Evaluation_of_Modeling_Tools_Adaptation.pdf


1
链接已更新为https://web.archive.org/web/20160324201529/http://www.languageworkbenches.net/,并添加了有关语言工作台评论文章的参考资料:1)现状:https://link.springer.com/chapter/10.1007/978-3-319-02654-1_11和2)实证评估:https://hal.archives-ouvertes.fr/file/index/docid/706841/filename/Evaluation_of_Modeling_Tools_Adaptation.pdf。 - Juha-Pekka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接