Ответ DW великолепен , но я бы хотел остановиться на одном. Спецификация - это не просто ссылка, по которой проверяется код. Одна из причин иметь формальную спецификацию - это проверить ее, доказав некоторые фундаментальные свойства. Конечно, спецификация не может быть полностью проверена - проверка будет такой же сложной, как и сама спецификация, поэтому это будет бесконечный процесс. Но проверка позволяет нам получить более надежную гарантию на некоторые важные свойства.
Например, предположим, что вы разрабатываете автопилот. Это довольно сложная вещь, включающая множество параметров. Свойства правильности автопилота включают в себя такие вещи, как «автомобиль не упадет в стену» и «автомобиль будет ехать туда, куда ему приказывают». Свойство типа «машина не упадет в стену» действительно очень важно, поэтому мы хотели бы доказать это. Поскольку система работает в физическом мире, вам необходимо добавить некоторые физические ограничения; фактическое свойство вычислительной системы будет примерно таким: «при этих допущениях, касающихся материаловедения, и этих допущений, касающихся восприятия препятствий датчиками автомобиля, автомобиль не столкнется со стеной». Но даже в этом случае результат является относительно простым свойством, которое явно желательно.
Не могли бы вы доказать это свойство из кода? В конечном счете, это то, что происходит, если вы следуете полностью формальному подходу ». Но в коде много разных частей; тормоза, камеры, двигатель и т. д. управляются автономно. Свойство корректности тормозов было бы что-то вроде «если сигнал« применить тормоза »включен, то тормоза применяются». Свойство правильности двигателя было бы «если сигнал сцепления выключен, то двигатель не приводит в движение колеса». Требуется очень высокий уровень, чтобы собрать их всех вместе. Спецификация создает промежуточные слои, где различные компоненты системы могут быть сформулированы вместе.
Фактически, такая сложная система, как автопилот, имела бы несколько уровней спецификаций с разным количеством уточнений. При проектировании часто используется уточняющий подход: начните с некоторых свойств высокого уровня, таких как «автомобиль не упадет в стену», затем выясните, что для этого требуются датчики и тормоза, и определите некоторые основные требования к датчикам, тормозам. и пилотное программное обеспечение, а затем снова уточнить эти базовые требования при проектировании компонента (для датчика мне понадобится радар, DSP, библиотека обработки изображений и т. д.) и т. д. В процессе формальной разработки, доказано, что каждый уровень спецификации соответствует требованиям, установленным уровнем выше него, от свойств самого высокого уровня до кода.
Невозможно быть уверенным, что спецификация верна. Например, если вы неправильно поняли физику, тормоза могут оказаться неэффективными, даже если математика, связывающая код тормоза с формальными требованиями, верна. Нет смысла доказывать, что перерывы эффективны при нагрузке 500 кг, если у вас есть 5000 кг. Но легче увидеть, что 500 кг - это неправильно, чем увидеть в коде тормозов, что они не будут достаточно хороши для физических параметров автомобиля.
¹ Противоположностью полностью формального подхода является «я думаю, это работает, но я не уверен». Когда вы ставите на это свою жизнь, это не так уж и здорово.