20

UML 是否可以在没有支持实现语言的情况下自行对计算机系统进行编程,例如直接将图表转换为机器代码(可能通过 C 或 C++ 等),而无需人工编码干预。

4

13 回答 13

24

我将逆势而上,分享一个经验,展示 UML 今天可以做什么,以及 UML 的某些未来版本(或另一种建模方法)可能是什么。

首先是一点历史。

很久以前,人们在组装中对计算机进行编程(不会一直回到这里)。然后出现了更高级别的语言,如 C 和 Basic。擅长汇编的程序员认为,您不能用高级语言完全表达处理器能够(以优化的方式)做的所有事情。事实上,他们是对的。从内存和性能的角度来看,在高级语言中,有些事情的优化程度要低得多,因为您无法完全控制发布给处理器的指令。

问题是,高级语言提供了更抽象的表达形式。因此,他们开始流行起来,过了一段时间,人们并不真正关心你不能完全控制处理器的各个方面,因为开发人员的生产力要高得多(摩尔定律也有帮助)。

类似的回合发生在面向对象的语言中,同样也发生在托管语言中。每次,更高级别的抽象变得可用并最终获胜,因为作为开发人员使用它更有效。事实上,随着编译器变得更好和优化技术的改进,高级表达式中的低效率通常会消失。

模型驱动开发是更高层次的表达。您不能完全表示可以用 C# 或 Java 编写的任何代码。尤其是没有开箱即用。但是,可以直接从 UML 模型生成应用程序的很大一部分。

我为几个相当大的项目领导了基于 UML 的代码生成工作。在许多情况下,我们可以生成(现实生活中的企业级)应用程序的整个源代码的 30% 到 60%。这只是一个为特定领域编写生成器的小团队。最终,整个行业都将支持从模型中生成越来越多实际应用的工具。

自从第一个汇编代码抽象操作码以来,这是我们一次又一次地在我们的行业中看到的自然演变的下一步(在那之前可能有一些东西,但那是在我的时代之前)。

于 2010-03-21T03:29:05.653 回答
11

简短的回答:没有。一些 UML 建模工具可以生成 Java、C++ 和其他编程语言的代码。但是,它生成的通常是接口和类关系。这些工具会生成存根,但仍需要为其提供实现,因此需要人工干预。

于 2010-03-21T03:16:20.857 回答
5

有一些工具可以将 UML 建模图转换为代码 - 特别是 UML 状态图。例如,我在 2000 年使用了一个名为“Rhapsody”(来自 I-Logix)的工具,它将 UML 图转换为 C++。这很酷,因为该工具可以直接运行状态机,也可以在远程机器上运行代码(在本例中,是运行 vxworks 的板)。

但一般来说,UML 最好用作建模工具。使用它来为您的系统建模并为您的设计文件或其他任何东西提供图表。然后使用这些知识以有组织的方式开发您的系统。

于 2010-03-21T03:09:19.560 回答
2

理论上?是的 - 你可以使用一个庞大的状态机图并详细指定所有内容,然后将状态机图连接到类图中的方法并运行一些非常复杂的工具来生成所有这些。

但这不是你想做的事情。你不会在表达自己的方式上获得更多自由,因为你必须使用正确的语法,这样工具才能理解你编写的所有内容。不仅如此,您自己编写实际代码的时间也远远少于制作所有这些图表所需的时间——它唯一给您的就是代码是规范的抄本(因为规范会生成代码)。这可能是一件好事,但由于您没有实际代码,这也意味着调试意味着调试图表——这几乎肯定是不可能的。

于 2010-03-21T03:17:40.917 回答
1

UML 可以为状态机建模。 因此,它可以代表图灵机。 具有足够复杂性的编译器可以读取此表示并创建图灵机的二进制(可执行)表示。

所以,我的答案是肯定的。

编辑

由于我的回答对某些人来说似乎令人不快......让我澄清一下,这个“具有足够复杂性的编译器”完全是虚构的,可能在未来很远......但从其他答案看来,有些程序可以生成一些样板代码甚至生成并运行整个程序。

我认为这证明了 UML(或它的某个子集)有资格作为一种编程语言,但可能不是一种好的语言。

于 2010-03-21T03:14:42.263 回答
1

是的,有可能,只需检查依赖于使用动作语言来表达系统行为细节的 ExecutableUML(以及类似的新标准即将推出)之类的方法(一种带有迭代器、条件的伪代码,并创建、读取、更新和销毁操作)。

一个完全不同的讨论是值得的。以足够的精度和细节对系统进行建模以生成 100% 的代码并不总能获得回报。对于模型驱动开发,我更喜欢坚持我的帕累托原则(或 80-20 规则):20% 的建模工作足以生成 80% 的应用程序代码

更详细的解释在这里: http: //modeling-languages.com/blog/content/pareto-principle-applied-mdd

于 2010-03-21T05:18:53.253 回答
1

现在有一个完全 OMG 标准化、图灵完备的执行语义,用于 UML 2.3 的一个子集,称为“基础 UML”(fUML)。在此处查找参考实现和指向 OMG 规范的指针。还有关于 OMG 标准 UML 动作语言的工作正在进行中。

无论好坏,当这项工作完成后,fUML 将成为一种编程语言。

——埃德

于 2010-04-18T10:48:56.923 回答
0

根据您使用的 UML 工具,可以将类图前向工程化为编程语言。我认为您仍然需要编写自己的业务逻辑等。

于 2010-03-21T03:10:27.000 回答
0

它不是。一点也不。

它不能做出决定(如果)或运行循环。它与其说是一种编程语言,不如说是一种有限状态机。至少 FSM 可以做出决定。UML 甚至没有状态。

于 2010-03-21T03:14:52.823 回答
0

简短的回答:就像现在一样,您无法生成 100% 的代码。

您可能可以通过类图生成系统的类结构,并且可能通过交互图和/或状态图生成方法主体的一部分,但我认为仅此而已。

于 2010-03-21T03:26:52.303 回答
0

WeNeedAnswers的一些链接,因为我受到他的评论的影响:

那应该是一个开始。

于 2010-03-21T04:14:21.503 回答
0

UML 动作语义支持对象分配/处置、读取/写入属性和局部变量、调用操作、抛出和捕获异常、导航关系、块、循环和条件行为等等。

看:

http://abstratt.com/blog/2008/11/02/what-c​​an-uml-do-for-you/

http://abstratt.com/blog/2008/11/07/executable-models-with-textuml-toolkit-12-m1/

对于那些说“不”的人:问题是关于UML,而不是“你使用的 UML 工具”,伙计们。UML 是一门庞大的语言,而工具实现了它的一个子集,通常可能非常小。

于 2010-04-12T21:14:09.457 回答
0

UML2 只是代码生成器的数据。

代码生成器通过使用来自模型的数据来概括代码(就像 C++ 模板通过使用 C++ 结构作为模型来概括代码)。

像这样工作,您可以为任何给定模型生成完整的创建、替换、更新、删除 (CRUD) 和搜索应用程序。

That code implements hooks, callbacks, inheritance or similar techniques, that allow to extend the functionality by hand-written-code, without touching the generated code (which must be seen as intermediate code).

于 2019-08-29T11:22:01.110 回答