Я написал интерпретатор для своего экспериментального языка и знаю, что хочу пойти дальше и написать небольшой компилятор для него. Вероятно, он возьмет источник, пройдет те же шаги, что и интерпретатор (токенизатор, анализатор), а затем переведет источник в сборку.
Теперь мои вопросы:
Можно ли ожидать, что каждая команда на моем языке может быть переведена 1: 1 в набор инструкций по сборке? Я имею в виду, что мне придется полностью перебрасывать всю программу ввода или она просто переводится в сборку на строку.
Какой ассемблер я должен использовать в качестве выходного формата?
Нет, вы не можете этого ожидать. Если ваш язык содержит такие вещи, как eval (), он может стать интересным.
Как бэкэнд-ассемблер, nasm кажется наиболее популярным. ГАЗ возможен, но я нашел его немного неумолимым и неполным.
Если вы не решительно настроены «заново изобрести колесо», вы можете просто сгенерировать код C и затем передать его существующему компилятору C, например, НКА. Это будет намного проще, чем писать свой собственный бэкэнд, и вы получите все оптимизации компилятора C и т. Д. Бесплатно.