Smalltalk-80: The Language and its Implementation
Smalltalk-80 — это объектно-ориентированный язык программирования и среда разработки, выпущенные в 1980 году компанией Xerox PARC. Является второй стабильной версией языка Smalltalk (после Smalltalk-72 и Smalltalk-76) и считается эталонной реализацией, заложившей основы современного объектно-ориентированного программирования. Книга «Smalltalk-80: The Language and its Implementation» (авторы — Адель Голдберг, Дэвид Робсон и др.) стала официальной спецификацией языка и описанием его виртуальной машины, оказав значительное влияние на развитие языков Java, C++, Objective-C и Python.
История
Предпосылки создания
В 1970-х годах в исследовательском центре Xerox PARC (Palo Alto Research Center) под руководством Алана Кея разрабатывалась концепция «персонального компьютера для всех возрастов». В рамках проекта Dynabook были созданы первые версии языка Smalltalk (Smalltalk-72, Smalltalk-76), которые уже использовали идеи объектов, сообщений и динамической типизации. Однако к концу 1970-х годов стало очевидно, что язык нуждается в стандартизации и документировании для распространения за пределами лаборатории.
Разработка и выпуск
В 1979 году группа инженеров Xerox PARC (Адель Голдберг, Дэвид Робсон, Дэн Ингаллс, Тед Кэлер и др.) начала работу над третьей версией языка, получившей название Smalltalk-80. Основные цели:
- Упрощение синтаксиса по сравнению с Smalltalk-76.
- Создание переносимой виртуальной машины (VM), написанной на подмножестве Smalltalk.
- Разработка полной среды разработки (IDE), включающей редактор кода, отладчик, браузер классов и инспектор объектов.
В 1980 году вышла одноимённая книга «Smalltalk-80: The Language and its Implementation», которая содержала:
- Полное описание синтаксиса и семантики языка.
- Исходный код виртуальной машины на языке Smalltalk.
- Спецификацию байт-кода и системы объектной памяти.
Влияние на индустрию
Хотя Smalltalk-80 не получил массового коммерческого распространения (из-за высокой стоимости лицензий Xerox и требований к аппаратному обеспечению), его идеи были заимствованы:
- Java (1995) — заимствовал виртуальную машину, сборку мусора и концепцию «всё есть объект».
- Objective-C (1983) — прямой наследник Smalltalk-80 в синтаксисе сообщений.
- Python (1991) — динамическая типизация и интерактивная среда.
- Ruby (1995) — чистая объектная модель и блоки кода.
Архитектура виртуальной машины
Основные компоненты
Виртуальная машина Smalltalk-80 (VM) состоит из трёх ключевых частей:
- Интерпретатор байт-кода — выполняет инструкции, сгенерированные компилятором.
- Менеджер памяти — реализует автоматическое управление памятью (сборку мусора) на основе поколенческой модели.
- Объектная память (Object Memory) — хранит все объекты, классы и методы в виде графа объектов.
Формат объекта
Каждый объект в Smalltalk-80 имеет заголовок (header) из 32 бит, содержащий:
- Указатель на класс (8 бит) — идентификатор класса объекта.
- Флаги (4 бита) — для сборки мусора и блокировки.
- Размер (20 бит) — количество полей (слотов) объекта.
Байт-код
Smalltalk-80 использует 256 байт-кодов (из которых 128 зарезервированы для часто используемых инструкций). Ключевые категории:
- Отправка сообщений (send, super send) — 32 кода.
- Управление стеком (push, pop, dup) — 16 кодов.
- Арифметика (add, sub, mul, div) — 8 кодов.
- Управление потоком (jump, jump if true/false) — 8 кодов.
Синтаксис и семантика
Основные конструкции
Smalltalk-80 использует минималистичный синтаксис, основанный на трёх типах сообщений:
- Унарные — без аргументов:
object message. - Бинарные — с одним аргументом:
object + argument. - Ключевые — с несколькими аргументами:
object at: index put: value.
Пример кода: ``smalltalk "Создание списка чисел" numbers := OrderedCollection new. numbers add: 1; add: 2; add: 3. "Вычисление суммы" sum := numbers inject: 0 into: [:acc :each | acc + each]. ``
Классы и метаклассы
В Smalltalk-80 каждый класс является объектом класса Metaclass. Иерархия:
- Классы — описывают структуру и поведение экземпляров.
- Метаклассы — описывают поведение самих классов (например, методы создания экземпляров).
- Класс Object — корневой класс всей иерархии.
Динамическая типизация
Все переменные в Smalltalk-80 являются ссылками на объекты. Тип проверяется только во время выполнения при отправке сообщения. Это позволяет реализовывать полиморфизм без наследования (так называемая «утиная типизация»).
Среда разработки
Инструменты
Smalltalk-80 включает в себя интегрированную среду разработки (IDE), которая работает в реальном времени:
- Браузер классов — просмотр и редактирование иерархии классов.
- Редактор кода — написание методов с подсветкой синтаксиса.
- Отладчик — пошаговое выполнение с просмотром стека вызовов.
- Инспектор объектов — просмотр и изменение состояния объектов.
- Системный браузер — управление пакетами и версиями.
Живая система
Smalltalk-80 является «живой» системой (live system): весь код хранится в образе (image) — файле, содержащем все объекты в сериализованном виде. Разработчик может изменять код во время выполнения, не перезапуская среду. Это свойство было унаследовано от Lisp и стало основой для современных сред (например, Pharo, Squeak).
Применение
Образовательные цели
Smalltalk-80 активно использовался в 1980-х годах для обучения объектно-ориентированному программированию в университетах (Стэнфорд, MIT, Калифорнийский университет в Беркли). Книга «Smalltalk-80: The Language and its Implementation» служила учебным пособием.
Прототипирование
Благодаря быстрой среде разработки, Smalltalk-80 применялся для создания прототипов графических интерфейсов, игр и систем управления. Например, компания Apple использовала Smalltalk-80 для прототипирования интерфейса Lisa.
Научные исследования
Smalltalk-80 стал платформой для исследований в области:
- Распределённых систем — проект «Smalltalk-80 Network».
- Графических интерфейсов — работа с окнами, меню и событиями.
- Методологий разработки — экстремальное программирование (XP) и рефакторинг.
Критика
Производительность
Интерпретатор байт-кода Smalltalk-80 работал медленнее, чем компилируемые языки (C, Pascal). Это ограничивало применение в системах реального времени. Позднее были разработаны JIT-компиляторы (например, в системе VisualWorks), но они не устранили проблему полностью.
Сложность переносимости
Виртуальная машина Smalltalk-80 была написана на подмножестве Smalltalk, что требовало написания «загрузчика» (bootstrap) на ассемблере для каждой новой платформы. Это замедлило распространение языка на не-Xerox компьютеры.
Отсутствие статической типизации
Динамическая типизация приводила к ошибкам времени выполнения, которые в статически типизированных языках (Java, C++) обнаруживались на этапе компиляции. Это критиковалось сторонниками строгой типизации.
Наследие
Современные реализации
- Squeak (1996) — открытая реализация Smalltalk-80, написанная на самом себе.
- Pharo (2008) — форк Squeak, ориентированный на промышленное использование.
- VisualWorks (1990) — коммерческая реализация от Cincom Systems.
Влияние на языки
- Java — виртуальная машина, сборка мусора, байт-код.
- C# — свойства, события, LINQ (частично).
- Ruby — блоки кода, итераторы, динамическая типизация.
- Python — интерактивная среда, динамическая типизация.
Интересные факты
- Книга «Smalltalk-80: The Language and its Implementation» была издана в 1983 году издательством Addison-Wesley и до сих пор считается одним из наиболее полных описаний объектно-ориентированной системы.
- В 1981 году журнал Byte посвятил Smalltalk-80 целый номер, что способствовало популяризации языка.
- Smalltalk-80 стал первой системой, в которой использовалась концепция «рефакторинга» (перестройка кода без изменения поведения).
Источники
- Goldberg, A., Robson, D. «Smalltalk-80: The Language and its Implementation». Addison-Wesley, 1983.
- Kay, A. «The Early History of Smalltalk». ACM SIGPLAN Notices, 1993.
- Ingalls, D. «The Smalltalk-80 System». Byte Magazine, 1981.
- «Smalltalk-80: The Interactive Programming Environment». Xerox PARC Technical Report, 1980.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →