Вопрос

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

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

Это было полезно?

Решение

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

Легенда:

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Alt text

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ХТХ

кости

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

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

Из Часто задаваемые вопросы по компиляторам:

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

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

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

«Бринч Хансен на Pascal Compilers» от Brinch Hansen Prentice-Hall 1985 ISBN 0-13-083098-4

Еще одна легкая теория тяжелая на прагматике здесь-это книга-это-это книга.Автор представляет проектирование, реализацию и полный исходный код для компилятора и интерпретатора P-кода для Pascal- (Pascal «минус»), подмножество паскаль с логическими и целочисленными типами (но без символов, реальных, подсудимых или перечисленных типов) , Постоянные и переменные определения и типы массива и записей (но без упакованных, вариантов, установки, указателя, безымянных, переименованных или типов файлов), выражений, операторов назначения, вложенных определений процедур со значением и параметров переменных, если операторы, в то время как операторы, операторы и блоки начала (но нет определений функций, процедурных параметров, операторов GOTO и меток, операторов случаев, повторных операторов, для операторов и с операторами).

Компилятор и интерпретатор написаны в Pascal* (Pascal "Star"), подмножество Pascal, расширенное с некоторыми функциями в стиле Edison для создания систем разработки программного обеспечения.Автор продается компилятор Pascal* для IBM PC продается, но легко перенести Pascal-компилятор книги на любую удобную платформу Pascal.

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

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

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

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

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

Извините, это на испанском языке, но это библиография курса Compiladores e Interpretes (Компиляторы и интерпретаторы) в Аргентине.

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

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

    Прентис-Холл.1990.

  • Сборники.Теория и строительство.
    Sanchís Llorca, FJ, Галан Паскуаль, К.Редакция Паранинфо.1988.

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

    Аддисон-Уэсли.1996.

  • Языковые, грамматические и автоматические.Un enfoque práctico.
    Педро Исаси Винуэла, Палома Мартинес Фернандес, Даниэль Борраджо Миллан.Аддисон-Уэсли Ибероамерикана (Эспана).1997.

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

    Прентис-Холл.1992.

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

  • Сборники.Основы концепции.
    Б.Тойфель, С.Шмидт, Т.Тойфель.

    Аддисон-Уэсли Ибероамерикана.1995.

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

    Джон Э.Хопкрофт.Джеффреф Д.Ульман.
    Аддисон-Уэсли.1979.

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

    Мак Грау Хилл.1983.

  • Техники разбора.Практическое руководство.
    Дик Грун, Ceriel Jacobs.
    Impreso Por Los Autores.1995 год
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Якк:Еще один компилятор-компилятор.
    Стивен С.Джонсон
    Технический отчет по компьютерной науке № 32, 1975.Bell Laboratories.Мюррей Хилл, Нью
    Джерси.

  • Лекс:Генератор лексического анализатора.
    М.Э.Леск, Э.Шмидт.Технический отчет по компьютерной науке № 39, 1975.Лаборатории Белла.Мюррей Хилл, Нью-Джерси.

  • лекс и якк.
    Джон Р.Левин, Тони Мейсон, Даг Браун.
    О'Рейли и партнеры.1995.

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

  • Эффективный алгоритм для построения графиков зависимости управления.
    Сальвадор В.Кавадини.
    Финальный этап работы для получения титула инженера-вычислителя.
    Факультет прикладной математики.У.К.С.Э.2001.

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

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

Руководство:Метакомпиляторы. Часть 1.

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

Вэл Шорре МЕТА II:Синтаксис-ориентированный язык написания компиляторов

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

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

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

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

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

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

(Рассмотрение не такое подробное, как в его книге о компиляторах.)

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

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

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

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

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

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

Если хотите, поработайте над этим, но затем посмотрите еще одну ссылку на то, как на самом деле пишутся более крупные и полные компиляторы.

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

Вы можете использовать БКЭЛ Фондом программного обеспечения Apache.С помощью этого инструмента вы можете генерировать код, подобный ассемблеру, но это 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();
}

В список пока не попала эта книга:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top