回顾一下LOP的理念:使创建DSLs更容易,而这些DSLs将使编写程序更容易;但就像我已经说明的,LOP中的‘程序’不局限的意味着你用过的典型的 “一堆指令集”的程序;对某个领域中某个问题任何无二义性的解决方案都是‘程序’;因此如果你设想一下“创建新语言”这个领域,那么这个领域中的‘程序 ’,本身就是一种新语言的定义,可以作为一个解决方案来思考,就像任何其它领域的解决方案一样;
因此,应用LOP的思想,使“创建新语言”更容易的方法,就是创建一种特定的专注于“创建新语言”这个领域的DSL;通过应用这些language- building DSL,我们可以使制造新语言更容易;让我们看几种language-building语言的例子,使你更好的理解它们是如何工作的;这里只是一个概述,以后的文章我会更详细的描述它们
Structure Language
最小最少,我们需要定义新语言的‘结构’;这是我们何以能够编写“精确定义”的程序的原因;语言的结构并不意味着它的文本形式的文法--像我提到过的,这种语言甚至根本就没有文本表示而只有图形化表示
在实践LOP的时候,大部分情况下,你会工作在两个层次的编程中:元层次和程序层次;你在元层次中定义语言,在程序层次中编写程序;当定义一种新语言的结构时,你会使用一种language-structure DSL来定义你的新语言,而这时,你将同时工作在这种language-structure DSL的程序层次和新语言的元层次中
在MPS 中,程序层次的每个节点都有一种“类型”,简单的连接到元层次的另一个节点;程序层次的这个节点被称作这种类型的一个“实例”;元层次中的“类型”节点则定义了这种类型的实例能够拥有的关系和属性;描述这种元层次语言结构的语言,就被简单的称为“Structure Language”
用Structure Language定义一种语言的抽象语法,你应该只是枚举这种语言所有的类型;类型简单的表示了这种语言支持的特性或者概念;每个概念应该用它的名字、实例的内部属性、实例与其它节点之间的关系(通常是连接)来定义
存在两种可能的关联;第一种是类似聚合的关联,它形成了概念模型的父子树结构;第二种是非聚合的,自由形式的关联,它可以连接到系统中任何其它的节点;关联有两个端点:源和目标;关联有角色,你可以定义每个角色的名称、每个端点的多重性,每个目标节点的类型;多重性可以是1, 0..1, 0..n, 1..n等,让你能够约束关联可以创建多少连接;关联的目标类型可以被用来约束哪些类型的节点可以被连接在一起
因此,使用新语言编写程序包括:创建语言中概念的实例、为实例的属性赋值、根据语言概念定义的关系将程序中的节点连接在一起;所有这些将会被强大的编辑器支持,你能够为你的语言定义这种编辑器
Editor Language
那么,编写和操作概念模型的界面应该是什么呢?我们的语言需要几种类型的编辑器,但是我们不想要一个通用的编辑器;经验表明通用的编辑器不能像我们希望的那样有用;我们希望快速的编写模型,因此我们需要专为我们的语言概念定做的特殊的编辑器;一定程度上,编辑器是语言的一部分,而我们的目标是容易的创建新语言,那么创建新的编辑器也应该很容易;本质上,我们需要一种创建编辑器的语言,在MPS中,它被称为Editor Language
文章来源于领测软件测试网 https://www.ltesting.net/