Отсюда и основные идеи Smalltalk: 'все есть объект'; программа - это не исходный текст, который компилируется, а затем 'исполняется', а 'живое море объектов, с каждым из которых можно пообщаться'. Работа со Smalltalk подразумевает 'общение' с этим 'живым морем' - средой, в которой можно посмотреть и изменить любой объект; процесс разработки и процесс выполнения суть одно. Этот подход, как можно заметить, существенно отличается от мэйнстримового ООП, с его акцентом на основную сущность - 'класс', близкий родственник 'модуля' из структурной парадигмы [Алан Кей, 'как честный человек', среди предшественников Smalltalk указывает язык Simula, упомянутый в предыдущей статье как прародитель 'мэйнстрим-ООП', - но классы и объекты Симулы с классами и объектами Смолтока роднит более терминология, нежели внутренние идеи. Большее влияние на архитектуру языка оказали Lisp, 'детский язык' Logo, а в наибольшей степени - программа Sketchpad (см. врезку 'Неязыки')]. В C++ класс - это сущность совершенно иного порядка, нежели объект; в Смоллтоке класс - это тоже объект, и обращаться с ним можно, как с любым другим объектом.
Сегодняшний Smalltalk - исследовательский язык для моделирования сложных систем; и язык 'для детей' в виде красочной системы Squeak (как оно и было задумано с самого начала); некоторые интересные идеи современной веб-разработки воплощены в Smalltalk-фреймворке Seaside. Smalltalk породил несколько интересных 'детей' - Self (язык с еще более простой объектной системой [Self воплощает концепции 'прототипного объектно-ориентированного подхода', в котором есть только объекты, новые объекты порождаются 'клонированием' старых; интересно, что изначальные концепции Smalltalk выглядели именно так, а 'усложнение' произошло при поиске эффективной реализации. Так что в какой-то степени Self - это 'возвращение к корням']) и Strongtalk (диалект с возможностью статической проверки типов); первый 'скорее мертв', второй - недавно был выпущен в open source и потихоньку 'оживает'.
При обсуждении происхождения языков программирования друг от друга, их взаимного влияния, источников тех или иных идей зачастую остаются за кадром не-языки: отдельные программы, чья внутренняя архитектура или способ задания опций послужил 'вдохновляющим мотивом' для авторов знаменитых языков программирования.
В качестве иллюстрации упомянем программу Sketchpad, разработанную Иваном Сазерлендом в 1963 году для диссертации. Sketchpad не только стала первой программой для компьютерного рисования и реализовала первый графический интерфейс пользователя, но и вводила понятие объекта как основной единицы данных (при этом сама программа была написана на макроассемблере компьютера TX-2). Своим рождением концепция 'объектов в стиле Smalltalk' в немалой степени обязана именно Sketchpad’у (Алан Кей некоторое время работал вместе с Сазерлендом).
Еще один пример 'программы, которая повлияла на язык', - текстовый редактор ed в Unix, привнесший в 'широкие массы' (а также в языки AWK и Perl, далее везде) регулярные выражения как гибкий, универсальный (хоть и запутанный) способ обработки строковых данных.
И обратный, несколько неожиданный пример: наиболее широкое распространение функциональный подход к программированию получил не в каком-либо конкретном языке, а в электронных таблицах вроде Excel. Когда мы определяем одну ячейку как SUM, а другую как AVG и выполняем дальнейшие операции над этими значениями - мы занимаемся именно функциональным программированием (придумал не я, а один из микрософтовцев, разрабатывавших Haskell; см. http://research.microsoft.com/~simonpj /papers/excel/index.htm).
Судьба некоторых немэйнстримовых языков, построенных вокруг идей не слишком общих и глобальных, более печальна, нежели у описанных выше. Отработанная идея с благодарностью подхватывается одним (или несколькими) из более общеупотребимых или просто более новых языков и 'растворяется' в преемниках, причем исходный язык (а зачастую и его автор) становится 'достоянием истории', монстром, о котором мало кто помнит.
Как пример можно привести линейку Snobol-Icon, языков Ральфа Гриспвольда для обработки строк. В 70-х и начале 80-х эти языки были очень популярными среди разработчиков компиляторов и исследователей ИИ, а затем их идеи вобрал в себя юниксовый AWK (при близких по мощности возможностях обработки строк он наследовал также и Algol-линейку традиционных языков, то есть в целом был более привычен и прост для изучения), а через него эти идеи попали в Perl (наравне с идеями из редактора ed, см. врезку 'Неязыки'). Называя 'патриархов', Ральфа Гриспвольда часто забывают упомянуть (даже Тьюринговской премии у него не было), он умер несколько месяцев назад не то чтобы 'всеми забытым', но явно недооцененным героем.
Судьба языка APL за авторством Кеннета Айверсона (того самого, что написал 'Notation as a Tool of Thought') сложилась более счастливо - по крайней мере, 'Тьюринга' Айверсону дали. Язык, который расширял привычную математическую нотацию для работы с массивами (все его операторы были одно- двухсимвольными комбинациями, APL требовал особой клавиатуры со спецсимволами), иногда считался 'издевательством' и 'write-only' языком. Тем не менее 'нотация' Айверсона показала свою мощь на задачах, для которых предназначалась (сложные операции с массивами данных); годы спустя появились языки-наследники J (1990, создан Айверсоном как более простая и логичная версия APL) и K (1993, создан учеником Айверсона Артуром Уитни как более простая и логичная версия J), имеющие ограниченную, но устойчивую популярность. На K, к слову, написана коммерческая РСУБД kdb, вроде как являющаяся самой быстрой в мире; по слухам, код ее составляет 26 файлов с однобуквенными именами [Отгадать, какие именно буквы использованы, оставляем как домашнее задание внимательному читателю], в каждом из которых - всего одна страница.
И наконец, для полноты картины упомянем язык Forth, который стоит несколько особняком - по 'глобальности задумки' (есть только стек и ничего кроме стека) он находится на уровне Лиспа (по странности внешнего вида - тоже), а по 'локальности последствий' - где-то в районе Snobol и APL. Сегодняшнее использование Forth смахивает на 'развлечение для понимающих'; языки, на которые повлияли концепции Форта, - несколько экспериментальных гибридов (Kevo, Joy, Factor) да PostScript, язык описания страниц для печатающих устройств.
Lisp привлекает своим минималистичным устройством: это самый простой язык с GC. В нем нет ничего наносного, никаких надуманных конструкций, служащих одной цели. Благодаря этому на нем можно реализовать любую парадигму, любое современное свойство других языков программирования. И даже гармонично объединять такие противоречащие друг другу концепции, как функциональный и императивный стили, динамическую и статическую типизации, ленивые вычисления и ООП.
Программируя на Лиспе, просто невозможно зайти в тупик: язык будет поддерживать тот стиль программирования, который вы сами для себя выберете или придумаете. Понятно, что такой подход требует от программиста самых свежих знаний для правильной и лаконичной реализации своих идей, но никто еще не жаловался на то, что ему приходится развиваться.
Те, кто хорошо знают и умеют применять Лисп, никогда не скажут, что какой-то язык может его полностью заменить, что Лисп устарел. Даже если такой программист использует в повседневной практике другой язык, значит, этот язык лучше подходит для решаемых задач или хорошо реализует полюбившуюся программисту парадигму.
Модернистская традиция в программировании не является ни редкой, ни бедной, ни вымирающей.