Qual è la base teorica della programmazione imperativa?


48

La programmazione funzionale ha una base teorica nel calcolo lambda e nella logica combinatoria . Come qualcuno coinvolto nel calcolo statistico, trovo che questi concetti siano molto utili per la modellazione.

Esiste una base matematica equivalente della programmazione imperativa o è semplicemente nata dall'applicazione pratica dell'hardware nel linguaggio macchina e dal successivo sviluppo di FORTRAN ?

Risposte:


27

In generale, quando la matematica viene utilizzata per studiare alcuni X , si ha prima bisogno di un modello di X , quindi si sviluppa una teoria, un insieme di risultati su quel modello. Credo che la teoria può dire di essere un "base teorica" per X . Ora imposta X = calcolo. Esistono molti modelli di calcolo, molti dei quali implicano "stato". Ogni modello ha la sua "teoria" ed è talvolta possibile "tradurre" tra modelli. Credo che sia difficile dire quale modello sia più "di base" --- sono semplicemente progettati con diversi obiettivi in ​​mente.

Le macchine di Turing sono state progettate per definire ciò che è calcolabile . Quindi fanno un buon modello se ti preoccupi se esiste un algoritmo per un certo problema. Questo modello viene talvolta abusato per studiare l' efficienza degli algoritmi o la durezza dei problemi, con il pretesto che è abbastanza buono, almeno se ti interessa solo il polinomio / non polinomio. Il modello RAM è più vicino a un vero computer e quindi migliore se si desidera un'analisi precisa di un algoritmo. Per porre limiti inferiori alla durezza dei problemi è meglio non farlousa un modello che assomigli troppo ai computer di oggi perché vuoi coprire una vasta gamma di computer possibili, pur essendo più preciso di un semplice polinomio / non polinomiale. In questo contesto, ho visto ad esempio il modello di sonda cellulare utilizzato.

