La domanda è piuttosto ampia. Per rispondere in uno spazio ragionevole farò molte semplificazioni eccessive.
Concordiamo sulla terminologia. Un programma è corretto quando implica la sua specifica. Questa vaga affermazione è resa precisa in molti modi, bloccando cosa è esattamente un programma e cosa è esattamente una specifica. Ad esempio, nel controllo del modello il programma è una struttura di Kripke e la specifica è spesso una formula LTL . Oppure, il programma potrebbe essere un elenco di istruzioni PowerPC e la specifica potrebbe essere un insieme di asserzioni Hoare-Floyd scritte, diciamo, nella logica del primo ordine. Esistono moltissime varianti possibili. È allettante concludere che in un caso (struttura di Kripke) non verifichiamo un programma reale, mentre nel secondo caso (elenco di istruzioni PowerPC) lo facciamo. Tuttavia, è importante rendersi conto che stiamo davvero esaminando modelli matematici in entrambi i casi, e questo va benissimo. (La situazione è abbastanza simile alla fisica in cui, ad esempio, la meccanica classica è un modello matematico della realtà.)
La maggior parte delle formalizzazione distingue tra sintassi e semantica di un programma; cioè, come viene rappresentato e cosa significa. La semantica di un programma è ciò che conta dal punto di vista della verifica del programma. Ma è ovviamente importante avere un modo chiaro di assegnare significati a (rappresentazioni sintattiche di) programmi. Due modi popolari sono i seguenti:
- (piccola fase) semantica operativa : è molto simile alla definizione di un linguaggio di programmazione scrivendo un interprete per esso. Per questo è necessario dire qual è lo stato ed è influenzato da ogni affermazione nella lingua. (Potresti chiederti in quale lingua scrivi l'interprete, ma farò finta di non esserlo.)
- semantica assiomatica : qui ogni tipo di istruzione viene fornito con uno schema assioma. Quindi, all'incirca, ogni volta che viene usata un'affermazione particolare di quel tipo, si traduce nella capacità di usare certi assiomi. Ad esempio, l'assegnazione viene fornita con lo schema ; l'assegnazione particolare viene fornita con l'assioma se istanziamo lo schema con .x : = e{ P[ x / e ] }x : = e{ P}x : = x + 1{ x + 1 = 1 }x : = x + 1{ x = 1 }P= ( x = 1 )
(Ce ne sono altri. Mi sento particolarmente male per aver omesso la semantica denotazionale, ma questa risposta è già lunga.) Il codice macchina più la semantica operativa è abbastanza vicino a quello che la maggior parte delle persone chiamerebbe un "vero programma". Ecco un documento fondamentale, che sembra usare la semantica operativa per un sottoinsieme del codice macchina DEC Alpha:
Perché mai useresti alcune semantiche di livello superiore, come quelle assiomatiche? Quando non si desidera che la prova della correttezza dipenda dall'hardware su cui si esegue. L'approccio quindi è quello di dimostrare la correttezza di un algoritmo rispetto ad alcune pratiche semantiche di alto livello e quindi dimostrare che la semantica suona rispetto alla semantica di livello inferiore più vicina alle macchine reali.
In sintesi, potrei pensare a tre motivi che hanno portato alla tua domanda:
- Hai visto solo la semantica di alto livello che non assomiglia a quello che sei abituato a chiamare un programma e ti chiedi se ce ne sono di basso livello. La risposta è si.
- Ti chiedi come dimostri che un modello corrisponde alla realtà. Come in fisica, no. Devi semplicemente trovare modelli migliori e confrontarli con la realtà.
- Non hai visto la distinzione tra sintassi e semantica e vari modi per assegnare significati ai programmi. Due domande precedenti elencano alcuni libri.
Questa risposta sta semplicemente cercando di identificare tre diversi modi in cui ho capito la domanda. Andare in profondità in uno di questi punti richiederebbe molto spazio.