Čím byl Lisp výjimečný

«Největší programovací jazyk, jaký byl kdy vytvořen«
- Alan Kay, "na Lisp"

Čím byl Lisp výjimečný

Když McCarthy koncem 1950. let vyvinul Lisp, byl radikálně odlišný od existujících jazyků, z nichž nejdůležitější byl Fortran.

Lisp představil devět nových nápadů:

1. Podmínky. Podmíněné příkazy jsou konstrukce if-then-else. Nyní je bereme jako samozřejmost. Oni byli vynalezl McCarthy během vývoje Lisp. (Fortran měl v té době pouze goto prohlášení, úzce spojená s instrukcí větve o základním hardwaru.) McCarthy, když byl ve výboru pro Algol, přispěl kondicionály do Algolu, odkud se rozšířily do dalších jazyků.

2. Typ funkce. V Lisp jsou funkce prvotřídní objekty - jsou datovým typem, stejně jako čísla, řetězce atd., a mají doslovnou reprezentaci, mohou být uloženy v proměnných, mohou být předány jako argumenty atd.

3. Rekurze. Rekurze samozřejmě existovala jako matematický koncept před Lispem, ale Lisp byl prvním programovacím jazykem, který ji podporoval. (To je možná implikováno při vytváření funkcí jako prvotřídních objektů.)

4. Nový koncept proměnných. V Lisp jsou všechny proměnné efektivní ukazatele. Hodnoty jsou to, co mají typy, nikoli proměnné, a přiřazení nebo vazba proměnných znamená kopírování ukazatelů, nikoli toho, na co ukazují.

5. Odvoz odpadků.

6. Programy složené z výrazů. Lisp programy jsou stromy výrazů, z nichž každý vrací hodnotu. (Některé výrazy Lisp mohou vracet více hodnot.) To kontrastuje s Fortranem a mnoha dalšími úspěšnými jazyky, které rozlišují mezi „výrazy“ a „výroky“.

Bylo přirozené mít tento rozdíl ve Fortranu, protože jazyk byl orientovaný na řádky (nepřekvapivé pro jazyk, jehož vstupní formát byl děrný štítek). Nemohli jste mít vnořené příkazy. A dokud jste k práci potřebovali matematické výrazy, nemělo smysl nechat cokoliv jiného vracet hodnotu, protože na vrácení možná nic nečeká.

Omezení byla zrušena s příchodem blokově strukturovaných jazyků, ale to už bylo pozdě. Rozdíl mezi výrazy a prohlášeními již byl stanoven. Přešlo z Fortranu do Algolu a dále na jejich potomky.

Když se jazyk skládá výhradně z výrazů, můžete výrazy skládat, jak chcete. Můžete napsat buď (pomocí syntaxe Oblouk)

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

nebo

(= x (if foo 1 2))

7. Typ symbolu. Znaky se liší od řetězců, v takovém případě můžete zkontrolovat rovnost porovnáním ukazatelů.

8. Zápis pro kód pomocí stromů symbolů.

9. Celý jazyk je vždy k dispozici. Mezi dobou čtení, dobou kompilace a dobou běhu není žádný zřejmý rozdíl. Můžete kompilovat nebo spouštět kód během čtení nebo číst nebo spouštět kód během kompilace nebo číst nebo kompilovat kód během jeho běhu.

Spuštění kódu při čtení umožňuje uživatelům přeprogramovat syntaxi Lisp; spouštění kódu v době kompilace je základem pro makra; runtime kompilace je základem pro použití Lisp jako rozšiřujícího jazyka v programech, jako je Emacs; a konečně, čtení za běhu umožňuje programům komunikovat pomocí s-výrazů, což je myšlenka nedávno znovu objevená v XML.

Závěr

Když byl Lisp poprvé vynalezen, tyto myšlenky byly na hony vzdáleny konvenčním programovacím praktikám diktovaným hardwarem dostupným na konci 1950. let.

Postupem času se výchozí jazyk, ztělesněný úspěchem populárních jazyků, postupně vyvinul směrem k Lisp. Body 1-5 jsou nyní široce přijímány. Bod 6 se začíná objevovat v mainstreamu. Python má v nějaké formě klauzuli 7, i když neexistuje žádná vhodná syntaxe. Položka 8, která (s položkou 9) umožňuje makra v Lisp, je stále pouze v Lisp, pravděpodobně proto, že (a) vyžaduje ty závorky nebo něco stejně špatného a (b) pokud přidáte toto nejnovější zvýšení výkonu, můžete už netvrdit, že vynalezli nový jazyk, ale pouze vyvinuli nový dialekt Lisp; -)

Ačkoli je to užitečné pro moderní programátory, je zvláštní popisovat Lisp z hlediska jeho odlišnosti od náhodných technik přijatých v jiných jazycích. Tohle si možná McCarthy nemyslel. Lisp nebyl navržen tak, aby opravoval Fortranovy chyby; vypadalo to spíš jako vedlejší produkt snažení axiomatizovat výpočty.

Zdroj: www.habr.com

Přidat komentář