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

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

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

4.08.2008 22:46:36
ANTLR полностью. Все ресурсы, предложенные ниже, кажутся мне излишними. ANTLR всегда лучший друг дизайнера компиляторов. A
A_Var 19.12.2010 04:25:15
Если вы сосредоточены на изучении принципа компиляции идей в целом - вы можете проверить, а SICP - сокращение для структурированной интерпретации компьютерной программы, основанной на схеме (списке), но учит общим принципам. mitpress.mit.edu/sicp . Эту книгу мне порекомендовал ветеран, который работает в компании и занимается этим сбором и интерпретацией для жизни!
Nishant 27.04.2011 15:32:25
9000 1.03.2014 00:21:05
Я написал статью о создании компилятора в своем блоге: orangejuiceliberationfront.com/how-to-write-a-compiler В нем основное внимание уделяется основам и началу работы . Там есть еще куча статей, связанных с компилятором / codegen / parser / language design.
uliwitness 8.03.2014 12:33:30
30 ОТВЕТОВ
РЕШЕНИЕ

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

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

  • ¶ Ссылка на файл PDF
  • $ Ссылка на печатную книгу
1077
15.10.2019 21:48:38
Я прочитал серию Let's Build a Compiler[ compilers.iecc.com/crenshaw/] , это действительно хорошая рецензия и хорошая отправная точка.
TheVillageIdiot 31.05.2010 04:35:19
Я думаю, что стоит упомянуть курс компиляторов Coursera. Он имеет хорошие видео и прогуливается по созданию java-подобного языка / простого компилятора. Ссылка на Coursera Compilers
QuantumKarl 24.02.2016 15:25:49
Я хотел, чтобы этот ответ был как можно более оригинальным, поэтому я решил разместить эту ссылку здесь: tutorialspoint.com/compiler_design/index.htm. Что мне понравилось в этом сайте, так это то, что он не связан с написанием кода. создать компилятор, но он разбивает компилятор на части: фазы и этапы. В нем описывается подход логического и алгоритмического проектирования без какой-либо конкретной языковой парадигмы, поскольку он выражает обозначения произвольного языка и алфавита. Это краткое чтение, но оно дает вам представление о том, что необходимо для каждой части.
Francis Cugler 8.12.2016 11:55:52

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

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

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

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

70
20.07.2009 23:01:20

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

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

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

55
4.12.2019 14:42:49
Конструкция компилятора PDF ethoberon.ethz.ch/WirthPubl/CBEAll.pdf
matepal297 21.10.2015 22:00:39
Я настоятельно рекомендую против версии C «Современная реализация компилятора», она изуродована низкоуровневыми деталями из-за C. Это полностью загромождает книгу. Java 1st не слишком хороша, так как дизайн ОО плох, Java 2nd ed больше не относится к языку Tiger. Поэтому я настоятельно рекомендую ML: нет необходимости свободно понимать ML. ML определенно хорошо подходит для работы.
akim 26.07.2016 17:52:07

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

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

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

44
4.08.2008 23:08:18
Game Scripting Mastery - отличный учебный ресурс, потому что когда вы закончите, у вас будет играбельная 2D игра-приключение со сценарием. Это делает каждое упражнение сосредоточенным на определенной цели и поддерживает читателя в мотивации.
Dour High Arch 9.12.2008 17:58:02
Dragon немного чрезмерно сосредоточен на грамматическом разборе. Если вы не пытаетесь анализировать что-то совершенно невозможное, например C ++ или с помощью генераторов синтаксического анализатора, но можете использовать, например, созданную вручную грамматику LL, вам может потребоваться найти что-то, что обрабатывает поля компилятора с более высоким процентом, кроме преобразования и проверки грамматики
Marco van de Voort 26.06.2009 21:36:25

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

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

27
16.08.2016 05:55:29
Я согласен, что эта серия немного устарела, хотя все еще полезна. Тем не менее, моя самая большая претензия к этому - тот факт, что он пытается выводить текст прямо на ассемблер, а не строить дерево разбора любого типа, что означает (вопреки тому, что указано в первой статье), что он не очень полезен для написания переводчик.
a_m0d 16.09.2010 06:58:36

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

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

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

23
4.08.2008 23:25:02
Первая ссылка мертва.
Lynn 24.03.2017 13:31:46

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

20
18.10.2011 13:55:17
Если у вас мало времени, не пишите компилятор.
Ingo 6.01.2012 23:56:02

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

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

17
20.07.2009 22:47:04

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

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

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

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

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

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

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

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

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

17
21.07.2009 10:37:00
++ Вы правы, что хорошо знать все эти вещи, и это может быть большой работой, но я также узнал от некоторых экспертов, как не делать вещи значительными. Хорошо знать вещи, и еще лучше знать, когда их не использовать, что происходит чаще всего.
Mike Dunlavey 21.07.2009 16:00:37
14
27.12.2014 12:39:08

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

11
18.08.2008 20:18:32

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

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

10
5.08.2008 16:16:01

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

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

10
20.08.2008 10:01:17
Но документация по настройке Visual Studio написана плохо, плюс примеров нет
SpicyWeenie 2.10.2014 09:17:44

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

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

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

10
27.12.2014 12:39:09

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

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

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

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

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

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

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

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

10
26.05.2019 23:00:07

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

Я бы второй 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
23.05.2017 11:54:41

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

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

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

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

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

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

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

НТН

скелет

9
15.12.2018 01:04:58
Что значит "не совсем Java"?
Hejazzman 25.04.2009 21:53:58
ха-ха, извини, я имел в виду, что он написан для .Net, который в принципе похож на Java. Оба в стиле JIT. :)
dbones 28.04.2009 10:48:51

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

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

8
20.08.2008 09:56:34

Из 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
27.06.2010 19:00:38

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

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

8
1.12.2010 12:50:57
  1. Это обширная тема. Не стоит недооценивать этот момент. И не стоит недооценивать мою точку зрения, чтобы не недооценивать ее.
  2. Я слышал, что « Книга Дракона» - это (?) Место для начала, наряду с поиском. :) Становитесь лучше в поисках, в конце концов это будет ваша жизнь.
  3. Создание собственного языка программирования - абсолютно хорошее упражнение! Но знайте, что это никогда не будет использовано для каких-либо практических целей. Исключений из этого мало, и они очень далеки.
8
28.02.2014 23:54:22
Если вы не читали книгу Дракона. Пожалуйста, не рекомендую это. На самом деле, вы когда-нибудь реализовывали компилятор?
anon 20.07.2009 22:46:24
Да, как следует из названия, Книга Дракона - это монстр. Очень глубокий, но тем не менее очень хороший ресурс. Я не рекомендовал бы это для начинающих, хотя ...
Zachary Murray 20.07.2009 22:47:51
@Neil: ты не гуглил меня? лол. blog.280z28.org Но нет, я не читал эту книгу.
Sam Harwell 20.07.2009 22:49:48
Я читаю это (книгу о драконах) в настоящее время, а также Lex / Yacc в то же время, я нахожу книгу довольно хорошей. Лично.
Simeon Pilgrim 20.07.2009 22:58:10
Чтобы быть справедливым, я предварял это "Я слышу ...". :) # 1 и # 3 - это пункты, которые я считаю чрезвычайно важными, но не упоминаются так часто.
Sam Harwell 20.07.2009 23:07:39

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

8
4.12.2019 14:40:14
Это кажется очень хорошим ресурсом, спасибо.
gideon 11.08.2016 15:26:31

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

7
12.08.2008 11:25:34

К сожалению, это на испанском языке, но это библиография курса под названием "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 (España). 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.

7
28.02.2014 23:52:55

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

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

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

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

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

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

6
1.03.2014 00:09:29
Как говорят другие, это БОЛЬШОЙ аргумент, я думаю, что суши - это финальная работа для бакалавра, для этого нужно знать МНОГО понятий математики, информатики и так далее.
ingconti 18.06.2014 06:10:43
Если вы не знаете этих тем, вам не следует пытаться создать серьезный компилятор. Однако, если у вас есть 2-3 года обучения в области компьютерных наук (программирование, структуры данных, язык ассемблера), статья MetaII будет работать для вас.
Ira Baxter 18.06.2014 12:23:51

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

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

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

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

5
2.09.2008 04:52:41

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

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

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

5
1.10.2008 09:30:26

Вы можете использовать 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
1.03.2014 00:06:24

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

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

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

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

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

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

5
4.12.2019 14:38:41

До сих пор эта книга не включена в список:

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

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

4
12.03.2014 16:05:11
Добавил его в список спасибо :)
Anton 12.03.2014 17:11:33