Mi interessa la progettazione della lingua e in generale posso ragionare facilmente su caratteristiche ampiamente conosciute (ad es. ereditarietà, polimorfismo, delegati, lambda, catture, garbage collection, eccezioni, generici, varianze, riflessioni e così via), le loro interazioni in una particolare lingua, i modi in cui possono essere implementate, i loro limiti, ecc.
Negli ultimi mesi ho iniziato a leggere su Rust, che ha un sistema di proprietà che garantisce la sicurezza della memoria e una gestione delle risorse deterministica costringendo la vita degli oggetti a essere staticamente verificabile. Dal punto di vista di un utente semplice della lingua, potrei prendere il sistema quasi immediatamente.
Dal punto di vista di un progettista di linguaggi, tuttavia, mi ci è voluto un po 'per capire perché le cose in Rust sono esattamente come sono. Non sono riuscito a capire immediatamente il ragionamento dietro alcune restrizioni del sistema di proprietà, fino a quando non mi sono costretto a escogitare casi che violassero l'integrità di un sistema se non avesse quegli aspetti.
La mia domanda principale non ha nulla a che fare con Rust e la sua proprietà in particolare - ma sentiti libero di usarla come esempio nei tuoi commenti / risposte, se necessario.
Quando i progettisti di linguaggi progettano una nuova funzione, quale metodologia o processo usano per decidere che la funzionalità funzioni correttamente?
Con "nuovo" intendo che non è qualcosa che è già stato testato nelle lingue esistenti (e quindi la maggior parte del lavoro è stata eseguita da altri designer). Con "funziona correttamente" intendo che la funzione risolve correttamente il problema previsto ed è ragionevolmente a prova di proiettile. Con "ragionevolmente a prova di proiettile" 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 possa violare l'integrità della funzione.
-
È un processo di prova ed errore, nel senso che ti viene in mente una forma semplice della funzione, quindi prova a trovare modi per violarlo, quindi correggilo se lo violano con successo, quindi ripeti? E poi, quando non riesci a pensare ad altre possibili violazioni, speri che non rimanga niente e lo chiami un giorno?
-
O c'è un modo formale per provare (nel senso matematico della parola) che il tuo elemento funziona e quindi usare quella prova per ottenere con sicurezza la funzionalità (o per lo più correttamente ) dall'inizio?
(Devo dire che ho un background ingegneristico, non informatica, quindi se mi manca qualcosa che sarebbe ovvio per le persone CS, non esitare a segnalarlo.)