Выбрать главу

Труднее всего оказалось воспринять отсутствие границы между инструментами и разрабатываемой программой. «А вдруг, — рассуждал я, — создаваемая программа сделает что-нибудь не так? Ведь тогда рухнет не только она, но и среда разработки!» На практике все оказалось не так страшно. В частности, все изменения пишутся в специальный журнал (change file), откуда в случае аварии виртуальной машины легко восстанавливаются.

Постепенно я стал понимать, что отсутствие границы между инструментом и созидаемым объектом — это чуть ли не главное, что есть в Смолтоке. Вокруг места, где не проходит эта граница, концентрируются вещи, составляющие дух и душу Smalltalk-системы.

Написание кода в отладчике — не эффектный кунштюк, а удобный и практичный способ программировать, когда можно вживую пообщаться с каждым из участвующих в приостановленном вычислении объектов, а не вспоминать мучительно, как называется нужный метод и что именно он возвращает. Возможность затачивать Инспектор под конкретные типы объектов — не просто полезная особенность, а путь к иному способу думать о графическом интерфейсе, когда каждый объект системы способен говорить с человеком на специфическом диалекте единого визуального языка (первоначальное понимание роли графического интерфейса, которое можно проследить в Smalltalk-76 и в Fabrik, было именно таким; теперь мы возвращаемся к сходным взглядам на новом витке спирали в таких средах, как Morphic и Oberon/Bluebottle).

Самое же главное в Смолтоке — это то, что через него программисты необратимо меняются к лучшему. Можно потом писать хоть на ассемблере, хоть на VBA, но это будут уже другой ассемблер и другой VBA. Знание Смолтока необходимо для глубины восприятия. Необходимо, но, конечно, не достаточно, потому что остаются еще Haskell и Erlang, OCaml и Oz, и Scheme, и еще много других путей вниз по кроличьей норе, прямиком в Страну Чудес.

Борис Беркгаут, компания «Транзас» (Санкт-Петербург), отдел ПО авиационных тренажеров

Декларация независимости

Академическое стремление иметь математически стройные средства программирования (к которым были бы применимы математические же методы проверки, доказательства, порождения и вывода) привели к созданию концепции декларативного программирования — идеологически стройного описания программы, которое «выполняется» неким умным компилятором-"думателем" [С термином есть некоторая путаница. Языки описания чего-либо, не являющиеся полноценными «языками программирования» (например, HTML/XML), также называют декларативными]. Разновидности (существенно разные): функциональное программирование — программа описывается как математическая функция, зависящая от других математических функций, затем вычисляется; логическое программирование — задается набор предикатов-утверждений, затем результат выводится из этих предикатов; программирование в ограничениях (constraint programming) — задаются только ограничения на результат, а компилятор вычисляет все результаты, удовлетворяющие этим ограничениям.

Из вышеперечисленных разновидностей лишь функциональное программирование воплотилось в широкую семью языков (языки-потомки «первого функционального» ML, максимально «идеологически чистый» Haskell, странный REFAL, практичный Erlang и другие [Lisp и его потомки постфактум тоже считаются функциональными]) и собрало широкое сообщество «функциональщиков». Сегодня термин «функциональное программирование» определяет как изначальную концепцию (программа-как-вычисление-функции), так и более широкий набор концепций (часть из них не являются обязательным свойством функциональных языков, но возникли именно в этой среде): функции как данные, анонимные функции, продолжения (continuations), сопоставление с образцом (pattern matching) и т. п.

Что до других способов программирования, традиционно называемых декларативными, то они оказались более узкоприменимы. К примеру, из языков общего назначения полностью и исключительно логическим является разве что Prolog; зато концепции логического программирования (и программирования в ограничениях) «окопались» во многих областях в форме библиотек к другим языкам и специализированных приложений.

Haskell

Включение «привычных» средств в язык делает его ближе и привычнее простому пользователю, но не выразительнее. Выразительнее языка, чем Haskell, я не встречал. До недавних пор у Хаскелла была стратегия «avoid success at all costs», а Тони Хоар печально говорил: «I fear that Haskell is doomed to succeed»; это язык, созданный geek’ами от Computer Science для geek’ов. И поэтому я, при всей любви к Хаскеллу, не могу переключиться на него полностью — без понимания теоретических основ CS я буду знать язык более чем посредственно. Сколько бы популяризаторы ни говорили, что для работы с Хаскеллом не нужны глубокие познания в математике, следует понимать, что потенциал языка будет использован далеко не полностью; дизайн языка и его библиотеки пропитан теорией категорий и универсальной алгеброй.

Глеб Алексеев,

компаниЯ Zoral (Киев)

Одним из критериев оценки языка для меня является лаконичность кода. Haskell — невероятно выразительный и элегантный язык. Дистанция между спецификацией задачи и ее реализацией сильно сокращена. Функции высшего порядка, частичное применение, алгебраические типы данных и сравнение с образцом позволяют писать декларации удивительно близко к оригиналу. Помимо этого вы получаете кучу бонусов, делающих жизнь приятной, — ленивость, строгая типизация без обязательной аннотации типов, полиморфизм. Помню восторг, который я испытал, увидев, что программа после первой же компиляции работала без ошибок. Это было невероятно! Позже я слышал похожие признания от других. TANSTAAFL [ «There Ain’t No Such Thing As A Free Lunch», то есть «Ничего не бывает бесплатно». — В.Ш.]. Для того чтобы начать писать на Haskell, приходится много учиться. Чересчур «другой» язык. Много нового. Совершенно иные подходы к обыденным вещам. Это одна из причин его сравнительно низкой распространенности. К сожалению, вряд ли здесь что-нибудь изменится.

Дмитрий Антонюк, Paragon Software Group

Лучшее детям

Не только академическое сообщество сильно, в пополнении копилки «бесполезных» (смайлик) языков. Smalltalk, «самый объектно-ориентированный язык», создавали люди, среди интересов которых были создание красивых и эффективных пользовательских интерфейсов, доступность компьютеров для детей и джазовая гитара. Алан Кей со товарищи работали в Xerox PARC (как раз в то время и в том месте изобретался весь современный пользовательский интерфейс); язык Smalltalk предназначался для обучения программированию детей; то есть обучению в смысле «сел и начал делать что-то интересное».

Отсюда и основные идеи Smalltalk: «все есть объект»; программа — это не исходный текст, который компилируется, а затем «исполняется», а «живое море объектов, с каждым из которых можно пообщаться». Работа со Smalltalk подразумевает «общение» с этим «живым морем» — средой, в которой можно посмотреть и изменить любой объект; процесс разработки и процесс выполнения суть одно. Этот подход, как можно заметить, существенно отличается от мэйнстримового ООП, с его акцентом на основную сущность — «класс», близкий родственник «модуля» из структурной парадигмы [Алан Кей, «как честный человек», среди предшественников Smalltalk указывает язык Simula, упомянутый в предыдущей статье как прародитель «мэйнстрим-ООП», — но классы и объекты Симулы с классами и объектами Смолтока роднит более терминология, нежели внутренние идеи. Большее влияние на архитектуру языка оказали Lisp, «детский язык» Logo, а в наибольшей степени — программа Sketchpad (см. врезку «Неязыки»)]. В C++ класс — это сущность совершенно иного порядка, нежели объект; в Смоллтоке класс — это тоже объект, и обращаться с ним можно, как с любым другим объектом.