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

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

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

699
задан 14.05.2020, 11:41

21 ответ

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

Легенда:

  • В ¶ Ссылка на Ссылку $ файла
  • PDF на печатную книгу
1055
ответ дан 14.05.2020, 11:44
  • 1
    I' ve читают Let's Build a Compiler [ compilers.iecc.com/crenshaw/] ряд, это - действительно хорошая рецензия и является хорошей начальной точкой. – TheVillageIdiot 14.05.2020, 11:44

Компилятор LCC ( Википедия ) ( домашняя страница проекта ) Fraser и Hanson описан в их книге "компилятор C Retargetable: Разработка и реализация". Это довольно читаемо и объясняет целый компилятор, вниз к генерации кода.

7
ответ дан 14.05.2020, 11:42

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

Генерация C код так же легка как генерация HTML (просто используют печать, или эквивалентный), который в свою очередь намного легче, чем запись синтаксического анализатора C или синтаксического анализатора HTML.

8
ответ дан 14.05.2020, 11:43
  • 1
    превосходный ответ! я смотрел, как изменить цвета текста и другой, и Ваше сообщение помогло мне много. – Bogdan 08.01.2013, 11:07

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

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

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

Niklaus Wirth, JГјrg Gutknecht

(Обработка не так обширна как его книга по компиляторам)

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

5
ответ дан 14.05.2020, 11:45
  • 1
    Довольный помочь. Да, it' s легкий пойти таблицы, строки, столбцы, и ячейки - как электронная таблица. – ADTC 03.12.2013, 11:22

Если Вам интересно в письменной форме компилятор для функционального языка (а не процедурный) Simon Peyton-Jones и David Lester" Реализующие функциональные языки: учебное руководство " является превосходным руководством.

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

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

5
ответ дан 14.05.2020, 11:45
  • 1
    Используйте code форматирование вместо полужирный курсив . I' d редактируют его самостоятельно, но I' d как Вы для изучения =) – ADTC 03.12.2013, 11:23

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

Read это.

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

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

4
ответ дан 14.05.2020, 11:46

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

3
ответ дан 14.05.2020, 11:47
  • 1
    Я wouldn' t говорят " также complicated" сказал бы я " плохо written". –  14.05.2020, 11:47

Я записал учебное руководство онлайн на дизайне компилятора, названном, "Давайте создадим Компилятор Механизма сценариев, а также компилятор собственного кода под названием Bxbasm. Документ Онлайн в: http://geocities.com/blunt_axe_basic/tutor/Bxb-Tutor.doc

документы, файлы поддержки и компилятор, в форме zip, в: http://geocities.com/blunt_axe_basic

Также: http://tech.groups.yahoo.com/group/QDepartment

Steve A.

3
ответ дан 14.05.2020, 11:48

Как начальная точка, будет хорошо создать синтаксический анализатор с рекурсивным спуском (RDP) (скажем, Вы хотите создать свой собственный аромат ОСНОВНЫХ и создать ОСНОВНОЙ интерпретатор) понять, как записать компилятор. Я нашел лучшую информацию в Продвинутых пользователях Herbert Schild C, главе 7. Эта глава обращается к другой книге H. Schildt "C полная Ссылка", где он объясняет, как создать калькулятор (синтаксический анализатор простого выражения). Я нашел обе книги о eBay очень дешевыми. Можно проверить код на книгу, если Вы переходите к www.osborne.com или регистрируетесь www.HerbSchildt.com , я нашел тот же код, но для C# в его последней книге

2
ответ дан 14.05.2020, 11:50
  • 1
    Где Вы регистрируетесь в Средстве моделирования или в Устройстве? – Sumanth 19.02.2020, 15:44

Если Вы похожи на меня, кто не имеет никакого формального образования информатики и интересуется, создавать/хотеть, чтобы знать, как работает компилятор:

я, рекомендуют "Процессоры языка программирования в Java: Компиляторы и Интерпретаторы", удивительная книга для программиста-самоучки.

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

существует другая книга, также хорошая, Дизайн Компилятора в C. Существует много кода, и он говорит Вам все о том, как создать инструменты компилятора и лексического анализатора.

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

не покупают книга Дракона. Это было пустой тратой денег и время и не для практика.

1
ответ дан 14.05.2020, 11:51

"Позволяют нам Сборка, Компилятор" является потрясающим, но это немного устарело. (Я не говорю, что это делает его даже немного менее допустимым.)

Или выезд СЛЕНГ . Это подобно для "Разрешения нам Сборка Компилятор", но является намного лучшим ресурсом специально для новичков. Это идет с учебным руководством PDF, которое проявляет 7 подходов шага при обучении Вам компилятор. Добавление quora ссылки, поскольку это имеет ссылки на все различные порты СЛЕНГА, в C++, Java и JS, также интерпретаторах в Python и Java, первоначально записанное использование C# и платформа.NET.

