面向模型的编程语言论纲

面向模型的编程语言论纲

💡 原文英文,约7300词,阅读约需27分钟。
📝

内容提要

作者十三年前开发了首个面向模型的编程语言Mo+,虽未推广,但认为其在AI时代潜力巨大。文章阐述模型由层级结构与数据组成,区分非正式、内联、耦合、解耦四种模型开发形式,并介绍编程会话、模型上下文、模型导向属性、动态语法等核心语言特性,强调可复用性与并行性,呼吁学界业界关注研究。

🔎

延伸解读

模型导向编程的四种开发形式

文章将模型导向开发分为非正式、内联、耦合和解耦四种形式。非正式模型存在于头脑或白板中,无工具支持;内联模型定义在源代码内,如ORM或UI框架;耦合模型在代码外,与代码强相关,如UML;解耦模型也在代码外,但与代码弱相关,侧重需求。作者认为,MOP语言对解耦形式的潜力最大,因为将设计留给代码、需求留给模型,能使建模和编码过程更流畅。

模型上下文与动态语法:降低编码负担

MOP语言将模型结构作为语法的一部分,并引入模型上下文栈,使开发者无需创建变量即可遍历和访问模型数据。例如,在foreach循环中,当前项自动压入上下文栈,通过../可访问上层节点。动态语法允许在运行时根据模型结构扩展语法,甚至支持非标准模型。这些特性减少了样板代码,提升了表达力,尤其适合处理层级化的模型数据。

模型导向属性的可复用性与并行潜力

模型导向属性是关联到模型结构节点的独立代码块,可在不同实例上重复求值,并像表达式一样使用。这种独立性带来了大规模复用,作者称许多属性实质上是可跨项目复用的最佳实践。由于编程会话中模型数据只读且几乎不需要变量,模型导向属性的求值天然适合并行化。作者虽未实现并行,但通过缓存已获得显著性能提升。

与目标代码集成的现实挑战

过渡式MOP能管理目标环境约80%的代码至最佳实践,但剩余部分需与手写代码集成。文章提出几种策略:使用部分文件分离生成与手写代码;在生成文件中定义定制点(如命名区域)以便重新应用自定义代码;解释器只更新和删除自己管理的文件;对高度定制的文件标记忽略。这些方法均非完美,但为实际应用提供了可行路径。

❓

Q&A

什么是面向模型的编程语言?

面向模型的编程语言(MOP)是一种利用模型来创建和维护系统的编程语言。模型由层级结构和数据组成,结构定义规则(模式),数据填充结构。MOP语言将模型结构作为语法的一部分,并提供模型上下文等特性,使编程更直接地基于模型。

面向模型的开发(MOD)有哪些形式?

MOD有四种形式:非正式MOD(使用非标准模型,如草图或想法)、内联MOD(在源代码中定义正式模型,如ORM或UI框架)、耦合MOD(在源代码外定义正式模型,与代码强相关,如UML)、解耦MOD(在源代码外定义正式模型,与代码弱相关,模型主要表达需求)。

面向模型的编程语言有哪些核心特性?

核心特性包括:编程会话(模型结构已知且数据只读)、模型结构作为语言语法、模型上下文(访问模型数据)、模型导向属性(与模型节点关联的独立代码块)、动态语法(运行时修改语法)、上下文语法(根据上下文过滤语法)、几乎无变量、大规模可复用性和大规模并行性。

模型导向属性是什么?它和面向对象属性有什么不同?

模型导向属性是与模型结构中的节点(如Entity)关联的独立代码块。在运行时,给定该节点的一个实例作为模型上下文,属性即可被求值。与面向对象属性不同,它不依赖于类定义,可以独立使用,并能在表达式等多种场景中复用。

动态语法在MOP语言中有什么作用?

动态语法允许语言语法在运行时改变或扩充。MOP语言解释器可以在会话开始时读取模型结构,并将其添加到语法中。这对于处理非标准模型(如非正式MOD)或需要添加额外属性(如MaxLength)时非常有用,使语言能灵活适应不同的模型结构。

MOP语言如何实现大规模可复用性和并行性?

由于模型导向属性是独立的代码块,可以在不同上下文中多次求值,并且几乎不需要变量,因此具有高度可复用性。同时,模型数据在会话中是只读的,且无变量,使得模型导向属性的求值可以大规模并行化。

🏷️

标签

➡️

继续阅读