MPS 2019.2帮助

快速跟踪MPS-精通十个步骤

欢迎!本教程是专门为开发人员设计的,他们是MPS的新手,并且喜欢通过MPS进行导览。您将沿着人迹罕至的道路一次走一步,并按照清晰的标记指示下一步的去向。这些信息经过结构化,因此您可以从较简单的概念发展为涉及更多的概念,并且在旅途的最后,您将了解MPS,并将能够在您的项目中有效地使用它。

我们承认,世界上有比学习MPS容易的任务。语言设计是一个复杂的领域,投影编辑需要一些习惯。如果您以前有DSL或语言工作台的经验,那么它会很有帮助,但是不需要了解本教程。只是期望路上会有更多的颠簸。当然会有很多-部分原因是MPS有其自身的问题和错误。因此,您将经历艰难的经历,这可能会花费您大量的时间。

请记住, 许多人之前已经走过这里并取得了成功 。如果您坚持不懈,您将获得回报 -您将成为语言设计师,可以准备定制的DSL,将其集成到项目中并使用它们开发高价值的软件。

因此,穿上好鞋子,系紧鞋带,然后开始穿鞋...

第1步-为什么选择MPS

原始时间估算-50分钟

让我们从学习MPS的动机开始。

  1. 首先,请观看有关MPS的两分钟概述视频- 为什么选择JetBrains MPS ,以便您可以评估该工具是否提供项目中所需的东西。

  2. 我们已经创建了新的VoiceMenu演示应用程序,以使来自不同专业领域的人们可以快速了解MPS的潜力。观看此短片。

第2步-MPS投影编辑器

原始时间估算-30分钟

在继续之前,您可能应该了解MPS最鲜明的功能- 投影编辑器观看一段视频该视频解释了传统文本编辑器与MPS投影编辑器之间的所有差异,并列出了此方法的众多优点。

如果您仍然犹豫,是否要花费更多时间探索MPS,可以考虑查看以下材料:

  • JetBrains MPS是一种高效且可靠的开发工具,已被软件供应商在商业和学术项目中采用。基于MPS的DSL已被广泛应用,例如立法建模,电气工程,保险业,嵌入式软件,医学系统,生物信息学和数据分析。“ 工作原理 ”页面列出了一些成功的项目,并对使用的技术进行了高级概述。

  • 您可能还想放慢速度,阅读一些描述人们如何成功使用MPS的文档。我们收集了一些案例研究,这些案例研究可能会激发您关于在MPS上构建出色事物的想法。

第3步-安装MPS并研究基础知识

原始时间估算-45分钟

立即观看此视频! - 第一次跑步 。它为您提供有关MPS的组织方式,工作方式以及用户与之交互的基本信息。

  1. 如果您正在仔细评估MPS,则在观看视频或阅读有关MPS使用情况的故事时,脑海中必定会浮现很多问题。我相信其中一些问题已经在MPS FAQ页面中得到了回答。看看这个,

  2. 阅读Mikhail Barash 撰写的有关MPS基础知识介绍性文章 。此刻绝对值得您花时间,因为一旦您阅读本文,您就会了解所有原理。

  3. 现在停止一分钟,浏览一小段列出基本术语(如节点,概念,AST)的短页面 ,以便更好地理解线下使用的术语。

步骤4-从程序员的角度看MPS

原始时间估算-45分钟

单纯地阅读MPS永远不会像实际尝试那样教给您太多。您可能已经这样做了,但是如果没有,请从下载站点获取MPS并进行安装。安装了MPS后,您将可以继续执行快速通道

配置编辑器

我们都不同。如果MPS随附的默认设置不符合您的习惯,则可以随时在“ 偏好设置” (MacOs,按Cmd +, )或“设置” (Windows,按Control + Shift + Space或菜单-文件->设置 )。最有可能更改的设置之一是“ 编辑器”->“常规”部分中的字体大小:

编辑器配置

安全起见,系好安全带

了解键盘快捷键可以将优秀的开发人员变成优秀的开发人员。在学习MPS时,您将内部化各种按键组合,这些组合会触发有用的MPS功能。从一开始,您就应该记住一个组合键-Control / Cmd + Z。再次-Control / Cmd + Z。这是“ 撤消”操作。每当您有意或无意地执行某些错误操作而想要返回功能代码时,请转到Control / Cmd + Z。

