- PVSM.RU - https://www.pvsm.ru -
После трёх лет неторопливой разработки вышла версия 1.0 моего скриптового языка Umka [1]. Это статически типизированный язык, предназначенный для встраивания в программы на C/C++. Синтаксис и некоторые особенности семантики Umka были вдохновлены языком Go, однако Umka никак не зависит от экосистемы Go и не требует для работы ничего, кроме стандартной библиотеки C.
Основным применением языка стал игровой фреймворк Tophat [2], созданный Марком Машкаринцем. Версия Tophat 1.0 вышла одновременно с Umka. Это очень простой модульный фреймворк для создания 2D игр. Несколько мини-игр на нём были написаны для участия в джемах. Сейчас в разработке находятся два более крупных игровых проекта — платформер-головоломка и игра о диспетчеризации железнодорожного движения.
Первый вопрос, на который мне регулярно приходится отвечать, как только заходит речь об Umka: зачем нужен новый язык, если есть Lua? Вопрос закономерен, поскольку Umka претендует на ту же нишу встраиваемых скриптовых языков, где почти безраздельно господствует Lua.
Основное отличие Umka — статическая типизация и вытекающие из неё преимущества:
Обнаружение ошибок типов на этапе трансляции программы, а не на этапе исполнения
Ясность намерений программиста (например, при указании типов параметров функции)
Непосредственная поддержка типов данных языка C, в том числе массивов и структур
Первый аргумент общеизвестен и послужил поводом для столь превосходной метафоры, что её не постеснялся привести [3] в своей презентации даже сам автор Lua, хотя она явно не в его пользу:
Что касается последнего пункта списка, то меня продолжает удивлять, что Lua, всегда предназначавшийся именно для интеграции с C, опирается на типы данных (таблицы), несовместимые с типами C. В Umka нет этого несоответствия: любая структура или массив в Umka автоматически является массивом или структурой в C, хотя, конечно, возникают тонкости при работе с такими высокоуровневыми типами, которых в C принципиально нет, — динамическими массивами и словарями (map).
Другие преимущества Umka имеют, скорее, субъективный и эстетический характер. Мне импонирует лаконизм Go, его отказ от классов и наследования, возможность присоединения методов к любому типу данных, полиморфизм через приведение любого подходящего типа к интерфейсу. Эти личные симпатии во многом сформировали облик Umka. Тем не менее, чтобы внешнее сходство не ввело в заблуждение, повторю: Umka — это не Go [5] ни по назначению, ни по синтаксису, ни по семантике.
Концепция языка в целом осталась прежней со времён версии 0.1 и первых публикаций [6] о нём на Хабре. Появились новые языковые возможности, например, словари как встроенный тип данных, цикл for...in
. Много усилий было затрачено на усовершенствование и отладку сборки мусора [7]. Серьёзной доработке подвергся интерфейс взаимодействия с C: появился доступ к высокоуровневым типам данных Umka и его менеджеру памяти, возможность встраивать код на Umka в виде текстовой строки, а не отдельного файла. Umka теперь умеет искать реализацию функций во внешних динамических библиотеках, что полезно для расширения языка и создания обёрток для сторонних библиотек. Обогатилась стандартная библиотека Umka: теперь в ней есть базовая поддержка UTF-8 и векторно-матричной алгебры. Появилась веб-песочница [8], в которой можно поупражняться с основными языковыми конструкциями (и поискать баги!).
Tophat — простой кросс-платформенный фреймворк, позволяющий писать 2D игры на Umka. В версии 1.0 он предоставляет инструменты для работы с графикой (в том числе спрайтами, анимацией, облаками частиц и шрифтами), звуком, устройствами ввода (клавиатурой и мышью). Он также имеет средства для анализа столкновений и поиска кратчайших путей на 2D карте, чтения и записи данных в формате CSV.
Tophat поставляется в виде одного исполняемого файла для Windows или Linux, в который зашиты все необходимые низкоуровневые библиотеки, интерпретатор Umka, а также все модули стандартной библиотеки Umka и самого Tophat. Никаких внешних зависимостей он не имеет.
Среди примеров мини-проектов на Tophat — космическая стрелялка, простейший платформер, тетрис, аналог Flappy Bird, таймер для «метода помидора» (тремя последними примерами мы обязаны также участнику проекта Tophat Святославу Шатунову, он же Ske [9]). Их можно запустить как на своём компьютере, так и непосредственно в браузере — прямо с сайта Tophat. Готова и веб-песочница [10] для браузерных экспериментов с Tophat.
Марек Машкаринец создал удобную утилиту UmProf для профилирования программ на Umka. Она выводит данные анализа в формате JSON, затем для визуализации результатов можно использовать Spall [11]. Интерпретатор Umka поддерживает профилирование, позволяя назначить внешние пользовательские функции (debug hooks), которые будут вызываться при каждом входе и выходе из любой функции Umka. Утилита UmProf интегрирована в Tophat. Вот пример её использования, позволяющий видеть, что наибольшую долю времени отрисовки кадра игры в данном случае занимает сортировка графических элементов по глубине:
Также Марек занят написанием универсального визуального редактора свойств с выводом данных в JSON. Этот инструмент ещё находится на ранней стадии разработки и не вошёл в выпуск Tophat 1.0.
Мне известны по меньшей мере два серьёзных игровых проекта, разрабатываемых на Tophat и Umka. Святослав Шатунов весь последний год работает над платформером-головоломкой SaveScum [12] (именно её скриншот вынесен на обложку статьи). Ключевая идея — превратить сохранение игры из вспомогательной операции в основу игровой механики. Для игры написан и редактор уровней — также на Tophat.
Марек Машкаринец тем временем развивает свой проект — игру о диспетчеризации железнодорожного движения. Репозиторий с прототипом игры пока закрыт, однако можно познакомиться с дневником разработки [13] на сайте автора. Марек регулярно участвует и в игровых джемах, часто с мини-играми в ретро-стилистике [14]. Он также ведёт канал в Discord [15], где обсуждаются Umka, Tophat и игры.
Umka 1.0 [16]
Tophat 1.0 [17]
Автор: Василий Терешков
Источник [18]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/kompilyatory-2/384462
Ссылки в тексте:
[1] Umka: https://github.com/vtereshkov/umka-lang
[2] Tophat: https://tophat2d.dev/
[3] не постеснялся привести: https://habr.com/ru/companies/vk/articles/459466/
[4] https://www.reddit.com/r/ProgrammerHumor/comments/a1hghl/dynamic_vs_static_typing/: https://www.reddit.com/r/ProgrammerHumor/comments/a1hghl/dynamic_vs_static_typing/
[5] Umka — это не Go: https://github.com/vtereshkov/umka-lang#umka-vs-go
[6] первых публикаций: https://habr.com/ru/articles/501002/
[7] сборки мусора: https://habr.com/ru/articles/569450/
[8] веб-песочница: https://vtereshkov.github.io/umka-lang/
[9] Ske: https://github.com/skejeton
[10] веб-песочница: https://tophat2d.dev/playground/
[11] Spall: https://gravitymoth.com/spall/
[12] SaveScum: https://ske.land/savegame/index.html
[13] дневником разработки: https://mrms.cz/game/
[14] ретро-стилистике: https://maskarinec.itch.io/spacescape
[15] канал в Discord: https://discord.com/channels/846663478873030666/846663478873030672
[16] Umka 1.0: https://github.com/vtereshkov/umka-lang/releases/tag/v1.0
[17] Tophat 1.0: https://tophat2d.dev/dl/
[18] Источник: https://habr.com/ru/articles/732430/?utm_source=habrahabr&utm_medium=rss&utm_campaign=732430
Нажмите здесь для печати.