Как написать простой компилятор в C/++?

Возможный дубликат:
Обучение написанию компилятора

Hi Stack Overflow, теперь не поймите меня неправильно, я не собираюсь писать компилятор для С++ (хотя я намереваюсь записать его на С++) или Java или какой-либо другой сложный язык программирования высокого уровня. Я просто хочу изучить основы преобразования базового набора команд в исполняемый файл Windows (скажем, простой язык с 5-6 функциями, полностью настраиваемый). Также я не хочу загружать любые библиотеки или файлы заголовков. Если бы вы могли связать меня с любым исходным примером или учебниками, мы будем очень благодарны!

Ответ 1

Jack Crenshaw Пусть Build Compiler - хороший учебник для начала. Он хороший писатель и облегчает понимание предмета.

Ответ 2

Чтобы проанализировать ввод, вы должны прочитать рекурсивный анализ спуска (это, вероятно, самые простые парсеры для ручного выполнения), хотя вы также потребуется лексер для создания токенов для вашего парсера. Они могут быть закодированы вручную (я это сделал), хотя проще использовать генератор лексера, например lex или flex.

После того, как вы проанализировали ввод, вам нужно будет преобразовать его в соответствующий вывод. Я не могу вам помочь, так как я не очень хорошо знаю инструментарий Windows. "Легкий" способ - создать сборку и запустить ее через NASM, MASM или любой ассемблер с вашей компиляционной средой. Если ваш язык достаточно прост, вы можете просто сгенерировать сборку, когда вы идете в коде парсера.

Ответ 3

Здесь вам нужно написать базовый компилятор:

  • Parser. Вам нужно будет проанализировать свой язык и создать абстрактное дерево синтаксиса. Вы можете узнать о написании парсеров. Вы можете либо передать код анализатору, либо использовать генераторы парсеров, например lex/yacc.
  • Ассамблея. Вам нужно будет сгенерировать инструкции сборки из дерева синтаксиса.
  • Набор инструкций. Вам нужно будет перевести сборку в машинный код в определенном наборе инструкций (типичный процессор Intel и AMD использует набор инструкций x86, в качестве альтернативы вы можете настроить набор инструкций Java VM или .NET IL).

Ответ 4

Собственно, самое важное, что вам нужно, это выяснить двоичный формат .exe файлов (если вы не планируете использовать существующий компоновщик, в этот момент мне кажется, вам нужно вывести файлы obj, которые также имеют двоичный формат).

Вам также нужно иметь дело с LOT сборки, если вы уже НЕ ОЧЕНЬ знакомы с набором инструкций x86, я бы попробовал что-то еще.

Вот несколько возможностей:

  • Раньше называлась "Tiny C" - я предполагаю, что это: http://bellard.org/tcc, Tiny C является достаточно хорошим компилятором для создания самого себя, но не настолько сложным, что его трудно понять. Это урок "Как построить компилятор" в коробке. Поругался с ним на 8088.

  • Вывод для "встроенного" процессора. Они, как правило, имеют простые языки ассемблера и очень четко определенные исполняемые форматы. Это было бы неплохо для начала.

  • Вывод C-кода вместо двоичного. Это обман, но вы можете сосредоточиться на своем языке и не слишком беспокоиться о языке ассемблера.

  • Наконец, если вы действительно хотите напрямую создать файл .exe, сначала напишите приложение, которое создает "Hello world" exe. Не утруждайте себя "компилированием" чего-либо, просто отредактируйте код, введите его в формат exe и запустите его - при этом вы ЗНАЕТЕ, что у вас есть все ваши биты, выстроенные в ряд и попадающие в правильные места, тогда вы может с уверенностью начать с компилятора.

После этого создание языка может быть выполнено с помощью множества процедур, приведенных здесь, но если вы просто хотите увидеть, как все это работает, я определенно сделаю несколько небольших итераций в первую очередь, не волнуйтесь о том, с чем вы столкнетесь, пока не столкнетесь с этим.

Ответ 5

Я бы порекомендовал www.antlr.org. Я работал в С#, но он поддерживает C, Java, Python и многое другое.

Ответ 6

Для того, чтобы узнать о том, как построение компилятора отличается на С++, чем, скажем, в C или Pascal, попробуйте выполнить парсер Spirit. рамки.

Это предполагает знакомство с С++.

Чтобы узнать о создании компилятора, я предлагаю использовать более простой язык, чем С++, а затем, возможно, перейти на С++.

Приветствия и hth.,