Учимся писать компилятор [закрыто]


699

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

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


ANTLR полностью. Все ресурсы, предложенные ниже, кажутся мне излишними. ANTLR всегда лучший друг дизайнера компиляторов. A
A_Var

Если ваша основная задача состоит в том, чтобы узнать, как работают идеи компиляции в целом - вы можете проверить и SICP сократить для структурированной интерпретации компьютерной программы, основанной на схеме (список), но учит общим принципам. mitpress.mit.edu/sicp . Эту книгу мне порекомендовал ветеран, который работает в компании и занимается сбором и интерпретацией этих работ!
Nishant


Я написал статью о создании компилятора в своем блоге: orangejuiceliberationfront.com/how-to-write-a-compiler В нем основное внимание уделяется основам и началу работы . Там есть еще куча статей, связанных с компилятором / codegen / parser / language design.
Uliwitness

Ответы:


1086

Большой список ресурсов:

Условные обозначения:

  • ¶ Ссылка на файл PDF
  • $ Ссылка на печатную книгу

22
Я прочитал серию Let's Build a Compiler[ compilers.iecc.com/crenshaw/] , это действительно хорошая рецензия и хорошая отправная точка.
TheVillageIdiot

5
Я думаю, что стоит упомянуть курс компиляторов Coursera. Он имеет хорошие видео и прогуливается по созданию java-подобного языка / простого компилятора. Ссылка на Coursera Compilers
QuantumKarl

1
Я хотел, чтобы этот ответ был как можно более оригинальным, поэтому я решил опубликовать эту ссылку здесь: tutorialspoint.com/compiler_design/index.htm. Что мне понравилось в этом сайте, так это то, что он не связан с написанием кода. создать компилятор, но он разбивает компилятор на части: фазы и этапы. Он описывает подход логического и алгоритмического проектирования без какой-либо конкретной языковой парадигмы, поскольку выражает нотации произвольного языка и алфавита. Это краткое чтение, но оно дает вам представление о том, что необходимо для каждой части.
Фрэнсис Куглер

70

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

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

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

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


55

Я думаю, что Modern Compiler Реализация в ML - лучший вводный текст написания компилятором. Существует также версия на Java и версия на C , каждая из которых может быть более доступной с учетом вашего языка. Книга содержит много полезных базовых материалов (сканирование и синтаксический анализ, семантический анализ, записи активации, выбор инструкций, генерация собственного кода в RISC и x86) и различные «сложные» темы (компиляция ОО и функциональных языков, полиморфизм, сборка мусора, оптимизация и единая форма статического назначения) в относительно мало места (~ 500 страниц).

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

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


Конструкция компилятора PDF ethoberon.ethz.ch/WirthPubl/CBEAll.pdf
matepal297

Я настоятельно рекомендую против версии C «Современной реализации компилятора», она изуродована низкоуровневыми деталями из-за C. Это полностью загромождает книгу. Java 1st не слишком хороша, так как дизайн ОО плох, Java 2nd ed больше не относится к языку Tiger. Поэтому я настоятельно рекомендую ML: нет необходимости свободно понимать ML. ML определенно хорошо подходит для работы.
аким

44

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

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

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


1
Game Scripting Mastery - отличный учебный ресурс, потому что когда вы закончите, у вас будет играбельная 2D игра-приключение со сценарием. Это делает каждое упражнение сосредоточенным на определенной цели и поддерживает читателя в мотивации.
Dour High Arch

1
Dragon немного чрезмерно сосредоточен на грамматическом разборе. Если вы не пытаетесь анализировать что-то совершенно невозможное, такое как C ++ или с помощью генераторов синтаксического анализатора, но можете использовать, например, созданную вручную грамматику LL, вы, возможно, захотите найти что-то, что обрабатывает поля компилятора с более высоким процентом, кроме преобразования и проверки грамматики
Marco van де Voort

27

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

Или проверить SLANG . Это похоже на «Давайте построим компилятор», но это гораздо лучший ресурс, особенно для начинающих. Это идет с учебником в формате PDF, который использует 7-ступенчатый подход к обучению компилятору. Добавление ссылки quora, поскольку она содержит ссылки на все различные порты SLANG в C ++, Java и JS, также переводчики в python и java, первоначально написанные с использованием C # и платформы .NET.


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

23

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

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

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


Первая ссылка мертва.
Линн

20

Если у вас мало времени, я рекомендую « Компиляцию компиляторов» Никлауса Вирта (Addison-Wesley. 1996) , крошечный небольшой буклет, который вы можете прочитать за день, но в нем объясняются основы (в том числе, как реализовать лексеры, парсеры рекурсивного спуска, и ваши собственные виртуальные машины на основе стека). После этого, если вы хотите глубокого погружения, нет пути обойти книгу Дракона, как предлагают другие комментаторы.


Если у вас мало времени, не пишите компилятор.
Инго

17

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

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


17

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

Python и Ruby обычно интерпретируются. Возможно, вы хотите начать с переводчика. Это вообще проще.

Первый шаг - написать формальное описание языка, грамматику вашего языка программирования. Затем вам нужно преобразовать исходный код, который вы хотите скомпилировать или интерпретировать в соответствии с грамматикой, в абстрактное синтаксическое дерево, внутреннюю форму исходного кода, которую компьютер понимает и может работать. Этот шаг обычно называется синтаксическим анализом, а программное обеспечение, которое анализирует исходный код, называется синтаксическим анализатором. Часто анализатор генерируется генератором синтаксического анализатора, который преобразует формальную грамматику в исходный машинный код. Для хорошего нематематического объяснения синтаксического анализа я рекомендую Технику синтаксического анализа - Практическое руководство. В Википедии есть сравнение генераторов парсеров, из которых вы можете выбрать тот, который подходит вам. В зависимости от генератора парсера, который вы выбрали,

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

На втором этапе абстрактное синтаксическое дерево трансформируется из древовидной структуры в линейное промежуточное представление. В качестве хорошего примера для этого часто упоминается байт-код Lua. Но промежуточное представление действительно зависит от вашего языка.

Если вы создаете интерпретатор, вам просто придется интерпретировать промежуточное представление. Вы также можете просто скомпилировать его. Я рекомендую LLVM и libjit для своевременной компиляции. Чтобы сделать язык пригодным для использования, вы также должны будете включить некоторые функции ввода и вывода и, возможно, небольшую стандартную библиотеку.

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

На эту тему есть несколько книг, но я не могу рекомендовать ни одну из них для общего пользования. Большинство из них слишком академичны или практичны. Там нет «Научитесь писать компилятором за 21 день», и, следовательно, вам придется купить несколько книг, чтобы получить хорошее понимание всей этой темы. Если вы будете искать в Интернете, вы обнаружите некоторые онлайн-книги и конспекты лекций. Может быть, рядом с вами есть университетская библиотека, где вы можете брать книги по компиляторам.

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


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


11

Одна книга, еще не предложенная, но очень важная, - «Линкеры и загрузчики» Джона Левина. Если вы не используете внешний ассемблер, вам понадобится способ вывести объектный файл, который можно связать с вашей конечной программой. Даже если вы используете внешний ассемблер, вам, вероятно, понадобится понять перемещения и как весь процесс загрузки программы работает, чтобы сделать рабочий инструмент. Эта книга собирает много случайных знаний об этом процессе для различных систем, включая Win32 и Linux.


10

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

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


10

Если вы хотите использовать LLVM, проверьте это: http://llvm.org/docs/tutorial/ . Он учит вас, как написать компилятор с нуля, используя инфраструктуру LLVM, и не предполагает, что у вас есть какие-либо знания по этому вопросу.

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


Но документация по настройке Visual Studio написана плохо, плюс примеров нет
SpicyWeenie

