Статическая проверка - плохое начало для этой задачи.Он основан на предположении, что можно автоматически проверить правильность программы.В реальности это невозможно, и ожидать, что программа проверит произвольно сложный код без каких-либо подсказок, просто глупо.Обычно программное обеспечение для статической проверки в конечном итоге требует подсказок по всему исходному коду, и в конце концов генерирует множество ложных срабатываний и ложных отрицаний.У него есть своя ниша, но это все.(См. Введение к « Типам и языкам программирования » Пирса)
В то время как инструменты такого типа были разработаны инженерами для их собственных простых целей, в академии выпекается настоящее решение.Было обнаружено, что типы в статически типизированных языках программирования эквивалентны логическим утверждениям, если все идет гладко и язык не имеет какого-то плохого поведения.Это называется " соответствие Карри-Ховарда ", а встраивание логики в типы - это " логика Брауэра-Хейтинга-Колмогорова ".Самые мощные доказательства возможны только в языках с мощными типами: зависимые типы .Если мы на время забудем всю эту терминологию, это означает, что мы можем написать программы, которые несут доказательства своей собственной корректности, и эти доказательства проверяются во время компиляции программы, при этом в случаеошибка.
Положительной стороной этого подхода является то, что вы никогда не получите никаких ложных отрицаний , т.е. скомпилированная программа гарантированно будет работать в соответствии со спецификацией.Даже без дополнительных доказательств о спецификациях программы на языках с зависимой типизацией менее подвержены ошибкам, потому что деление на ноль, необработанные исключения и переполнения просто никогда не заканчиваются в исполняемой программе.
Всегда писать такие доказательства вручнуюутомительный.Для этого существуют « тактика », то есть программы, которые генерируют доказательства правильности.Они почти эквивалентны программам для статической проверки, но, в отличие от них, необходимы для генерации формального доказательства.
Существует ряд языков с типизированной зависимостью для различных целей: Coq , Агда , Идрис , Эпиграмма , Кайен и т. Д.
Тактика реализована на Coq и, возможно, еще на нескольких языках.Кроме того, Coq является наиболее зрелым из них, с инфраструктурой, включающей такие библиотеки, как Bedrock .
В случае, если извлечения кода C из Coq недостаточно для ваших требований, вы можете использовать ATS, что соответствует по производительности с C.
Haskell использует слабую форму соответствия Карри-Ховарда: она отлично работает, если только вы не начинаете писать программы с ошибками или с зацикливанием.Если вам не сложно написать формальные доказательства, рассмотрите возможность использования Haskell.