compiler-construction - translator - windows compiler c




Учимся писать компилятор (20)

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

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


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

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

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

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

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


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

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

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

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


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

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


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

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


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

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

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


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

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

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


Если у вас мало времени, я рекомендую « ethoberon.ethz.ch/WirthPubl/CBEAll.pdf , крошечный небольшой буклет, который вы можете прочитать за день, но в нем объясняются основы (в том числе, как реализовать лексеры, парсеры рекурсивного спуска, и ваши собственные виртуальные машины на основе стека). После этого, если вы хотите глубокого погружения, нет пути обойти книгу Дракона, как предлагают другие комментаторы.


Из 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.

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


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

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

  • Дизайн компиляторов в C.
    Аллен И. Голуб

    Prentice-Hall. 1990.

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

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

    Addison-Wesley. 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.


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

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

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

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


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

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

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

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

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

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



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

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


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

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

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


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

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

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

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

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

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

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

НТН

скелет


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

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

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

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

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

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

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

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


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

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

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


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

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


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

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

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





language-agnostic