Jako inżynier oprogramowania piszę dużo kodu dla produktów przemysłowych. Stosunkowo skomplikowane rzeczy z klasami, wątkami, trochę wysiłków projektowych, ale także pewne kompromisy w zakresie wydajności. Robię dużo testów i mam dość testowania, więc zainteresowałem się narzędziami do sprawdzania formalnego, takimi jak Coq, Isabelle ... Czy mogę użyć jednego z nich, aby formalnie udowodnić, że mój kod jest wolny od błędów i gotowe z tym? - ale za każdym razem, gdy sprawdzam jedno z tych narzędzi, odchodzę nieprzekonany, że nadają się one do codziennej inżynierii oprogramowania. To może być tylko ja i szukam wskazówek / opinii / pomysłów na ten temat :-)
W szczególności odnoszę wrażenie, że sprawienie, by jedno z tych narzędzi działało, wymagałoby ogromnej inwestycji, aby właściwie zdefiniować obiekt, metody… rozważanego programu. Zastanawiam się wtedy, czy nie zabraknie mu pary, biorąc pod uwagę rozmiar wszystkiego, z czym będzie musiał sobie poradzić. A może musiałbym pozbyć się efektów ubocznych (te narzędzia do sprawdzania poprawności wydają się naprawdę dobrze radzić sobie z deklaratywnymi językami) i zastanawiam się, czy to spowodowałoby „sprawdzony kod”, którego nie można byłoby użyć, ponieważ nie byłby szybki lub wystarczająco mały. Poza tym nie mam luksusu zmieniać języka, z którym pracuję, musi to być Java lub C ++: Nie mogę powiedzieć mojemu szefowi, że od teraz będę pisać w OXXXml, ponieważ jest to jedyny język w co mogę udowodnić poprawność kodu ...
Czy ktoś z większym doświadczeniem w zakresie formalnych narzędzi sprawdzających może komentować? Znowu - ja kocham używać formalnego narzędzia Prover, myślę, że są świetne, ale mam wrażenie, że są w wieży z kości słoniowej, że nie może dotrzeć z ubogiej rowu Java / C ++ ... (PS: także UWIELBIAM Haskell, OCaml ... nie mam pomysłu: jestem fanem deklaratywnych języków i formalnego dowodu, próbuję tylko zobaczyć, jak mogę realistycznie uczynić to użytecznym dla inżynierii oprogramowania)
Aktualizacja: Ponieważ jest to dość szerokie, spróbujmy odpowiedzieć na następujące bardziej szczegółowe pytania: 1) czy istnieją przykłady użycia dowódców w celu udowodnienia poprawności przemysłowych programów Java / C ++? 2) Czy Coq byłby odpowiedni do tego zadania? 3) Jeśli Coq jest odpowiedni, czy powinienem najpierw napisać program w Coq, a następnie wygenerować C ++ / Java z Coq? 4) Czy to podejście może poradzić sobie z optymalizacją wątków i wydajnością?