将 UML 视为 DSL 是否合适?
我知道每个人都认为 UML 是一种绘制图片的方式,但在 UML 图的“视图”之下有一个模型……而 UML 中的“L”代表语言。
另一个问题 - SysML 是 DSL 吗?
将 UML 视为 DSL 是否合适?
我知道每个人都认为 UML 是一种绘制图片的方式,但在 UML 图的“视图”之下有一个模型……而 UML 中的“L”代表语言。
另一个问题 - SysML 是 DSL 吗?
UML是一种 DSL。
“特定领域的语言”可以让人们在狭窄的应用领域中指定问题或解决方案;银行、电话电路设计……区分 DSL 的一种方法是它不能进行通用计算(尽管有一些 DSL 可以)。Java、C#、Python 和 COBOL 未能通过此测试。(有人会说 COBOL 是特定于“业务”的域,但它唯一的重大让步是十进制数据类型,C# 也有。)ColdFusion 未通过此测试;非标准语法不是 DSL,但 IIRC ColdFusion 对生成 HTML 有一些支持。Fortran 未能通过此测试,但其数组(-section)子语言仅适用于数组,不适用于通用计算。Verilog 是非常特定于领域的:它旨在让您写下数字电路。
UML 侧重于指定软件结构的不同方面。[你会注意到它不能进行通用计算;一个标志]。(它实际上有 9 个或更多不同的方面:类、状态图、部署……我将坚持讨论类方面)。类图方面可以描述数据是如何组织的,以及对该数据的操作。您可以就软件争论这一点,因此它不能是“特定于域的”。什么,构建软件不是问题域?
SYSML 专注于表达系统的连接方式,因此它也适合这一类别。
恕我直言,一个更有用的问题是,“如果我将 UML 视为 DSL,我将获得什么?” 在这里,我认为您不会得到很多。当你为一个你没有(设计或拥有)的人争论时,DSL 的概念很有用,重点是对常见问题的更好表达,并且可能对争论“你不想完全在其中实现你的系统”很有用因为它没有图灵能力”。如果您想解释您的语言将有很多有趣的符号,这也很有用,正是因为它们服务于特殊目的。人们已经对 UML 有所了解,所以……什么都没学到。
虽然我是 DSL 的忠实粉丝,但我也是 GPL(通用语言)的忠实粉丝。我认为在大型系统中,您必须同时找到“很多”:DSL 可以简洁地表达它们(减少工程和维护成本),以及 GPL 提供系统部分之间的任意计算和粘合。对我来说,一门语言最重要的是:
UML(15 年后)已经对这些问题给出了很好的答案。
本土 DSL 通常表现不佳,部分原因是设计不佳,但通常是因为难以获得工具支持。我的公司提供机器给 DSL 建设者极好的支持来改善这种情况。
UML 不是 DSL,因为 UML 可用于对任何垂直领域(保险软件、嵌入式系统……)进行建模
UML 是一种(水平的)DSL,因为 UML 是一种专门用于对软件系统建模的语言。
所以 UML 是也不是 DSL,这取决于你如何看待它。您可以将相同的推理应用于许多其他语言,例如 html 或 SQL。它们是通用的,因为它们可用于表示/操作任何类型的数据,但它们是特定的,因为它们专注于一项任务
对这两个问题的简短回答 - 否。
将 UML 视为一种工具,可让您描述软件架构、软件交互等……以通用方式描述它们,与语言无关。
DSL 是专门的语法,旨在更容易描述一些特定的问题
我认为您第一个问题的答案取决于如何在“通用语言”一词中定义“通用”。维基百科说它不是 DSL:
相反的是:
通用编程语言,例如 C、Java 或 Python,
或通用建模语言,例如统一建模语言 (UML)。
我是 MDA 爱好者,所以我想我可以为你的问题提供一个非常详细的答案。什么是 UML:对象管理组(OMG) 是一个旨在提供标准语言和技术的公司联盟,它定义了一种称为“元对象设施”或MOF的元元建模语言(http://www.omg.org/mof)。元模型是描述模型的模型,或者换句话说,描述词汇表(您可以在模型中使用的元素)、语法(它们相互关联)及其语义(每个实体的含义以及如何它的含义在给定的上下文中会发生变化等)。元模型在它们产生的语言方面扮演着与上下文无关文法相同的角色。因此,您可以将元元模型视为一种可用于定义元模型的语言。这就是 OMG 对 UML 所做的实际操作。UML 语言有一个通过 MOF 在两个文档中描述的元模型:UML Infrastructure和UML Supersturcture (http://www.omg.org/spec/UML)。
UML 元模型的定义目的是足够通用以应对属于不同领域的不同系统的建模。当您定义一个新的 UML 模型时,您将创建一个 UML 元模型的实例。这样做的原因有很多:分析系统的某些特征,与其他利益相关者共享系统的某些方面等等。然而,OMG 愿景最重要的方面之一是模型转换。您可以将转换视为一组规则,告诉解释器如何探索模型并产生其他东西。您基本上可以将模型转换为两种不同的模型,其他模型(Model2Model,M2M 转换,通过QVT定义语言)或文本,例如代码或文档(Model2Text、M2T、通过MOFM2T 转换语言定义的转换)。所以理解UML模型不是它的图表是非常重要的。图表只是模型内容的图形表示,对人类有用,但不是机器可读的。您不能将转换应用于图表。
Eclipse 建模框架(EMF) 是一个非常强大(而且免费!)的框架,它实现了我提到的所有技术。MOF 的一个子集是用 Eclipse ECORE 语言实现的。通过 ECORE 定义 UML 元模型,以便图形 UML 编辑器(即 Papyrus、TopCased 等)实际上创建图形定义的 UML 模型的 XMI 表示,以符合 UML 元模型的 ECORE 表示。这种表示可以作为输入提供给转换引擎。使用 QVTo 插件和ACCELEO(实现 MOFM2T 转换语言)的 EMF 中也提供了这两种转换语言和相关引擎。
如前所述,UML 是有意通用的。然而,它还提供轻量级扩展机制,以使用特定领域的结构扩展原始语言词汇。这可以通过刻板印象来完成。原型是一种标签(实际上带有元属性),您可以附加在模型元素上以在语言中创建新实体。例如,您可以在您的模型中说某些类可能是需求或其他东西。当然有一些规则,例如,当你构造一个元类时,你不能违反它的原始语义,只是减少它。
SysSML 是 UML http://www.omgsysml.org/的概要文件。SysML Block 只是一个原型为 Block 的 UML 类,SysML Requirement 只是另一个原型为 Block 的 UML 类,依此类推。
剖析像 UML 这样的元模型是一种创建与 UML 兼容的 DSL(就像您将原型添加到更通用的语言中的一些属于您的领域的结构一样)的一种非常简单的方法(即您可以使用 SysML和 UML 一起)。还有另一种创建 DSL 的方法,它通过 MOF (ECORE) 定义其元模型。在这种情况下,您将创建一种全新的语言,它在概念上与 UML 本身处于同一级别。
许多人说 UML 只是关于图表,因为在许多情况下他们不知道他们在说什么。这个话题要复杂得多,有趣和有前途。
UML 是一种通用建模语言,不特定于任何领域,而 DSL 中的 S 代表特定。UML 用于建模也可以用多用途编程语言表示的系统。另一方面,DSL 是特定于特定领域的受限编程/脚本语言。