Re: Как написать компилятор Бейсика для Dendy?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 20.10.24 07:02
Оценка:
Здравствуйте, Worminator X, Вы писали:

WX>Решил попробовать сабж, это должно быть интересным проектом, увлекательной задачей для ума, да и любителям блогера Кинамана, ретроигр и эмуляторов была бы интересна подобная программа.


Я ещё помню свой опыт с Агатами. Там тот же 6502. Ну, очень занудно, если посмотреть с современной точки зрения.

Главное — процессор очень дешёвый (почему и получил офигенное распространение), зато очень неблагодарный. Три 8-битных регистра плюс "нулевая страница", не использовать которую нельзя, если хочешь получить хотя бы косвенную адресацию, но при этом её половина использована не как регистры, а как глобальные переменные и постоянно боишься, что наступишь на чьё-то уже занятое место.

В общем, я лично бы не стал это повторять. Но это таки последствия того, что я с этим возился и всё помню.

WX>Сам Бейсик будет максимально приближен к Sinclair Basic (на ZX Spectrum), MSX BASIC и QBASIC, планируются встроенные команды для спрайтов и тайлов, циклы, модули, процедуры и функции, но не будет записей/структур (только массивы, строки и целые числа, последние и для логических операций как в Си).


Бейсик для Apple II был в двух вариантах — INT (без поддержки вещественных), влезал в его ПЗУ, и FP (с такой поддержкой), надо было уже грузить с дискеты. Я сейчас быстро не нашёл, сколько занимал тот Бейсик в ПЗУ, но по идее в 4KB должен был влезть. Набор возможностей как раз примерно такой.

В сети полно ресурсов по нему, даже код есть с расшифровкой.

Разумеется, это всё интерпретаторы.

WX>Как архитектурно может быть устроен подобный компилятор? Я выбрал такую схему:

WX>1) лексический анализатор читает исходники, пропускает комментарии, разбивает текст на токены — ключевые слова, строки, числа (читается файл главного модуля и другие модули, импортируемые в нем);
WX>2) семантический анализатор получает наборы токенов (для каждого файла модуля), строит по ним единое AST;
WX>3) дерево AST обрабатывается препроцессором, основанным на мини-Лиспе для оптимизации, выкидывания ненужных имен и конструкций, замены деления на 2 сдвигами, хвостовой рекурсии циклами и т.д.;
WX>4) результатом прероцессора будет шитый код как на Форте, где все данные кладутся в стек и вызываются функции для их обработки

Не уверен, что влезет в доступное ПЗУ. Но можете попробовать, конечно.

WX> (вроде программы на Форте особо не тормозили, по быстродействию были сравнимы с Си и Фортраном);


Ну да — потому что

1) Уровень оптимизации в компиляторах в те времена был ничтожно малым по сравнению с сейчас, можно было и на Форте обогнать.
2) Отсутствие out-of-order execution и прочего ну очень современного в процессорах не давало коду, сделанному в оптимальном стиле, разогнаться.

WX>5) далее уже шитый код можно преобразовать в нативный, т.е. инструкции процессора 6502 для Донди.

WX>Или слишком избыточно, и можно что-то упростить? За годы Java энтерпрайза, паттернов проектирования и микросервисных архитектур совсем отвык от простых решений.

Да нет, выглядит вроде адекватно.
Но я бы начал таки с создания интерпретатора в современном стиле кодирования и затем уже перешёл к компилятору. Иначе по частям будет слишком путано это делать.

Ещё непонятно, что делать со вводом-выводом. У такой приставки просто нет таких возможностей, максимум что есть это записать накопление прогресса в пару байт картриджа. А тут вам его потребуется много. Надо расширить представление о платформе.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.