Решил попробовать сабж, это должно быть интересным проектом, увлекательной задачей для ума, да и любителям блогера Кинамана, ретроигр и эмуляторов была бы интересна подобная программа.
В идеале хотелось бы полноценный игровой конструктор уровня Game Maker, с редактором спрайтов, тайлов и музыки и конструированием уровней мышкой, но для начала ограничился просто Бейсиком.
Сам Бейсик будет максимально приближен к Sinclair Basic (на ZX Spectrum), MSX BASIC и QBASIC, планируются встроенные команды для спрайтов и тайлов, циклы, модули, процедуры и функции, но не будет записей/структур (только массивы, строки и целые числа, последние и для логических операций как в Си).
Для лучшего понимания — архитектура компьютера NES/Famicom и его клонов.
Процессор: 8-битный Ricoh 2A03, совместимый с MOS 6502 (не поддерживаются двоично-десятичные числа), содержит также контроллер DMA в кристалле
ОЗУ: 2 КБ (на картриджах может быть дополнительно до 48 КБ)
ПЗУ: 8 КБ на картриджах (с маппингом может быть более 64 КБ)
Видеокарта: PPU с поддержкой до 256 тайлов (символов 8x8 цветного шрифта с пикселями из 3 цветов), 64 цветными спрайтами (8x8 или 8x16) и палитрой 48 цветов (по 3 цвета на каждый спрайт или тайл)
Видеопамять: 2/4 КБ (с аппаратным скроллингом 4-экранной тайловой карты 64x56)
Разрешение экрана: 256x224 (NTSC) или 256x240 (PAL/SECAM)
Как архитектурно может быть устроен подобный компилятор? Я выбрал такую схему:
1) лексический анализатор читает исходники, пропускает комментарии, разбивает текст на токены — ключевые слова, строки, числа (читается файл главного модуля и другие модули, импортируемые в нем);
2) семантический анализатор получает наборы токенов (для каждого файла модуля), строит по ним единое AST;
3) дерево AST обрабатывается препроцессором, основанным на мини-Лиспе для оптимизации, выкидывания ненужных имен и конструкций, замены деления на 2 сдвигами, хвостовой рекурсии циклами и т.д.;
4) результатом прероцессора будет шитый код как на Форте, где все данные кладутся в стек и вызываются функции для их обработки (вроде программы на Форте особо не тормозили, по быстродействию были сравнимы с Си и Фортраном);
5) далее уже шитый код можно преобразовать в нативный, т.е. инструкции процессора 6502 для Донди.
Или слишком избыточно, и можно что-то упростить? За годы Java энтерпрайза, паттернов проектирования и микросервисных архитектур совсем отвык от простых решений.
Как запру я тебя за железный замок, за дубовую дверь окованную,
Чтоб свету божьего ты не видела, мое имя честное не порочила…
М. Лермонтов. Песня про царя Ивана Васильевича, молодого опричника и удалого купца Калашникова