Nie jestem w stanie powiedzieć, jak dużo więcej badań powinno odbywać się na ten temat, ale mogę powiedzieć, że nie jest badanie zostało zrobione, na przykład Verisoft XT Program finansowany przez rząd niemiecki.
Pojęcia, które, jak myślę, szukasz, nazywane są formalną weryfikacją i programowaniem opartym na kontraktach , przy czym ten drugi sposób jest przyjazny dla programisty. W programowaniu opartym na kontraktach najpierw piszesz kod w normalny sposób, a następnie wstawiasz do kodu tak zwane umowy . Łatwym w użyciu językiem opartym na tym paradygmacie jest Spec # firmy Microsoft Research oraz funkcjonalnie podobne, ale nieco mniej ładne rozszerzenie Code Contracts dla C #, które można wypróbować online (mają one również podobne narzędzia dla innych języków, sprawdź rise4fun ). Wspomniany „int z typem zakresu” odzwierciedla się w dwóch kontraktach w funkcji:
Contract.Requires(-3 <= a && a <= 24);
Contract.Requires( 3 <= b && b <= 10);
Jeśli chcesz wywołać tę funkcję, musisz użyć parametrów, które są spełnione, aby spełnić te kryteria, lub otrzymasz błąd czasu kompilacji. Powyższe są bardzo prostymi umowami, możesz wstawić prawie każde założenie lub wymaganie dotyczące zmiennych lub wyjątków i ich relacji, o których możesz pomyśleć, a kompilator sprawdzi, czy każde wymaganie jest objęte założeniem lub czymś, co można zapewnić, tj. Wyprowadzić z założeń. Dlatego, skąd bierze się nazwa: odbiorca stawia wymagania , osoba dzwoniąca zapewnia, że zostaną one spełnione - jak w umowie biznesowej.
P(x1,x2,...,xn)nPjest używany. Od strony CS te dwie są kluczowymi częściami procesu - generowanie warunków weryfikacji jest trudne, a SMT stanowi problem NP-zupełny lub nierozstrzygalny, w zależności od rozważanych teorii. Istnieją nawet konkursy na solwery SMT, więc z pewnością prowadzone są badania w tym zakresie. Ponadto istnieją alternatywne podejścia do korzystania z SMT do formalnej weryfikacji, takie jak wyliczanie przestrzeni stanu, symboliczne sprawdzanie modelu, sprawdzanie modelu z ograniczeniami i wiele innych, które są również badane, choć SMT jest, afaik, obecnie najbardziej „nowoczesnym” podejściem.
Jeśli chodzi o granice ogólnej idei:
- Jak już wspomniano, udowodnienie poprawności programu jest trudnym obliczeniowo problemem, więc może się zdarzyć, że sprawdzenie czasu kompilacji programu z kontraktami (lub inną specyfikacją) zajmie naprawdę dużo czasu lub może nawet będzie niemożliwe. Najlepszym sposobem, w jaki można to zrobić, jest zastosowanie heurystyki, która działa dobrze przez większość czasu.
- Im więcej określisz w swoim programie, tym większe prawdopodobieństwo wystąpienia błędów w samej specyfikacji . Może to prowadzić do fałszywych trafień (kontrola czasu kompilacji nie powiedzie się, mimo że wszystko jest wolne od błędów) lub fałszywego wrażenia, że jest bezpieczny, nawet jeśli Twój program nadal ma błędy.
- Pisanie umów lub specyfikacji to naprawdę żmudna praca, a większość programistów jest zbyt leniwa, aby to zrobić. Spróbuj napisać program w języku C # z umowami dotyczącymi kodu wszędzie, po chwili pomyślisz „no dalej, czy to naprawdę konieczne?”. Dlatego formalna weryfikacja jest zwykle stosowana tylko do projektowania sprzętu i systemów krytycznych dla bezpieczeństwa, takich jak oprogramowanie sterujące samolotami lub motoryzacja.
Ostatnią rzeczą wartą wspomnienia, która nie do końca pasuje do powyższego wyjaśnienia, jest pole o nazwie „Teoria niejawnej złożoności”, na przykład ten artykuł . Ma na celu scharakteryzowanie języków programowania, w których każdy program, który można napisać, należy do określonej klasy złożoności, na przykład P. W takim języku każdy program, który piszesz, jest automatycznie „zapewniany” jako wielomianowy czas wykonywania, który można „sprawdzić” w czasie kompilacji, po prostu kompilując program. Nie znam jednak praktycznie żadnych użytecznych wyników tych badań, ale daleko mi też do bycia ekspertem.