Открыть сервис

Виртуальная машина 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 интерпретирует байт-код последовательно, выполняя инструкции по мере их чтения. Интерпретатор реализован в виде цикла:

  1. Прочитать текущую инструкцию по счётчику команд.
  2. Выполнить соответствующую операцию.
  3. Увеличить счётчик команд на длину инструкции.
  4. Повторить.

Интерпретация обеспечивает переносимость, но может быть медленнее, чем компилируемый код. Для повышения производительности в некоторых реализациях (например, в VisualWorks) используется динамическая компиляция (JIT — Just-In-Time compilation), при которой часто выполняемые методы компилируются в машинный код.

Образ (image)

ВМ Smalltalk-80 работает с образом (image) — файлом, содержащим состояние всей системы: все объекты, классы, методы и глобальные переменные. Образ загружается в память при запуске ВМ и может быть сохранён в любой момент. Это позволяет разработчику продолжать работу с того же места, где она была прервана.

Образ Smalltalk-80 включает:

  • Библиотеку классов (около 200 классов в версии 1980 года).
  • Глобальные объекты (например, Smalltalk, Transcript, Processor).
  • Пользовательские объекты (созданные разработчиком).

Примитивы

Некоторые операции, критичные для производительности, реализованы как примитивы — встроенные функции ВМ, написанные на языке реализации (обычно C). Примитивы обрабатывают такие операции, как:

Примитивы вызываются из байт-кода с помощью специальной инструкции 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 →