Каков хороший подход к созданию нового компилятора? - PullRequest
6 голосов
/ 12 октября 2009

У меня есть опыт работы с фразами компиляторов, и я заинтересован в области языков программирования и компиляторов, и я надеюсь, что кто-нибудь даст мне некоторое объяснение о том, как лучше написать новый компилятор с нуля для нового языка программирования? ( Я имею в виду ШАГИ ).

Ответы [ 4 ]

9 голосов
/ 12 октября 2009

Первый шаг - прочитать Книга Дракона .

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

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

6 голосов
/ 12 октября 2009

Пожалуйста, не используйте Книгу Дракона, она старая и в основном устарела (и использует странные имена для большинства вещей).

Для книг я бы порекомендовал Apple Tiger Book или Cooper's Engineering - компилятор. Я настоятельно рекомендую вам использовать фреймворк, такой как llvm , чтобы вам не пришлось повторно реализовывать кучу вещей для генерации кода и т. Д.

Вот учебник по созданию вашего языка с помощью llvm: http://llvm.org/docs/tutorial/

3 голосов
/ 12 октября 2009

Я бы посмотрел на интеграцию вашего языка / внешнего интерфейса с платформой компилятора GNU.

Таким образом, вам только (ТОЛЬКО!) Нужно написать анализатор и транслятор в формате переносимых объектов gcc. Вы получаете оптимизатор, генерацию объектного кода для выбранного чипа, компоновщик и т. Д. Бесплатно.

Другой альтернативой может быть нацеливание на Java JVM, виртуальная машина хорошо документирована, а набор инструкций JVM намного более устойчив, чем машинный код x86.

2 голосов
/ 14 октября 2009

Мне удалось написать компилятор без какой-либо конкретной книги (хотя в прошлом я читал некоторые книги по компилятору, но не в деталях).

Первое, что вы должны сделать, это поиграть с любым из инструментов типа «Компилятор компилятора» (flex, bison, antlr, javacc) и заставить вашу грамматику работать. Грамматика в основном прямолинейна, но всегда есть мелкие кусочки, которые мешают и разрушают все. Особенно такие вещи, как выражения, приоритет и т. Д.

Некоторые из более старых более простых языков более просты по причине. Это делает парсеры "Just Work". Рассмотрим вариант Паскаля, который может быть обработан исключительно с помощью рекурсивного приличия.

Я упоминаю об этом, потому что без вашей грамматики у вас нет языка. Если вы не можете разобрать и правильно его проанализировать, вы очень быстро никуда не добьетесь. И наблюдать, как дюжина строк примера кода на вашем новом языке превращается в множество токенов и синтаксических узлов, на самом деле просто потрясающе. Во всяком случае, это действительно работает. Это буквально почти "все это работает" или "ничего из этого не работает", особенно в начале. Как только это действительно сработает, вы почувствуете, что действительно сможете это осуществить.

И в какой-то степени это так, потому что, как только вы выполнили эту часть, вы должны приступить к работе. Как только вы скомпилируете «a = 1 + 1», большая часть новой работы позади вас, и теперь вам просто нужно реализовать остальных операторов. По сути, это упражнение по управлению справочными таблицами и ссылками, а также определению того, где вы находитесь в данный момент.

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

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

...