Što je Lisp činilo posebnim

«Najbolji programski jezik ikada stvoren«
— Alan Kay, "on Lisp"

Što je Lisp činilo posebnim

Kada je McCarthy razvio Lisp kasnih 1950-ih, bio je radikalno drugačiji od postojećih jezika, od kojih je najvažniji bio Fortran.

Lisp je predstavio devet novih ideja:

1. Kondicionali. Uvjetne izjave su if-then-else konstrukcije. Sada ih uzimamo zdravo za gotovo. Oni su bili izmislio McCarthyja tijekom razvoja Lispa. (Fortran je u to vrijeme imao samo goto naredbe, blisko povezane s uputama za granu na osnovnom hardveru.) McCarthy, dok je bio u odboru za Algol, pridonio je kondicionalima Algolu, odakle su se proširili na druge jezike.

2. Tip funkcije. U Lispu su funkcije prvorazredni objekti - one su tip podataka, baš kao i brojevi, nizovi itd., i imaju doslovnu reprezentaciju, mogu se pohraniti u varijablama, mogu se proslijediti kao argumenti itd.

3. Rekurzija. Rekurzija je, naravno, postojala kao matematički koncept prije Lispa, ali Lisp je bio prvi programski jezik koji ju je podržavao. (Ovo se možda podrazumijeva u stvaranju funkcija kao prvorazrednih objekata.)

4. Novi koncept varijabli. U Lispu su sve varijable učinkoviti pokazivači. Vrijednosti su ono što tipovi imaju, a ne varijable, a dodjeljivanje ili vezanje varijabli znači kopiranje pokazivača, a ne onoga na što oni pokazuju.

5. Kolekcija smeća.

6. Programi sastavljeni od izraza. Lisp programi su stabla izraza, od kojih svaki vraća vrijednost. (Neki Lisp izrazi mogu vratiti više vrijednosti.) To je u suprotnosti s Fortranom i mnogim drugim uspješnim jezicima koji razlikuju "izraze" i "izjave".

Bilo je prirodno imati ovu razliku u Fortranu jer je jezik bio linijski orijentiran (što nije iznenađujuće za jezik čiji je ulazni format bila bušena kartica). Niste mogli imati ugniježđene izjave. I sve dok su vam za rad bili potrebni matematički izrazi, nije bilo smisla da bilo što drugo vraća vrijednost jer možda neće biti ničega što čeka da se vrati.

Ograničenja su ukinuta dolaskom blokovskih jezika, ali tada je već bilo prekasno. Razlika između izraza i iskaza već je uspostavljena. Prešlo je s Fortrana na Algol i dalje na njihove potomke.

Kada je jezik u potpunosti sastavljen od izraza, izraze možete sastavljati kako god želite. Možete pisati ili (koristeći sintaksu Luk)

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

ili

(= x (if foo 1 2))

7. Vrsta simbola. Znakovi se razlikuju od nizova, u kojem slučaju možete provjeriti jednakost usporedbom pokazivača.

8. Oznaka za kod koristeći stabla simbola.

9. Cijeli jezik je uvijek dostupan. Nema očite razlike između vremena čitanja, vremena kompajliranja i vremena izvođenja. Možete kompajlirati ili pokretati kod dok čitate, ili čitati ili pokretati kod dok kompilirate, ili čitati ili kompajlirati kod dok se izvodi.

Pokretanje koda tijekom čitanja omogućuje korisnicima reprogramiranje Lispove sintakse; pokretanje koda u vrijeme kompajliranja je osnova za makronaredbe; runtime kompilacija je osnova za korištenje Lispa kao jezika proširenja u programima kao što je Emacs; i konačno, čitanje tijekom izvođenja omogućuje programima da komuniciraju pomoću s-izraza, što je ideja nedavno ponovno osmišljena u XML-u.

Zaključak

Kada je Lisp prvi put izumljen, te su ideje bile daleko od konvencionalnih programskih praksi koje je diktirao hardver dostupan u kasnim 1950-ima.

Tijekom vremena, zadani jezik, utjelovljen uspjehom popularnih jezika, postupno je evoluirao prema Lispu. Točke 1-5 sada su široko prihvaćene. Točka 6 se počinje pojavljivati ​​u mainstreamu. U Pythonu postoji klauzula 7 u nekom obliku, iako ne postoji odgovarajuća sintaksa. Stavka 8, koja (sa stavkom 9) omogućuje makronaredbe u Lispu, još uvijek je samo u Lispu, vjerojatno zato što (a) zahtijeva te zagrade ili nešto jednako loše, i (b) ako dodate ovo najnovije povećanje snage, možete više ne tvrde da su izmislili novi jezik, već samo da su razvili novi dijalekt Lispa; -)

Iako je ovo korisno za moderne programere, čudno je opisivati ​​Lisp u smislu njegove razlike od nasumičnih tehnika usvojenih u drugim jezicima. Ovo možda nije ono što je McCarthy mislio. Lisp nije dizajniran da ispravlja Fortranove pogreške; činilo se više kao nusprodukt pokušaja aksiomatizirati izračune.

Izvor: www.habr.com

Dodajte komentar