Как инженер-программист, я пишу много кода для промышленных продуктов. Относительно сложные вещи с классами, потоками, некоторыми проектными усилиями, но также и некоторыми компромиссами для производительности. Я много тестирую, и я устал от тестирования, поэтому я заинтересовался инструментами формального доказательства, такими как Coq, Isabelle ... Могу ли я использовать один из них, чтобы формально доказать, что мой код не содержит ошибок, и все готово? с этим? - но каждый раз, когда я проверяю один из этих инструментов, я не уверен, что они пригодны для повседневной разработки программного обеспечения. Теперь это может быть только я, и я ищу указатели / мнения / идеи по этому поводу :-)
В частности, у меня складывается впечатление, что для того, чтобы заставить один из этих инструментов работать на меня, потребовались бы огромные инвестиции, чтобы правильно определить, проверять объекты, методы ... рассматриваемой программы. Затем я задаюсь вопросом, не исчерпает ли прувер пар, учитывая размер всего, с чем ему придется иметь дело. Или, может быть, мне придется избавиться от побочных эффектов (эти средства проверки, кажется, действительно хорошо работают с декларативными языками), и мне интересно, приведет ли это к «проверенному коду», который нельзя будет использовать, потому что он не будет быстрым или достаточно небольшой. Кроме того, я не могу позволить себе роскошь менять язык, с которым я работаю, это должен быть Java или C ++: я не могу сказать своему боссу, что с этого момента я буду писать код в OXXXml, потому что это единственный язык в что я могу доказать правильность кода ...
Может ли кто-то с большим опытом формальных инструментов доказательства прокомментировать? Опять же - я ЛЮБЛЮ использовать формальный инструмент проверки, я думаю, что они великолепны, но у меня сложилось впечатление, что они находятся в башне из слоновой кости, которую я не могу достать из скромного рва Java / C ++ ... (PS: я также ЛЮБЛЮ Haskell, OCaml ... не поймите неправильно: я фанат декларативных языков и формальных доказательств, я просто пытаюсь понять, как я могу реально сделать это полезным для разработки программного обеспечения)
Обновление: поскольку это довольно широкий вопрос, давайте попробуем ответить на следующие более конкретные вопросы: 1) есть ли примеры использования средств проверки, чтобы доказать правильность промышленных программ на Java / C ++? 2) Подойдет ли Coq для этой задачи? 3) Если подходит Coq, должен ли я сначала написать программу на Coq, а затем сгенерировать C ++ / Java из Coq? 4) Может ли этот подход обрабатывать потоки и оптимизацию производительности?