1

众所周知,UML 没有图灵完备(与通常的编程语言相比)。但在我看来,UML 比传统语言更灵活。我无法想象一个问题可以用 C++ (fe) 之类的语言来描述,但同时又不能用 UML 来描述。恰恰相反,我更容易想象存在于 UML 中但在 C++ 中不可靠的构造(Java、Delphi、VB 等......)你能帮我理解这一刻吗?我真的抓不住。

4

3 回答 3

3

我想说,自从添加了 Action Semantics 包(这发生在 UML 1.5 版本中)以来,UML 就是一种图灵完备的语言。

现在 UML 包括一种命令式动作语言(不要与 OCL 混淆),它允许精确定义类方法的行为。这种命令式动作语言包括典型的一组赋值、if 条件、迭代器,......你会从任何编程语言中得到期望。

这种动作语言是可执行 UML 方法的流行组件之一,但它现在是 UML 标准本身的一部分

于 2010-10-23T14:42:53.397 回答
1

有趣的问题。我想到了几点,尽管可能还有更多。对不起,它很长。

你能用 C++ 描述什么你不能用 UML 描述?

首先,您必须定义“UML”的含义。通常,人们倾向于指“核心”元素——类图、状态图、活动图等上的元素——加上 OCL(约束语言)。

鉴于这些元素,您无法指定命令式算法。具体来说,任何需要分配的东西。然而,您可以非常接近:步骤和决策逻辑可以使用例如活动图来表示,并且每个步骤的功能定义为 OCL 中的前置条件和后置条件。但是,您永远无法完全指定行为。举一个原子步骤的例子,其目的是增加一个整数的值。输入是一个整数——比如说X。输出由后置条件描述X == X@pre+1。但是,UML 中没有任何东西可以实际实现该步骤。

现在完全可以想象扩展 UML 的使用以解决上述问题。UML 动作语义被精确地开发以支持动作规范。这样做可以使语言在计算上完整。这些问题仅仅是实际的:

  1. 语义没有普遍认可和采用的语法。
  2. 很少有实现

你能用 UML 描述哪些不能用 C++ 实现的东西?

本质上什么都没有。但是有两个实际限制:

  1. UML“规范”通常不精确、模棱两可和/或不完整。例如,活动图经常使路径悬空。它可以直接用 C++ 表示吗?是的。它会编译吗?不。
  2. UML 构造到命令式、基于堆栈的语言的一些映射是不平凡的。状态模型就是一个例子:虽然有众所周知的模式,但映射非常复杂。对于分层和/或并发行为尤其如此。在活动图中,很容易表达两个活动并行发生,然后在进入下一步之前同步。这当然可以在 C++ 中完成,但需要使用例如线程库。

然而,它可以做到。事实上,这正是 Executable UML 工具所做的:模型编译器采用可执行的 UML 模型并将其转换为 100% 有效的命令式代码。

hth。

于 2010-10-22T14:39:21.503 回答
1

顾名思义,UML 是一种建模语言。它有时可以用作设计软件的方法。

曾几何时,他们梦想着自动生成代码的方法,它们被称为 CASE 工具。尽管他们确实从语言中删除了许多样板代码,但他们未能让代码生成器有效地工作。这种增强成为 UML 的关键,因为它提供了一种增强设计和编程软件体验的方法。

我不知道 UML 是否是“图灵完备的”,我希望它是,通过以图形格式向计算机描述问题并让计算机为计算机完成所有困难的讨厌编程来提出解决方案不是很好吗?你。

UML 是代码中执行的元语言。它描述了人工制品,它们如何关联/相互作用以及它们的作用。

UML 正在被添加,新的设计工件正在逐年添加,如果它还没有 Turing Complete,我不明白为什么它不能。

但是,我认为在某个地方我读到了一些关于“图灵等效”的语言,如果它们都可以表达和解决相同的解决方案的话。

由于 UML 是设计语言,而代码是基于 UML 设计的实现语言,我会说 UML 和代码(c#、java 等)是图灵等效的。如果它们被同意是图灵等效的,那么 UML 必须是图灵完备的。

于 2010-10-25T03:04:00.013 回答