Ciò di cui stiamo parlando alla fine qui è tempo di compilazione vs runtime.
Gli errori del tempo di compilazione, se ci pensate, alla fine equivalgono al compilatore in grado di determinare quali problemi avete nel vostro programma prima ancora che venga eseguito. Ovviamente non è un compilatore di "linguaggio arbitrario", ma tornerò su questo a breve. Il compilatore, in tutta la sua infinita saggezza, non elenca tuttavia tutti i problemi che possono essere determinati dal compilatore. Ciò dipende in parte dalla capacità di scrittura del compilatore, ma la ragione principale di ciò è che molte cose sono determinate in fase di esecuzione .
Gli errori di runtime, come ben sapete, sono sicuro come me, sono qualsiasi tipo di errore che si verifica durante l'esecuzione del programma stesso. Ciò include la divisione per zero, eccezioni puntatore null, problemi hardware e molti altri fattori.
La natura degli errori di runtime significa che non è possibile anticipare tali errori in fase di compilazione. Se potessi, verrebbero quasi sicuramente controllati al momento della compilazione. Se è possibile garantire che un numero sia zero al momento della compilazione, è possibile eseguire alcune conclusioni logiche, ad esempio la divisione di un numero per quel numero comporterà un errore aritmetico causato dalla divisione per zero.
In quanto tale, in un modo molto reale, il nemico di garantire a livello programmatico il corretto funzionamento di un programma sta eseguendo controlli di runtime invece di controlli di compilazione. Un esempio potrebbe essere l'esecuzione di un cast dinamico su un altro tipo. Se questo è permesso, tu, il programmatore, stai essenzialmente scavalcando la capacità del compilatore di sapere se è una cosa sicura da fare. Alcuni linguaggi di programmazione hanno deciso che questo è accettabile, mentre altri ti avvertiranno almeno in fase di compilazione.
Un altro buon esempio potrebbe essere quello di consentire ai null di far parte del linguaggio, poiché potrebbero verificarsi eccezioni al puntatore null se si consentono i null. Alcune lingue hanno eliminato del tutto il problema impedendo che variabili non dichiarate esplicitamente in grado di contenere valori null siano dichiarate senza che sia stato immediatamente assegnato un valore (ad esempio Kotlin). Sebbene non sia possibile eliminare un errore di runtime dell'eccezione puntatore null, è possibile impedire che ciò accada rimuovendo la natura dinamica della lingua. In Kotlin, puoi forzare la possibilità di mantenere valori nulli, ovviamente, ma è ovvio che si tratta di un "metaforico" che gli acquirenti devono fare, poiché devi dichiararlo esplicitamente come tale.
Potresti avere concettualmente un compilatore in grado di controllare gli errori in ogni lingua? Sì, ma sarebbe probabilmente un compilatore goffo e altamente instabile in cui dovresti necessariamente fornire in anticipo la lingua da compilare. Inoltre non poteva sapere molte cose sul tuo programma, più di quanto i compilatori per lingue specifiche conoscano alcune cose al riguardo, come il problema di interruzione di cui hai parlato. A quanto pare, molte informazioni che potrebbero essere interessanti da imparare su un programma sono impossibili da raccogliere. Questo è stato dimostrato, quindi non è probabile che cambi presto.
Tornando al tuo punto principale. I metodi non sono automaticamente thread-safe. C'è una ragione pratica per questo, che è che i metodi thread-safe sono anche più lenti anche quando i thread non vengono utilizzati. Rust decide che possono eliminare i problemi di runtime rendendo i metodi thread sicuri per impostazione predefinita, e questa è la loro scelta. Tuttavia ha un costo.
Potrebbe essere possibile dimostrare matematicamente la correttezza di un programma, ma sarebbe con l'avvertenza che avresti letteralmente zero funzionalità di runtime nella lingua. Saresti in grado di leggere questa lingua e sapere cosa fa senza sorprese. Il linguaggio probabilmente sembrerebbe molto matematico in natura, e probabilmente non è una coincidenza lì. Il secondo avvertimento è che si verificano ancora errori di runtime , che potrebbero non avere nulla a che fare con il programma stesso. Pertanto, il programma può essere dimostrato corretto, assumendo una serie di ipotesi riguardanti il computer su cui è in esecuzione su sono accurate e non cambiano, che ovviamente sempre non accade in ogni caso e spesso.