10

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

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

Альтернативный текст


10

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

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

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

Многие также говорят, что писать компиляторы глупо и бессмысленно. Ну, есть несколько причин, почему разработка компилятора полезна:

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

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

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

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


9

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

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

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

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

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


9

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

Создать языковой компилятор для .NET Framework - не уверен, куда это делось

Создайте языковой компилятор для .NET Framework - копия оригинального документа в формате PDF

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

  1. Определение языка
  2. сканер
  3. Парсер (немного больше всего меня интересует)
  4. Ориентация на .Net Framework
  5. Генератор кода

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

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

НТН

скелет


Что значит "не совсем Java"?
Hejazzman

ха-ха, извини, я имел в виду, что он написан для .Net, который в принципе похож на Java. Оба в стиле JIT. :)
dbones

8

Простой способ создать компилятор - это использовать bison и flex (или аналогичные), построить дерево (AST) и сгенерировать код на C. С генерацией C-кода является наиболее важным шагом. Создавая код на C, ваш язык будет автоматически работать на всех платформах, где есть компилятор C.

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


8

Из comp.compilers FAQ :

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

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

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

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

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

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

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


8

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

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


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

4
Если вы не читали книгу Дракона. Пожалуйста, не рекомендую это. На самом деле, вы когда-нибудь реализовывали компилятор?

Да, как следует из названия, Книга Дракона - это монстр. Очень глубокий, но тем не менее очень хороший ресурс. Я не рекомендовал бы это для начинающих, хотя ...
Захари Мюррей

2
@Neil: Ты меня не гуглил? лол. blog.280z28.org Но нет, я не читал эту книгу.
Сэм Харвелл

Я читаю это (книгу о драконах) в настоящее время, а также Lex / Yacc в то же время, я нахожу книгу довольно хорошей. Лично.
Симеон Пилигрим

1
Чтобы быть справедливым, я предварял это "Я слышу ...". :) # 1 и # 3 - это те моменты, которые я считаю чрезвычайно важными, но не упоминаются так часто.
Сэм Харвелл

8

Компилятор LCC ( википедия ) ( домашняя страница проекта ) ( github.com/drh/lcc ) Фрейзера и Хансона описан в их книге «Компилятор C с возможностью ретаргетинга: проектирование и реализация». Он довольно читабелен и объясняет весь компилятор, вплоть до генерации кода.


Это кажется очень хорошим ресурсом, спасибо.
Гидеон

7

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


7

К сожалению, это на испанском языке, но это библиография курса под названием "Compiladores e Intérpretes" (составители и переводчики) в Аргентине.

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

  • Проектирование компиляторов в C.
    Allen I. Holub

    Prentice-Hall. 1990.

  • Compiladores. Теория и строительство.
    Санчи Льорка, FJ, Галан Паскуаль, C. Редакция Paraninfo. 1988.

  • Конструкция компилятора.
    Никлаус Вирт

    Эддисон-Уэсли. 1996.

  • Lenguajes, Gramáticas y Autómatas. Un enfoque práctico.
    Педро Исаси Виньуэла, Палома Мартинес Фернандес, Даниэль Боррахо Миллан. Addison-Wesley Iberoamericana (Испания). 1997.

  • Искусство дизайна компилятора. Теория и практика.
    Томас Питтман, Джеймс Питерс.

    Prentice-Hall. 1992.

  • Построение объектно-ориентированного компилятора.
    Джим Холмс.
    Прентис Холл, Энглвудские скалы, Нью-Джерси 1995

  • Compiladores. Основные понятия.
    Б. Тойфель, С. Шмидт, Т. Тойфель.

    Addison-Wesley Iberoamericana. 1995.

  • Введение в теорию автоматов, языков и вычислений.

    Джон Э. Хопкрофт Джеффре Д. Ульман.
    Addison-Wesley. 1979.

  • Введение в формальные языки.
    György E. Révész.

    Mc Graw Hill. 1983.

  • Техника разбора. Практическое руководство.
    Дик Грун, Цериэль Джейкобс.
    Impreso por los autores. 1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc: еще один компилятор-компилятор. Технический отчет
    Стивена Джонсона по
    вычислительной технике № 32, 1975 год. Bell Laboratories. Мюррей Хилл, Нью-
    Джерси.

  • Лекс: генератор лексического анализатора.
    ME Lesk, E. Schmidt. Технический отчет по вычислительной технике № 39, 1975 г. Bell Laboratories. Мюррей Хилл, Нью-Джерси.

  • lex & yacc.
    Джон Р. Левин, Тони Мейсон, Даг Браун.
    О'Рейли и Партнеры. 1995.

  • Элементы теории вычислений.
    Гарри Р. Льюис, Христос Х. Пападимитриу. Segunda Edición. Прентис Холл. 1998.

  • Находится на стадии строительства и контроля.
    Сальвадор В. Кавадини.
    Трабахо Финал де Градо, парашютист в «Титуло де Инженерио ан Компьюсьон».
    Facultad de Matemática Aplicada. UCSE 2001.


6

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

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

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

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

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

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


Как говорят другие, это БОЛЬШОЙ аргумент, я думаю, что суши - это финальная работа для бакалавра, для этого нужно знать МНОГО понятий математики, информатики и так далее.
ingconti

Если вы не знаете этих тем, вам не следует пытаться создать серьезный компилятор. Однако, если у вас есть 2-3 года обучения в области компьютерных наук (программирование, структуры данных, язык ассемблера), статья MetaII будет работать для вас.
Ира Бакстер

5

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

Прочитайте это.

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

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


5

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

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

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


5

Вы можете использовать BCEL от Apache Software Foundation. С помощью этого инструмента вы можете генерировать код, подобный ассемблеру, но это Java с BCEL API. Вы можете узнать, как генерировать код промежуточного языка (в данном случае - байт-код).

Простой пример

  1. Создайте класс Java с этой функцией:

    public String maxAsString(int a, int b) {
        if (a > b) {
            return Integer.valueOf(a).toString();
        } else if (a < b) {
            return Integer.valueOf(b).toString();
        } else {
            return "equals";
        }
    }
    

Теперь запустите BCELifier с этим классом

BCELifier bcelifier = new BCELifier("MyClass", System.out);
bcelifier.start();

Вы можете увидеть результат на консоли для всего класса (как построить байт-код MyClass.java). Код для этой функции:

private void createMethod_1() {
  InstructionList il = new InstructionList();
  MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);

  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
  il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
    BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
  il.append(if_icmple_2);
  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
  il.append(InstructionFactory.createLoad(Type.INT, 2));
    BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
  il.append(if_icmpge_15);
  il.append(InstructionFactory.createLoad(Type.INT, 2));
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  if_icmple_2.setTarget(ih_13);
  if_icmpge_15.setTarget(ih_26);
  method.setMaxStack();
  method.setMaxLocals();
  _cg.addMethod(method.getMethod());
  il.dispose();
}

5

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

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

http://www.ethoberon.ethz.ch/WirthPubl/ProjectOberon.pdf

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

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

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


4

Пока в эту книгу не вошла эта книга:

Основы проектирования компиляторов (Торбен Могенсен) (факультет компьютерных наук, Университет Копенгагена)

Я также заинтересован в изучении компиляторов и планирую войти в эту отрасль в ближайшие пару лет. Эта книга - идеальная книга по теории, чтобы начать изучать компиляторы, насколько я вижу. Это БЕСПЛАТНО для копирования и воспроизведения, аккуратно и аккуратно написано и дает вам на простом английском языке без какого-либо кода, но по-прежнему представляет механику в виде инструкций и диаграмм и т. Д. Стоит посмотреть IMO.


Добавил в список спасибо :)
Антон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.