Come ingegnere del software, scrivo molto codice per i prodotti industriali. Elementi relativamente complicati con classi, thread, alcuni sforzi di progettazione, ma anche alcuni compromessi per le prestazioni. Faccio molti test e sono stanco dei test, quindi mi sono interessato a strumenti di dimostrazione formale, come Coq, Isabelle ... Potrei usare uno di questi per dimostrare formalmente che il mio codice è privo di bug ed essere fatto con esso? - ma ogni volta che controllo uno di questi strumenti, vado via senza essere convinto che siano utilizzabili per l'ingegneria del software di tutti i giorni. Ora, potrei essere solo io, e sto cercando suggerimenti / opinioni / idee a riguardo :-)
In particolare, ho l'impressione che per far funzionare uno di questi strumenti per me sarebbe necessario un enorme investimento per definire correttamente al prover gli oggetti, i metodi ... del programma in esame. Mi chiedo quindi se il prover non si limiterebbe a rimanere senza vapore, date le dimensioni di tutto ciò che dovrebbe affrontare. O forse dovrei sbarazzarmi degli effetti collaterali (quegli strumenti prover sembrano fare davvero molto bene con i linguaggi dichiarativi), e mi chiedo se ciò comporterebbe un "codice comprovato" che non potrebbe essere usato perché non sarebbe veloce o abbastanza piccolo. Inoltre, non ho il lusso di cambiare la lingua con cui lavoro, deve essere Java o C ++: non posso dire al mio capo che sto per scrivere codice in OXXXml da ora in poi, perché è l'unica lingua in che posso dimostrare la correttezza del codice ...
Qualcuno con più esperienza negli strumenti di correzione formale può commentare? Ancora una volta - ADORO usare uno strumento prover formale, penso che siano fantastici, ma ho l'impressione che si trovino in una torre d'avorio che non riesco a raggiungere dal modesto fossato di Java / C ++ ... (PS: I anche LOVE Haskell, OCaml ... non ho un'idea sbagliata: sono un fan dei linguaggi dichiarativi e delle prove formali, sto solo cercando di vedere come potrei realisticamente renderlo utile all'ingegneria del software)
Aggiornamento: poiché questo è abbastanza ampio, proviamo le seguenti domande più specifiche: 1) ci sono esempi di utilizzo dei tester per dimostrare la correttezza dei programmi Java / C ++ industriali? 2) Coq sarebbe adatto a quel compito? 3) Se Coq è adatto, devo prima scrivere il programma in Coq, quindi generare C ++ / Java da Coq? 4) Questo approccio potrebbe gestire threading e ottimizzazioni delle prestazioni?