Sono interessato al design del linguaggio e in generale posso ragionare facilmente su caratteristiche ampiamente conosciute (ad esempio eredità, polimorfismo, delegati, lambda, catture, raccolta dei rifiuti, eccezioni, generici, varianza, riflessione e così via), le loro interazioni in un linguaggio particolare, i modi in cui possono eventualmente essere implementati, i loro limiti, ecc.
Negli ultimi mesi, ho iniziato a leggere di Rust, che ha un sistema di proprietà che garantisce la sicurezza della memoria e la gestione deterministica delle risorse forzando la durata degli oggetti a essere verificata staticamente. Dal punto di vista di un semplice utente della lingua, ho potuto prendere il sistema quasi immediatamente.
Dal punto di vista di un designer linguistico, tuttavia, mi ci è voluto un po 'di tempo per capire perché le cose in Rust sono esattamente come sono. Non riuscivo immediatamente a capire il ragionamento alla base di alcune restrizioni del sistema di proprietà, fino a quando non mi costrinsi a inventare casi che avrebbero violato l'integrità di un sistema se non avesse avuto quegli aspetti.
La mia domanda principale non ha nulla a che fare con Rust e la sua proprietà in particolare - ma, se necessario, sentiti libero di usarlo come esempio nei tuoi commenti / risposte.
Quando i progettisti del linguaggio progettano una nuova funzionalità, quale metodologia o processo usano per decidere che la funzionalità funzioni correttamente?
Per "nuovo" intendo che non è qualcosa che è già stato testato nelle lingue esistenti (e quindi la maggior parte del lavoro è stata fatta da altri designer). Con "funziona correttamente" intendo che la funzione risolve correttamente il problema previsto ed è ragionevolmente a prova di proiettile. Con "ragionevolmente antiproiettile" intendo che nessun codice può essere scritto nella lingua o in un particolare sottoinsieme della lingua (ad esempio un sottoinsieme senza codice "non sicuro") che violerebbe l'integrità della funzione.
È un processo di prova ed errore, nel senso che ti viene in mente una semplice forma della funzione, quindi prova a trovare modi per violarla, quindi correggila se la violi con successo, quindi ripeti? E poi, quando non riesci a pensare ad altre possibili violazioni, speri che non sia rimasto nulla e lo chiami un giorno?
Oppure c'è un modo formale per dimostrare effettivamente (nel senso matematico della parola) che la tua funzione funziona e quindi usare quella prova per ottenere con sicurezza la funzione giusta (o principalmente giusta) dall'inizio?
(Devo dire che ho una formazione ingegneristica, non informatica. Quindi, se mi manca qualcosa che sarebbe ovvio per le persone CS, non esitate a segnalarlo.)