Глобальность идеи и легкость реализации Лиспа способствовало образованию многочисленного сообщества «фанатов», использовавших любимый язык где ни попадя. В качестве внутреннего макроязыка разновидности Lisp встроены в Emacs и AutoCAD; одно из первых серьезных веб-приложений (viaweb) было написано на нем. За сорок лет споры о деталях и особенностях, практичности и чистоте привели к появлению бесчисленного множества диалектов, главные - Scheme (более изящный, используется в основном в учебе [До недавнего времени знаменитый курс MIT «Структура и интерпретация компьютерных программ» использовал именно Scheme. Месяц назад Scheme вроде бы заменили на Python. Times, they are changing]) и Common Lisp (в каком-то смысле более практичный, но и менее стройный), есть и «более экстремистские», вроде маленького-практичного newLISP или сверх-концептуально-чистого Qi.
Smalltalk
Бывает так: сначала ты «снаружи», вокруг все очень обычное, очень знакомое и скучное. А потом мимо проносится Белый Кролик, при часах и при жилете. Дальше известно что: погоня, несколько минут свободного падения вниз по кроличьей норе - и ты уже «внутри», а из привычного и знакомого остался только ты сам, да и это ненадолго. Такие переживания - когда за поворотом вдруг распахивается целый новый мир - составляют если не смысл жизни, то что-то вроде того.
Три года назад у меня было ощущение, что ничего радикально нового в области технологии разработки ПО мне уже не откроется, а мечта о гибкой, живой и мощной среде программирования… Что ж, на то она и мечта.
Потом случилось так, что я сменил место жительства, а с ним и работу. Там, где я оказался, Smalltalk - не просто инструмент, а жизненная позиция, и даже предмет поклонения. Несколько недель у меня ушло на преодоление собственных предрассудков. Я считал, что сборка мусора несовместима с гарантированными временными характеристиками, что полиморфные вызовы медленны - а тут у меня на глазах ядро авиационного тренажера бодро крутило цикл расчетов сорок раз в секунду.
Труднее всего оказалось воспринять отсутствие границы между инструментами и разрабатываемой программой. «А вдруг, - рассуждал я, - создаваемая программа сделает что-нибудь не так? Ведь тогда рухнет не только она, но и среда разработки!» На практике все оказалось не так страшно. В частности, все изменения пишутся в специальный журнал (change file), откуда в случае аварии виртуальной машины легко восстанавливаются.
Постепенно я стал понимать, что отсутствие границы между инструментом и созидаемым объектом - это чуть ли не главное, что есть в Смолтоке. Вокруг места, где не проходит эта граница, концентрируются вещи, составляющие дух и душу Smalltalk-системы.
Написание кода в отладчике - не эффектный кунштюк, а удобный и практичный способ программировать, когда можно вживую пообщаться с каждым из участвующих в приостановленном вычислении объектов, а не вспоминать мучительно, как называется нужный метод и что именно он возвращает. Возможность затачивать Инспектор под конкретные типы объектов - не просто полезная особенность, а путь к иному способу думать о графическом интерфейсе, когда каждый объект системы способен говорить с человеком на специфическом диалекте единого визуального языка (первоначальное понимание роли графического интерфейса, которое можно проследить в Smalltalk-76 и в Fabrik, было именно таким; теперь мы возвращаемся к сходным взглядам на новом витке спирали в таких средах, как Morphic и Oberon/Bluebottle).
Самое же главное в Смолтоке - это то, что через него программисты необратимо меняются к лучшему. Можно потом писать хоть на ассемблере, хоть на VBA, но это будут уже другой ассемблер и другой VBA. Знание Смолтока необходимо для глубины восприятия. Необходимо, но, конечно, не достаточно, потому что остаются еще Haskell и Erlang, OCaml и Oz, и Scheme, и еще много других путей вниз по кроличьей норе, прямиком в Страну Чудес.
Борис Беркгаут, компания «Транзас» (Санкт-Петербург), отдел ПО авиационных тренажеров
Декларация независимости
Академическое стремление иметь математически стройные средства программирования (к которым были бы применимы математические же методы проверки, доказательства, порождения и вывода) привели к созданию концепции декларативного программирования - идеологически стройного описания программы, которое «выполняется» неким умным компилятором-"думателем" [С термином есть некоторая путаница. Языки описания чего-либо, не являющиеся полноценными «языками программирования» (например, HTML/XML), также называют декларативными]. Разновидности (существенно разные): функциональное программирование - программа описывается как математическая функция, зависящая от других математических функций, затем вычисляется; логическое программирование - задается набор предикатов-утверждений, затем результат выводится из этих предикатов; программирование в ограничениях (constraint programming) - задаются только ограничения на результат, а компилятор вычисляет все результаты, удовлетворяющие этим ограничениям.
Читать дальше