快速骑行

既然我们程序员喜欢尝试,那么首先使用MPS编辑器进行简单的测试怎么样?如果启动MPS并打开Robot Kaja示例项目,则可能会立即获得第一印象。该项目定义了一种人工语言来命令虚拟机器人。机器人可以在一个矩形区域内移动,掉落并收集标记,并检查周围单元的壁和标记。您可以使用内置命令以及动态创建的新命令来编写脚本 。运行脚本时,将启动用Java编写的模拟器来可视化程序的执行。

要打开项目,请启动新的MPS,单击“ 打开样本项目”按钮,然后选择robot_Kaja 。样本项目已安装到HOME / MPSSamples文件夹中。

                                                                                                                              

机器人打开1

以下视频是从MPS在线入门培训课程中借来的。此指导性的屏幕广播将帮助您开始使用MPS。看看这个。
如果您喜欢该视频,并且认真学习MPS,则可以考虑注册MPS在线入门培训 。通过大量的动手练习,它将为您提供全面的指导,并且您可以与现场培训师讨论您的进度和问题。

步骤5-投影编辑提示和技巧

原始时间估算-30分钟

在MPS中编辑代码时,您会遇到编码习惯干扰MPS编辑器的投影特性的情况。我真的很自信,您已经在实验中发现了这些惊喜。MPS中的代码不是文本,而是抽象语法(AST)的投影。这给语言设计人员带来了很多好处,同时,与普通文本编辑器相比,其编辑体验也略有不同且更具限制性。可能会或可能不会认为这是一个优势,但是投影编辑存在学习曲线。通常,在投影代码中,您更多地依赖于编辑器的帮助。代码完成,块选择和意图动作应该成为您的密友,以便成为高效的投影编码器。它有好有坏的一面:

  • 很好-在MPS编辑器中进行不到一周的编程后,人们通常会恢复以前在基于文本的IDE中所经历的全编码速度

  • 不好-投射式编辑非常容易上瘾,您可能会发现基于文本的编辑器比以前认为的引人注目和帮助更少

步骤6-从语言设计师的角度来看MPS

原始时间估算-40分钟

现在,您必须对如何创建机器人样本语言感到好奇。请再次打开Robot Kaja示例项目,并播放说明性的屏幕广播,向您展示语言定义基础知识
同样,该视频是从MPS入门在线培训课程中借来的,以使您了解JetBrains提供的该付费课程。
在观看视频时,请经常停顿一下,自己看看示例项目。这样,您将了解典型的语言结构并查看其各个部分之间的关系。

在这一点上,您应该了解语言定义包含多个方面。其中一些是强制性的,一些是可选的:

  • 结构 -定义可以在用户模型中使用的节点的类型(称为Concepts )。程序(模型)中的每个节点都引用其概念。概念指定了节点, 节点和引用节点可能具有的属性概念可以扩展其他概念并实现ConceptInterfaces

  • 约束 -限制结点之间的关系以及超出“ 结构”中定义的规则的属性的允许值。约束通常定义为:

    • 引用的目标范围(引用可以指向的允许节点的集合)

    • 节点可以是另一个节点的子/父/祖先的情况

    • 属性的允许值

    • 属性访问器方法(获取器和设置器)

  • 行为 -与OOP持有方法中的类一样, 概念可以定义可以在节点上以多态方式调用的方法和静态方法。因此, 节点除了其属性和关系外还具有行为。

  • 编辑器 -MPS提供了投影编辑器的概念,而不是定义将将代码从可编辑的形式(即文本)转换为计算机可以操作的树状结构的解析器,而是让用户直接编辑AST。编辑器方面使语言设计者可以创建用于编辑其概念概念的UI。

  • 动作 -由于MPS编辑器直接操作基础AST,因此某些编辑动作(例如复制粘贴或将一个节点替换为另一个节点)会转化为不重要的AST更改。“ 动作”方面包含此类自定义AST转换的定义。

  • 意图 -所有现代IDE都可帮助开发人员在方便的快捷键(MPS中的Alt + Enter)下进行即时代码操纵操作。语言作者可以在意图方面为他们的语言定义如此小的代码转换。

  • 类型系统 -需要对代码进行类型检查的语言需要提供类型系统规则。MPS类型系统引擎将即时评估规则,计算节点类型并报告
    错误,无论计算的类型与预期有何不同。
    可以另外定义所谓的检查规则以验证关于模型的非类型系统断言。

  • 数据流 -通过语言构造理解值流和控制的能力有助于语言报告诸如无法到达的代码潜在的空指针错误之类的问题 。语言设计人员可以利用数据流方面为每个概念定义流,然后MPS将使用该流来计算整个程序的数据流。

  • 生成器 -用一种或多种语言编写的模型最终被翻译成某些目标通用语言和平台(例如Java)的可运行代码。在此过程中,模型逐渐进行了转换,以便反复地将概念从较低的抽象级别替换为达到最低要求的概念。在Generator方面定义了翻译概念及其正确顺序的规则。

  • TextGen-在生成达到最低要求的AST表示形式的代码生成过程中, TextGen阶段进入,并将模型中的所有节点转换为其文本表示形式,并将生成的文本源文件保存在磁盘上。

第7步-形状教程

原始估算-2小时

这是您快速掌握自己的语言的机会。查看MPS入门级Shapes教程,并构建一种语言,使非程序员可以构建图形形状的场景。

图1

图2

步骤8-计算器教程

原始时间估算-8小时

现在您必须好奇地找到有关MPS中语言设计的更多详细信息,对吗?在为您提供了所有基本信息和一定程度的经验之后,入门教程应该使您处于更好的位置,可以更深入地学习并从头开始构建示例语言。计算器教程将指导您完成语言创建的过程。您从一个空项目开始,最后以一种语言来构建基于Java Swing的可视应用程序。试试看,玩得开心。

JavaScript中的计算器教程

为了说明MPS不限于生成Java,我们准备了一个类似的Calculator示例项目-CalculatorJS ,该项目生成一个HTML页和一个JavaScript程序来保存计算。您可以在GitHub上查看

第9步-管理依赖关系和导入的语言

原始时间估算-30分钟

正如您已经注意到的那样,MPS使您可以管理模型之间的依赖关系以及导入语言。由于了解这些是必不可少的,因此请阅读有关正确使用依赖项的用户指南。它将教您依赖项和导入语言之间的区别以及如何设置/管理它们。

步骤10-车库项目教程

原始时间估算-5小时

计算器教程应该使您对语言设计有了全面的了解。现在是时候进行更彻底的锻炼了。车库项目将让您创建几种相互关联的语言,将它们打包为可重用的插件,并在另一种之上堆叠语言。为了处理本教程的复杂性,我们利用Stepik平台进行在线教育。免费注册MPS基础课程

审查进度

恭喜你!通过完成上述教程和练习,您已经对语言设计领域产生了严重的影响。您现在可以在Dreyfus技能获取模型高级初学者阶段之上掌握MPS的知识和命令。这绝对是庆祝的好时机,也许也让我们知道您的成功。

爬上梯子

Dreyfus技能获取模型的下一个阶段是Competent 。一旦达到该阶段,您将可以在没有具体指导和监督的情况下自行工作。但是要做到这一点,您将需要花费更多的时间来解决MPS的各种问题。如果您已经有了实现某种语言的想法,那就继续做吧。如果不是,请尝试提出一种有用的小语言。您也可以尝试重新实现一个或多个MPS样本,然后查看得到的紧密程度。或者只是选择一个样本作为起点并将其向前移动-添加语言功能,实现生成器,添加类型系统规则,完善编辑体验-感觉对您来说都是正确的挑战。

此外,你应该为了尝试这些在MPS和语言设计成为称职

  1. 申请JetBrains的MPS高级课程 。在线和现场选项均可用。在高级课程中,您将学习:

    • 使编辑人员流利,智能且易于使用

    • 实现非平凡的生成器

    • 定义类型系统规则

    • 指定代码分析规则和快速修复

    • 构建定制的IDE和语言插件

    • 大量的其他东西

  2. 学习通用语言模式

  3. 学习食谱,以加深您对语言设计各个方面的了解

  4. 了解报价和反报价

  5. 生成器教程将教您MPS生成器提供的更多细微选择。您将了解不同类型的宏,生成器脚本,实用程序模型等。

  6. 熟悉MPS中捆绑的语言,例如闭包集合概念函数 ,正则表达式元组smodel构建语言

  7. 了解如何从命令行构建MPS项目 ,如何将语言打包到IntelliJ IDEAMPS插件,如何使用插件以及如何构建独立的DSL IDE。

  8. 感受一下用户指南,以便快速找到所需的信息

  9. 认真学习一些键盘快捷键

  10. 积极参与MPS社区,并尝试回答与MPS掌握相同的道路的人们所遇到的论坛问题

