Научиться писать компилятор

голоса
699

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

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

Задан 04/08/2008 в 23:46
источник пользователем
На других языках...                            


40 ответов

голоса
1k

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

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

  • ¶ Ссылка на файл в формате PDF
  • $ Ссылка на печатную книгу
Ответил 04/08/2008 d 23:52
источник пользователем

голоса
69

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

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

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

Некоторые книги по этой теме , которые я нашел особенно полезно были Составители принципы и методы (или книгу Dragon, из - за милый дракон на обложке). У него есть некоторые большие теории и , безусловно , охватывает контекстно-свободные грамматики в очень доступной форме. Кроме того , для построения лексического анализатора и синтаксического анализа, вы , вероятно , использовать * NIX инструменты Лекс и Yacc. И достаточно неинтересно, книга под названием « Lex и Yacc » взяла, где Дракон книга остановилась на эту часть.

Ответил 21/07/2009 d 00:01
источник пользователем

голоса
54

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

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

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

Ответил 10/08/2008 d 08:54
источник пользователем

голоса
45

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

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

Это все еще приличное чтение, особенно если вы можете забрать его за дешево на Amazon. Если вы хотите только простое введение в компилятор, Game Scripting Мастерства не плохой путь. Если вы хотите идти хардкор фронт, то вы должны согласиться на не меньше, чем Dragon Book.

Ответил 05/08/2008 d 00:08
источник пользователем

голоса
28

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

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

Ответил 04/08/2008 d 23:56
источник пользователем

голоса
24

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

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

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

Ответил 05/08/2008 d 00:13
источник пользователем

голоса
20

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

Ответил 29/08/2010 d 00:14
источник пользователем

голоса
17

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

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

Ответил 20/07/2009 d 23:47
источник пользователем

голоса
16

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

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

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

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

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

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

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

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

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

Ответил 21/07/2009 d 11:37
источник пользователем

Ответил 18/05/2010 d 00:38
источник пользователем

голоса
11

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

Ответил 18/08/2008 d 21:18
источник пользователем

голоса
10

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

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

Alt текст

Ответил 09/08/2010 d 19:33
источник пользователем

голоса
10

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

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

Ответил 20/08/2008 d 11:01
источник пользователем

голоса
10

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

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

Ответил 05/08/2008 d 17:16
источник пользователем

голоса
9

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

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

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

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

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

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

Ответил 06/08/2009 d 23:37
источник пользователем

голоса
9

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

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

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

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

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

Ее цель люди начали, написано на C # (не совсем Java)

НТН

скелет

Ответил 31/12/2008 d 00:01
источник пользователем

голоса
9

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

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

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

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

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

Ответил 20/08/2008 d 12:28
источник пользователем

голоса
8

Из comp.compilers FAQ :

"Программирование персонального компьютера" Пер Brinch Hansen Prentice-Hall 1982 ISBN 0-13-730283-5

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

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

"Бринч Хансен на Pascal Составители" Пер Brinch Hansen Prentice-Hall 1985 ISBN 0-13-083098-4

Другим свет на теории тяжелых-на-прагматиков here's-хау к кодовой ней книге. Автор представляет проектирование, внедрение и полный исходный код для компилятора и интерпретатора р-кода для Pascal- (Pascal «минус»), Паскаль подмножество с булевыми и целочисленных типов (но без символов, чисел, subranged или перечислены типы) , постоянная и переменное определение и массив и типы записей (но не упакован, варианта, установить, указатель, безымянные, переименовано, или типов файлов), выражение, операторы присваивания, вложенные определения процедуры со значением и переменных параметрами, если заявления, а заявления, и начать конец блоки (но не определение функций, процедурные параметры Гото заявление и этикетки, заявления случае повторите заявления, для заявлений, а также с заявлениями).

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

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

Ответил 26/06/2010 d 21:17
источник пользователем

голоса
8

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

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

Ответил 05/10/2008 d 17:00
источник пользователем

голоса
8

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

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

Ответил 20/08/2008 d 10:56
источник пользователем

голоса
7

К сожалению, это на испанском языке, но это библиография курс под названием «Compiladores е» (интерпретирует Компиляторы и интерпретаторы) в Аргентине.

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

  • Составители Дизайн в С.
    Аллен И. Голуб

    Prentice-Hall. 1990.

  • Compiladores. Teoria у Construcción.
    Санчис Llorca, FJ, Галан Паскуаль, C. Editorial Paraninfo. 1988.

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

    Addison-Wesley. 1996.

  • Lenguajes, Gramáticas у Automatas. Un enfoque Practico.
    Педро Isasi Виньуэла, Палома Мартинес Фернандес, Даниэль Borrajo Миллан. Addison-Wesley Iberoamericana (España). 1997.

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

    Prentice-Hall. 1992.

  • Объектно-ориентированные компиляторы.
    Джим Холмс.
    Prentice Hall, Englewood Cliffs, NJ 1995

  • Compiladores. Conceptos Fundamentales.
    Б. Тойфель, С. Шмидт, Т. Тойфель.

    Addison-Wesley Iberoamericana. 1995.

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

    John E. Hopcroft. Jeffref Д. Ульман.
    Addison-Wesley. 1979.

  • Введение формальных языков.
    Дёрдь Е. Ревеса.

    Mc Грау Хилл. 1983.

  • Синтаксические методы. Практическое руководство.
    Dick Grune, Ceriel Jacobs.
    Impreso Por лос autores. 1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc: Еще один компилятор компиляторов.
    Стивен К. Джонсон
    Технический отчет Computing Science Nº 32, 1975. Bell Laboratories. Мюррей - Хилл, Нью -
    Джерси.

  • Lex: лексический анализатор генератор.
    Е. Lesk, Э. Шмидт. Вычислительный Технический отчет Наука Nº 39, 1975. Bell Laboratories. Мюррей - Хилл, Нью - Джерси.

  • Lex & Yacc.
    Джон Р. Левин, Тони Мейсон, Даг Браун.
    O'Reilly & Associates. 1995.

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

  • Un Algoritmo Eficiente пара ла Construcción дель Grafo де Dependencia де управления.
    Сальвадор В. Cavadini.
    Trabajo Окончательный де Градо пункт Obtener эль Título де Ingeniero ан Computación.
    Facultad де Matematica Aplicada. UCSE 2001.

