Ostatecznie mówimy tutaj o czasie kompilacji a czasie wykonywania.
Błędy czasu kompilacji, jeśli się nad tym zastanowić, ostatecznie sprowadzają się do tego, że kompilator jest w stanie określić, jakie problemy masz w swoim programie, zanim jeszcze zostanie uruchomiony. Oczywiście nie jest to kompilator „dowolnego języka”, ale wrócę do tego wkrótce. Kompilator, w całej swej nieskończonej mądrości, nie wymienia jednak wszystkich problemów, które może określić kompilator. Zależy to częściowo od tego, jak dobrze napisany jest kompilator, ale głównym tego powodem jest to, że wiele rzeczy jest określanych w czasie wykonywania .
Błędy uruchomieniowe, jak dobrze wiesz, jestem pewien, że tak jak ja, to każdy rodzaj błędu, który pojawia się podczas wykonywania samego programu. Obejmuje to dzielenie przez zero, wyjątki zerowego wskaźnika, problemy ze sprzętem i wiele innych czynników.
Charakter błędów w czasie wykonywania oznacza, że nie można przewidzieć tych błędów w czasie kompilacji. Jeśli możesz, prawie na pewno zostaną sprawdzone podczas kompilacji. Jeśli możesz zagwarantować, że liczba jest równa zero w czasie kompilacji, możesz wykonać pewne logiczne wnioski, takie jak podzielenie dowolnej liczby przez tę liczbę spowoduje błąd arytmetyczny spowodowany dzieleniem przez zero.
Jako taki, w bardzo realny sposób, wróg programowo gwarantujący prawidłowe funkcjonowanie programu wykonuje kontrole czasu wykonywania w przeciwieństwie do kontroli czasu kompilacji. Przykładem może być dynamiczne rzutowanie na inny typ. Jeśli jest to dozwolone, to ty, programista, zasadniczo przesłonisz zdolność kompilatora do sprawdzenia, czy jest to bezpieczne. Niektóre języki programowania zdecydowały, że jest to akceptowalne, podczas gdy inne przynajmniej ostrzegą cię podczas kompilacji.
Innym dobrym przykładem może być dopuszczenie, aby wartości null były częścią języka, ponieważ wyjątki wskaźnika zerowego mogą się zdarzyć, jeśli zezwolisz na wartości null. Niektóre języki całkowicie wyeliminowały ten problem, uniemożliwiając, aby zmienne, które nie zostały jawnie zadeklarowane, mogły przechowywać deklarowane wartości zerowe bez natychmiastowego przypisywania wartości (na przykład Kotlin). Chociaż nie można wyeliminować błędu czasu wykonania wyjątku wskaźnika zerowego, można temu zapobiec, usuwając dynamiczną naturę języka. W Kotlinie można oczywiście wymusić zachowanie wartości zerowych, ale nie trzeba dodawać, że jest to metaforyczna „uwaga kupujących”, ponieważ należy to wyraźnie określić.
Czy możesz koncepcyjnie mieć kompilator, który może sprawdzać błędy w każdym języku? Tak, ale prawdopodobnie byłby to niezgrabny i wysoce niestabilny kompilator, w którym musiałbyś koniecznie podać język kompilacji wcześniej. Nie mógł również wiedzieć wielu rzeczy o twoim programie, tak jak kompilatory dla określonych języków nie wiedzą o nim pewnych rzeczy, takich jak wspomniany problem zatrzymania. Jak się okazuje, nie da się zebrać wielu informacji, które mogą być interesujące dla programu. Zostało to udowodnione, więc prawdopodobnie nie zmieni się w najbliższym czasie.
Wracając do pierwotnego punktu. Metody nie są automatycznie wątkowo bezpieczne. Istnieje praktyczny powód tego, że metody bezpieczeństwa wątku są również wolniejsze, nawet gdy wątki nie są używane. Rust decyduje, że może wyeliminować problemy w czasie wykonywania, domyślnie czyniąc metody wątkami bezpiecznymi, i to jest ich wybór. To jednak kosztuje.
Możliwe jest matematyczne udowodnienie poprawności programu, ale z zastrzeżeniem, że masz dosłownie zero cech środowiska uruchomieniowego w języku. Będziesz mógł przeczytać ten język i wiedzieć, co on robi bez żadnych niespodzianek. Język prawdopodobnie wyglądałby bardzo matematycznie i prawdopodobnie nie jest to przypadek. Drugim zastrzeżeniem jest to, że nadal występują błędy czasu wykonywania , które mogą nie mieć nic wspólnego z samym programem. Dlatego program można udowodnić, że jest poprawny, zakładając, że szereg założeń dotyczących komputera, na którym jest uruchamiany, są dokładne i nie zmieniają się, co oczywiście zawsze się zdarza i często.