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




15 Answers

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

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

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

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

java compilers linux

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

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




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

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

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




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

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

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




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

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







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

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




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

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




«... Давайте построим компилятор ...»

Я бы второй http://compilers.iecc.com/crenshaw/ by @sasb . Забудьте купить больше книг на данный момент.

Зачем? Инструменты и язык.

Необходимым языком является Pascal, и если я правильно помню, то на основе Turbo-Pascal. Это просто так происходит, если вы перейдете на http://www.freepascal.org/ и загрузите компилятор Pascal, все примеры работают прямо со страницы ~ http://www.freepascal.org/download.var . Прекрасная вещь о бесплатном Паскаль, вы можете использовать его практически в любом процессоре или операционной системе, о которой вы можете заботиться.

После того, как вы освоили уроки, попробуйте более продвинутую « Книгу Дракона » ~ http://en.wikipedia.org/wiki/Dragon_book




Легкий способ создания компилятора - использовать бизон и гибкость (или подобное), построить дерево (AST) и сгенерировать код в C. Сгенерирующим C-кодом является наиболее важный шаг. Генерируя код C, ваш язык будет автоматически работать на всех платформах с компилятором C.

Сгенерировать код C так же просто, как генерировать HTML (просто использовать печать или эквивалент), что, в свою очередь, намного проще, чем писать парсер S или парсер HTML.




Вы должны проверить « ichbins » Дариуса Бэкона, который является компилятором для небольшого диалекта Лиспа, ориентированного на C, всего на более чем 6 страницах кода. Преимущество, которое у него есть над большинством компиляторов игрушек, заключается в том, что язык достаточно велик, чтобы в нем был написан компилятор. (В tarball также включен интерпретатор для загрузки объекта.)

Есть больше вещей о том, что я нашел полезным в обучении написанию компилятора на моей веб-странице Ur-Scheme .




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




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

Учебник: Метакомпиляторы Часть 1

Все это основано на удивительной небольшой 10-страничной технической статье:

Val Schorre META II: язык, ориентированный на синтаксический язык компилятора

от честного до бога 1964 года. Я научился строить компиляторы с этого момента в 1970 году. Удивительный момент, когда вы, наконец, заглядываете, как компилятор может восстановить себя ....

Я знаю автора веб-сайта из моих дней колледжа, но я не имею никакого отношения к веб-сайту.




Если вы заинтересованы в написании компилятора для функционального языка (а не процедурного), Саймон Пейтон-Джонс и Дэвид Лестер « Реализация функциональных языков: учебник » - отличный справочник.

Концептуальные основы того, как работают функциональные оценки, руководствуются примерами на простом, но мощном функциональном языке под названием «Core». Кроме того, каждая часть компилятора основного языка объясняется примерами кода в Miranda (чистый функциональный язык, очень похожий на Haskell).

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




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

Прочтите.

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

И прочитайте On Trusting Trust , чтобы получить представление о неочевидных вещах, которые могут быть сделаны в этом домене.




Книга Дракона слишком сложна. Поэтому игнорируйте это как отправную точку. Это хорошо и заставляет вас много думать, если у вас уже есть начальная точка, но для начинающих, возможно, вам стоит просто попытаться написать оценщика математического / логического выражения, используя методы разбора RD, LL или LR со всем (лексирование / разбор) вручную, возможно, в C / Java. Это интересно само по себе и дает вам представление о проблемах, связанных с компилятором. Затем вы можете перейти на свой собственный DSL, используя некоторый язык сценариев (поскольку в них обычно проще обрабатывать текст), и, как сказал кто-то, сгенерируйте код либо на языке сценариев, либо на C. Вы, вероятно, должны использовать flex / bison / antlr и т. Д. выполните лексирование / разбор, если вы собираетесь делать это в c / java.






Related