Se ti preoccupi della correttezza , allora sono ancora utili altri modelli. Qui hai la semantica operativa (che direi sia l'analogo del calcolo lambda per i calcoli con stato), la semantica assiomatica (sviluppata nel 1969 da Hoare sulla base delle affermazioni induttive di Floyd del 1967, che sono rese popolari da Knuth in The Art of Computer Programming , volume 1) e altri.

Per riassumere, penso che tu stia cercando modelli di calcolo. Esistono molti di questi modelli, sviluppati con vari obiettivi in ​​mente e molti hanno uno stato, quindi corrispondono alla programmazione imperativa. Se vuoi sapere se qualcosa può essere calcolato, dai un'occhiata alle macchine di Turing. Se ti interessa l'efficienza, guarda i modelli RAM. Se ti interessa la correttezza, guarda i modelli che terminano con la "semantica", come la semantica operativa.

Infine, lasciatemi ricordare che esiste un grande libro online solo sui Modelli di calcolo di John Savage. Si tratta principalmente di efficienza. Per la parte della correttezza, ti consiglio di iniziare con i classici documenti di Floyd (1967) , Hoare (1969) , Dijkstra (1975) e Plotkin (1981) . Sono tutti piuttosto fighi.


4
Penso che la Semantica Operativa sia davvero ciò che il poster sta cercando. Altre informazioni su wikipedia: en.wikipedia.org/wiki/Operational_semantics
sclv

22

Il modello teorico più semplice di un programma imperativo è la stessa macchina da turismo. Ha entrambi i componenti essenziali di un programma imperativo: stato modificabile illimitato e una macchina a stati che vi opera.

Puoi anche mettere la programmazione imperativa nella programmazione funzionale considerando i programmi come composizioni di operazioni monadiche che passano e restituiscono versioni modificate dello stato globale, come fatto nel linguaggio di programmazione Haskell.


2
L'uso delle monadi per ottenere costrutti imperativi in ​​un linguaggio puramente funzionale (come Haskell) non ti dà il pieno potere della programmazione imperativa. In particolare, senza uno stato realmente mutabile (ad es. Come in molte lingue con riferimenti), esistono ancora molte strutture di dati la cui implementazione efficiente in un linguaggio puramente funzionale è sconosciuta.
Joshua Grochow,

@Joshua: Perché pensi che le monadi statali non esprimano la semantica dei riferimenti? Non riesco a capire quale potrebbe essere l'obiezione.
Charles Stewart,

Una monade di stato è fondamentalmente zucchero sintattico per avere una raccolta di funzioni che accettano tutti un argomento aggiuntivo (stato) e producono un output aggiuntivo (stato successivo). Ma in un linguaggio puramente funzionale non puoi effettivamente modificare lo stato per ottenere lo stato successivo, devi ancora copiare e ricostruire. Non so se ci sono strutture dati specifiche in cui è noto che non possono essere implementate in modo efficiente in un linguaggio puramente funzionale, ma ci sono certamente prove suggestive (ad esempio Pippenger. Pure vs. impure Lisp. 1997).
Joshua Grochow,

6
Si può catturare perfettamente la semantica della mutazione con le monadi - vedi, ad esempio, la monade ST in Haskell. Stiamo parlando di semantica qui, non di implementazione.
sclv,

20

In breve, direi che la programmazione imperativa si è evoluta dal linguaggio macchina e dalla pratica di programmazione. D'altra parte, le monadi forniscono un quadro semantico appropriato per descrivere la semantica delle caratteristiche del linguaggio di programmazione imperativo. Il documento Nozioni di computazione e monadi di Moggi stabilì le basi formali. Phil Wadler ha reso popolare l'idea e ha contribuito in modo significativo a renderla il modo chiave per incorporare caratteristiche imperative nel linguaggio di programmazione Haskell. Recenti lavori di Plotkin e Power Nozioni di calcolo determinano le monadi va dall'altra parte affermando che alcune nozioni di calcolo (imperativo) in realtà danno una monade, il che significa che in modo molto essenziale le monadi corrispondono a nozioni imperative (e altre) di calcolo.


8
Le monadi possono essere usate per isolare la programmazione imperativa in un mondo puramente funzionale, ma non vedo il caso di affermare che formano una base teorica per la programmazione imperativa analoga alla relazione tra il calcolo lambda e molti linguaggi funzionali. Le monadi non modellano il calcolo tanto quanto formano un'astrazione rispetto alle classi di calcolo (ad esempio calcolo puro vs. calcolo che coinvolge IO, o calcolo che si basa su un particolare fascio di stato mutabile).
blucz,

1
Le monadi sono un modo per scrivere una semantica denotazionale più chiara per linguaggi efficaci, quindi perché no?
nponeccop,

15

Se stai cercando un trattamento matematico rigoroso di un linguaggio di programmazione imperativo, il libro di Winskel "The Formal Semantics of Programming Languages" (1993) ne è un esempio.

Nel libro definisce un imperativo linguaggio di programmazione chiamato IMP e ne fornisce la semantica operativa, denotazionale e assiomatica.


14

Vengo a questa domanda in ritardo, ma è una domanda affascinante. Quindi, ecco le mie opinioni.

Quando ero studente, avevamo un grande professore di matematica, che ci teneva conferenze sulla storia e lo sviluppo della matematica. Secondo lui, la matematica si è sviluppata in ondate di "espansione" e "consolidamento". Durante una fase di espansione, sono state prese in considerazione e studiate nuove idee precedentemente sconosciute. Quindi, durante una fase di consolidamento, le nuove teorie sono state integrate nell'attuale corpus di conoscenze. Tuttavia, nel 20 ° secolo, ha affermato, l'espansione e il consolidamento avvengono parallelamente.

La programmazione imperativa è attualmente un'attività di espansione per la matematica. In precedenza era "sconosciuto". (Potrebbe non essere del tutto vero. Hoare ci dice che Euclide stava facendo qualcosa di simile alla programmazione imperativa nella sua Geometria. Ma la matematica ha perso interesse in essa, nel bene e nel male.) I matematici non sono ancora interessati alla programmazione imperativa. Tanto la perdita per loro. Ma considero tutta l'Informatica come una branca della matematica in senso astratto. Lo stiamo studiando, espandendo la matematica nel processo.

Quindi, non mi importerebbe particolarmente se esiste una base teorica a priori per la programmazione imperativa. Se non ce n'è uno, andiamo a trovarlo. Ciò che sappiamo già ci dice che la programmazione imperativa è incredibilmente profonda e bella. La programmazione funzionale impallidisce a confronto. Ma abbiamo molto lavoro da fare per far conoscere tutta questa teoria alle persone.


"La programmazione funzionale impallidisce a confronto". Se solo potessi portare te e Bob Harper in un'arena di combattimento. Avresti oscillato un grosso blocco di comandi e lui avrebbe cercato di chiuderti addosso. (PS: ottima risposta, l'ho votata a favore.)
Andrej Bauer,

Beh, mi evita in qualche modo. Non so se questo significhi qualcosa :-)
Uday Reddy,

11

La programmazione funzionale ha una chiara base in matematica perché i linguaggi di programmazione funzionale si sono evoluti parallelamente alla matematica pertinente e i loro progettisti in genere hanno tenuto in grande considerazione la matematica. La relazione forte e diretta è una profezia che si autoavvera.

La programmazione imperativa ha una storia significativamente più complicata, legata molto più strettamente ai problemi aziendali e di ingegneria e storicamente molto più interessata alle prestazioni dei compilatori e al codice che generano che al rispetto dei formalismi matematici.

Molte persone hanno tentato di spiegare la programmazione imperativa in termini (tradizionalmente) funzionali. Questo può essere il più vicino che possiamo ottenere a quello che stai cercando, ma questi tentativi sono invariabilmente imbarazzanti, noiosi, forensi. Sono abbastanza sicuro che preferirei strapparmi gli occhi dalla faccia piuttosto che leggere una prova di progresso / conservazione per il CLR.

Di solito, se arrivi alla fine di un libro di testo decente (ad es. Tipi e linguaggi di programmazione di Pierce), inizierai a vedere la modellazione formale delle caratteristiche del linguaggio imperativo. Questo potrebbe essere interessante per te.


11

An Axiomatic Basis for Computer Programming in AUTO HOARE

In questo documento viene fatto un tentativo di esplorare le basi logiche della programmazione informatica usando tecniche che sono state applicate per la prima volta nello studio della geometria e successivamente sono state estese ad altri rami della matematica. Ciò comporta la delucidazione di insiemi di assiomi e regole di inferenza che possono essere utilizzati nelle prove delle proprietà dei programmi per computer. Vengono forniti esempi di tali assiomi e regole e viene visualizzata una prova formale di un semplice teorema. Infine, si sostiene che importanti vantaggi, sia teorici che pratici, possono derivare dal perseguimento di questi argomenti.

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.85.8553&rep=rep1&type=pdf


8

Secondo ciò che ha detto Alexandre, che la macchina di Turing ha fornito la base teorica originale per la programmazione imperativa. Nella misura in cui l'organizzazione dei linguaggi di programmazione imperativa riflette l'architettura della macchina, penso che il lavoro di John Von Neumann sarebbe anche una parte fondamentale delle loro basi teoriche.


7

Esiste una base matematica equivalente della programmazione imperativa o è semplicemente nata dall'applicazione pratica dell'hardware nel linguaggio macchina e dal successivo sviluppo di FORTRAN?

Se intendi "base" in senso storico, penso che non ci siano "basi matematiche equivalenti". Tuttavia, anche se la programmazione imperativa è nata da preoccupazioni pratiche, ci sono diversi modi per caratterizzare in modo completo il significato della programmazione imperativa in modi che potresti trovare "utili per modellare", come la logica Hoare .


intendevi davvero creare questa wiki della community?
Suresh Venkat,

Sì, intendevo renderlo wiki della community.
jbapple,

7

i post che menzionano la logica hoare e la logica di separazione sono quelli corretti su questo argomento. La logica hoare ti consente di indicare le proprietà dell'intera configurazione heap di un programma e la logica di separazione è il parente più moderno che ti consente di utilizzare una "congiunzione di separazione" che ti consente di indicare come condizioni pre e post a un segmento di codice ciò che le proprietà trattengono la parte dell'heap che il segmento del programma manipolerà durante la quantificazione rispetto al resto dell'heap.

La risposta per quanto riguarda le monadi non è rigorosamente accurata, poiché in haskell una monade viene utilizzata semplicemente perché è un'astrazione che consente la codifica dell'ordine dei vincoli di valutazione e il tracciamento esplicito della proprietà "potrebbe usare IO".

Vale la pena sottolineare sia che la logica di rafia / separazione può essere vista come monade, sia che ci sono una serie di progetti contemporanei come il progetto ynot di Harvard che stanno esplorando questi argomenti.

la ricerca nella logica della separazione è un campo continuo e attivo.


Mi sembra un errore confondere il fatto che Haskell usa una nozione di monadi (e una monade tipografica) con l'approccio più generale, come proposto ad esempio da Moggi, che usa le monadi per strutturare un resoconto della semantica categorica. L'adozione delle monadi come strumento per strutturare la programmazione non dovrebbe renderci ciechi all'uso della semantica categorica come strumento per strutturare il ragionamento sulla programmazione.
sclv,

chiarimento molto buono, anche se credo che un sacco di gente abbia usato le monadi alla haskell per esplorare la semantica attraverso i trasformatori di monade. In particolare, la diversa semantica per le operazioni che derivano da diverse composizioni di detti trasformatori (ad esempio per stato / mutabilità, continuazioni, non determinismo ecc.)
Carter Tazio Schonwald,

5

Sto arrivando a questa domanda anche più tardi, ma ne sono ugualmente affascinato.

Mi sfugge il motivo per cui la teoria della programmazione imperativa è meno risolta di quella della programmazione funzionale. Probabilmente ha iniziato a prendere sul serio con Scott e de Bakker nel 1969 con la loro analisi del significato di ricorsione in un linguaggio imperativo semplice [1]. Quando il linguaggio imperativo acquisisce funzionalità, la storia diventa un po 'più caotica, ma questo è solo il prezzo da pagare per essere più vicini al metal. Per nominare uno degli sforzi più completi, nel 1980 de Bakker, de Bruin e Zucker scrissero una monografia sull'argomento [2]. Altri sono stati menzionati sopra. Questi riferimenti ovviamente precedono la logica di separazione ma [2] affrontano comunque array e procedure reciprocamente ricorsive.

[1]: inedito nel 1969, ma è apparso nei panni di Jaco W. de Bakker e Dana S. Scott. Una teoria dei programmi , pagine 1-30. In Klop et al. JW de Bakker, 25 anni fa. CWI, Amsterdam, 1989. Liber Amoricum.

[2]: Jacobus W. de Bakker, Arie de Bruin, Jeffrey Zucker: teoria matematica della correttezza del programma. Prentice Hall 1980.


1
La programmazione chiaramente imperativa è estremamente ben compresa. Penso che ciò che la gente intende quando affermano che è meno stabile è che strutturalmente, la programmazione imperativa è più ricca della pura programmazione funzionale, e molto meno struttura matematica è stata scoperta che si manifesta in questa o quella forma di programmazione imperativa. Ad esempio, alcuni tipi di programmi imperativi possono essere ragionati sull'uso corretto della logica di separazione. Questo probabilmente ha a che fare con le forme di condivisione. Forse questo tipo di programmi ha una bella e astratta caratterizzazione matematica?
Martin Berger,

1
Personalmente, intendo la teoria della modularità nei linguaggi imperativi non è molto chiara. Sappiamo cosa significa modularità per linguaggi funzionali: parametricità relazionale. Per le lingue imperative, ci sono molti modi di nascondere le informazioni che (a) funzionano chiaramente, ma (b) per i quali mancano buone tecniche di prova. Ci sono allettanti suggerimenti secondo cui esiste una teoria profonda qui: per esempio, quando faccio prove modulari di programmi imperativi sequenziali, finisco per aver bisogno di tecniche dalla concorrenza. Informalmente, l'aliasing è come la concorrenza, ma non so davvero come formalizzare quell'idea ...
Neel Krishnaswami,

@Kai. Benvenuto nella discussione! È passato molto tempo da quando ho guardato il lavoro di de Bakker, ma penso che il problema di base sia che l'approccio non è aumentato. Per un breve riassunto dei progressi compiuti nella programmazione imperativa da allora vedi il mio post nel "Che cosa costituisce la semantica denotazionale?" collegamento thread .
Uday Reddy,

@NeelKrishnaswami. Mi piacerebbe vedere quelle prove. Sono sulla tua pagina web? L'aliasing è come la concorrenza in quanto implicano entrambi una condivisione sofisticata e un interfogliamento. In concomitanza, astraggete l'interleaving e assumete il non determinismo (il che è buono). Nell'aliasing, ti costringi ad affrontare l'interlacciamento. La semantica dei giochi è un eccellente esempio di questo interlacciamento forzato, motivo per cui non mi piace.
Uday Reddy,

3

Poco dopo aver posto la tua domanda, Mark Bender della McMaster University ha pubblicato una tesi: Calcolo delle assegnazioni: un linguaggio di ragionamento imperativo puro (8 settembre 2010). Questa tesi descrive un linguaggio semplice e imperativo corrispondente al calcolo lambda.

Il calcolo delle assegnazioni è costituito solo da quattro costrutti di base, assegnazione X:=t, sequenza t;u, formazione della ¡tprocedura e invocazione della procedura !t. Vengono fornite tre interpretazioni per AC: una semantica operativa, una semantica denotazionale e un sistema di riscrittura dei termini. I tre sono mostrati equivalenti.

La tesi di Mark Bender prosegue esplorando varianti estese con valutazione pigra, backtracking, composizione procedurale. Questo è simile all'esplorazione del calcolo lambda mediante l'uso di piccole estensioni.

Nel complesso, la tesi fornisce una risposta relativamente diretta alla domanda del PO.


il collegamento pdf è interrotto
Quinn Wilson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.