WikiDer > Венский метод развития - Википедия
В Венский метод развития (VDM) является одним из старейших формальные методы для разработки компьютерных систем. Исходя из работы, выполненной на Лаборатория IBM в Вене[1] в 1970-х годах он расширился и теперь включает группу методов и инструментов, основанных на формальном языке спецификации - языке спецификации VDM (VDM-SL). Имеет расширенную форму, VDM ++,[2] который поддерживает моделирование объектно-ориентированный и параллельные системы. Поддержка VDM включает коммерческие и академические инструменты для анализа моделей, включая поддержку тестирования и доказательства свойств моделей и генерации программного кода из проверенных моделей VDM. Существует история промышленного использования VDM и его инструментов, и растущее количество исследований в области формализма привело к заметному вкладу в разработку критических систем. компиляторы, параллельные системы и в логика за Информатика.
Философия
Вычислительные системы могут быть смоделированы в VDM-SL на более высоком уровне абстракции, чем это достижимо с использованием языков программирования, что позволяет анализировать конструкции и определять ключевые особенности, включая дефекты, на ранней стадии разработки системы. Проверенные модели могут быть преобразованы в подробные системные проекты посредством процесса уточнения. Язык имеет формальную семантику, позволяющую доказывать свойства моделей с высокой степенью уверенности. Он также имеет исполняемое подмножество, так что модели могут быть проанализированы путем тестирования и могут выполняться через графические пользовательские интерфейсы, так что модели могут быть оценены экспертами, которые не обязательно знакомы с самим языком моделирования.
История
Истоки VDM-SL лежат в IBM Лаборатория в Вена где первая версия языка называлась VИена Dопределение Lязык (VDL).[3] VDL в основном использовался для операционная семантика описания в отличие от VDM - Meta-IV, который предоставил денотационная семантика[4]
«К концу 1972 года венская группа снова обратила внимание на проблему систематической разработки компилятора на основе определения языка. Общий подход был назван «Венским методом разработки» ... Фактически принятый метаязык («Meta-IV») используется для определения основных частей PL / 1 (как указано в ECMA 74 - что интересно, «формальный» документ стандартов, написанный как абстрактный интерпретатор ») в BEKIČ 74.»[5]
Нет связи между Мета-IV,[6] и Шорре Мета-II язык или его преемник Дерево Мета; это были компилятор-компилятор системы, а не подходят для формального описания проблем.
Таким образом, Meta-IV «использовался для определения основных частей» PL / I язык программирования. Другие языки программирования, ретроспективно или частично описанные с использованием Meta-IV и VDM-SL, включают BASIC язык программирования, FORTRAN, то Язык программирования APL, АЛГОЛ 60 г. Язык программирования Ада и Язык программирования Паскаль. Meta-IV превратилась в несколько вариантов, обычно описываемых как датская, английская и ирландская школы.
"Английская школа", созданная на основе работы Клифф Джонс об аспектах VDM, не связанных непосредственно с определением языка и дизайном компилятора (Jones 1980, 1990). Это подчеркивает постоянное моделирование[7] состояние за счет использования типов данных, созданных из обширной коллекции базовых типов. Функциональность обычно описывается с помощью операций, которые могут иметь побочные эффекты для состояния и которые в большинстве случаев указываются неявно с использованием предусловия и постусловия. "Датская школа" (Бьёрнер и другие. 1982), как правило, подчеркивал конструктивный подход с более широким использованием явных рабочих спецификаций. Работа в датской школе привела к появлению первых сертифицированных в Европе Ада компилятор.
An ISO Стандарт для языка был выпущен в 1996 году (ISO, 1996).
Возможности VDM
Синтаксис и семантика VDM-SL и VDM ++ подробно описаны в языковых руководствах VDMTools и в имеющихся текстах. Стандарт ISO содержит формальное определение семантики языка. В оставшейся части этой статьи используется синтаксис обмена, определенный ISO (ASCII). Некоторые тексты предпочитают более сжатые математический синтаксис.
Модель VDM-SL - это описание системы с точки зрения функциональности, выполняемой с данными. Он состоит из серии определений типов данных и функций или операций, выполняемых с ними.
Основные типы: числовые, символьные, токен и кавычки
VDM-SL включает следующие основные типы моделирующих чисел и символов:
bool | Логический тип данных | false true |
нац | натуральные числа (включая ноль) | 0, 1, 2, 3, 4, 5 ... |
nat1 | натуральные числа (кроме нуля) | 1, 2, 3, 4, 5, ... |
int | целые числа | ..., −3, −2, −1, 0, 1, 2, 3, ... |
крыса | рациональное число | а / б, куда а и б целые числа, б не является 0 |
настоящий | действительные числа | ... |
char | символы | А, Б, В, ... |
жетон | бесструктурные токены | ... |
<A> | тип котировки, содержащий значение <A> | ... |
Типы данных определены для представления основных данных моделируемой системы. Каждое определение типа вводит новое имя типа и дает представление в терминах основных типов или в терминах уже введенных типов. Например, тип, моделирующий идентификаторы пользователей для системы управления входом в систему, может быть определен следующим образом:
typesUserId = nat
Для управления значениями, принадлежащими типам данных, для значений определены операторы. Таким образом, обеспечивается сложение натуральных чисел, вычитание и т. Д., А также логические операторы, такие как равенство и неравенство. Язык не устанавливает максимальное или минимальное представимое число или точность действительных чисел. Такие ограничения определяются там, где они требуются в каждой модели, с помощью инвариантов типа данных - логических выражений, обозначающих условия, которые должны соблюдаться всеми элементами определенного типа. Например, требование, чтобы идентификаторы пользователей не превышали 9999, можно было бы выразить следующим образом (где <=
является логическим оператором "меньше или равно" для натуральных чисел):
UserId = natinv uid == uid <= 9999
Поскольку инварианты могут быть произвольно сложными логическими выражениями, а принадлежность к определенному типу ограничена только теми значениями, которые удовлетворяют инварианту, правильность типа в VDM-SL не может быть автоматически разрешена во всех ситуациях.
Другие основные типы включают char для символов. В некоторых случаях представление типа не имеет отношения к цели модели и только добавит сложности. В таких случаях члены типа могут быть представлены как бесструктурные токены. Значения типов токенов можно сравнивать только на равенство - для них не определены другие операторы. Если требуются определенные именованные значения, они представлены как типы кавычек. Каждый тип кавычек состоит из одного именованного значения с тем же именем, что и сам тип. Значения типов кавычек (известные как литералы кавычек) можно сравнивать только на равенство.
Например, при моделировании контроллера светофора может быть удобно определить значения для представления цветов светофора как типов цитат:
<Red>, <Amber>, <FlashingAmber>, <Green>
Конструкторы типов: объединение, произведение и составные типы
Только основные типы имеют ограниченную ценность. Новые, более структурированные типы данных создаются с помощью конструкторов типов.
T1 | T2 | ... | Тн | Союз типов Т1, ..., Тн |
Т1 * Т2 * ... * Тн | Декартово произведение типов Т1, ..., Тн |
Т :: f1: T1 ... fn: Tn | Составной (запись) тип |
Самый простой конструктор типов образует объединение двух предопределенных типов. Тип (А | В)
содержит все элементы типа A и все элементы типа B
. В примере с контроллером светофора тип, моделирующий цвет светофора, можно определить следующим образом:
SignalColour =| <Янтарь> | <Мигающий янтарь> | <Зеленый>
Перечислимые типы в VDM-SL определены, как показано выше, как объединения по типам котировок.
Декартовы типы продуктов также могут быть определены в VDM-SL. Тип (A1 *… * An)
- это тип, состоящий из всех кортежей значений, первый элемент которых принадлежит типу A1
а второй из типа A2
и так далее. Составной тип или тип записи - это декартово произведение с метками для полей. Тип
T :: f1: A1 f2: A2 ... fn: An
декартово произведение с полями, помеченными f1,…, fn
. Элемент типа Т
может быть составлен из составных частей конструктором, написанным mk_T
. И наоборот, учитывая элемент типа Т
, имена полей можно использовать для выбора названного компонента. Например, тип
Date :: day: nat1 месяц: nat1 год: natinv mk_Date (d, m, y) == d <= 31 и m <= 12
моделирует простой тип даты. Значение mk_Date (1,4,2001)
соответствует 1 апреля 2001 года. Учитывая дату d
, выражение d.month
натуральное число, представляющее месяц. При желании в инвариант можно включить ограничения на количество дней в месяц и високосные годы. Сочетание этих:
mk_Date (1,4,2001) .month = 4
Коллекции
Типы коллекций моделируют группы значений. Наборы - это конечные неупорядоченные коллекции, в которых подавляется дублирование значений. Последовательности - это конечные упорядоченные коллекции (списки), в которых может происходить дублирование, а отображения представляют собой конечные соответствия между двумя наборами значений.
Наборы
Конструктор типа набора (пишется набор T
куда Т
является предопределенным типом) создает тип, состоящий из всех конечных наборов значений, взятых из типа Т
. Например, определение типа
UGroup = набор UserId
определяет тип UGroup
состоящий из всех конечных наборов ID пользователя
значения. На множествах определены различные операторы для построения их объединения, пересечений, определения правильных и нестрогих отношений подмножества и т. Д.
{а, б, в} | Set enumeration: набор элементов а , б и c |
{x | x: T&P (x)} | Понимание набора: набор Икс от типа Т такой, что Р (х) |
{i, ..., j} | Набор целых чисел в диапазоне я к j |
e в наборе s | е является элементом множества s |
е нет в наборе s | е не является элементом множества s |
s1 союз s2 | Союз наборов s1 и s2 |
s1 inter s2 | Пересечение множеств s1 и s2 |
s1 s2 | Установить разницу наборов s1 и s2 |
dunion s | Распределенное объединение множества наборов s |
s1 psubset s2 | s1 - (собственное) подмножество s2 |
s1 подмножество s2 | s1 - (слабое) подмножество s2 |
открытки | Мощность множества s |
Последовательности
Конструктор типа конечной последовательности (пишется seq of T
куда Т
является предопределенным типом) создает тип, состоящий из всех конечных списков значений, взятых из типа Т
. Например, определение типа
Строка = последовательность символов
Определяет тип Нить
состоит из всех конечных строк символов. В последовательностях определены различные операторы для построения конкатенации, выбора элементов и подпоследовательностей и т. Д. Многие из этих операторов являются частичными в том смысле, что они не определены для определенных приложений. Например, выбор 5-го элемента последовательности, содержащей только три элемента, не определен.
Порядок и повторение элементов в последовательности имеют большое значение, поэтому [а, б]
не равно [б, а]
, и [а]
не равно [а, а]
.
[а, б, в] | Перечисление последовательности: последовательность элементов а , б и c |
[f (x) | x: T&P (x)] | Понимание последовательности: последовательность выражений f (x) для каждого Икс (числового) типа Т такой, что Р (х) держит ( Икс значения взяты в числовом порядке) |
HD s | Голова (первый элемент) s |
tl s | Хвост (оставшаяся последовательность после удаления головы) s |
len s | Длина s |
Elems S | Набор элементов s |
s (я) | В я th элемент s |
inds s | набор индексов для последовательности s |
s1 ^ s2 | последовательность, образованная конкатенацией последовательностей s1 и s2 |
Карты
Конечное отображение - это соответствие между двумя наборами, доменом и диапазоном, с элементами индексации домена диапазона. Поэтому он похож на конечную функцию. Конструктор типа отображения в VDM-SL (написано сопоставить T1 с T2
куда Т1
и Т2
являются предопределенными типами) создает тип, состоящий из всех конечных отображений из наборов Т1
значения для наборов Т2
значения. Например, определение типа
Дни рождения = сопоставить строку с датой
Определяет тип Дни рождения
который отображает символьные строки в Дата
. Опять же, в отображениях определены операторы для индексации в отображении, слияния отображений, перезаписи, извлечения под-отображений.
{a | -> r, b | -> s} | Перечисление карт: а сопоставляется с р , б сопоставляется с s |
{x | -> f (x) | x: T&P (x)} | Понимание карт: Икс сопоставляется с f (x) для всех Икс для типа Т такой, что Р (х) |
дом м | Область м |
rng m | Диапазон м |
м (х) | м применительно к Икс |
m1 munion m2 | Союз сопоставлений m1 и m2 (m1 , m2 должны быть последовательными там, где они перекрываются) |
m1 ++ m2 | m1 перезаписан m2 |
Структурирование
Основное различие между нотациями VDM-SL и VDM ++ заключается в способе структурирования. В VDM-SL есть обычное модульное расширение, тогда как VDM ++ имеет традиционный объектно-ориентированный механизм структурирования с классами и наследованием.
Структурирование в VDM-SL
В стандарте ISO для VDM-SL есть информационное приложение, которое содержит различные принципы структурирования. Все они следуют традиционным принципам сокрытия информации с помощью модулей, и их можно объяснить следующим образом:
- Именование модулей: Каждый модуль синтаксически запускается с ключевого слова
модуль
за которым следует имя модуля. В конце модуля ключевое словоконец
записывается, после чего снова следует имя модуля. - Импорт: Можно импортировать определения, которые были экспортированы из других модулей. Это делается в раздел импорта который начинается с ключевого слова
импорт
а затем следует последовательность импорта из разных модулей. Каждый из этих модулей импорта начинается с ключевого словаиз
за которым следует имя модуля и подпись модуля. В подпись модуля может быть просто ключевым словомвсе
указывает на импорт всех определений, экспортированных из этого модуля, или это может быть последовательность сигнатур импорта. Сигнатуры импорта специфичны для типов, значений, функций и операций, и каждая из них запускается с помощью соответствующего ключевого слова. Кроме того, эти сигнатуры импорта называют конструкции, к которым есть желание получить доступ. Кроме того, может присутствовать дополнительная информация о типе, и, наконец, можно переименовать каждая из конструкций при импорте. Для типов нужно также использовать ключевое словоструктура
если кто-то хочет получить доступ к внутренняя структура определенного типа. - Экспорт: Определения из модуля, к которому должны иметь доступ другие модули, экспортируются с использованием ключевого слова
экспорт
за которым следует подпись модуля экспорта. В экспортирует подпись модуля может просто состоять из ключевого словавсе
или как последовательность экспортных подписей. Такой экспортные подписи специфичны для типов, значений, функций и операций, и каждый из них запускается с помощью соответствующего ключевого слова. Если вы хотите экспортировать внутреннюю структуру типа, ключевое словоструктура
должны быть использованы. - Более экзотические особенности: В более ранних версиях инструментов VDM-SL также была поддержка параметризованных модулей и экземпляров таких модулей. Однако эти функции были убраны из VDMTools примерно в 2000 году, потому что они почти никогда не использовались в промышленных приложениях, и с этими функциями возникало значительное количество проблем с инструментами.
Структурирование в VDM ++
В VDM ++ структурирование выполняется с использованием классов и множественного наследования. Ключевые концепции:
- Учебный класс: Каждый класс синтаксически начинается с ключевого слова
учебный класс
за которым следует имя класса. В конце класса ключевое словоконец
записывается, после чего снова следует имя класса. - Наследование: В случае, если класс наследует конструкции от других классов, после имени класса в заголовке класса могут следовать ключевые слова
является подклассом
за которым следует список имен суперклассов, разделенных запятыми. - Модификаторы доступа: Скрытие информации в VDM ++ выполняется так же, как и в большинстве объектно-ориентированных языков, с использованием модификаторов доступа. В VDM ++ определения по умолчанию являются частными, но перед всеми определениями можно использовать одно из ключевых слов модификатора доступа:
частный
,общественный
изащищенный
.
Функциональность моделирования
Функциональное моделирование
В VDM-SL функции определяются над типами данных, определенными в модели. Поддержка абстракции требует, чтобы была возможность характеризовать результат, который должна вычислять функция, без необходимости говорить, как он должен быть вычислен. Основным механизмом для этого является неявное определение функции в котором вместо формулы, вычисляющей результат, используется логический предикат над входными и результирующими переменными, называемый постусловие, дает свойства результата. Например, функция SQRT
для вычисления квадратного корня из натурального числа можно определить следующим образом:
КОРЕНЬ (x: nat) r: realpost r * r = x
Здесь постусловие не определяет метод вычисления результата. р
но указывает, какие свойства можно предположить, чтобы обладать этим. Обратите внимание, что это определяет функцию, которая возвращает правильный квадратный корень; не требуется, чтобы это был положительный или отрицательный корень. Вышеуказанной спецификации может удовлетворять, например, функция, возвращающая отрицательный корень из 4, но положительный корень из всех других допустимых входных данных. Обратите внимание, что функции в VDM-SL должны быть детерминированный так что функция, удовлетворяющая приведенному выше примеру, должна всегда возвращать один и тот же результат для одного и того же ввода.
Более ограниченная спецификация функции достигается усилением постусловия. Например, следующее определение ограничивает функцию возвратом положительного корня.
SQRT (x: nat) r: realpost r * r = x и r> = 0
Все характеристики функций могут быть ограничены предварительные условия которые являются логическими предикатами только для входных переменных и описывают ограничения, которые, как предполагается, выполняются при выполнении функции. Например, функция вычисления квадратного корня, которая работает только с положительными действительными числами, может быть указана следующим образом:
SQRTP (x: real) r: realpre x> = 0post r * r = x и r> = 0
Предусловие и постусловие вместе образуют договор это должно быть удовлетворено любой программой, претендующей на реализацию этой функции. В предварительном условии записаны предположения, при которых функция гарантирует возврат результата, удовлетворяющего постусловию. Если функция вызывается для входов, которые не удовлетворяют ее предварительному условию, результат не определен (действительно, завершение даже не гарантируется).
VDM-SL также поддерживает определение исполняемых функций в манере функционального языка программирования. В явный определение функции, результат определяется посредством выражения над входами. Например, функция, которая создает список квадратов списка чисел, может быть определена следующим образом:
SqList: seq of nat -> seq of natSqList (s) == if s = [] then [] else [(hd s) ** 2] ^ SqList (tl s)
Это рекурсивное определение состоит из сигнатуры функции, дающей типы ввода и результата, а также тела функции. Неявное определение той же функции может иметь следующую форму:
SqListImp (s: seq of nat) r: seq natpost len r = len s и forall i в наборе inds s & r (i) = s (i) ** 2
Явное определение в простом смысле является реализацией неявно указанной функции. Корректность явного определения функции по отношению к неявной спецификации может быть определена следующим образом.
Учитывая неявную спецификацию:
f (p: T_p) r: T_rpre pre-f (p) post post-f (p, r)
и явная функция:
f: T_p -> T_r
мы говорим, что он соответствует спецификации если только:
для всех p в наборе T_p & pre-f (p) => f (p): T_r и post-f (p, f (p))
Так, "ж
правильная реализация "следует интерпретировать как"ж
удовлетворяет спецификации ».
Государственное моделирование
В VDM-SL функции не имеют побочных эффектов, таких как изменение состояния постоянной глобальной переменной. Это полезная способность во многих языках программирования, поэтому существует аналогичная концепция; вместо функций, операции используются для изменения переменные состояния (также известный как глобалы).
Например, если у нас есть состояние, состоящее из одной переменной someStateRegister: nat
, мы могли бы определить это в VDM-SL как:
Государственный реестр someStateRegister: natend
В VDM ++ это вместо этого будет определено как:
переменные экземпляра someStateRegister: nat
Операция загрузки значения в эту переменную может быть указана как:
ЗАГРУЗИТЬ (i: nat) ext wr someStateRegister: natpost someStateRegister = i
В внешние пункт (доб
) указывает, к каким частям состояния может получить доступ операция; rd
с указанием доступа только для чтения и писать
доступ для чтения / записи.
Иногда важно указать значение состояния до того, как оно было изменено; например, операция добавления значения к переменной может быть указана как:
ДОБАВИТЬ (i: nat) ext wr someStateRegister: natpost someStateRegister = someStateRegister ~ + i
Где ~
символ на переменной состояния в постусловии указывает значение переменной состояния перед выполнением операции.
Примеры
В Максимум функция
Это пример неявного определения функции. Функция возвращает самый большой элемент из набора положительных целых чисел:
max (s: set of nat) r: natpre card s> 0post r в наборе s и forall r 'в наборе s & r' <= r
Постусловие характеризует результат, а не определяет алгоритм его получения. Предварительное условие необходимо, потому что ни одна функция не может вернуть r в наборе s, когда набор пуст.
Умножение натуральных чисел
multp (i, j: nat) r: natpre truepost r = i * j
Применение обязательства доказательства forall p: T_p & pre-f (p) => f (p): T_r и post-f (p, f (p))
к явному определению multp
:
multp (i, j) == if i = 0 then 0 else if is-even (i) then 2 * multp (i / 2, j) else j + multp (i-1, j)
Тогда обязательство по доказательству становится:
для всех i, j: nat & multp (i, j): nat и multp (i, j) = i * j
Это можно показать правильно:
- Доказательство того, что рекурсия заканчивается (это, в свою очередь, требует доказательства того, что числа становятся меньше на каждом шаге)
- Математическая индукция
Абстрактный тип данных очереди
Это классический пример, иллюстрирующий использование неявной спецификации операции в модели хорошо известной структуры данных на основе состояний. Очередь моделируется как последовательность, состоящая из элементов типа Qelt
. Представление Qelt
несущественен и поэтому определяется как тип токена.
типы
Qelt = токен; Queue = seq of Qelt;
состояние TheQueue of q: Queueend
операции
ENQUEUE (e: Qelt) ext wr q: Queuepost q = q ~ ^ [e];
DEQUEUE () e: Qeltext wr q: Queuepre q <> [] post q ~ = [e] ^ q;
IS-EMPTY () r: boolext rd q: Queuepost r <=> (len q = 0)
Пример банковской системы
В качестве очень простого примера модели VDM-SL рассмотрим систему для ведения данных о банковском счете клиента. Клиенты моделируются по номерам клиентов (CustNum), счета моделируются номерами счетов (AccNum). Представления номеров клиентов считаются несущественными и поэтому моделируются типом токена. Балансы и овердрафты моделируются числовыми типами.
AccNum = токен; CustNum = токен; Balance = int; Overdraft = nat;
AccData :: owner: Баланс CustNum: Баланс
State Bank of accountMap: сопоставить AccNum с AccData overdraftMap: сопоставить CustNum с Overdraftinv mk_Bank (accountMap, overdraftMap) == для всех в наборе rng accountMap и a.owner в set dom overdraftMap и a.balance> = -overdraftMap (a.owner )
С операциями:NEWC назначает новый номер клиента:
operationsNEWC (od: Overdraft) r: CustNumext wr overdraftMap: сопоставить CustNum с Overdraftpost r не в наборе dom ~ overdraftMap и overdraftMap = ~ overdraftMap ++ {r | -> od};
NEWAC назначает новый номер счета и обнуляет баланс:
NEWAC (cu: CustNum) r: AccNumext wr accountMap: сопоставить AccNum с AccData rd overdraftMap map CustNum to Overdraftpre cu in set dom overdraftMappost r not in set dom accountMap ~ and accountMap = accountMap ~ ++ {r | -> mk_AccData (cu, 0)}
ACINF возвращает все балансы всех счетов клиента в виде карты номера счета для баланса:
ACINF (cu: CustNum) r: map AccNum to Balanceext rd accountMap: map AccNum to AccDatapost r = {an | -> accountMap (an) .balance | in set dom accountMap и accountMap (an) .owner = cu}
Поддержка инструмента
VDM поддерживает ряд различных инструментов:
- VDMИнструменты являются ведущими коммерческими инструментами для VDM и VDM ++, которые принадлежат, продаются, обслуживаются и разрабатываются CSK Systems, основанный на более ранних версиях, разработанных датской компанией IFAD. В руководства и практический руководство доступны. Все лицензии доступны бесплатно для полной версии инструмента. Полная версия включает автоматическое создание кода для Java и C ++, библиотеку динамической компоновки и поддержку CORBA.
- Увертюра - это инициатива сообщества с открытым исходным кодом, направленная на обеспечение свободно доступной инструментальной поддержки для VDM ++ поверх платформы Eclipse. Его цель - разработать структуру для совместимых инструментов, которые будут полезны для промышленного применения, исследований и образования.
- vdm-режим представляет собой набор пакетов Emacs для написания спецификаций VDM с использованием VDM-SL, VDM ++ и VDM-RT. Он поддерживает выделение и редактирование синтаксиса, проверку синтаксиса на лету, завершение шаблонов и поддержку интерпретатора.
- SpecBox: from Adelard обеспечивает проверку синтаксиса, простую семантическую проверку и создание файла LaTeX, позволяющего печатать спецификации в математической нотации. Этот инструмент находится в свободном доступе, но в дальнейшем не поддерживается.
- Латекс и макросы LaTeX2e доступны для поддержки представления моделей VDM в математическом синтаксисе стандартного языка ISO. Они были разработаны и поддерживаются Национальной физической лабораторией Великобритании. Документация и макросы доступны в Интернете.
Промышленный опыт
VDM широко применяется в различных областях применения. Наиболее известные из этих приложений:
- Ада и ХОЛОД компиляторы: Первый европейский компилятор Ada был разработан Данск Датаматик Центр с помощью VDM.[8] Аналогично семантика CHILL и Модула-2 были описаны в их стандартах с использованием VDM.
- ConForm: эксперимент British Aerospace, сравнивающий стандартную разработку доверенного шлюза с разработкой с использованием VDM.
- Dust-Expert: проект, выполненный Аделардом в Великобритания для приложения, связанного с безопасностью, определяющего соответствие безопасности компоновке промышленных предприятий.
- Разработка VDMTools: большинство компонентов набора инструментов VDMTools сами разрабатываются с использованием VDM. Эта разработка была произведена в МФСР в Дания и ЦСК в Япония.[9]
- TradeOne: Некоторые ключевые компоненты системы бэк-офиса TradeOne, разработанные CSK systems для японской фондовой биржи, были разработаны с использованием VDM. Существуют сравнительные измерения производительности разработчиков и плотности дефектов компонентов, разработанных VDM, по сравнению с традиционно разработанным кодом.
- FeliCa Networks сообщила о разработке Операционная система для Интегральная схема за сотовый телефон Приложения.
Уточнение
Использование VDM начинается с очень Абстрактные модель и развивает ее в реализации. Каждый шаг включает реификация данных, тогда декомпозиция операции.
Реификация данных развивает абстрактные типы данных в более конкретный структуры данных, в то время как декомпозиция операций развивает (абстрактные) неявные спецификации операций и функций в алгоритмы которые могут быть непосредственно реализованы на выбранном компьютерном языке.
Технические характеристики | Выполнение | |
---|---|---|
Абстрактный тип данных | ––– Верификация данных → | Структура данных |
Операции | ––– Декомпозиция операции → | Алгоритмы |
Реификация данных
Вещество данных (пошаговое уточнение) включает поиск более конкретного представления абстрактных типов данных, используемых в спецификации. До реализации может быть несколько шагов. Каждый шаг реификации для абстрактного представления данных ABS_REP
предполагает предложение нового представительства NEW_REP
. Чтобы показать, что новое представление является точным, функция получения определяется, что относится NEW_REP
к ABS_REP
, т.е. retr: NEW_REP -> ABS_REP
. Правильность реификации данных зависит от доказательства достаточность, т.е.
для всех a: ABS_REP & существует r: NEW_REP & a = retr (r)
Поскольку представление данных изменилось, необходимо обновить операции и функции, чтобы они работали с NEW_REP
. Новые операции и функции должны быть показаны для сохранения любого типа данных. инварианты на новом представлении. Чтобы доказать, что новые операции и функции моделируют те, что были в исходной спецификации, необходимо выполнить два обязательства по доказательству:
- Правило домена:
для всех r: NEW_REP и pre-OPA (retr (r)) => pre-OPR (r)
- Правило моделирования:
forall ~ r, r: NEW_REP и pre-OPA (retr (~ r)) и post-OPR (~ r, r) => post-OPA (retr (~ r,), retr (r))
Пример реификации данных
В системе безопасности бизнеса работникам выдаются удостоверения личности; они загружаются в считыватели карт при входе и выходе с завода. Необходимые операции:
В ЭТОМ()
инициализирует систему, предполагает, что фабрика пустаENTER (p: человек)
записывает, что рабочий входит на завод; данные рабочих считываются из удостоверения личности)ВЫХОД (p: Человек)
записывает, что рабочий покидает заводЕСТЬ-ПРИСУТСТВУЕТ (p: Person) r: bool
проверяет, находится ли указанный рабочий на фабрике или нет
Формально это будет:
типы
Person = токен; Workers = набор Person;
Государственный AWCCS пресс: Workersend
операции
INIT () ext wr pres: Workerspost pres = {};
ENTER (p: Person) ext wr pres: Workerspre p not in set prespost pres = pres ~ union {p};
ВЫХОД (p: Person) ext wr pres: Workerspre p in set prespost pres = pres ~ {p};
ЕСТЬ-ПРИСУТСТВУЕТ (p: Person) r: boolext rd pres: Workerspost r <=> p in set pres ~
Поскольку большинство языков программирования имеют концепцию, сравнимую с набором (часто в форме массива), первым шагом из спецификации является представление данных в терминах последовательности. Эти последовательности не должны допускать повторения, поскольку мы не хотим, чтобы один и тот же рабочий процесс появлялся дважды, поэтому мы должны добавить инвариантный к новому типу данных. В этом случае порядок не важен, поэтому [а, б]
такой же как [б, а]
.
Венский метод разработки полезен для систем, основанных на моделях. Это не подходит, если система основана на времени. Для таких случаев расчет коммуникационных систем (CCS) более полезен.
Смотрите также
- Формальные методы
- Формальная спецификация
- Код пиджина
- Логика предикатов
- Исчисление высказываний
- Язык спецификации Z, основная альтернатива VDM-SL (сравнить)
- Язык моделирования COMPASS (CML), комбинация VDM-SL с CSP, на основе Объединяющие теории программирования, разработан для моделирования Системы систем (SoS)
дальнейшее чтение
- Бьёрнер, Дайнс; Клифф Б. Джонс (1978). Венский метод разработки: метаязык, конспект лекций по информатике 61. Берлин, Гейдельберг, Нью-Йорк: Springer. ISBN 978-0-387-08766-5.
- О'Реган, Джерард (2006). Математические подходы к качеству программного обеспечения. Лондон: Спрингер. ISBN 978-1-84628-242-3.
- Клифф Б. Джонс, изд. (1984). Языки программирования и их определение - Х. Бекич (1936-1982). Конспект лекций по информатике. 177. Берлин, Гейдельберг, Нью-Йорк, Токио: Springer-Verlag. Дои:10.1007 / BFb0048933. ISBN 978-3-540-13378-0.
- Фитцджеральд, Дж. и Ларсен, П.Г., Системы моделирования: практические инструменты и методы разработки программного обеспечения. Издательство Кембриджского университета, 1998 ISBN 0-521-62348-0 (Японское издание паб. Иванами Шотен 2003 ISBN 4-00-005609-3).[10]
- Фитцджеральд, Дж., Ларсен, П.Г., Мукерджи, П., Плат, Н. и Верхоф, М., Проверенные проекты для объектно-ориентированных систем. Springer Verlag 2005. ISBN 1-85233-881-4. Поддерживающий веб-сайт [1] включает примеры и бесплатную поддержку инструментов.[11]
- Джонс, К., Систематическая разработка программного обеспечения с использованием VDM, Prentice Hall 1990. ISBN 0-13-880733-7. Также доступны онлайн и бесплатно: http://www.csr.ncl.ac.uk/vdm/ssdvdm.pdf.zip
- Бьёрнер, Д. и Джонс, К., Формальная спецификация и разработка программного обеспечения Prentice Hall Международный, 1982. ISBN 0-13-880733-7
- Дж. Дауэс, Справочное руководство VDM-SL, Питман 1991. ISBN 0-273-03151-1
- Международная организация по стандартизации, Информационные технологии. Языки программирования, их среды и интерфейсы системного программного обеспечения. Венский метод разработки. Язык спецификации. Часть 1. Базовый язык. Международный стандарт ISO / IEC 13817-1, декабрь 1996 г.
- Джонс, К., Разработка программного обеспечения: строгий подход, Prentice Hall International, 1980. ISBN 0-13-821884-6
- Джонс, К. и Шоу, Р. (ред.), Примеры из практики систематической разработки программного обеспечения, Prentice Hall International, 1990. ISBN 0-13-880733-7
- Bicarregui, J.C., Фитцджеральд, Дж., Линдси, П.А., Мур, Р. и Ричи, Б., Доказательство в VDM: Руководство для практикующего. Springer Verlag Формальные подходы к вычислениям и информационным технологиям (FACIT), 1994. ISBN 3-540-19813-Х .
Статья основана на материалах, взятых из Бесплатный онлайн-словарь по вычислительной технике до 1 ноября 2008 г. и зарегистрированы в соответствии с условиями «перелицензирования» GFDL, версия 1.3 или новее.
Рекомендации
- ^ Некоторое представление об этой работе, включая технический отчет TR 25.139 по "Формальное определение подмножества PL / 1"от 20 декабря 1974 г. перепечатано в Jones 1984, p.107-155. Особого внимания заслуживает список авторов в следующем порядке: Х. Бекич, Д. Бьёрнер, В. Хенхапл, К. Б. Джонс, П. Лукас.
- ^ Двойной плюс заимствован из C ++ объектно-ориентированный язык программирования на основе C.
- ^ Бьёрнер и Джонс 1978, Вступление, стр. ix
- ^ Вступительное слово Клиффа Б. Джонса (редактор) в Bekič 1984, p.vii
- ^ Бьёрнер и Джонс 1978, Вступление, p.xi
- ^ Бьёрнер и Джонс 1978, стр.24.
- ^ См. Статью о упорство для его использования в информатике.
- ^ Клемменсен, Герт Б. (январь 1986 г.). «Ретаргетинг и повторный хостинг системы компиляции DDC Ada: пример - Honeywell DPS 6». ACM SIGAda Письма Ада. 6 (1): 22–28. Дои:10.1145/382256.382794.
- ^ Питер Горм Ларсен, "Десять лет исторического развития" Загрузка "VDMTools", В Журнал универсальных компьютерных наук, том 7 (8), 2001 г.
- ^ Системы моделирования: практические инструменты и методы разработки программного обеспечения
- ^ Проверенные проекты для объектно-ориентированных систем