Журнал «Компьютерра» N 8 от 27 февраля 2007 года
Шрифт:
Труднее всего оказалось воспринять отсутствие границы между инструментами и разрабатываемой программой. «А вдруг, - рассуждал я, - создаваемая программа сделает что-нибудь не так? Ведь тогда рухнет не только она, но и среда разработки!» На практике все оказалось не так страшно. В частности, все изменения пишутся в специальный журнал (change file), откуда в случае аварии виртуальной машины легко восстанавливаются.
Постепенно я стал понимать, что отсутствие границы между инструментом и созидаемым объектом - это чуть ли не главное, что есть в Смолтоке. Вокруг места, где не проходит эта граница, концентрируются вещи, составляющие дух и душу Smalltalk-системы.
Написание кода в отладчике - не эффектный кунштюк, а удобный и практичный способ программировать, когда можно вживую пообщаться с каждым из участвующих в приостановленном
Самое же главное в Смолтоке - это то, что через него программисты необратимо меняются к лучшему. Можно потом писать хоть на ассемблере, хоть на VBA, но это будут уже другой ассемблер и другой VBA. Знание Смолтока необходимо для глубины восприятия. Необходимо, но, конечно, не достаточно, потому что остаются еще Haskell и Erlang, OCaml и Oz, и Scheme, и еще много других путей вниз по кроличьей норе, прямиком в Страну Чудес.
Борис Беркгаут, компания «Транзас» (Санкт-Петербург), отдел ПО авиационных тренажеров
Академическое стремление иметь математически стройные средства программирования (к которым были бы применимы математические же методы проверки, доказательства, порождения и вывода) привели к созданию концепции декларативного программирования - идеологически стройного описания программы, которое «выполняется» неким умным компилятором-"думателем" [С термином есть некоторая путаница. Языки описания чего-либо, не являющиеся полноценными «языками программирования» (например, HTML/XML), также называют декларативными]. Разновидности (существенно разные): функциональное программирование - программа описывается как математическая функция, зависящая от других математических функций, затем вычисляется; логическое программирование - задается набор предикатов-утверждений, затем результат выводится из этих предикатов; программирование в ограничениях (constraint programming) - задаются только ограничения на результат, а компилятор вычисляет все результаты, удовлетворяющие этим ограничениям.
Из вышеперечисленных разновидностей лишь функциональное программирование воплотилось в широкую семью языков (языки-потомки «первого функционального» ML, максимально «идеологически чистый» Haskell, странный REFAL, практичный Erlang и другие [Lisp и его потомки постфактум тоже считаются функциональными]) и собрало широкое сообщество «функциональщиков». Сегодня термин «функциональное программирование» определяет как изначальную концепцию (программа-как-вычисление-функции), так и более широкий набор концепций (часть из них не являются обязательным свойством функциональных языков, но возникли именно в этой среде): функции как данные, анонимные функции, продолжения (continuations), сопоставление с образцом (pattern matching) и т. п.
Что до других способов программирования, традиционно называемых декларативными, то они оказались более узкоприменимы. К примеру, из языков общего назначения полностью и исключительно логическим является разве что Prolog; зато концепции логического программирования (и программирования в ограничениях) «окопались» во многих областях в форме библиотек к другим языкам и специализированных приложений.
Включение «привычных» средств в язык делает его ближе и привычнее простому пользователю, но не выразительнее. Выразительнее языка, чем Haskell, я не встречал. До недавних пор у Хаскелла была стратегия «avoid success at all costs», а Тони Хоар печально говорил: «I fear that Haskell is doomed to succeed»;
Глеб Алексеев,
компаниЯ 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++ класс - это сущность совершенно иного порядка, нежели объект; в Смоллтоке класс - это тоже объект, и обращаться с ним можно, как с любым другим объектом.
Сегодняшний Smalltalk - исследовательский язык для моделирования сложных систем; и язык «для детей» в виде красочной системы Squeak (как оно и было задумано с самого начала); некоторые интересные идеи современной веб-разработки воплощены в Smalltalk-фреймворке Seaside. Smalltalk породил несколько интересных «детей» - Self (язык с еще более простой объектной системой [Self воплощает концепции «прототипного объектно-ориентированного подхода», в котором есть только объекты, новые объекты порождаются «клонированием» старых; интересно, что изначальные концепции Smalltalk выглядели именно так, а «усложнение» произошло при поиске эффективной реализации. Так что в какой-то степени Self - это «возвращение к корням»]) и Strongtalk (диалект с возможностью статической проверки типов); первый «скорее мертв», второй - недавно был выпущен в open source и потихоньку «оживает».