Интересный вопрос. На ум приходит пара моментов, хотя, вероятно, есть еще кое-что. Извините, это довольно долго.
Что вы можете описать, например, с помощью C ++, который вы не можете описать с помощью UML?
Во-первых, вы должны определить, что вы подразумеваете под "UML". Обычно люди имеют в виду «основные» элементы - те, что на диаграммах классов, диаграммах состояний, диаграммах деятельности и т. Д. - плюс OCL (язык ограничений).
Учитывая эти элементы, вы не можете указать императивные алгоритмы. В частности, все, что требует назначения. Однако вы можете подойти очень близко: шаги и логика решения могут быть выражены, например, с помощью Диаграммы действий и функции каждого шага, определенные как предварительные и последующие условия в OCL. Тем не менее, вы никогда не сможете полностью определить поведение. Возьмите пример атомарного шага, целью которого является увеличение значения целого числа. Входные данные являются целыми числами - скажем, X
. Выход описывается постусловием X == X@pre+1
. Однако в UML нет ничего, чтобы на самом деле реализовать шаг.
Теперь вполне возможно расширить использование UML до указанного выше. Семантика действий UML была разработана именно для того, чтобы обеспечить спецификацию действий. Это делает язык вычислительно завершенным. Проблемы просто практические:
- Не существует универсально согласованного и принятого синтаксиса для семантики;
- Существует очень мало реализаций
Что вы можете описать с помощью UML, который не может быть реализован, например, C ++?
По сути ничего. Однако есть два практических ограничения:
- UML «спецификации» обычно неточны, неоднозначны и / или неполны. Диаграммы действий, например, часто оставляют пути висящими. Может ли он быть представлен непосредственно в C ++? Да. Будет ли это компилироваться? Нет.
- Некоторые отображения конструкций UML на императивные языки на основе стека нетривиальны. Модели состояний являются примером: хотя существуют хорошо известные шаблоны, отображение довольно сложное. Это особенно верно для иерархического и / или параллельного поведения. В диаграмме действий легко выразить, что два действия происходят параллельно, а затем синхронизируются перед переходом к следующему шагу. Это, конечно, может быть сделано в C ++, но требует использования, например, библиотеки потоков.
Однако это можно сделать. Фактически, это то, что делают исполняемые инструменты UML: компиляторы моделей берут исполняемую модель UML и переводят ее в 100% функционирующий императивный код.
НТН.