MPS 如何工作?

主体特定的方言和语言可以帮助人们准确、高效地传达各自的想法。 MPS 为编程语言世界带来了同样的灵活性。 与语法和语义严格的传统编程语言不同,MPS 让用户可以从头创建、更改和扩展语言。

扩展语言的核心问题在于解析器,解析器可以分析字符串以构建数据结构。解析器将代码持久表示限制为一种表示法,这意味着它们不能轻易地与其他解析器组合,这妨碍了语言模块化。

实现程序代码的非文本表示是建议用于解决此问题的最常见替代方式。 这种方法的一个主要优点在于无需解析。 但是在 MPS 中,我们建议了另一种替代方式。我们的解决方案是始终在抽象语法树 (AST) 中维护代码,语法树由具有一组特性(属性、子项和引用)的节点组成,这些特性完整地描述了程序代码。

然后,MPS 编辑器的任务是以用户友好的方式可视化 AST,并提供有效编辑的方法。 例如,如果您要创建一种模拟标准文本语言的语言,编辑器会提供一种与使用常见的文本编辑器相当的体验。 类似地,如果您要创建一种具有图形化表示法的语言,编辑器会提供与使用图表编辑器相同的体验。

在 MPS 中创建语言时,您可以定义代码编辑规则,并指定代码呈现给用户的方式。 您还可以指定语言的类型系统和约束,作为一组应用于您的语言的规则。 这些特性相结合,允许 MPS 动态检查程序代码,它们让使用新语言进行编程变得容易且不易出错。

MPS 使用生成式方法。 这意味着您可以为语言定义生成器,以将最终用户输入转换成一种更符合惯例并且一般来说通用的语言。目前,MPS 尤其擅长但并不限于生成 Java 代码。 您还可以生成 C、C#、XML、FHTML、PDF、LaTeX、JavaScript 等。

什么是领域专用语言 (DSL)?

“编程语言通过指定直接使用来自特定问题领域的概念和规则的解决方案,将抽象级别提升到编程之外。”

Kelly 和 Tolvanen (2008)

使用 MPS,您可以为新语言定义自定义编辑器,并让使用这些 DSL 更简单。 即使是不熟悉传统编程的领域专家也可以在 MPS 中轻松工作,因为领域专用语言使用其领域专用术语设计。

投影编辑器

投影编辑器允许用户以有效的方式编辑代码的抽象语法树 (AST) 表示。 它可以模仿用于文本表示法的文本编辑器、用于图形化语言的图表编辑器,以及用于编辑表格的表格式编辑器等编辑器的行为。 用户通过直观的屏幕视觉与代码交互,甚至可以在多台显示器之间切换相同代码。

IDE 支持

JetBrains 以其高性能 IDE 和开发工具而闻名,MPS 也不例外。

MPS 是一款功能强大的 IDE,提供充分利用 DSL 所需的一切。其中的一些功能包括:代码补全、导航、重构、错误检查、快速修复、DSL 调试、带自动迁移的语言版本控制,以及与主流版本控制系统集成。

代码生成

由 MPS 生成器弥合业务领域和实现领域之间的语义鸿沟。

通过一系列步骤,生成器逐渐将初始领域专用模型转换为以低级通用语言(例如,Java、C、JavaScript 或 XML)表示的模型。 然后可以将得到的模型进一步转换为文本源文件,这些文件可被送到传统编译器中,以便生成可运行的二进制文件。

领域专用语言使领域专家的业务知识正式化,生成器以给定技术封装该知识的实现。 生成器以可重用的形式保留了最高级软件开发者的专业知识,并让他人从中受益。

语言中明确分离的商业知识和生成器中的实现知识,允许用户通过为同一语言使用多个生成器同时面向多个平台。 用户还可以在切换目标实现技术时节省工作量,因为只需更改生成器。 现有领域专用模型中包含的业务知识可以保持完整。

使用 MPS 创建 DSL 和语言扩展

MPS 最初引入了一种名为 BaseLanguage 的即用型通用语言,这种语言是 Java 的副本。 随着时间推移,还添加了其他语言,如 XML、C 和 JavaScript。 这些语言本身就可用于创建程序。 但 MPS 的真正优势在于扩展 BaseLanguage 或其他通用语言,并以它们为基础创建新语言。 MPS 附带一些有用的 BaseLanguage 扩展,用于处理字符串、集合、日期、正则表达式等。 您还可以将它们用作创建新语言的参考。 这些强大的工具使 MPS 成为非常善于创建领域专用语言 (DSL) 的工具。