Ce l-a făcut pe Lisp special

«Cel mai grozav limbaj de programare creat vreodată«
— Alan Kay, „pe Lisp”

Ce l-a făcut pe Lisp special

Când McCarthy a dezvoltat Lisp la sfârșitul anilor 1950, acesta era radical diferit de limbile existente, dintre care cea mai importantă era Fortran.

Lisp a introdus nouă idei noi:

1. Condiționale. Instrucțiunile condiționate sunt construcții dacă-atunci-altfel. Acum le luăm de bune. Erau inventat McCarthy în timpul dezvoltării lui Lisp. (Fortran la acea vreme avea doar declarații goto, strâns legate de o instrucțiune de ramură privind hardware-ul de bază.) McCarthy, în timp ce făcea parte din comitetul Algol, a contribuit cu condiționale la Algol, de unde s-au răspândit în alte limbi.

2. Un tip de funcție. În Lisp, funcțiile sunt obiecte de primă clasă - sunt un tip de date, la fel ca numerele, șirurile de caractere etc. și au o reprezentare literală, pot fi stocate în variabile, pot fi transmise ca argumente etc.

3. Recursiune. Recursiunea, desigur, a existat ca un concept matematic înainte de Lisp, dar Lisp a fost primul limbaj de programare care a susținut-o. (Acest lucru este probabil implicat în crearea de funcții ca obiecte de primă clasă.)

4. Un nou concept de variabile. În Lisp, toate variabilele sunt indicatori efectivi. Valorile sunt ceea ce au tipurile, nu variabilele, iar alocarea sau legarea variabilelor înseamnă copierea indicatorilor, nu spre ce indică acestea.

5. Colectarea gunoiului.

6. Programe compuse din expresii. Programele Lisp sunt arbori de expresii, fiecare dintre acestea returnând o valoare. (Unele expresii Lisp pot returna mai multe valori.) Acest lucru contrastează cu Fortran și cu multe alte limbaje de succes care fac diferența între „expresii” și „afirmații”.

Era firesc să existe această distincție în Fortran, deoarece limbajul era orientat pe linie (nu este surprinzător pentru o limbă al cărei format de intrare era un card perforat). Nu puteai avea declarații imbricate. Și atâta timp cât aveai nevoie de expresii matematice pentru a funcționa, nu avea niciun rost să returnezi o valoare pentru orice altceva, deoarece s-ar putea să nu fie nimic care să aștepte să fie returnat.

Restricțiile au fost ridicate odată cu apariția limbajelor structurate în bloc, dar până atunci era prea târziu. Distincția dintre expresii și enunțuri a fost deja stabilită. A trecut de la Fortran la Algol și mai departe la descendenții lor.

Când o limbă este făcută în întregime din expresii, puteți compune expresii în orice mod doriți. Puteți scrie oricare (folosind sintaxa Arc)

(if foo (= x 1) (= x 2))

sau

(= x (if foo 1 2))

7. Un tip de simbol. Caracterele sunt diferite de șiruri, caz în care puteți verifica egalitatea comparând pointerii.

8. O notație pentru cod folosind arbori de simboluri.

9. Întreaga limbă este întotdeauna disponibilă. Nu există nicio diferență evidentă între timpul de citire, timpul de compilare și timpul de rulare. Puteți să compilați sau să rulați cod în timp ce citiți, sau să citiți sau să rulați cod în timp ce compilați, sau să citiți sau să compilați codul în timp ce acesta rulează.

Rularea codului în timpul citirii permite utilizatorilor să reprogrameze sintaxa lui Lisp; rularea codului în timpul compilării este baza pentru macrocomenzi; compilarea runtime este baza pentru utilizarea Lisp ca limbaj de extensie în programe precum Emacs; și, în sfârșit, citirea în timp de execuție permite programelor să comunice folosind expresii s, o idee recent reinventată în XML.

Concluzie

Când Lisp a fost inventat, aceste idei erau departe de practicile convenționale de programare dictate de hardware-ul disponibil la sfârșitul anilor 1950.

De-a lungul timpului, limba implicită, întruchipată de succesul limbilor populare, a evoluat treptat către Lisp. Punctele 1-5 sunt acum larg acceptate. Punctul 6 începe să apară în mainstream. În Python, există o clauză 7 într-o anumită formă, deși nu există o sintaxă adecvată. Itemul 8, care (cu elementul 9) face posibile macrocomenzi în Lisp, este încă doar în Lisp, probabil pentru că (a) necesită acele paranteze sau ceva la fel de rău și (b) dacă adăugați această ultimă creștere a puterii, puteți nu mai pretind că a inventat o nouă limbă, ci doar că a dezvoltat un nou dialect de Lisp; -)

Deși acest lucru este util pentru programatorii moderni, este ciudat să descriem Lisp în ceea ce privește diferența sa față de tehnicile aleatorii adoptate în alte limbi. S-ar putea să nu fie ceea ce se gândea McCarthy. Lisp nu a fost conceput pentru a corecta erorile lui Fortran; a apărut mai degrabă ca un produs secundar al încercării axiomatizarea calculelor.

Sursa: www.habr.com

Adauga un comentariu