Виртуальная машина Smalltalk-80
Виртуальная машина Smalltalk-80 — это программная среда исполнения, реализующая виртуальный процессор для объектно-ориентированного языка программирования Smalltalk-80. Она представляет собой интерпретатор байт-кода, управляющий динамической памятью (кучей) и обеспечивающий выполнение кода в единой среде, объединяющей разработку и исполнение программ. Виртуальная машина (ВМ) Smalltalk-80 является ключевым компонентом системы Smalltalk-80, которая была разработана в исследовательском центре Xerox PARC (Palo Alto Research Center) в конце 1970-х — начале 1980-х годов.
История
Первая версия Smalltalk была создана Аланом Кеем, Дэном Ингаллсом, Адель Голдберг и другими исследователями в Xerox PARC в начале 1970-х годов. К 1980 году была выпущена спецификация Smalltalk-80, которая включала описание виртуальной машины, языка программирования и библиотеки классов. В отличие от предыдущих версий, Smalltalk-80 был полностью реализован на виртуальной машине, что обеспечивало переносимость между различными аппаратными платформами.
Первая реализация ВМ Smalltalk-80 была написана на языке программирования C и работала на компьютерах Xerox Alto и Dorado. В 1983 году компания Apple Computer выпустила реализацию Smalltalk-80 для Lisa, а затем для Macintosh. В 1987 году компания ParcPlace Systems (основанная бывшими сотрудниками Xerox PARC) начала коммерческое распространение Smalltalk-80, включая виртуальную машину.
В 1990-х годах появились открытые реализации, такие как Squeak (1996), написанная на самом Smalltalk и транслируемая в C. В 2000-х годах были разработаны современные реализации, включая Pharo (2008) и GemStone/S (коммерческая система с поддержкой персистентности).
Архитектура
Байт-код
Виртуальная машина Smalltalk-80 исполняет байт-код, который представляет собой последовательность однобайтовых инструкций. Каждая инструкция кодирует простую операцию, такую как отправка сообщения, создание объекта, присваивание переменной или арифметическое действие. Байт-код генерируется компилятором из исходного кода Smalltalk.
Формат байт-кода включает:
- Инструкции отправки сообщений (например,
sendс указанием селектора и числа аргументов). - Инструкции работы со стеком (push, pop, dup).
- Инструкции управления потоком (условные переходы, возврат из метода).
- Инструкции создания объектов (new, new:).
- Инструкции доступа к переменным (instance variable access, temporary variable access).
Стек и контексты
ВМ Smalltalk-80 использует стековый подход для выполнения методов. Каждый вызов метода создаёт новый контекст (объект класса MethodContext), который хранит:
- Указатель на метод (объект класса
CompiledMethod). - Указатель на получателя сообщения (
self). - Массив временных переменных.
- Стек операндов (локальный стек контекста).
- Счётчик команд (индекс текущей инструкции в байт-коде).
Контексты образуют цепочку вызовов (call stack). В отличие от традиционных стеков, в Smalltalk-80 контексты являются объектами, что позволяет реализовать такие механизмы, как продолжения (continuations) и исключения.
Управление памятью
ВМ Smalltalk-80 управляет памятью автоматически с помощью сборщика мусора (garbage collector). Память делится на две области:
- Новое пространство (new space) — для недавно созданных объектов. Сборка мусора в этой области выполняется часто (по поколенческому принципу).
- Старое пространство (old space) — для долгоживущих объектов. Сборка мусора здесь выполняется реже, но требует полного обхода всех объектов.
Сборщик мусора использует алгоритм «копирующий сборщик» (copying collector) для нового пространства и «маркировка-очистка» (mark-and-sweep) для старого. В современных реализациях (например, Pharo) применяются более сложные алгоритмы, такие как поколенческая сборка с инкрементальной маркировкой.
Объектная модель
ВМ Smalltalk-80 реализует объектную модель, в которой всё является объектами, включая числа, символы, классы и методы. Каждый объект имеет:
- Указатель на класс (объект класса, определяющий поведение).
- Слоты экземпляра (instance variables) — массив указателей на другие объекты.
Классы также являются объектами и наследуются от класса Class. Методы хранятся как объекты класса CompiledMethod, содержащие байт-код и метаданные (число аргументов, число временных переменных, литералы).
Реализация
Интерпретация
ВМ Smalltalk-80 интерпретирует байт-код последовательно, выполняя инструкции по мере их чтения. Интерпретатор реализован в виде цикла:
- Прочитать текущую инструкцию по счётчику команд.
- Выполнить соответствующую операцию.
- Увеличить счётчик команд на длину инструкции.
- Повторить.
Интерпретация обеспечивает переносимость, но может быть медленнее, чем компилируемый код. Для повышения производительности в некоторых реализациях (например, в VisualWorks) используется динамическая компиляция (JIT — Just-In-Time compilation), при которой часто выполняемые методы компилируются в машинный код.
Образ (image)
ВМ Smalltalk-80 работает с образом (image) — файлом, содержащим состояние всей системы: все объекты, классы, методы и глобальные переменные. Образ загружается в память при запуске ВМ и может быть сохранён в любой момент. Это позволяет разработчику продолжать работу с того же места, где она была прервана.
Образ Smalltalk-80 включает:
- Библиотеку классов (около 200 классов в версии 1980 года).
- Глобальные объекты (например,
Smalltalk,Transcript,Processor). - Пользовательские объекты (созданные разработчиком).
Примитивы
Некоторые операции, критичные для производительности, реализованы как примитивы — встроенные функции ВМ, написанные на языке реализации (обычно C). Примитивы обрабатывают такие операции, как:
- Арифметика с целыми числами (SmallInteger).
- Создание массивов и строк.
- Работа с файловой системой.
- Операции ввода-вывода.
Примитивы вызываются из байт-кода с помощью специальной инструкции primitive. Если примитив не может быть выполнен (например, из-за неверного типа аргумента), ВМ возвращается к интерпретации.
Применение
Разработка программного обеспечения
ВМ Smalltalk-80 используется в среде разработки Smalltalk, которая включает редактор кода, отладчик, браузер классов и инспектор объектов. Разработка ведётся в живом окружении: изменения кода применяются мгновенно, без этапа компиляции и перезагрузки.
Обучение и исследования
Smalltalk-80 и его виртуальная машина широко использовались в академических кругах для изучения объектно-ориентированного программирования, динамических языков и виртуальных машин. Многие концепции, такие как рефлексия, метапрограммирование и динамическая типизация, были впервые реализованы в Smalltalk-80.
Коммерческие системы
На основе ВМ Smalltalk-80 были построены коммерческие продукты, такие как:
- VisualWorks (Cincom Systems) — среда разработки для предприятий.
- GemStone/S (GemTalk Systems) — объектно-ориентированная база данных с поддержкой Smalltalk.
- VA Smalltalk (Instantiations) — среда для разработки приложений.
Интересные факты
- ВМ Smalltalk-80 была одной из первых виртуальных машин, реализующих поколенческую сборку мусора, что значительно повысило производительность по сравнению с ранними системами.
- Концепция образа (image) была позаимствована из Smalltalk-80 и используется в других системах, таких как Lisp Machine и виртуальная машина Java (в виде сериализации).
- В 1983 году компания Xerox выпустила спецификацию Smalltalk-80 в виде книги «Smalltalk-80: The Language and its Implementation» (авторы Адель Голдберг и Дэвид Робсон), которая стала стандартом для реализации.
- Современная реализация Pharo (основанная на Squeak) поддерживает работу на ARM-процессорах, что позволяет запускать Smalltalk на мобильных устройствах.
Критика
ВМ Smalltalk-80 критикуется за низкую производительность по сравнению с компилируемыми языками (например, C++ или Java). Интерпретация байт-кода и динамическая типизация приводят к накладным расходам, которые могут быть неприемлемы для высоконагруженных систем. Кроме того, образ (image) создаёт проблемы с версионированием и совместной работой, так как изменения в образе не всегда легко отследить.
Источники
- Goldberg, A., & Robson, D. (1983). Smalltalk-80: The Language and its Implementation. Addison-Wesley.
- Ingalls, D. (1981). Design Principles of the Smalltalk-80 System. Byte Magazine.
- Krasner, G. (1983). The Smalltalk-80 Virtual Machine. BYTE Publications.
- Ducasse, S., & Nierstrasz, O. (2005). Squeak: A Language for Communication and Collaboration. Springer.
- Pharo Project. (2023). Pharo Virtual Machine Architecture. Pharo.org.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →