[compiler-construction] Обучение написанию компилятора


Answers

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

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

Просто верхняя половина позволяет вам получить опыт написания лексического анализатора и анализатора и перейти к созданию некоторого «кода» (это промежуточное представление, о котором я упоминал). Таким образом, вам понадобится ваша исходная программа и преобразовать ее в другое представление и выполнить некоторую оптимизацию (если хотите), что является основой компилятора. Нижняя половина будет принимать это промежуточное представление и генерировать байты, необходимые для запуска программы по определенной архитектуре. Например, нижняя половина примет ваше промежуточное представление и сгенерирует исполняемый файл PE.

Некоторые книги по этой теме, которые я нашел особенно полезными, были Принципы и методы составителей (или Книга Дракона, из-за милого дракона на обложке). У этого есть отличная теория и определенно охватывает Контекстно-свободные Граммары в действительно доступной манере. Кроме того, для создания лексического анализатора и анализатора вы, вероятно, будете использовать инструменты * nix lex и yacc. И неинтересно, книга, названная « lex и yacc », поднялась там, где Книга Дракона остановилась для этой части.

Question

Предпочтительные языки : C / C ++, Java и Ruby.

Я ищу несколько полезных книг / учебников о том, как писать собственный компилятор просто для образовательных целей. Я больше всего знаком с C / C ++, Java и Ruby, поэтому предпочитаю ресурсы, которые связаны с одним из этих трех, но любой хороший ресурс является приемлемым.




I liked the Crenshaw tutorial too, because it makes it absolutely clear that a compiler is just another program that reads some input and writes some out put.

Прочтите.

Work it if you want, but then look at another reference on how bigger and more complete compilers are really written.

And read On Trusting Trust , to get a clue about the unobvious things that can be done in this domain.




Книга Дракона, безусловно, является «сборщиком компиляторов», но если ваш язык не так сложен, как текущее поколение языков, вы можете посмотреть шаблон интерпретатора из шаблонов проектирования .

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




Здесь есть много хороших ответов, поэтому я подумал, что просто добавлю еще один список:

Я получил книгу под названием Project Oberon более десяти лет назад, в которой есть очень хорошо написанный текст в компиляторе. Книга действительно выделяется в том смысле, что источник и объяснения очень удобны и читабельны. Полный текст (издание 2005 года) доступен в формате pdf, поэтому вы можете скачать его прямо сейчас. Компилятор обсуждается в главе 12:

http://www-old.oberon.ethz.ch/WirthPubl/ProjectOberon.pdf

Никлаус Вирт, Юрг Гуткнехт

(Лечение не столь обширно, как его книга о компиляторах)

Я прочитал несколько книг о компиляторах, и я могу записать книгу драконов, время, потраченное на эту книгу, очень полезно.




Если вы хотите использовать мощные инструменты более высокого уровня, а не строить все самостоятельно, то через проекты и чтения для этого курса это довольно хороший вариант. Это языковой курс автора механизма анализатора Java ANTLR. Вы можете получить книгу для курса в формате PDF от прагматичных программистов .

Курс охватывает стандартные компиляторы компилятора, которые вы увидите в другом месте: синтаксический анализ, типы и проверка типов, полиморфизм, таблицы символов и генерация кода. Практически единственное, что не охвачено, - это оптимизация. Конечный проект - это программа, которая компилирует подмножество C. Поскольку вы используете такие инструменты, как ANTLR и LLVM, вполне возможно написать весь компилятор за один день (у меня есть доказательство существования, хотя я имею в виду ~ 24 часа). Он тяжелый в практической технике, используя современные инструменты, немного более легкий по теории.

Кстати, LLVM просто фантастичен. Во многих ситуациях, когда вы обычно можете скомпилировать сборку, вам лучше будет компилировать промежуточное представление LLVM . Это более высокий уровень, кросс-платформенный, и LLVM вполне хорош в создании оптимизированной сборки из него.




Я счел книгу Дракона слишком трудной для чтения, уделяя слишком много внимания теории языка, которая на самом деле не нужна для написания компилятора на практике.

Я бы добавил книгу Oberon которой содержится полный источник удивительно быстрого и простого Oberon-компилятора Project Oberon .




Я помню, что задавал этот вопрос около семи лет назад, когда я был довольно новичком в программировании. Я был очень осторожен, когда я спросил, и на удивление я не получил столько критики, как вы сюда попадаете. Однако они указали мне в сторону « Книги Дракона », которая, на мой взгляд, действительно отличная книга, которая объясняет все, что вам нужно знать, чтобы написать компилятор (вам, конечно, придется освоить язык или два. языки, которые вы знаете, тем веселее.).

И да, многие люди говорят, что чтение этой книги сумасшедшее, и вы ничего не узнаете от нее, но я полностью не согласен с этим.

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

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

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

Книга также хороша, если вы хотите научиться писать парсеры / переводчики.




Возможно, вам стоит взглянуть на Lex / Yacc (или Flex / Bison, что бы вы ни назвали). Flex - это лексический анализатор, который будет анализировать и идентифицировать семантические компоненты («токены») вашего языка, а Bison будет использоваться для определения того, что происходит, когда каждый токен анализируется. Это может быть, но, без ограничений, печать C-кода для компилятора, который будет скомпилировать C, или динамически запускать инструкции.

Этот FAQ поможет вам, и этот учебник выглядит весьма полезным.







The Dragon Book is too complicated. So ignore it as a starting point. It is good and makes you think a lot once you already have a starting point, but for starters, perhaps you should simply try to write an math/logical expression evaluator using RD, LL or LR parsing techniques with everything (lexing/parsing) written by hand in perhaps C/Java. This is interesting in itself and gives you an idea of the problems involved in a compiler. Then you can jump in to your own DSL using some scripting language (since processing text is usually easier in these) and like someone said, generate code in either the scripting language itself or C. You should probably use flex/bison/antlr etc to do the lexing/parsing if you are going to do it in c/java.




Я рассматриваю ту же концепцию и нашел эту многообещающую статью Джоэла Побара,

Создание компилятора языка для .NET Framework

он обсуждает концепцию компилятора высокого уровня и приступает к разработке своего собственного langauge для .NET-структуры. Хотя он нацелен на .NET Framework, многие концепции должны быть воспроизведены. Статья охватывает:

  1. Определение Langauge
  2. сканер
  3. Parser (в основном это интересует)
  4. Ориентация на .Net Framework
  5. Генератор кода

есть и другие темы, но вы получаете просто.

Его предназначение для начинающих людей, написанных на C # (не совсем Java)

НТН

скелет




Компилятор LCC ( wikipedia ) ( главная страница проекта ) Фрейзера и Хансона описан в их книге «A Retargetable C Compiler: Design and Implementation». Это вполне читаемо и объясняет весь компилятор, вплоть до генерации кода.




Часто задаваемые вопросы о comp.compiler :

«Программирование персонального компьютера» Пер Бринч Хансен Прентис-холл 1982 ISBN 0-13-730283-5

В этой, к сожалению, названной книге объясняется дизайн и создание однопользовательской среды программирования для микросчетов с использованием языка Pascal, называемого Edison. Автор представляет весь исходный код и объясняет поэтапную реализацию компилятора Edison и простой поддерживающей операционной системы, написанной в самом Эдисоне (за исключением небольшого поддерживающего ядра, написанного на символическом ассемблере для PDP 11/23; полный источник также можно заказать для IBM PC).

Наиболее интересными вещами в этой книге являются: 1) способность продемонстрировать, как создать полный, автономный, самоподдерживающийся, полезный компилятор и операционную систему; 2) интересное обсуждение проблем проектирования и спецификации языка, в главе 2.

«Бринч Хансен на компиляторах Паскаля» Пер Бринч Хансен Прентис-Холл 1985 ISBN 0-13-083098-4

Еще одна световая теория о тяжелой прагматике здесь - как-к-коду - это книга. Автор представляет проект, реализацию и полный исходный код для интерпретатора компилятора и p-кода для Pascal- (Pascal «минус»), подмножество Pascal с булевыми и целочисленными типами (но без символов, реалов, подменю или перечислимых типов) , константы и переменные определения, типы массивов и записей (но не упакованные, варианты, набор, указатель, безымянный, переименованный или типы файлов), выражения, операторы присваивания, определения вложенных процедур со значениями и переменными параметрами, если утверждения, и начальные блоки (но не определения функций, процедурные параметры, операторы goto и метки, заявления о случаях, заявления повторения, для операторов и с операторами).

Компилятор и интерпретатор написаны в Pascal * (Pascal «star»), подмножество Pascal, расширенное некоторыми элементами стиля Edison для создания систем разработки программного обеспечения. Компилятор Pascal * для IBM PC продается автором, но легко переносить компилятор Pascal книги на любую удобную платформу Pascal.

Эта книга упрощает разработку и реализацию компилятора. Мне особенно нравится то, как автор относится к качеству, надежности и тестированию. Компилятор и интерпретатор могут быть легко использованы в качестве основы для более сложного проекта языка или компилятора, особенно если вам нужно быстро что-то запустить и запустить.




Я согласен с ссылкой на книгу Дракона; ИМО, это окончательное руководство по построению компилятора. Однако приготовьтесь к какой-то хардкорной теории.

Если вам нужна книга, более легкая в теории, Game Scripting Mastery может стать для вас лучшей книгой. Если вы являетесь новичком в теории компиляторов, он предлагает более мягкое введение. Он не охватывает более практические методы парсинга (выбор для неиндексивного рекурсивного спуска без обсуждения разбора LL или LR), и, как я помню, он даже не обсуждает какую-либо теорию оптимизации. Кроме того, вместо компиляции в машинный код он компилируется в байт-код, который должен запускаться на виртуальной машине, которую вы также пишете.

Это по-прежнему достойное чтение, особенно если вы можете забрать его за дешево на Amazon. Если вы хотите простое введение в компиляторы, Game Scripting Mastery - неплохой путь. Если вы хотите пойти хардкор вперед, тогда вы должны довольствоваться ничем иным, как Книгой Дракона.




  1. Это обширная тема. Не стоит недооценивать этот момент. И не стоит недооценивать мою точку зрения, чтобы не недооценивать ее.
  2. Я слышал, что Книга Дракона - это (?) Место для начала, а также поиск. :) Поймитесь в поисках, в конце концов это будет ваша жизнь.
  3. Построение собственного языка программирования - абсолютно хорошее упражнение! Но знайте, что он никогда не будет использоваться для какой-либо практической цели в конце. Исключений из этого мало и очень далеко.



Related