Автор игры на Коболе рассказал, что ему понравилось в языке
Владелец видеоблога Context Free, который представляется как Том, рассказал о проекте видеоигры на Коболе. Этот прикладной язык программирования предназначен для написания коммерческих систем, а не геймдева. Первую версию Кобола выпустили в 1959 году, и в последние годы даже в бизнесе от него всё быстрее отказываются. Тем не менее Том из интереса начал изучать Кобол, написал небольшую 2D-игру и поделился своим опытом.
Название «COBOL» образовано в виде акронима от фразы «common business-oriented language» («общий бизнес-ориентированный язык»). Действительно, язык используют в коммерческих приложениях, финансовой индустрии и государственных структурах. По сей день Кобол продолжает развиваться, его даже рекомендуют за распространённость, читаемость и зрелость: старый язык хорошо интегрируется с другими современными системами. Несмотря на ореол почти вытесненного легаси, Кобол держится в тридцатке рейтинга TIOBE.
Кобол специфичен. Программы на Коболе разбиваются на division
, section
, а предложения заканчиваются точкой. Диалекты варьируются, но обычно в каждой строке исходного кода первые 6 символов используют для идентификации строки, в 7-й находится индикатор, что строка — комментарий, продолжение предыдущей строки или, например, инструкция для компилятора, а сам код начинается с 8-го или 12-го символа и длится до 72-го символа. Пространство с 73-й по 80-й символ отведено для генерируемых системой чисел. Такой формат наследует ограничения 80-символьных бумажных бланков программирования.
Mainframestechhelp
Стереотип утверждает, что приложение на Коболе будет крутиться в системе z/OS на дорогом отказоустойчивом мейнфрейме IBM, где обрабатываются данные клиентов авиакомпании или гостиничной сети. Действительно, через Кобол проходит подавляющее большинство транзакций банкоматов и бронирований номеров, язык используют налоговики и системы здравоохранения.
Тем не менее Том, автор блога Context Free, написал игру не на каком-нибудь IBM Enterprise COBOL, а на GnuCOBOL, открытом и свободном компиляторе Кобола. Бесплатные ассеты Том взял с ресурса Kenney, шрифты — от продуктов JetBrains и из Ubuntu.
Вообще, это уже не первая попытка написать игру на Коболе. В 2016 году, 7 лет назад, некто Эмерсон представил свой проект, написанный на PowerCOBOL 3.0. Эмерсон скопировал Lunar Lander, двухмерную аркаду для игровых автоматов, в которой нужно посадить аппарат на поверхность астрономического объекта. Разработчик развил идею дальше простого клонирования: в игре можно не только прилуниться, но и совершить посадку на Венеру, Меркурий, Землю, Юпитер или Марс. Ещё один клон Lunar Lander авторства Кристофера Джонсона написан для GnuCOBOL, но вообще поддерживается любой системой с Коболом стандарта 1985 года.
Игра Тома Cobol Explorer тоже двухмерная. По геймплею она напоминает типичный infinite faller, где нужно как можно дольше падать и избегать препятствия.
Основной файл короток. Вначале код вызывает несколько copybook
— сущностей, которые напоминают добавляемое директивой #include
в C.
copy game-control-data.
copy game-option-data.
copy game-resource-data.
Для получения пользовательского ввода, отрисовки окна и графики Cobol Explorer обращается в коде к библиотеке SDL через один вспомогательный файл на C. Все обращения были выполнены напрямую, без обёртки, кроме одного случая, когда иначе данные возвращались повреждёнными. Том не обнаружил в Коболе структур, поэтому он вручную составил данные структуры, которые подходили для передачи в SDL. В том числе он явно объявил пустые байты.
dispose.
call 'SDL_DestroyRenderer' using by value renderer
call 'SDL_DestroyWindow' using by value win
call 'SDL_Quit'
.
Графические изображения Том включил прямо в исполняемый файл с помощью утилиты на Python, которая кодирует картинки в виде 16-значных чисел. Впрочем, разработчик сразу предупреждает, что его практики могут отходить от общепринятых и рекомендуемых.
Билд-скрипт запускает утилиту на Python для конвертации ассетов в числа, компилирует код на Коболе и вспомогательный файл на C, линкует SDL, оптимизирует размер и изменяет размер программы на Коболе на 200 тысяч строк (это нужно для файлов с закодированными ассетами). В результате получается исполняемый файл на 243 КБ.
Том рассказал, что эксперимент с Коболом ему понравился:
- Хотя везде используются (полу-)глобальные переменные, удалось написать простую программу, код которой выглядит аккуратно.
- Разработчик оценил легковесное ощущение Кобола, которое ему дали подрутины (subroutines), объявляемые в виде абзацев. Разработчик даже пожелал, чтобы схожие структуры были в других языках.
- Синтаксические особенности языка отличаются от текущей C-подобной реальности: в названии переменных могут быть дефисы, параметры функции не нужно перечислять через запятую (достаточно пробела). Вообще, запятые и точки с запятой распознаются как пробелы и тоже могут отделять слова друг от друга.
Как показалось Тому, написать игру на Коболе оказалось не так тяжело и страшно. Он предупреждает, что задачей было не высмеять язык, а найти то, чему у Кобола сто́ит поучиться. Впрочем, разработчик признаёт, что писать игры на этом языке он не рекомендовал бы.
Код на Коболе в GnuCOBOL сначала переводится в C и лишь затем компилируется. Транспиляция идёт с особенностями. К примеру, то, что выглядит как локальная переменная, объявляется как глобальная переменная, из-за чего плохо работают, например, рекурсивные конструкции. Если же явно указать в коде на Коболе is recursive
, то GnuCOBOL всё равно создаёт глобальные переменные, но также создаёт стек, из которого эти переменные получает и сохраняет операциями push
и pop
. Как объяснил Том, он и сам не до конца понимает происходящее.
Том попытался опубликовать свою игру на WebAssembly, но это не удалось именно из-за неожиданностей этого перевода GnuCOBOL в код на C. В попытке заставить игру на Коболе работать прямо в браузере Том тоже не первый. Другой игровой проект cobol-js-emscripten реализует клон Pong и опубликован на Wasm, то есть работает в виде приложения на веб-странице. Том же просто опубликовал код проекта и предоставил инструкции для компиляции.
github.com/contextfreecode/cobol-explore