Следующая статья, написанная Дэвидом Баком, основателем и генеральным директором Simberon, крупного производителя Smalltalk, базирующегося в Оттаве, Канада, посвящена тому, как можно заставить Smalltalk работать на мобильных устройствах. Дэвид использовал Cincom Smalltalk (VisualWorks) для разработки мобильного игрового приложения под названием HexSolve. Это великолепный пример универсальности Smalltalk для решения самых разных проблемных областей.

Игра теперь доступна в Google Play и App Store от Apple.

HexSolve был написан на Smalltalk, и люди спрашивали меня, как можно запустить Smalltalk на мобильных устройствах. Я подумал, что напишу небольшое описание технологии, лежащей в основе этого.

Я много лет хотел иметь возможность запускать Smalltalk на Android и iOS. Я наконец решил что-то с этим сделать. Я выбрал VisualWorks для своей среды разработки. К сожалению, iOS не поддерживает динамическую компиляцию, поэтому запустить обычную виртуальную машину VisualWorks на iOS практически невозможно. Я решил обойти проблему, написав собственную виртуальную машину.

Моя виртуальная машина написана на C. Она интерпретирует те же байт-коды, что и созданные VisualWorks, поэтому я могу использовать компилятор VisualWorks для компиляции всего кода для мобильного Smalltalk. Как чистый интерпретатор, я обхожу проблему динамической компиляции на iOS. Apple не возражает против интерпретатора, если весь код, который он интерпретирует, поставляется вместе с продуктом, а не загружается динамически.

Разработка кода Smalltalk начинается в VisualWorks. У меня есть собственный класс Object (в моем собственном пространстве имен), а также мои собственные копии других базовых классов (True, False, UndefinedObject и т. Д.). Я сделал это, потому что у меня был лучший контроль над реализацией, чем если бы я просто использовал базовый код VisualWorks. Если бы я использовал обычные классы VisualWorks, мне пришлось бы вводить все больше и больше базового кода, чтобы эти классы работали. Просто слишком много «привязанных условий», чтобы делать это эффективно.

У методов, начинающихся с символа подчеркивания ($ _), подчеркивание будет удалено при перемещении изображения на мобильное устройство. Это позволяет мне иметь одну версию для Mobile Smalltalk и другую версию для VisualWorks. Вы можете себе представить, что было бы плохо, если бы я переопределил at: put: в VisualWorks.

У меня есть утилита ImageBuilder, которая берет весь код из пакетов «SimTalk Remote Core» (базовый код Smalltalk) и «SimTalk HexSolve» (сама игра), упаковывает их в специальный 64-битный формат изображения и записывает изображение в файл. Затем я могу использовать AndroidStudio или XCode, чтобы включить это изображение в качестве ресурса для доставки на устройство вместе с интерпретатором.

Сам интерпретатор представляет собой 64-битный образ. Он использует непосредственные объекты (помеченные объекты, которые помещаются в указатель объекта) для SmallInteger, Character и Float. Это позволяет мне выполнять более быстрые операции с этими объектами без выделения памяти.

Игра использует примитивы Smalltalk для взаимодействия с OpenGL ES, который работает как на Android, так и на iOS. Для текста я использую Freetype, который скомпилирован и поставляется вместе с игрой. Freetype создаст изображения для персонажей, которые я могу собрать и кэшировать в объекте Smalltalk Image. Затем я визуализирую эти изображения как текстуры OpenGL.

Мой мобильный Smalltalk является однопоточным - нет таких вещей, как fork, Process или ProcessManager. Фактически, Smalltalk полностью выполняет функцию обратного вызова ОС. Когда ОС определяет, что что-то произошло (событие касания, кнопка или тайм-аут), она выполняет обратный вызов в моей виртуальной машине. ВМ создает объект Event, помещает его в известное место на изображении и запускает интерпретатор. Затем интерпретатор считывает событие, отправляет его, при необходимости повторно визуализирует экран, затем вызывает приостановку, которая возвращается из обратного вызова ОС. Больше ничего не происходит до следующего обратного вызова ОС.

Некоторые люди спрашивали меня, когда я выпущу эту технологию, чтобы они могли ее использовать. Извините, но я не собираюсь этого делать. Это для внутреннего использования, чтобы написать код Smalltalk для Android и iOS. У меня будет несколько проблем, если я попытаюсь коммерциализировать технологию разработки:

  1. Вы не можете разрабатывать код в этой среде без лицензии VisualWorks. У меня есть такая лицензия в Cincom, но трудно сказать другим разработчикам, что им нужна лицензия на VisualWorks плюс лицензия на мою среду мобильной разработки, и что ее трудно обеспечить.
  2. Я реализовал интерфейсы для API, которые мне нужны в ОС, но не для всего. Другим разработчикам, вероятно, понадобится доступ к акселерометрам, GPS, Интернету, камерам и другим вещам. У меня не может быть хорошего коммерческого продукта без этих интерфейсов, а писать эти интерфейсы на основе предположений - слишком большая работа.
  3. Слишком много компаний умерло, пытаясь предоставить разработчикам инструменты для улучшения среды Smalltalk. Рынок недостаточно велик, чтобы оправдать усилия.
  4. Если честно, у разработчиков программного обеспечения плохие клиенты. Они, как правило, очень требовательны ко всему, что им нужно, и обычно не любят платить деньги за то, что получают. Они привыкли к тому, что среды разработки программного обеспечения являются бесплатными и имеют открытый исходный код, и не хотят платить за разработку и поддержку своего набора инструментов.
  5. Я предпочитаю создавать веселые прибыльные игры, чем создавать среду разработки, которую другие люди будут использовать для создания веселых прибыльных игр.

Вся графика для HexSolve была отрисована с использованием POV-Ray.

Надеюсь, это ответит на большинство ваших вопросов. Приятного общения на языке Smalltalking.