Qual è la relazione tra il calcolo lambda e i linguaggi di programmazione? [chiuso]


13

Sto iniziando il mio primo anno (al college) in Informatica il prossimo anno e scrivo principalmente in C (se questo è importante). Ho provato a cercare ma la maggior parte di ciò che trovo presuppone la conoscenza del calcolo lambda. Perché il calcolo lambda è considerato molto più utile del calcolo a variabile singola nella progressione? Esiste una relazione tra espressioni lambda e programmi funzionali? È stato il lavoro di Alonzo Church sul calcolo lambda a influenzare lo sviluppo dei linguaggi di programmazione?

Tutti fuori dalla scuola continuano a ronzare e non ho idea di cosa parleranno anche se sono ansioso di impararlo e vedere come si collega direttamente alla mia programmazione e comprensione dei linguaggi di programmazione.


2
A questa domanda sarà data una risposta migliore su cs.stackexchange.com .
davidk01,

@ ChrisF. Forse questa domanda è più adatta per uno dei siti di informatica. Altrimenti, ho provato a restringerlo e mi chiedo se possa essere riaperto nella sua forma attuale.
Tom Au,

Mathematica ha il calcolo lambda cotto in notato nessuno lo ha menzionato.
William,

Risposte:


26

Il Lambda Calculus è interessante, elegante e rende molto più semplice la comprensione dei linguaggi di programmazione funzionale. Tuttavia, non incontrerai la LC in un tipico corso di laurea in CS, quindi non devi impararla subito - consiglierei di sperimentare prima i linguaggi funzionali prima di rivisitare il Lambda Calculus. Credo che OCaml sia un buon punto di partenza nella programmazione funzionale per un programmatore C e che Scheme sia un buon punto di partenza per tuffarsi nel Lambda Calculus.

Il calcolo Lambda non è associato al calcolo (che invece dovrebbe essere chiamato Analisi). In generale, un calcolo è un "sistema formale", cioè un insieme di regole per fare qualcosa. Mentre il calcolo differenziale fornisce regole relative alla modifica dei valori, le regole del calcolo Lambda descrivono il calcolo stesso. Da questo insieme di regole molto basilari, possiamo costruire calcoli arbitrari, rappresentazioni di dati come booleani, numeri interi o liste e persino controllare costrutti di flusso come condizionali o loop. La LC è equivalente alle macchine di Turing, ma entrambi i modelli hanno diversi punti di forza.

Lambda Calculus ha avuto un impatto enorme sui linguaggi di programmazione. Il secondo linguaggio di alto livello da implementare era Lisp, che può essere inteso come una codifica diretta della LC in un linguaggio di programmazione. Questa "programmazione funzionale" ha un immenso effetto sull'evoluzione dei linguaggi di programmazione. Caratteristiche come funzioni anonime, puntatori a funzioni, chiusure (funzioni nidificate), garbage collection, ambito variabile, metaprogrammazione, progressi nei sistemi di tipo, inferenza di tipo, linguaggi interpretati, linguaggi tipizzati dinamicamente, programmazione orientata agli oggetti sono dovuti in gran parte al ramo di programmazione funzionale dei linguaggi di programmazione. C'è una battuta che ogni nuovo linguaggio di programmazione (non accademico) aggiunge solo funzionalità che Lisp ha già avuto per decenni.

Oltre a ciò, il Lambda Calculus e altri calcoli correlati sono strumenti indispensabili nella teoria del linguaggio di programmazione e in alcune tecniche di costruzione del compilatore.

Qualsiasi linguaggio che ha funzioni anonime che si comportano come chiusure e che può essere passato in giro liberamente contiene immediatamente una codifica del calcolo lambda. Le funzioni anonime corrispondono a espressioni lambda, tranne per il fatto che nelle funzioni LC hanno sempre esattamente un argomento. Tuttavia, qualsiasi linguaggio completo di Turing equivale a LC, quindi LC può sempre essere implementato su tali lingue. Ciò tende ad accadere in sistemi di corrispondenza delle regole o in formati di configurazione eccessivamente intelligenti, dando origine alla "decima regola di Greenspun" (per scherzo - principalmente): " Qualsiasi programma C o Fortran sufficientemente complicato contiene un programma ad hoc, specificato in modo informale, pieno di bug , lenta implementazione di metà del Common Lisp.


Questa è una risposta migliore di quella che avevo selezionato prima. La tua risposta colpisce davvero a casa. Questo e 'esattamente quello che stavo cercando!
RonaldMunodawafa,

"... tranne che nelle funzioni LC hanno sempre esattamente un argomento": questa funzione è chiamata curry o è almeno correlata ad essa?
Giorgio,

@Giorgio Currying è diverso, ma correlato. LC non ha funzioni multi-argomento, ma queste possono essere semplicemente codificate come funzioni nidificate che accettano un argomento ciascuno. Esempio usando la notazione ML: x = fn (a, b, c) => a + b + c(tipo int * int * int -> int, invocazione fn (1, 2, 3)) può essere trasformato in x = fn a => fn b => fn c => a + b + c(tipo int -> int -> int -> int, invocazione ((x 1) 2) 3- parentesi facoltative in ML). Ora invece di fornire tutti e tre gli argomenti, possiamo anche fornire solo due: plus3 = x 1 2che ha tipo int -> int. Questa è un'applicazione / curry parziale.
amon

Ho pensato che curry significhi che tutte le funzioni accettano solo un argomento (come in LC).
Giorgio,

8

Il calcolo lambda non ha nulla a che fare con il calcolo differenziale / integrale. Calcolo nel senso più generico della parola significa semplicemente un sistema di calcolo.

A un livello molto elevato il calcolo lambda è un modello di calcolo allo stesso modo in cui una macchina di turing è un modello di calcolo. Il motivo per cui i ricercatori del linguaggio di programmazione studiano il calcolo lambda è perché come modello ha forti connessioni con metodi formali in matematica come la logica e la teoria delle categorie. Quindi metodi di questi domini possono essere applicati allo studio di vari aspetti ed estensioni del calcolo lambda che a loro volta aiutano a progettare linguaggi di programmazione migliori con determinate proprietà.

L'influenza più diretta del calcolo lambda nei linguaggi di programmazione appare di solito sotto forma di funzioni e chiusure di prima classe. C non ha il supporto per le chiusure e quindi dovrai esplorare il concetto in un linguaggio di alto livello come Lisp, Python, Ruby, JavaScript, ecc. Storicamente Lisp è considerata la prima implementazione concreta del calcolo lambda come linguaggio di programmazione .


1
Potresti voler menzionare lingue specifiche che sono abbastanza vicine al calcolo lambda, ad esempio Lisp.
Giorgio,

1
Sto ancora imparando Scheme usando SICP e spero di saperne di più su questo settore. Grazie per la tua elaborata risposta e suggerimento.
RonaldMunodawafa,
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.