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

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

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

40 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

НТН

скелет

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Извините, это на испанском языке, но это библиография курса под названием "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.

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

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

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

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

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

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

Вы можете использовать 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();
}

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам