Што зрабіла Lisp асаблівым

«Найвялікшая з калі-небудзь створаных моў праграмавання«
- Alan Kay, "on Lisp"

Што зрабіла Lisp асаблівым

Калі Макарці распрацаваў Lisp у канцы 1950-х, ён радыкальна адрозніваўся ад існуючых моў, самай галоўнай з якіх быў Fortran.

Lisp увасобіў дзевяць новых ідэй:

1. Умоўныя выказванні (Conditionals). Умоўныя выказванні гэта if-then-else канструкцыя. Цяпер мы ўспрымаем іх як належнае. Яны былі вынайдзены Макарці падчас распрацоўкі Lisp. (Fortran у той час меў толькі goto-сцвярджэнні, цесна звязаныя з інструкцыяй галінавання на які ляжыць у аснове жалезе.) Макарці, будучы ў камітэце па Algol, унёс умоўныя выказванні ў Algol, адкуль яны распаўсюдзіліся на іншыя мовы.

2. Функцыянальныя тыпы (A function type). У Lisp'е функцыі гэта аб'екты першага класа – яны з'яўляюцца тыпам дадзеных, таксама як лікі, радкі і г.д., і маюць літаральнае ўяўленне, могуць захоўвацца ў зменных, могуць быць перададзеныя як аргументы, і.т.д.

3. Рэкурсія (Recursion). Рэкурсія, вядома, існавала як матэматычная канцэпцыя да Lisp'а, але Lisp была першай мовай праграмавання якая падтрымлівае яе. (Гэта магчыма маецца на ўвазе ў стварэнні функцый як аб'ектаў першага класа.)

4. Новая канцэпцыя зменных (A new concept of variables). У Lisp'е ўсе зменныя з'яўляюцца эфектыўнымі паказальнікамі. Значэнні - гэта тое, што ёсць у тыпаў, а не ў зменных, а прысваенне або звязванне зменных азначае капіраванне паказальнікаў, а не таго, на што яны паказваюць.

5. Зборка смецця (Garbage-collection).

6. Праграмы складаюцца з выразаў (Programs composed of expressions). Праграмы на Lisp'е гэта дрэвы выразаў, кожны з якіх вяртае значэнне. (Некаторыя Lisp-выразы могуць вяртаць множныя значэнні.) Гэта ўваходзіць у кантраст з Fortran'ам і з мноствам іншых паспяховых моў, якія адрозніваюць «выразы» і «сцвярджэнні».

Было натуральным мець такое адрозненне ў Fortran'е, таму што мова была лінейна-арыентаванай (не дзіўна для мовы, у якім фарматам уводу была перфакарта). Вы не маглі мець укладзеныя сцвярджэнні. І пакуль што вам патрабаваліся матэматычныя выразы для працы, не было сэнсу ў тым, каб прымушаць што-небудзь яшчэ вяртаць значэнне, таму што магло не быць чагосьці, што чакала вяртання.

Абмежаванні былі зняты са з'яўленнем блочна-структураваных моў, але да таго моманту было ўжо занадта позна. Адрозненне паміж выразамі і сцвярджэннямі ўжо замацавалася. Яно перайшло ад Fortran'а да Algol'у і далей да іх нашчадкаў.

Калі мова зроблена цалкам з выразаў, вы можаце складаць выразы як захочаце. Вы можаце напісаць альбо (выкарыстоўваючы сінтаксіс Дуга)

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

альбо

(= x (if foo 1 2))

7. Сімвольны тып (A symbol type). Сімвалы адрозніваюцца ад радкоў, у гэтым выпадку вы можаце праверыць на роўнасць, параўнаўшы паказальнікі.

8. Натацыя для кода (A notation for code) з выкарыстаннем дрэў з сімвалаў.

9. Уся мова заўсёды даступная (The whole language always available). Няма відавочнага адрознення паміж часам чытання, часам кампіляцыі і часам выканання. Вы можаце кампіляваць ці запускаць код падчас чытання, ці чытаць ці запускаць кода пакуль кампілюеце, ці чытаць ці кампіляваць код падчас выканання.

Запуск кода падчас чытання дазваляе карыстальнікам перапраграмаваць сінтаксіс Lisp'а; запуск кода падчас кампіляцыі гэта аснова для макрасаў; кампіляванне падчас выканання гэта аснова выкарыстання Lisp'аў як мовы пашырэння ў такіх праграмах як Emacs; і нарэшце, чытанне падчас выканання дазваляе праграмам узаемадзейнічаць, выкарыстаючы s-выразы, ідэя, нядаўна перавынайдзеная ў XML.

Заключэнне

Калі Lisp быў толькі вынайдзены, усе гэтыя ідэі былі моцна далёкія ад звычайных практык праграмавання, якія дыктаваліся жалезам, даступным у канцы 1950-х.

З часам мова па змаўчанні, увасобленая ў поспеху папулярных моў, паступова эвалюцыянавала ў бок Lisp. Пункты 1-5 зараз шырока распаўсюджаныя. Пункт 6 пачынае з'яўляцца ў мэйнстрыме. У Python'е ў некаторым выглядзе ёсць пункт 7, хоць прыдатнага сінтаксісу няма. Пункт 8, які (з пунктам 9) робіць магчымым макрасы ў Lisp'е, да гэтага часу ёсць толькі ў Lisp'е, магчыма таму што (а) ён патрабуе гэтыя дужкі ці чагосьці гэтак жа дрэннага, і (б) калі вы дадасце гэта апошняе павелічэнне магутнасці, то больш не зможаце сцвярджаць, што вынайшлі новую мову, а толькі распрацавалі новы дыялект Lisp'а; -)

Хоць гэта карысна для сучасных праграмістаў, дзіўна апісваць Lisp з пункта гледжання яго адрозненні ад выпадковых прыёмаў, прынятых у іншых мовах. Магчыма гэта не тое, аб чым думаў Макарці. Lisp не быў спраектаваны, каб выправіць памылкі Fortran'а; ён з'явіўся хутчэй як пабочны прадукт спробы аксіяматызаваць вылічэнні.

Крыніца: habr.com

Дадаць каментар