Ciò di cui stiamo parlando in definitiva qui è compilazione tempo vs runtime.
Compilare errori nel tempo, se ci pensate, in ultima analisi equivale al fatto che il compilatore sia in grado di determinare quali problemi avete nel vostro programma prima ancora che venga eseguito. Ovviamente non è un compilatore di "linguaggio arbitrario", ma tornerò tra poco. Il compilatore, in tutta la sua infinita saggezza, non elenca comunque il problema ogni che può essere determinato dal compilatore. Questo dipende in parte dal modo in cui il compilatore è scritto, ma la ragione principale è che molte cose sono determinate in runtime .
Errori di runtime, come ben sai sono sicuro che sono, qualsiasi tipo di errore che si verifica durante l'esecuzione del programma stesso. Ciò include la divisione per zero, eccezioni del puntatore nullo, problemi hardware e molti altri fattori.
La natura degli errori di runtime significa che non è possibile anticipare detti errori in fase di compilazione. Se potessi, verrebbero quasi certamente controllati al momento della compilazione. Se si è in grado di garantire che un numero sia zero al momento della compilazione, è possibile eseguire alcune conclusioni logiche, ad esempio la divisione di qualsiasi numero per quel numero comporterà un errore aritmetico causato dalla divisione per zero.
Come tale, in un modo molto reale, il nemico che garantisce programmaticamente il corretto funzionamento di un programma sta eseguendo verifiche di runtime piuttosto che verifiche della compilazione del tempo. Un esempio di questo potrebbe essere eseguire un cast dinamico per 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 che i null siano parte della lingua, poiché le eccezioni del puntatore nullo potrebbero verificarsi se si accettano valori nulli. Alcune lingue hanno eliminato completamente questo problema impedendo che le variabili non dichiarate esplicitamente fossero in grado di mantenere i valori nulli da dichiarare senza che venisse assegnato immediatamente un valore (ad esempio, prendere Kotlin). Sebbene non sia possibile eliminare un errore di runtime delle eccezioni del puntatore nullo, è possibile impedire che ciò accada rimuovendo la natura dinamica della lingua. In Kotlin, puoi forzare la possibilità di mantenere valori nulli, naturalmente, ma è ovvio che si tratta di un metaforico "gli acquirenti si guardano bene", come devi esplicitamente dichiararlo come tale.
Potresti concettualmente avere un compilatore in grado di controllare gli errori in ogni lingua? Sì, ma probabilmente sarebbe un compilatore goffo e altamente instabile in cui dovresti necessariamente fornire in anticipo il linguaggio da compilare. Inoltre, non è in grado di conoscere molte cose sul tuo programma, più di quanto i compilatori di specifiche lingue conoscano certe cose a riguardo, come ad esempio il problema dell'arresto, come hai menzionato. A quanto pare, una buona quantità di informazioni che potrebbero essere interessanti da apprendere su un programma sono impossibili da raccogliere. Questo è stato dimostrato, quindi non è probabile che cambi in qualsiasi momento presto.
Ritorno al 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 safe per impostazione predefinita, e questa è la loro scelta. Tuttavia, ha un costo.
Potrebbe essere possibile provare matematicamente la correttezza di un programma, ma sarebbe con l'avvertenza che avresti letteralmente zero funzioni di runtime nella lingua. Saresti in grado di leggere questa lingua e sapere cosa fa senza sorprese. La lingua probabilmente avrebbe un aspetto molto matematico, e probabilmente non è una coincidenza lì. La seconda avvertenza è che si verificano errori di runtime ancora , che potrebbero non avere nulla a che fare con il programma stesso. Pertanto, il programma può essere dimostrato corretto, supponendo che una serie di ipotesi sul computer su cui viene eseguito siano accurate e non cambino, il che, naturalmente, fa accade comunque e spesso.