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