2009-10-12 3 views
6

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

ответ

9

Первый шаг - прочитать Dragon Book.

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

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

+2

Пожалуйста, ребята, вы должны * на самом деле * прекратить цитирование книги драконов ... Это одна из худших книг компилятора. Вы можете привести Аппеля, Купера и т. Д. Но * пожалуйста * не Книга Дракона. – tonfa

+1

«Современная реализация компилятора» (Appel) очень плохо написана, а «Engineering Compiler» (Cooper) не очень подходит для новичков. –

+0

Это не может быть хуже, чем тайная Книга Дракона. Я лично не нашел книгу Тигра плохо написанной, хотя я никогда ее не читал с прикрытия, я нашел, что у нее много хороших идей. – tonfa

3

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

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

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

+1

Зависит от того, что вы хотите сделать. Если вы действительно хотите знать, как все работает с нуля, GCC - очень запутанный способ. –

5

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

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

Вот учебник для создания вашего языка с LLVM: http://llvm.org/docs/tutorial/

2

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

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

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

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

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

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

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

Смежные вопросы