После трёх лет неторопливой разработки вышла версия 1.0 моего скриптового языка Umka. Это статически типизированный язык, предназначенный для встраивания в программы на C/C++. Синтаксис и некоторые особенности семантики Umka были вдохновлены языком Go, однако Umka никак не зависит от экосистемы Go и не требует для работы ничего, кроме стандартной библиотеки C.
Основным применением языка стал игровой фреймворк Tophat, созданный Марком Машкаринцем. Версия Tophat 1.0 вышла одновременно с Umka. Это очень простой модульный фреймворк для создания 2D игр. Несколько мини-игр на нём были написаны для участия в джемах. Сейчас в разработке находятся два более крупных игровых проекта — платформер-головоломка и игра о диспетчеризации железнодорожного движения.
Язык
Первый вопрос, на который мне регулярно приходится отвечать, как только заходит речь об Umka: зачем нужен новый язык, если есть Lua? Вопрос закономерен, поскольку Umka претендует на ту же нишу встраиваемых скриптовых языков, где почти безраздельно господствует Lua.
Основное отличие Umka — статическая типизация и вытекающие из неё преимущества:
Обнаружение ошибок типов на этапе трансляции программы, а не на этапе исполнения
Ясность намерений программиста (например, при указании типов параметров функции)
Непосредственная поддержка типов данных языка C, в том числе массивов и структур
Первый аргумент общеизвестен и послужил поводом для столь превосходной метафоры, что её не постеснялся привести в своей презентации даже сам автор Lua, хотя она явно не в его пользу:
Что касается последнего пункта списка, то меня продолжает удивлять, что Lua, всегда предназначавшийся именно для интеграции с C, опирается на типы данных (таблицы), несовместимые с типами C. В Umka нет этого несоответствия: любая структура или массив в Umka автоматически является массивом или структурой в C, хотя, конечно, возникают тонкости при работе с такими высокоуровневыми типами, которых в C принципиально нет, — динамическими массивами и словарями (map).
Другие преимущества Umka имеют, скорее, субъективный и эстетический характер. Мне импонирует лаконизм Go, его отказ от классов и наследования, возможность присоединения методов к любому типу данных, полиморфизм через приведение любого подходящего типа к интерфейсу. Эти личные симпатии во многом сформировали облик Umka. Тем не менее, чтобы внешнее сходство не ввело в заблуждение, повторю: Umka — это не Go ни по назначению, ни по синтаксису, ни по семантике.
Концепция языка в целом осталась прежней со времён версии 0.1 и первых публикаций о нём на Хабре. Появились новые языковые возможности, например, словари как встроенный тип данных, цикл for...in
. Много усилий было затрачено на усовершенствование и отладку сборки мусора. Серьёзной доработке подвергся интерфейс взаимодействия с C: появился доступ к высокоуровневым типам данных Umka и его менеджеру памяти, возможность встраивать код на Umka в виде текстовой строки, а не отдельного файла. Umka теперь умеет искать реализацию функций во внешних динамических библиотеках, что полезно для расширения языка и создания обёрток для сторонних библиотек. Обогатилась стандартная библиотека Umka: теперь в ней есть базовая поддержка UTF-8 и векторно-матричной алгебры. Появилась веб-песочница, в которой можно поупражняться с основными языковыми конструкциями (и поискать баги!).
Игровой фреймворк
Tophat — простой кросс-платформенный фреймворк, позволяющий писать 2D игры на Umka. В версии 1.0 он предоставляет инструменты для работы с графикой (в том числе спрайтами, анимацией, облаками частиц и шрифтами), звуком, устройствами ввода (клавиатурой и мышью). Он также имеет средства для анализа столкновений и поиска кратчайших путей на 2D карте, чтения и записи данных в формате CSV.
Tophat поставляется в виде одного исполняемого файла для Windows или Linux, в который зашиты все необходимые низкоуровневые библиотеки, интерпретатор Umka, а также все модули стандартной библиотеки Umka и самого Tophat. Никаких внешних зависимостей он не имеет.
Среди примеров мини-проектов на Tophat — космическая стрелялка, простейший платформер, тетрис, аналог Flappy Bird, таймер для «метода помидора» (тремя последними примерами мы обязаны также участнику проекта Tophat Святославу Шатунову, он же Ske). Их можно запустить как на своём компьютере, так и непосредственно в браузере — прямо с сайта Tophat. Готова и веб-песочница для браузерных экспериментов с Tophat.
Дополнительные инструменты
Марек Машкаринец создал удобную утилиту UmProf для профилирования программ на Umka. Она выводит данные анализа в формате JSON, затем для визуализации результатов можно использовать Spall. Интерпретатор Umka поддерживает профилирование, позволяя назначить внешние пользовательские функции (debug hooks), которые будут вызываться при каждом входе и выходе из любой функции Umka. Утилита UmProf интегрирована в Tophat. Вот пример её использования, позволяющий видеть, что наибольшую долю времени отрисовки кадра игры в данном случае занимает сортировка графических элементов по глубине:
Также Марек занят написанием универсального визуального редактора свойств с выводом данных в JSON. Этот инструмент ещё находится на ранней стадии разработки и не вошёл в выпуск Tophat 1.0.
Игры
Мне известны по меньшей мере два серьёзных игровых проекта, разрабатываемых на Tophat и Umka. Святослав Шатунов весь последний год работает над платформером-головоломкой SaveScum (именно её скриншот вынесен на обложку статьи). Ключевая идея — превратить сохранение игры из вспомогательной операции в основу игровой механики. Для игры написан и редактор уровней — также на Tophat.
Марек Машкаринец тем временем развивает свой проект — игру о диспетчеризации железнодорожного движения. Репозиторий с прототипом игры пока закрыт, однако можно познакомиться с дневником разработки на сайте автора. Марек регулярно участвует и в игровых джемах, часто с мини-играми в ретро-стилистике. Он также ведёт канал в Discord, где обсуждаются Umka, Tophat и игры.