Qual è la differenza tra un calcolo e un linguaggio di programmazione?


13

Penso di essere piuttosto confuso su ciò che viene chiamato un calcolo e ciò che viene chiamato un linguaggio di programmazione.

Tendo a pensare, e potrebbe essere stato detto, che un calcolo è un sistema formale per ragionare sull'equivalenza dei programmi. I programmi hanno una semantica operativa specificata da una macchina, che dovrebbe (penso?) Essere deterministica. In questo modo, un calcolo (corretto) per una lingua è un metodo di prova per l'equivalenza del programma.L

Mi sembra una ragionevole divisione, ma è questo il significato comunemente accettato? O forse è anche sbagliato?

Correlati, perché alcune semantiche operative non sono deterministiche (supponiamo che sia confluente)? Cosa si ottiene lasciando aperta la scelta della strategia?

Gradirei davvero alcuni chiarimenti su questi; e riferimenti concreti ancora di più! Grazie!


3
Sono parole diverse per modi diversi di vedere la stessa cosa.
Raffaello

1
@Raphael, come risponde alla domanda? Questo non è il posto giusto per fare filosofia.
fade2black,

4
A volte è necessaria una piccola filosofia, ovunque.
André Souza Lemos,

Risposte:


10

Il significato delle parole non è fisso, ma posso darti la mia interpretazione.

Un calcolo è qualcosa con cui calcoliamo nel senso di manipolazione delle equazioni (pensa alla manipolazione delle serie di Taylor o al calcolo degli integrali in analisi). Un calcolo ci dice quali sono le regole di manipolazione, ma non quali dovremmo usare in una determinata situazione.

Un linguaggio di programmazione è qualcosa che ci dice come calcolare. Ci dice esattamente come usare le regole. In genere consentiamo al computer di utilizzare le regole, poiché è molto più veloce. Le regole possono essere non deterministiche e potrebbero esserci ottime ragioni per non essere deterministiche. Può essere nella natura del calcolo che non è deterministico (si pensi a processi di comunicazione simultanei), o fissare una particolare strategia può essere dannoso per le tecniche di implementazione e ottimizzazione.

Ad esempio, il calcolo è una teoria equazionale . Ci sono espressioni ed equazioni che ci dicono quando le espressioni sono uguali. Le equazioni non ci dicono come applicarle, anche se le persone di solito hanno ordini del giorno nascosti e presentano le equazioni in modo che in seguito possano trarre utili strategie di valutazione da esse. Ma nella sua essenza il calcolo λ è un gruppo di equazioni. Non è un linguaggio di programmazione.λλ

Al contrario, Standard ML è un linguaggio di programmazione. Viene dato in termini di semantica operativa, ovvero regole di calcolo. Ci sono nozioni derivate di uguaglianza (equivalenza contestuale, equivalenza osservativa, ecc.) Che possiamo mettere su di essa per pensarla come una sorta di calcolo.

Naturalmente, ci sono spesso utili connecitoni tra un calcolo e la sua manifestazione come linguaggio di programmazione. La normalizzazione confluente è solo un modo per passare dal calcolo al linguaggio di programmazione (anche se purtroppo alcune persone lo hanno trasformato in una specie di religione). L'interazione tra calcoli e linguaggi di programmazione è importante: i linguaggi di programmazione possono essere effettivamente utilizzati, ma i calcoli spiegano di cosa tratta il programma.

Giusto per infastidire le persone, lasciatemi anche affermare che fingere che non ci sia differenza tra un calcolo e la sua manifestazione operativa a volte porta a visioni distorte della programmazione e delle mini-religioni all'interno della comunità di programmazione. Puoi provare a indovinare quale lingua ho in mente. (È un linguaggio molto interessante!)


Quindi un linguaggio di programmazione è un calcolo dotato di un sistema di strategia / riscrittura compatibile con esso?
xavierm02,

pp'p=p'

π

Potresti presentare equazioni che parlano non solo del programma ma anche del suo ambiente (stato o transizioni). Ma non direi che una cosa del genere sia un calcolo. Piuttosto è un modello algebrico.
Andrej Bauer,

Grazie mille, Andrej, questo ha senso per me. Mi rendo conto che potrebbe variare da persona a persona, ma sto accettando questa risposta in quanto (penso) sia la migliore.
Guido,

2

L'obiettivo dei calcoli non è solo studiare le equivalenze dei programmi, è studiare i programmi. Un esempio di calcolo elaborato è questo in cui la strategia (chiamata per valore o chiamata per nome) è determinata localmente. Potrebbe essere implementato un giorno in un linguaggio di programmazione, ma prima viene studiato come un calcolo. Si usano anche i calcoli per studiare i sistemi di tipi (con alcuni calcoli come quello nella teoria dei tipi di Martin-Löf anche i tipi di calcolo).


Credo che la differenza principale sia che i calcoli debbano essere (relativamente) facili da studiare formalmente mentre i linguaggi di programmazione dovrebbero essere (relativamente) facili da usare. Ciò comporta le seguenti differenze:

I calcoli tendono ad essere minimalisti mentre i PL tendono ad avere ridondanza (per loop quando hai già while loop, cambia quando hai già if, ...) per rendere più facile esprimere ciò che desideri.

I calcoli hanno una semantica completamente specificata, mentre una semantica di PL è spesso descritta da un interprete / compilatore predefinito.


Alcune semantiche operative non sono deterministiche perché consentono:

  • Per provare cose su tutti i "subsemantici".
  • Consentire all'implementazione di scegliere e quindi di (forse) accelerare le cose.
  • Perché a volte, hai un'operazione "radnom ()" e se non ti interessano le probabilità ma solo ciò che è possibile, il non determinismo è un buon modo per rappresentarlo.

Si noti che la chiamata per valore non è deterministica: è possibile scegliere di valutare prima la funzione o l'argomento.


No, non sono d'accordo che si tratti di livello di formalizzazione o raffinatezza.
Andrej Bauer,

2

"Linguaggio di programmazione" e "calcolo" sono termini polisemici, cioè significano cose diverse a seconda del contesto.

In alcuni contesti, linguaggi di programmazione e calcoli sono convertibili per riferirsi allo stesso concetto, quello di un sistema di riscrittura basato su una serie di regole formali che possono essere applicate "meccanicamente".

Il motivo per cui questa convergenza è occasionalmente enigmatico per noi (ma non per sviluppatori di software o matematici che lavorano) è che il nostro compito è concepire linguaggi di programmazione concreti come se fossero calcoli e incorporare fisicamente i calcoli in linguaggi di programmazione concreti.

Per rispondere direttamente alla tua domanda, la confusione tra calcoli e linguaggi di programmazione (nella misura in cui esiste) non è un incidente, ma un progetto. Il nostro progetto. È una testimonianza del nostro relativo successo come disciplina scientifica.

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.