Ответил 25/04/2009 d 18:23
источник пользователем

голоса
7

LCC компилятор ( википедия ) ( проект страница ) Фрейзер и Hanson описывается в своей книге «настраиваемый C Compiler: разработка и реализация». Это вполне читаема и объясняет весь компилятор, вплоть до генерации кода.

Ответил 16/09/2008 d 17:21
источник пользователем

голоса
7

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

Ответил 12/08/2008 d 12:25
источник пользователем

голоса
6

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

Учебное пособие: Metacompilers Часть 1

Это все основано на удивительном маленьком 10-страничный технический документ:

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

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

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

Ответил 28/08/2009 d 01:01
источник пользователем

голоса
5
  1. Это обширная тема. Не стоит недооценивать эту точку зрения. И не стоит недооценивать мою точку зрения не стоит недооценивать его.
  2. Я слышу , как Dragon Book является а (?) Для начала, наряду с поиском. :) Получить лучше на поиск, в конце концов , это будет ваша жизнь.
  3. Создание собственного языка программирования абсолютно хорошее упражнение! Но знайте , что он никогда не будет использоваться для любой практической цели , в конце концов. Исключения из этого мало и очень далеко друг от друга.
Ответил 20/07/2009 d 23:44
источник пользователем

голоса
5

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

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

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

Ответил 01/10/2008 d 10:30
источник пользователем

голоса
5

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

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

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

Никлаус Вирт, Джург Гаткнет

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

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

Ответил 19/09/2008 d 00:31
источник пользователем

голоса
4

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

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

  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();
}
Ответил 14/07/2011 d 16:42
источник пользователем

голоса
4

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

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

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

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

Ответил 22/08/2008 d 16:57
источник пользователем

голоса
3

Не входит в список до сих пор эта книга:

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

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

Ответил 12/03/2014 d 17:05
источник пользователем

голоса
3

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

(Предположим , что вы пишете компилятор и систему выполнения, и что вы реализуете мусора собрали язык.

Ответил 27/06/2010 d 00:43
источник пользователем

голоса
3

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

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

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

Стив А.

Ответил 13/01/2009 d 23:31
источник пользователем

голоса
3

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

Ответил 01/10/2008 d 21:24
источник пользователем

голоса
2

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

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

Ответил 21/07/2009 d 01:20
источник пользователем

голоса
2

В качестве отправной точки, это будет хорошо , чтобы создать метод рекурсивного спуска (RDP) (скажем , вы хотите создать свой собственный аромат BASIC и построить BASIC интерпретатор) , чтобы понять , как написать компилятор. Я нашел самую лучшую информацию в Шилдт в C Power Users, глава 7. В этой главе относится к другой книге Г. Шилд «C Полный Reference» , где он объясняет , как создать калькулятор (простое выражение парсер). Я нашел обе книги на eBay очень дешево. Вы можете проверить код книги , если вы идете в www.osborne.com или проверить в www.HerbSchildt.com я нашел тот же код , но для C # в своей последней книге

Ответил 20/08/2008 d 12:16
источник пользователем

голоса
1

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

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

Был бы признателен за отзывы о них.

Ответил 02/04/2014 d 13:39
источник пользователем

голоса
1

Самый быстрый подход через две книги:

Версия 1990 из Введения в компиляцию методов, первый курс с использованием ANSI C, Лекса и YACC Дж.П. Беннет - идеальный балансом примером кода, анализом теории и дизайн- это содержит полный компилятор , написанный на C, Лекс и Yacc для простая грамматика

Dragon Book (старая версия) - в основном подробный справочник для функций , не предусмотренных в бывшей книге

Ответил 01/04/2011 d 20:39
источник пользователем

голоса
1

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

Как вы думаете, C ++ был сделан?

Ответил 21/07/2009 d 01:42
источник пользователем

голоса
1

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

Я рекомендую «Язык программирования процессоров в Java: компиляторы и интерпретаторы», удивительная книга для самоучки программиста.

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

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

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

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

Ответил 05/02/2009 d 03:55
источник пользователем

голоса
0
  • Начните с убедившись, что вы можете ответить на большинство вопросов, отмеченных C ++ здесь на переполнение стека.
  • После этого, вы должны убедиться, что вы понимаете, как другие компиляторы работают и понимать [часть] их исходный код.
  • Вы заметите, что вам нужен ассемблер и начать изучать ассемблер, пока вы не можете ответить на многие вопросы, с этим тегом.
  • Если вы зашли так далеко, вы обнаружите, что прошло несколько лет, и понять, насколько велик такой проект и, возможно, улыбка на свой вопрос из тогда (если эта страница все еще существует в то время) ...
Ответил 21/07/2009 d 00:01
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more