成为主管后,您肯定应该继续获得经验。您与MPS的合作越多,项目的转移就越多,您在Dreyfus技能获取规模模型上的发展就会越快。如果您将自己设定为精通 MPS并最终成为MPS 专家的目标,则可以考虑尝试:

  1. 学习和练习高级主题,例如:
    1. 查找用法
    2. MPS Make框架
    3. 调试器增强和定制

    4. 自定义持久性
    5. 依赖性分析器模块依赖性工具

    6. 定制数据流分析仪

    7. 扩展名 

  2. 通过为其他目标语言/平台创建基本语言(Python,Ruby,Dart,Haskell,Go等)来帮助MPS扩展到这些区域

  3. 在活动中谈论MPS

  4. 帮助我们改进文档

  5. 向MPS项目贡献代码

尽管在这个经验水平上没有太多详细的文档来指导您,并且在大多数情况下您必须保持自我驱动,但是我们将始终乐于与您讨论,建议和合作。

文件来源

这是在掌握MPS的过程中可能需要的文档来源列表

图书

Fabien Campagne撰写了《 MPS语言工作台:第一卷和第二卷》,您可以通过电子方式和平装本购买。让他们在这里

MPS书籍封面第1卷小
封面第2卷v3缩略图网站1 216x300

学术论文

出版物页面收集了有关MPS和相关领域的所有相关论文。

食谱

获得稍微简化的实用信息以及有关语言设计各个方面的一些提示和技巧,您可以尝试一些食谱。

用户指南

完整的参考文档提供了有关MPS的详尽信息。查阅《 语言设计师的用户指南》

截屏

随着时间的流逝,MPS团队创建了大量的屏幕广播,涵盖了MPS使用和语言设计的许多方面。您可以在MPS屏幕播放页面或直接在JetBrains TVMPS频道中查看所有排序良好的文件。

指导培训

MPS团队提供动手培训。查看详细信息:

一般文件

MPS文档页面将为您提供所有剩余的案例研究,教程,FAQ和MPS文档其他部分的指针。

其他样本项目

MPS附带了一些示例项目,您可以使用它们来更好地掌握语言开发。我建议您尝试一下它们,也许按下面列出的顺序进行。找出它们做什么以及如何实现。他们可能会教您重要的课程。如果有时您不知道如何实现特定功能,请不要担心。您很可能会在以下练习之一中找到答案,然后可以重新访问示例,然后单击即可。

这是我们为您准备的样品清单:

语言扩展:

  • SampleJavaExtensions   -一组方便的Java增强功能,例如parallel for loop除非语句, Money文字决策表Constants定义。该示例将教您如何使用自定义结构扩展现有的通用语言。您可能还想观看介绍各个扩展的简短屏幕广播

  • 复杂 -定义Java扩展以使用复杂数字

  • XML文字 -允许XML文字直接在Java代码中用作一流的语言元素。该语言建立在.xml之上,并生成为org.jdom。* API。用户插入的XML代码可以参考周围的Java上下文,以方便地进行参数设置。

  • math-为Java提供精美的数学语言扩展,允许您以自然的方式输入复数,矩阵,区间,求和,乘积和其他常见数学运算。

