MPS 2019.2帮助

常问问题

DSL,LOP和编程

在这里,您可以找到有关MPS的最常见问题的答案。

什么是DSL?它们与“真实”编程语言有何不同?

DSL是针对特定类别问题优化的语言。它通常不如Java,C或Ruby等通用语言复杂。DSL甚至可能不是图灵完备的,而仅陈述有关感兴趣域的事实。通常,DSL是在与设计DSL领域的专家紧密合作的基础上开发的。在许多情况下,DSL并非由软件人员使用,而是由精通DSL地址域的非程序员使用。这就要求为非程序员优化语言的符号和工具支持,例如,通过使用数学符号,文本和图形符号的混合或简化的IDE(不会使DSL用户暴露于IDEA或Eclipse的全部复杂性) 。

DSL有什么好处?我为什么要在乎?

使用DSL可以带来很多好处。使用DSL的最明显的好处是-一旦有了语言和转换引擎,您在DSL涵盖的软件开发的特定方面的工作就会变得更加“高效”,这仅仅是因为您不必手动完成任务。如果您从一个相对较小的DSL程序中生成了完整的代码负载,则这一点最为明显。如果您是从DSL程序生成源代码(而不是对其进行解释),则可以使用特定于域的漂亮抽象,而无需支付任何运行时开销,因为生成器就像编译器一样,可以删除抽象并生成高效的代码码。如果您有一种用与领域紧密相关的语言来表达领域问题的方法,那么您的“思路”就会变得更加清晰*,因为您编写的代码不会因实现细节而混乱。换句话说:使用DSL可使您将必要的复杂性与偶然的复杂性分开。DSL的域,抽象和符号与域专家(即,非程序员)表达自己的方式紧密一致,从而使技术人员和域人员之间实现了很好的集成。使用DSL和执行引擎可以使应用逻辑以DSL代码*独立于目标平台*表达。使用DSL可以提高所创建产品的质量:减少错误,更好的体系结构一致性,增强的可维护性。这是由于消除了(不必要的)自由度,避免了代码重复以及自动化重复工作的结果。与库和框架相比,DSL可以附带* tools *(即IDE),它们可以识别该语言。这可以导致大大改善的用户体验。可以提供代码完成,可视化,调试器,模拟器和各种其他功能。

DSL和常规代码如何结合在一起?

传统代码和DSL代码如何集成有两种根本不同的方法。第一个将DSL代码和常规代码保存在单独的文件中。然后,通过代码生成器将DSL代码转换为编程语言代码,或者,程序将加载特定于域的代码并执行该代码。具有分离通用语言(GPL)和DSL代码的第一种方法称为外部 DSL。将SQL视为外部DSL的示例。另一种方法是将DSL代码和通用代码混合在同一程序文件中,从而导致DSL代码和编程语言代码之间的紧密集成。DSL重用了GPL的语法和解析器,并利用了主机语言的可用扩展选项。值得一提的是,某些GPL比其他GPL更适合扩展。
两种方法都可能有意义,具体取决于环境,MPS支持这两种方法。

传统上,通过使用宿主语言的元编程功能,DSL已嵌入到编程语言代码中。DSL的结构和语法是通过以将DSL代码嵌入其中的语言编写代码来定义的。通常,IDE不了解DSL,因此不提供支持(代码完成,自定义错误检查等)。使用MPS,您可以将MPS框架及其专用DSL一起用于语言开发,以定义语言扩展。IDE知道它们,因此系统可以为特定于域的嵌入式语言提供完整的IDE支持。

什么是面向语言的编程?

术语“ 面向语言的编程”由JetBrains的首席执行官兼MPS的“父亲” 谢尔盖·德米特里耶夫Sergey Dmitriev)在2004年的一篇名为《 面向语言的编程:下一个编程范式》中提出 。其他人想出了一些相关的方法,通常使用不同的名称。一个主要的例子是Charles Simonyi及其有意编程方法,Martin Fowler在其2005年的文章《 语言工作平台:领域特定语言的杀手应用》中描述了该方法。

核心思想是,我们在开发软件时不仅使用一种语言,还使用最适合每个任务的那些语言。与表面上提倡类似方法的多语言编程相反, 面向语言的编程明确鼓励开发人员构建自己的DSL,或使用领域特定的概念扩展现有语言,以此作为方法的一部分。开发一种新语言应该成为软件开发不可或缺的一部分,而不是Übergeeks。为了使之可行,诸如MPS之类的语言工作台是面向语言方法的重要组成部分。

为什么要扩展语言?图书馆还不够好吗?

库和语言扩展之间有一些区别。语言扩展可以带有自己的语法。使用MPS的投影编辑器,此语法可以是任意的,并且不受扩展语言语法的限制。语言扩展还具有其自身的约束和类型系统,因此您的IDE可以静态报告错误。通常,以MPS支持它们的方式将语言扩展完全集成到IDE中:您可以为新的语言结构获得代码完成,语法突出显示和重构支持。最后,语言扩展是通过编译时转换执行的,并转换为目标编程语言代码,因此不存在反射或间接堆栈带来的运行时开销。这在针对资源受限的系统时尤其重要。

投影编辑

什么是投影编辑?

在基于解析器的方法中,用户使用文本编辑器输入代表程序的字符序列。然后,解析器检查程序的语法正确性,并根据字符序列构造抽象语法树 (AST)。AST包含程序所表达的所有语义信息,即省略了关键字和纯语法方面。

在投影编辑器中,该过程以相反的方式进行:当用户编辑程序时,直接修改AST。这类似于MVC模式,其中每个编辑操作都会触发AST的更改。然后,投影引擎会创建AST的某种表示形式,以便用户与之交互。这种方法在各种图形编辑器中是众所周知的。例如,在编辑UML图时,用户不会在画布上绘制像素以供“图像解析器”读取图,解析图然后创建AST。如引擎所理解的那样,那将太限制您可以绘制的内容。相反,当您将一个类从面板拖到画布上时,编辑器会创建Class的类和实例。投影引擎渲染该图,在这种情况下,为类绘制一个矩形。然后,您可以在不更改图表含义的情况下重新排列屏幕上的视觉元素。

可以将这种方法推广到也可以与文本编辑器一起使用。每个程序元素都作为具有唯一ID(UID)的节点存储在AST中。引用基于实际的指针(对UID的引用)。AST实际上从一开始就是一个ASG,是一个抽象的语法图,因为交叉引用是一类的,而不是在解析后解决的。然后,该程序将以XML格式保存到磁盘,但是此过程对用户是透明的。

为什么要使用投影编辑?文字编辑器还不够好吗?

由于投影编辑器中不使用任何解析,并且该机制基本上像图形编辑器一样工作,因此可以在编辑器中使用文本以外的符号。例如,MPS支持表格以及简单图表。由于这些非文本符号的处理方式与文本符号相同(可能与其他输入手势一起使用),因此可以轻松地将它们混合在一起:可以将表嵌入文本源中,并且可以在表单元格中使用文本语言。文本符号也可以在框内使用,也可以在图中用作连接标签。

在组合了单独开发的语言之后,由于大多数语法形式主义在组成上都不是封闭的,因此结果语言在基于解析器的系统中可能变得模棱两可。在投影系统中,这不会发生。语言的任何组合在语法上都是有效的(语义是另一个问题)。如果所编写的语言不明确,则用户必须在构建程序时做出明确的决定。例如,在MPS中,如果在给定位置使用相同的别名可以使用两种语言概念,则仅键入别名就不会绑定,并且用户必须通过从代码完成菜单中选择一种选择来手动确定。

使用投影编辑器而不是解析语言的主要好处是什么

投影编辑器使抽象语法树(AST)在代码操作中发挥了重要作用。代码以AST形式进行持久化,版本控制,重构和编辑,从而消除了重复进行文本到模型和返回转换的需要。AST是更丰富的代码表示,可以避免歧义。可以将AST投影到屏幕上,以便以语言设计人员希望的任何方式进行编辑。使用投射式编辑器,您的语言可以:

  • 允许使用不可解析的符号-表格,图像,GUI组件可能成为语言语法的一部分。AST可以轻松容纳这些语言元素,并且投影编辑器可以根据需要在屏幕上绘制任何图形形状。

  • 在单个代码中组合可能由不同供应商开发的多种语言。解析器将无法解决的歧义对于投影编辑器来说不是问题。

  • 处理上下文相关和位置语法

  • 提供类似形式的符号-通常在针对非专业开发人员和领域专家时,首选可能是使用提供严格符号的语言,并清楚表明用户应该提供价值的“移动”部分

  • 为一种语言提供多种符号-用户可以使用几种不同的编辑器来查看和编辑同一段代码,每种编辑器都适合于不同的任务。一些编辑器可能使用图形或表格符号,一些编辑器可能显示其他来源的额外信息,一些编辑器可能会减少视觉混乱的数量,但所有这些都与同一代码段(AST)相关。因此,开发人员可以为给定任务选择最佳的cdd可视化效果。

  • 将图解符号与文本结合使用-例如考虑电路,将其建模为图形方案,并将嵌入式代码段归因于方案的各个元素

如果不是文本,那么与版本控制的集成如何工作?差异,合并?

基础架构集成需要特殊支持。由于具体语法不是纯文本,因此需要使用通用的持久性格式。因此,需要提供特殊工具进行差异和合并。MPS提供与常规VCS系统(例如SVN或Git)的集成,并使用具体的投影语法在工具中处理差异和合并。请注意,由于每个程序元素都有一个UUID,因此可以将移动与删除/创建区分开,从而为diff和merge提供更多可用的语义。下图显示了一个示例。

mps差异

习惯编辑器需要多长时间?

在2010年初,我们在培训中进行了一项实验。十个人从未使用过MPS,他们被教过MPS开发的原理。经过两天的讨论,所有人都同意,虽然开始时的编辑体验有点不寻常,但实际上编辑器并不比文本编辑器差一点,只是有所不同。两天后,您习惯了,不会感到不适。实际上,对我们并不奇怪,有些人声称他们更喜欢用MPS编辑事物的方式,因为在许多情况下,无论如何,您都是基于语法树来选择/更改/删除元素,并且投影编辑器比文本更具优势。 -base IDE在这方面。

MPS细节

MPS如何获得许可?

MPS已根据Apache 2.0许可获得许可 。Apache 2.0非常自由,它允许您基本上在任何喜欢的上下文中使用该系统。诸如Realaxy之类的公司已经使用MPS来构建商业应用程序。

MPS中已经包含哪些语言,所以我可以扩展它们?

MPS带有一种称为BaseLanguages的语言,该语言本质上是Java 6(具有Java 7和8语法的可选扩展名)以及一堆自定义扩展名,例如闭包,集合API,正则表达式,扩展方法,元组和构建器支持。该语言还用于MPS中语言开发的许多方面,在这种情况下,它使用几个附加扩展来处理程序树。MPS还附带了可以使用和扩展的XML实现。还有C的实现,可以作为其他基本语言使用,请参阅mbeddr.com 。第三方和开放源代码项目(例如JavaScript )正在逐步开发其他语言。请查看“ MPS语言存储库”页面以获取更多详细信息。

在某个地方有语言存储库吗?

由于可以将语言打包和分发为jar文件,因此没有什么可以像库一样阻止语言的共享。在JetBrains插件存储库中已公开提供了一些MPS和IntelliJ IDEA的语言插件(由JetBrains和第三方提供):

有关于MPS的书吗?

是的,有:

向MPS添加新的基本语言需要花费多少精力?

添加新语言所花费的时间显然很大程度上取决于语言的复杂性。如果您熟悉MPS,则可以在几分钟或几小时内添加小型DSL。添加到MPS的任何语言都可以用作基本语言,并且您或其他人可以轻松扩展。但这可能不是您想要了解的内容:)将*真实*编程语言添加为新的基本语言要花点功夫,因为通用语言通常相当大(除了Lisp这样的语言,这是微不足道的)添加 :-))。mbeddr.com人们最近实现的C基础语言是一个很好的基准。他们报告说,要在MPS中实施所有C,需要2-3个人的工作量。

如果投影是如此酷,我们什么时候可以做文字以外的符号?

MPS已经支持基于解析器的系统无法实现的表示法。例如,MPS附带BaseLanguage扩展,可以执行分数条和大数学符号(例如大符号符号)。此外,MPS支持表,如mbeddr项目中的决策表示所示 。也可以将任何swing小部件嵌入到编辑器中。MPS 3.1发行版中已添加了对图形表示的支持。

MPS是否开发了成功的项目?

MPS最初是作为JetBrains的内部项目开发的,因此JetBrains中有多个用例。mbeddr.com项目是一个著名的示例,该项目为嵌入式软件开发提供了基于C的可扩展IDE。西门子医疗,OcéTechnologies或荷兰税务局是成功将基于MPS的DSL投入生产的公司的其他示例。
MPS逐渐被不同行业所采用-电气工程,保险,税收法规,医疗保健和其他行业,以为各自领域实现强大的DSL。

MPS如何缩放?

mbeddr团队做了一些负载测试。他们发现,单个根元素(相当于传统IDE中的文件)可以轻松达到4.000行,而不会出现严重的性能问题。他们还采取措施,使带有多达100.000行C代码的C系统可以正常工作。

MPS是开源的,但仍由JetBrains拥有。??

是的,JetBrains是该项目的主要贡献者,提供了10多名全职开发人员。但是,欢迎大家提供外部意见,无论是通过论坛散布想法, 跟踪器中的请求和错误报告,还是代码的补丁。定期的贡献者可以成为项目的提交者,并参与计划实施过程的项目。

我可以将Java代码导入MPS吗?

MPS致力于简化Java互操作性。例如,您可以毫无问题地使用MPS中的任何Java库。您可以在同一项目中混合和匹配Java和MPS代码,以便您的MPS代码可以查看和使用Java代码,反之亦然-在Java中,您可以使用从MPS生成的代码。此外,MPS可以解析您决定粘贴到MPS中的Java代码片段,并将其转换为有效的BaseLanguage代码。

支持哪些Java版本?

MPS可以在JDK 1.8和更高版本上运行。请查看MPS Java兼容性页面以获取更多详细信息。

Java IDE集成如何?

当前,MPS是一个独立的应用程序,用Java实现,因此可以在所有主要平台上运行。在3.0版本中,MPS添加了对将语言部署到IntelliJ IDEA中的支持。语言*开发*仍然可以通过MPS独立应用程序完成,但是语言*使用*现在可以在IntelliJ IDEA中使用。当将基于MPS的DSL集成到Java和其他应用程序中时,这为用户提供了更好的选择。

Eclipse集成如何?

尽管在技术上可行,但目前尚未积极寻求与Eclipse的集成。根据MPS用户的兴趣及其对此类活动的贡献或赞助能力,JetBrains准备考虑实施Eclipse集成。

我如何获得支持?

有一个MPS社区论坛 ,您可以在这里获得支持。问题跟踪器可用于提交和跟踪错误。最后但并非最不重要的一点,您还可以从拥有MPS实际操作经验的人员那里获得专业支持

MPS与其他语言工作台相比如何?

从我们的立场来看,这当然很难以客观的方式来表达,但是让我们尝试:-)与大多数其他语言工作台不同,MPS使用投影编辑器。我们已经在上面的FAQ中讨论了这种方法的好处。而且,MPS是最全面的系统,因为它在单个集成包中提供了对语言结构,语法,类型系统,约束,重构,转换和代码生成的支持。到目前为止,其他替代方案(例如MetaEdit +)为语法语法提供了更好的支持,而Xtext提供了更好的Eclipse集成,并且具有更大的社区。为了进行更详细的比较,您必须下定决心,并根据自己项目的需要考虑所有事实。查看语言工作台竞赛以了解更多信息。您还可以考虑查看MPS案例研究 ,阅读一些有关MPS的学术论文,并与经验丰富的顾问联系

我如何学习使用MPS?

您应该看看新近装修的Learn MPS页面 。它从逻辑上组织了对概述文章的引用,有关MPS基本概念和高级概念的教程,以及针对有趣案例研究的屏幕录像和指针。

上次修改时间:2019年8月30日