вторник, 8 мая 2007 г.

Smalltalk, въезд

Ну что. Расскажу я вам немного про Смоллтолк. Наверное, все (нормальные) программисты слышали такое слово как Смоллтолк, и что это есть дедушка всех ООП языков. Все это так, но мало кто знает, что это действительно очень концептуальный и интересный язык.
Что же в нем такого интересного? В общем то основные фичи языка можно прочитать тут и тут. В двух словах: все - суть объекты, которые общаются посредством сообщений (эквивалент сообщения - вызов метода).
Интересное начинается дальше. В смоллтолке все программы как бы неразрывны, более того, в смоллтолке все есть одна большая неразрывная программа. Другими словами, эта большая программа - смоллтолк-система, которая вертится на виртуальной машине. Виртуальная машина, как вы могли догадаться, написана на смоллтолке :-). При этом С-рантайм, на котором собственно вертится эта виртуальная машина очень маленький, например у Squeak исполняемый файл весит всего 1 Мб, что даже меньше чем размер текущей версии флэш-плеера!!! Основная же функциональность вынесена в виртуальную машину, которая в Squeak на данный момент весит ~17 Мб. За счет такого положения дел Squeak чрезвычайно хорошо портируем ). Похожим может похвастать Java. В ней тоже основные библиотеки (коллекции, IO, регекспы, дата-время, графич. библиотека) написаны на ней самой, благо скорость работы Java'ы это позволяет. Преимущества такого подхода очевидны. На текущий момент ни питон ни руби не могут похвастать подобным (. Подробнее об архитектуре можно прочитать тут и тут.
Однако, отвлеклись )). Архитектура смоллтолка в реализации Squeak выглядит так: на маленьком си-рантайменном ядре вертится виртуальная машина, на виртуальной машине вертится смоллтолк-система.
Сама смоллтолк-система тоже очень интересная сущность. Это исключительно динамичная (абсолютно все параметры системы можно менять на лету) система. Сказать кратко - это мини-ось, а что, в качестве шелла Workspace+Transcript, в качестве скриптового языка - его величество, Смоллтолк, рабочий стол, Morphic'овские окошки, графика (1, 2, 3))) Только не смейтесь, реализация в виде ОС тоже есть).
В смоллтолке реализована так называемая инкрементальная компиляция. Т.е. создавать классы и методы, а так-же менять методы вы можете на лету. При этом каждый раз, когда Вы говорите системе Accept некоторый код, этот код компилируется. Это возможно, потому что в Смоллтолк-системе существует порожденный экземпляр компилятора, который и выполняет данную работу)) Продолжая параллели с Java'ой - в джаве тоже замечательно, что компилируя проект, вы компилируете только еще не скомпилированные классы, при этом вам совершенно не нужно иметь исходники используемых библиотек.
Кроме того Смоллтолк предоставляет поистине невообразимые, чудовищные, колоссальные, уникальные, невероятные (эко меня торкнуло) средства для интроспекции уже работающей программы (кода). Тем более невероятно, вы можете воздействовать на работающую программу (изменять ее параметры) прямо на лету, и вам для этого не нужно ставить брекпойнты, проходить в пошаговом режиме (как в Java), вы как бы можете вклиниваться в работающую программу и подхачивать ее, не останавливая. Небольшой наглядный пример. Перед вами окошко, в котором летают шарики, отбаваясь от стенок (типа, модель газа). Вы в состоянии затормозить часть шариков, удалить, перекрасить, наблюдать за изменением их скоростей, все это на лету (Используя Inspect It, Explore It).
И вот таким динамизмом эта среда пронизана польностью ).
Что еще интересного. Исключения. В смоллтолке они особенные. Взять Java'у. В ней, если произошло исключение, стек вызовов методов как бы "раскручивается", и мы попадаем в некоторый catch блок. В смоллтолке все хитрее!! Там стек не раскручивается. И после произошедшего исключения вы можете продолжить выполнение программы. Пример. Вы написали код, запускаете - упс, исключение - перед вами возникает окошко с названием исключения, стеком вызовов, и тремя кнопками (Proceed, Abandon, Debug). Вы по стеку вызовов перемещаетесь в точку возникновения исключения, исправляете, делаете Accept, и жмете Proceed, программа побежала дальше. Красота )) В какой Java'е, Python'е, Ruby это возможно?
Ну и последнее. Когда вы выходите из системы она (система) сохраняется на диск в виде образа. Образ - это есть дамп запущенной (работающей) системы! Там хранится весь введенный вами код, все запущенные программы, все установленные пакеты, и т.д. По сути вся система (та самая большая живая неразрывная программа) сериализуется на диск. А при следующем запуске загружается! Это очень удобно, хоть и довольно непривычно. (Предствьте, у вас запущен сервер. Вы выключаете систему, затем через время включаете, и севрер вновь запущен как ни в чем не бывало). Можно иметь несколько образов с разным набором установленного ПО, или с разной конфигурацией, кроме того разные довольно большие проекты (Seaside, Croquet) имеют обыкновение распространяться в виде отдельных образов, хотя обычно их можно установить и как пакеты.
Ладно, пока достаточно ). Тут еще не затронуты вопросы о континуациях (продолжениях), блоках кода (замыканиях) и других интересных вещах. Но хорошего по немножку. До связи!
UPD. Сдается мне в архитектуру вкралась досадная неточность, на самом деле, виртуальная машина написанная на смоллтолке автоматически конвертируется в исходники си, которые затем компилируются в исполняемый код. Это удобно, т.к. можно отлаживать виртуальную машину в смоллтолк-среде, а потом когда все работает как надо автоматически получить корректные ее си-исходники. Вот так то)

7 коммент.:

nikchern комментирует...

Очень качественно, чел!
Кратко, но емко.
Неплохо было бы примеры все же сопроводить скриншотами.

mysterio комментирует...

хорошо написали, сам вторую неделю вожусь со смолтоком (на работе пишу на руби, вот и стали интересны корни)

Maniac комментирует...

> На текущий момент ни питон ни руби не могут похвастать подобным

Кхм... Вообще-то, у Питона с портируемостью все очень хорошо. Помимо трех основных платформ он работает на куче всяких минорных вещей от древних юниксов до телефонов Нокиа.

При этом он не только "запускается", там еще и стандартная библиотека большей частью кроссплатформенная, включая доступ к ОС, файлам, сигналам, тредам...

xonix комментирует...

Иван, Вы правы на счет Питона, и его распространенности. Тут я лишь хотел подчеркнуть тот факт, что основная часть библиотеки реализована на самом языке (в Smalltalk'e, Java'е), и это все же облегчает портируемость и удобство разработки (вы имеете полный доступ к исходникам реализации).

Maniac комментирует...

Собственно, то же верно и для Питона: очень большая часть стандартной библиотеки реализована на Питоне. На Си переписываются только критичные к производительности вещи, регулярные выражения например или сериализация объектов.

Анонимный комментирует...

Экстракт в следующем: я хоштел бы узнать про цпну домена netormozi.com и про моишансы на его покупку. Также я хотел уточнить по покоду: входит ли в эту смму самостоятельно сайт либо нет? Желание, ответьте в комментариях. А то мыльник батахлит.

Анонимный комментирует...

Заходи к нам:
http://plugtarpa.chez.com/