Coraz większa złożoność programów komputerowych i coraz ważniejsza pozycja komputerów w naszym społeczeństwie sprawia, że zastanawiam się, dlaczego nadal nie używamy zbiorowo języków programowania, w których musisz formalnie udowodnić, że kod działa poprawnie.
Uważam, że termin ten jest „kompilatorem certyfikującym” (znalazłem go tutaj ): kompilatorem kompilującym język programowania, w którym nie tylko trzeba napisać kod, ale także podać specyfikację kodu i udowodnić, że kod jest zgodny z specyfikacji (lub użyj do tego automatycznego automatu).
Podczas przeszukiwania Internetu znalazłem tylko projekty, które albo używają bardzo prostego języka programowania, albo projekty, które zakończyły się niepowodzeniem, które próbują dostosować nowoczesne języki programowania. To prowadzi mnie do mojego pytania:
Czy są jakieś kompilatory certyfikujące implementujące w pełni rozwinięty język programowania, czy też jest to bardzo trudne / teoretycznie niemożliwe?
Dodatkowo mam jeszcze zobaczyć każdy klasa złożoności udziałem udowodnić programy, takie jak „klasie wszystkich językach rozstrzygalne przez maszynę Turinga, dla którego istnieje dowód, że ta maszyna Turinga zatrzymanie”, które będę nazywał , jako analogiczny do , zestaw języków rekurencyjnych.
Widzę zalety studiowania takiej klasy złożoność: na przykład, w przypadku Zahamowanie problemem jest rozstrzygalne (nawet przypuszczenie określony w sposób oczywisty byłoby największa klasa języków, dla których jest to rozstrzygalne). Ponadto wątpię, abyśmy wykluczyli jakiekolwiek praktycznie przydatne programy: kto używałby programu, gdy nie można udowodnić, że się zakończył?
Moje drugie pytanie brzmi:
Co wiemy o klasach złożoności, które wymagają, aby ich języki zawierały pewne właściwości?