27
ответ дан 14.05.2020, 11:54
  • 1
  • 2
    Я соглашаюсь, что этот ряд немного устарел, хотя это все еще полезно. Однако мое самое большое схватывание с ним является тем, что это пытается произвести прямо к ассемблеру вместо того, чтобы создать любой тип дерева синтаксического анализа, что означает (вопреки тому, что указано в первой статье), что это isn' t очень полезный для записи интерпретатора. – a_m0d 14.05.2020, 11:54

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

7
ответ дан 14.05.2020, 11:55

Необходимо проверить Darius Bacon" ichbins", который является компилятором для маленького диалекта Lisp, предназначаясь C, на чуть более чем 6 страницах кода. Преимущество, которое это имеет по большинству игрушечных компиляторов, состоит в том, что язык достаточно завершен, что компилятор записан в нем. (tarball также включает интерпретатор для начальной загрузки вещи.)

существует больше материала о том, что я нашел полезным в обучении записать компилятор на моем веб-страница Схемы Ура .

8
ответ дан 14.05.2020, 11:56

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

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

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

55
ответ дан 14.05.2020, 11:57
  • 1
    Это все хорошие ресурсы, но я думаю Okasaki' s книга является, вероятно, самым фундаментальным и также наиболее полезное. – John L 15.10.2019, 03:21

Я соглашаюсь с Книжной ссылкой Дракона; IMO, это - полное руководство к конструкции компилятора. Подготовьтесь к некоторой жесткой теории, все же.

, Если Вы хотите книгу, которая легче на теории, , Игровое Мастерство Сценариев могло бы быть лучшей книгой для Вас. Если Вы - общий новичок в теории компилятора, она обеспечивает более нежное введение. Это не покрывает более практические методы парсинга (выбирающий непрогнозирующий рекурсивный спуск, не обсуждая LL или LR-анализ), и как я вспоминаю, это даже не обсуждает вида теории оптимизации. Плюс, вместо того, чтобы компилировать в машинный код, это компилирует в байт-код, который, как предполагается, работает на VM, который Вы также пишете.

Это - все еще достойное чтение, особенно если можно взять его для дешевого на Amazon. Если Вы только хотите легкое введение в компиляторы, Игровое Мастерство Сценариев не является плохим способом пойти. Если Вы хотите пойти хардкор впереди, то необходимо согласиться на не что иное как Книгу Дракона.

45
ответ дан 14.05.2020, 11:57
  • 1
    "куча" больших ссылок здесь, Спасибо! также благодаря всем else' s отвечает также:) – guhou 15.10.2019, 03:22
  • 2
    Дракон немного чрезмерно фокусируется на основанном на грамматике парсинге. Если Вы не пытаетесь проанализировать что-то чистое, невозможное как C++ или таким образом с помощью парсеров-генераторов, но можете использовать, например, LL-грамматика ручной работы, Вы могли бы хотеть высматривать что-то, что рассматривает более высокий компилятор процента поля кроме преобразования грамматики и доказательства – Marco van de Voort 14.05.2020, 11:58
  • 3
    Игровое Мастерство Сценариев является большим ресурсом изучения потому что когда you' ре, сделанное, у Вас будет играемая, scriptable 2D игра приключения. Это делает каждое осуществление сфокусированным на определенной цели и сохраняет читателя мотивированным. – Dour High Arch 14.05.2020, 11:58

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

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

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

23
ответ дан 14.05.2020, 11:58
  • 1
    Спасибо @kylc! I' ve зафиксировал ссылки в ответе. – Travis Brown 15.10.2019, 03:21

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

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

10
ответ дан 14.05.2020, 12:00
  • 1
    @Handfeger Какие-либо идеи, как мы можем закрыть DocBlock, если последняя строка пуста и мы нажимаем enter снова? – yckart 28.02.2020, 19:25

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

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

10
ответ дан 14.05.2020, 12:01
  • 1
    Я думаю, что DocBlockr добавляет эту опцию также. Его намного более усовершенствованный, чем мое решение – Handfeger 28.02.2020, 19:25

"... Позвольте нам Сборка Компилятор... "

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

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

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

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

9
ответ дан 14.05.2020, 12:03

Я изучаю то же понятие и нашел, что эта многообещающая статья Joel Pobar,

Создают Языковой компилятор для Платформы.NET - не уверенный, куда это пошло

, Создают Языковой компилятор для Платформы.NET - копия PDF исходного документа

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

  1. Сканер определения
  2. Langauge
  3. Синтаксический анализатор (бит я главным образом интересуюсь)
  4. Предназначение для.Net Платформы
  5. Генератор кода

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

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

кости HTH

9
ответ дан 14.05.2020, 12:03
  • 1
    Спасибо @denoir. – baptme 21.09.2012, 00:17
  • 2
    ха-ха, извините, я имел в виду его записанный для.Net, который в принципале подобен Java. Оба - JIT в стиле.:) – dbones 14.05.2020, 12:04
  • 3
    Что делает " не совсем Java" средний? – Hejazzman 14.05.2020, 12:04

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

11
ответ дан 14.05.2020, 12:05

Теги

Похожие вопросы