独立语言:

  • LanguagePatterns-一组示例语言,说明了MPS中常见语言模式的实现。对于初学者来说,单独查看典型语言结构的具体实现很有用。该示例项目正在逐步以新模式进行更新。

  • MultipleProjections-一种简单的状态机语言的示例,重点关注每个概念的多个投影的机制。使用该语言的程序员在进行状态机定义时可以在多个预定义符号之间进行即时切换。所有可用符号均以该语言或其扩展名定义。

  • 多目标   -说明了如何将一种语言生成为多种不同的目标语言。

  • 自定义方面 -显示了定义语言定义的自定义方面的方法。查阅“ 自定义语言方面”食谱以了解详细信息。

  • 跨模型生成   -说明了如何使用自定义生成器计划来实现跨模型生成。

  • 组件依赖关系 -用于表达系统组件之间的依赖关系的语言的简约示例,它提供了三种可选的编辑器表示法:
    1. 文字的

    2. 表格

    3. 图表

    该语言带有XML生成器,以说明生成非命令式语言(例如XML)的可能性。
  • 定制调试器 -使用Java调试器挂钩语言的示例,即使该语言既不扩展也不不会生成BaseLanguage

  • 思维导图 -定义图表符号的直观示例,包括一组自定义图形符号

  • 状态机(机密隔离区语言/ DSL书样本) -状态机语言的示例,包括状态机测试语言。屏幕快照概述可帮助您入门。

  • 自定义测试用例 -构建您自己的测试并从MPS运行它们的简约示例。

  • 最简单的语言 -一个生成Hello World应用程序的简单示例,该应用程序打印出定制的消息。展示了语言生成的基础知识。

  • 移居   -一个简单的迁移脚本示例,可以同时使用smodel API和TransformStatement迁移两种互连的语言。

  • Lambda Calculus-一种模拟lambda演算的语言,具有投影编辑器并生成到Java中

  • 协议 -面向业务DSL的示例

  • 表达式 -一种简化的表达式语言,使您可以使用类型系统和“ 类型系统跟踪”工具。该语言为您提供了一种基本的表达式语言,几乎没有对编辑器的支持,但是具有结构良好的类型系统规则,可以帮助您了解MPS计算类型的核心。在Typesystem Debugging文档中阅读更多内容。

  • 固定长度阅读器 -说明了如何创建一种描述二进制数据格式的语言。带有一个假设运行时库的存根,它将使用提供的数据格式描述(称为配置)从二进制数据中提取元素。

  • 高级语言 -定义一组自定义语言定义语言的示例。说明如何定义自己的方法来编纂语言的结构和编辑器。

  • 示例语言 -一个非常直观和简约的示例,显示了如何实现包含定义及其引用的根概念的通用模式。在此示例中,我们模拟Java类,方法定义和方法调用。但是,这种模式在许多语言中都很常见,值得花一些时间进行调查。您也可以查看简短的屏幕录像,向您展示该示例。

  • 公式语言 -表达式语言的示例定义,包括编辑器操作和生成器

  • Notes Organizer-用于IntelliJ IDEA的示例DSL插件,包括用于模拟任务/任务列表的构建脚本。任务可以具有不同的优先级,状态和类别,这些任务本身也可以进行自定义。可以使用几种Swing UI组件来过滤任务列表,并且用户可以在任务列表的几种替代可视化效果中进行选择。作为过滤节点集合,替代编辑器以及将Swing组件直接合并到类似表单的符号中的示例。

  • 状态图 -状态图定义语言的示例,该语言在SCXML标准中生成状态图。

  • 需求跟踪 (新) -一种与语言无关的通用需求跟踪语言的示例。可以在使用提供的需求跟踪语言编写的规范文档中捕获软件项目的目标。可以在实现这些需求的地方将相关需求的提及插入代码中。可以在使用任何MPS语言的代码中使用提及内容。该示例具有节点属性,简单的作用域以及针对单个概念的多个可切换编辑器。

  • 属性 -一个示例,用于说明text-gen和generator中属性的透明处理。这两个CommentAttribute节点属性概念未更改地通过生成器传递,因此它们的text-gen可以将它们转换为文本。

  • 样本 -演示了一个简单的构面,该构面拦截了构建过程。

  • 轻量级 DSL-使用jetbrains.mps.baselanguage.lightweightDSL语言构建嵌入在BaseLanguage类中的内部“轻量级” DSL的示例

  • 加热控制器   -一种简单的语言,提供两种表示法来为假设的家庭供暖控制器指定供暖计划。默认表示法允许文本表示,而语言扩展提供了另一种表格表示法。

  • 进度指示器 -一组动作,说明处理动作中进度条的正确方法,如何使动作可取消并使其在后台运行。

  • xmlPersistence-使用新的Open API实现自定义持久性的重要示例。该插件包含三个解决方案(构建脚本,持久性实现和插件描述符)。自定义的持久性实现将加载/保存XML文档。请查看我们的“ 自定义持久性食谱”以了解详细信息。

教程示例:

 

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