Наивный вопрос о полноте UML и Тьюринга - PullRequest
1 голос
/ 22 октября 2010

Это общеизвестный факт, что UML не является полным по Тьюрингу (в отличие от обычных языков программирования). Но мне кажется, что UML еще более гибок, чем традиционные языки. Я не могу представить себе проблему, которую вы можете описать с помощью такого языка, как C ++ (f.e), но в то же время не можете описать с помощью UML. Наоборот, мне намного проще представить себе конструкцию, существующую в UML, но не выпускаемую из C ++ (Java, Delphi, VB и т. Д.) Не могли бы вы помочь мне понять этот момент? Я действительно не могу поймать это.

Ответы [ 3 ]

3 голосов
/ 23 октября 2010

Я бы сказал, что UML - это завершающий язык с момента добавления пакета семантики действий (это произошло в версии UML 1.5).

Теперь UML включает обязательный язык действий (не путать сOCL), что позволяет точно определить поведение методов класса.Этот обязательный язык действий включает в себя типичный набор назначений, если условия, итераторы, ... вы ожидаете от любого языка программирования.

Этот язык действий является одним из популярных компонентов подходов Executable UML, но онтеперь часть самого стандарта UML

1 голос
/ 25 октября 2010

Как видно из названия, UML является языком моделирования. Иногда его можно применять в качестве методологии проектирования программного обеспечения.

Когда-то они придумывали способы автоматической генерации кода, их называли инструментами CASE. Им не удалось заставить генераторы кода работать эффективно, хотя они действительно удалили много стандартного кода из языка. Это дополнение стало ключом к UML, поскольку оно дало возможность расширить опыт проектирования и программирования программного обеспечения.

Я не знаю, является ли UML «завершением Тьюринга», я надеюсь, что было бы неплохо придумать решения, описав проблему с компьютером в графическом формате и позволив компьютеру сделать все это сложно неприятное программирование для вас.

UML - это мета-язык для выполнения в коде. Он описывает артефакты, как они связаны / взаимодействуют и что они делают.

UML добавляется, новые артефакты дизайна добавляются из года в год, и если это еще не Turing Complete, я не понимаю, почему этого не может быть.

Тем не менее, я думаю, что где-то в одном месте я прочел что-то о том, что языки являются «эквивалентами Тьюринга», если бы они могли как выразить, так и решить одно и то же решение.

Поскольку UML является языком проектирования, а код является языком реализации, основанным на дизайне UML, я бы сказал, что UML и код (c #, java и т. Д.) Являются эквивалентами Тьюринга. Если они согласны на эквивалентность по Тьюрингу, тогда UML должен быть завершен по Тьюрингу.

1 голос
/ 22 октября 2010

Интересный вопрос. На ум приходит пара моментов, хотя, вероятно, есть еще кое-что. Извините, это довольно долго.

Что вы можете описать, например, с помощью C ++, который вы не можете описать с помощью UML?

Во-первых, вы должны определить, что вы подразумеваете под "UML". Обычно люди имеют в виду «основные» элементы - те, что на диаграммах классов, диаграммах состояний, диаграммах деятельности и т. Д. - плюс OCL (язык ограничений).

Учитывая эти элементы, вы не можете указать императивные алгоритмы. В частности, все, что требует назначения. Однако вы можете подойти очень близко: шаги и логика решения могут быть выражены, например, с помощью Диаграммы действий и функции каждого шага, определенные как предварительные и последующие условия в OCL. Тем не менее, вы никогда не сможете полностью определить поведение. Возьмите пример атомарного шага, целью которого является увеличение значения целого числа. Входные данные являются целыми числами - скажем, X. Выход описывается постусловием X == X@pre+1. Однако в UML нет ничего, чтобы на самом деле реализовать шаг.

Теперь вполне возможно расширить использование UML до указанного выше. Семантика действий UML была разработана именно для того, чтобы обеспечить спецификацию действий. Это делает язык вычислительно завершенным. Проблемы просто практические:

  1. Не существует универсально согласованного и принятого синтаксиса для семантики;
  2. Существует очень мало реализаций

Что вы можете описать с помощью UML, который не может быть реализован, например, C ++?

По сути ничего. Однако есть два практических ограничения:

  1. UML «спецификации» обычно неточны, неоднозначны и / или неполны. Диаграммы действий, например, часто оставляют пути висящими. Может ли он быть представлен непосредственно в C ++? Да. Будет ли это компилироваться? Нет.
  2. Некоторые отображения конструкций UML на императивные языки на основе стека нетривиальны. Модели состояний являются примером: хотя существуют хорошо известные шаблоны, отображение довольно сложное. Это особенно верно для иерархического и / или параллельного поведения. В диаграмме действий легко выразить, что два действия происходят параллельно, а затем синхронизируются перед переходом к следующему шагу. Это, конечно, может быть сделано в C ++, но требует использования, например, библиотеки потоков.

Однако это можно сделать. Фактически, это то, что делают исполняемые инструменты UML: компиляторы моделей берут исполняемую модель UML и переводят ее в 100% функционирующий императивный код.

НТН.

...