Обучение написанию компилятора
Предпочтительные языки: C/С++, Java и Ruby.
Я ищу несколько полезных книг/учебников о том, как писать собственный компилятор просто для образовательных целей. Я больше всего знаком с C/С++, Java и Ruby, поэтому предпочитаю ресурсы, которые связаны с одним из этих трех, но любой хороший ресурс является приемлемым.
Ответы
Ответ 1
Большой список ресурсов:
Условные обозначения:
- ¶ Ссылка на файл PDF
- $ Ссылка на печатную книгу
Ответ 2
Это довольно расплывчатый вопрос, я думаю; только из-за глубины вовлеченной темы. Однако компилятор можно разложить на две отдельные части; верхняя половина и нижняя. Верхняя половина обычно берет исходный язык и преобразует его в промежуточное представление, а нижняя половина заботится о генерации кода для конкретной платформы.
Тем не менее, одна идея для простого подхода к этой теме (по крайней мере, той, которую мы использовали в моем классе компиляторов) состоит в том, чтобы собрать компилятор из двух частей, описанных выше. В частности, вы получите хорошее представление обо всем процессе, просто собрав верхнюю половину.
Простое выполнение верхней половины позволяет вам получить опыт написания лексического анализатора и анализатора и приступить к генерации некоторого "кода" (это промежуточное представление, которое я упомянул). Поэтому он возьмет вашу исходную программу и преобразует ее в другое представление и выполнит некоторую оптимизацию (если хотите), которая является сердцем компилятора. Нижняя половина затем будет принимать это промежуточное представление и генерировать байты, необходимые для запуска программы в конкретной архитектуре. Например, нижняя половина будет принимать ваше промежуточное представление и генерировать исполняемый файл PE.
Некоторые книги на эту тему, которые я нашел особенно полезными, были " Принципы и методы компиляторов" (или "Книга Дракона" из-за милого дракона на обложке). Он получил отличную теорию и определенно охватывает контекстно-свободные грамматики действительно доступным способом. Также для построения лексического анализатора и парсера вы, вероятно, будете использовать инструменты * nix lex и yacc. И что неинтересно, книга под названием " lex and yacc " была взята с того места, где остановилась Книга Дракона.
Ответ 3
Я думаю, что Modern Compiler Реализация в ML - лучший вводный текст написания компилятором. Есть также версия на Java и версия на C, каждая из которых может быть более доступной, если учесть ваши языки. Книга содержит много полезных базовых материалов (сканирование и синтаксический анализ, семантический анализ, записи активации, выбор инструкций, генерация собственного кода в RISC и x86) и различные "сложные" темы (компиляция ОО и функциональных языков, полиморфизм, сборка мусора, оптимизация и единая форма статического назначения) в относительно мало места (~ 500 страниц).
Я предпочитаю "Реализацию современного компилятора" книге "Дракон", потому что реализация "Современного компилятора" рассматривает меньше вопросов - вместо этого в ней действительно подробно освещены все темы, которые вам понадобятся для написания серьезного, достойного компилятора. После того, как вы поработаете с этой книгой, вы будете готовы более детально заняться исследовательскими работами, если вам это нужно.
Должен признаться, у меня серьезное слабое место для конструкции компилятора Niklaus Wirth . Он доступен онлайн в формате PDF. Я нахожу эстетику программирования Wirth просто красивой, однако некоторые люди считают его стиль слишком минимальным (например, Wirth предпочитает парсеры с рекурсивным спуском, но большинство курсов CS ориентированы на инструменты генератора синтаксических анализаторов; конструкции языка Wirth довольно консервативны.) Конструкция компилятора - очень лаконичная дистилляция Вирт основные идеи, так что, нравится ли вам его стиль или нет, я настоятельно рекомендую прочитать эту книгу.
Ответ 4
Я согласен со ссылкой на Книгу Дракона; ИМО, это полное руководство по построению компилятора. Приготовьтесь к какой-то хардкорной теории.
Если вам нужна более легкая по теории книга, вам лучше подойдет Game Scripting Mastery. Если вы новичок в теории компиляторов, она станет более понятным введением. Он не охватывает более практичные методы синтаксического анализа (выбирая непредсказуемый рекурсивный спуск без обсуждения парсинга LL или LR), и, насколько я помню, он даже не обсуждает какую-либо теорию оптимизации. Кроме того, вместо компиляции в машинный код он компилируется в байт-код, который должен работать на виртуальной машине, которую вы также пишете.
Это все еще достойное чтение, особенно если вы можете купить его на Амазоне дешево. Если вы хотите просто познакомиться с компиляторами, Game Scripting Mastery - неплохой путь. Если вы хотите пойти в хардкор, то вам стоит согласиться только на "Книгу Дракона".
Ответ 5
"Let Build the Compiler" является удивительным, но он немного устарел. (Я не говорю, что это делает его даже немного менее действенным.)
Или зайдите SLANG. Это похоже на "Let Build the Compiler", но это гораздо лучший ресурс, особенно для начинающих. Это связано с учебным пособием в формате pdf, в котором вы получаете 7-ступенчатый подход к обучению вас компилятору. Добавление ссылки quora, поскольку она имеет ссылки на все порты SLANG, в С++, Java и JS, также интерпретаторы в python и java, изначально написанные с использованием С# и платформы .NET.
Ответ 6
Если вы хотите использовать мощные инструменты более высокого уровня, а не строить все сами, проходя через проекты и чтения для этот курс довольно хороший вариант. Это языковой курс автора механизма анализатора Java ANTLR. Вы можете получить книгу для курса в формате PDF от прагматичных программистов.
Курс охватывает стандартные компиляторы компилятора, которые вы увидите в другом месте: синтаксический анализ, типы и проверка типов, полиморфизм, таблицы символов и генерация кода. Практически единственное, что не охвачено, - это оптимизация. Окончательный проект - это программа, которая компилирует подмножество C. Поскольку вы используете такие инструменты, как ANTLR и LLVM, вполне возможно написать весь компилятор за один день (у меня есть доказательство существования, хотя я имею в виду ~ 24 часа). Это тяжелое практическое проектирование с использованием современных инструментов, немного более легкое в теории.
LLVM, кстати, просто фантастичен. Во многих ситуациях, когда вы обычно можете скомпилировать до сборки, вам гораздо лучше было бы скомпилировать вместо промежуточное представление LLVM. Это более высокий уровень, кросс-платформенный и LLVM вполне хорош в создании оптимизированной сборки из него.
Ответ 7
Если у вас мало времени, я рекомендую Niklaus Wirth "Compiler Construction" (Addison-Wesley, 1996) - крошечный маленький буклет, который вы может читаться через день, но он объясняет основы (в том числе, как реализовать лексеры, рекурсивные партизаны спуска и собственные стековые виртуальные машины). После этого, если вы хотите глубоко погрузиться, в книге дракона нет возможности, как предлагают другие комментаторы.
Ответ 8
Возможно, вы захотите изучить Lex/Yacc (или Flex/Bison, что бы вы ни назвали). Flex - это лексический анализатор, который будет анализировать и идентифицировать семантические компоненты ( "токены" ) вашего языка, а Bison будет использоваться для определения того, что происходит, когда каждый токен анализируется. Это может быть, но определенно не ограничивается, печать C-кода, для компилятора, который будет компилироваться на C или динамически запускать инструкции.
Этот FAQ должен помочь вам, и этот учебник выглядит весьма полезным.
Ответ 9
Вообще говоря, нет пятиминутного учебника для компиляторов, потому что это сложная тема и написание компилятора может занять несколько месяцев. Вам придется делать свой собственный поиск.
Python и Ruby обычно интерпретируются. Возможно, вы тоже хотите начать с переводчика. Это вообще проще.
Первый шаг - написать формальное описание языка, грамматику вашего языка программирования. Затем вам необходимо преобразовать исходный код, который вы хотите скомпилировать или интерпретировать в соответствии с грамматикой, в абстрактное синтаксическое дерево, внутреннюю форму исходного кода, которую компьютер понимает и может работать. Этот шаг обычно называется синтаксическим разбором, а программное обеспечение, которое анализирует исходный код, называется парсером. Часто парсер генерируется генератором синтаксического анализатора, который преобразует формальную грамматику в исходный кодовый код. Для хорошего, не математического объяснения разбора я рекомендую Parsing Techniques - Практическое руководство. В Википедии есть сравнение генераторов парсеров, из которых вы можете выбрать тот, который вам подходит. В зависимости от выбранного вами синтаксического анализатора вы найдете учебники в Интернете, а для действительно популярных генераторов парсеров (например, GNU bison) есть также книги.
Написание парсера для вашего языка может быть очень трудным, но это зависит от вашей грамматики. Поэтому я предлагаю сохранить вашу грамматику простой (в отличие от С++); хорошим примером для этого является LISP.
На втором этапе абстрактное синтаксическое дерево преобразуется из древовидной структуры в линейное промежуточное представление. Как хороший пример для этого байт-кода Lua часто цитируется. Но промежуточное представление действительно зависит от вашего языка.
Если вы строите интерпретатор, вам просто придется интерпретировать промежуточное представление. Вы также можете точно его компилировать. Я рекомендую LLVM и libjit для компиляции "точно в срок". Чтобы использовать язык, вам также необходимо включить некоторые функции ввода и вывода и, возможно, небольшую стандартную библиотеку.
Если вы собираетесь скомпилировать язык, это будет сложнее. Вам придется писать бэкэнды для разных компьютерных архитектур и генерировать машинный код из промежуточного представления в этих бэкэндах. Я рекомендую LLVM для выполнения этой задачи.
Есть несколько книг по этой теме, но я не могу рекомендовать ни один из них для общего использования. Большинство из них слишком академичны или слишком практичны. Там нет "Научите себя компилятору писать через 21 день", и, таким образом, вам придется купить несколько книг, чтобы получить хорошее понимание всей этой темы. Если вы ищете в Интернете, вы столкнетесь с некоторыми онлайн-книгами и лекциями. Может быть, рядом с вами есть университетская библиотека, где вы можете брать книги у компиляторов.
Я также рекомендую хорошие знания в области теоретической информатики и теории графов, если вы намерены сделать свой проект серьезным. Также будет полезной степень в области информатики.
Ответ 10
Взгляните на книгу ниже. Автор является создателем ANTLR.
Шаблоны языковой реализации: создайте свои собственные доменные и общие языки программирования.
Ответ 11
Одна книга, еще не предложенная, но очень важная, - это "Линкеры и загрузчики" от Джона Левина. Если вы не используете внешний ассемблер, вам понадобится способ вывода объектного файла, который может быть связан с вашей последней программой. Даже если вы используете внешний ассемблер, вам, вероятно, потребуется понять перемещение и как весь процесс загрузки программы работает, чтобы создать рабочий инструмент. Эта книга собирает много случайных знаний об этом процессе для различных систем, включая Win32 и Linux.
Ответ 12
Книга Дракона, безусловно, является книгой "Сборка компиляторов", но если ваш язык не такой сложный, как у языков нынешнего поколения, вы можете захотеть взглянуть на шаблон Интерпретатор из Шаблонов проектирования.
Пример в книге разрабатывает язык, подобный регулярному выражению, и хорошо продуман, но, как говорится в книге, он хорош для продумывания процесса, но эффективен только на небольших языках. Однако гораздо быстрее написать интерпретатор для небольшого языка с этим шаблоном, чем изучать все типы синтаксических анализаторов, yacc и lex, и так далее...
Ответ 13
Если вы хотите использовать LLVM, проверьте это: http://llvm.org/docs/tutorial/. Он учит, как писать компилятор с нуля с помощью LLVM framework, и не предполагает, что у вас есть какие-либо знания о предмете.
В учебнике предлагается написать собственный синтаксический анализатор и лексер и т.д., но я советую вам изучить бизон и сгиб, как только вы получите эту идею. Они делают жизнь намного проще.
Ответ 14
Я помню, как задавал этот вопрос около семи лет назад, когда я был довольно новичком в программировании.
Я был очень осторожен, когда спросил, и на удивление, я не получил столько критики, как ты здесь. Однако они указали мне на " Книгу Дракона ", которая, на мой взгляд, является действительно замечательной книгой, которая объясняет все, что вам нужно знать, чтобы написать компилятор (вам, конечно, придется освоить один или два языка. языки вы знаете, веселее.).
И да, многие люди говорят, что чтение этой книги - сумасшествие, и вы ничему не научитесь из нее, но я полностью не согласен с этим.
Многие также говорят, что писать компиляторы глупо и бессмысленно. Ну, есть ряд причин, по которым разработка компилятора полезна:
- Потому что это весело.
- Это познавательно, изучая, как писать компиляторы, вы узнаете много нового о компьютерных науках и других методах, которые полезны при написании других приложений.
- Если бы никто не писал компиляторы, существующие языки не стали бы лучше.
Я не сразу написал свой собственный компилятор, но, спросив, я знал, с чего начать. И теперь, изучив много разных языков и прочитав "Книгу Дракона", написание не представляет особой проблемы. (Я также изучаю компьютерную инженерию, но большинство из того, что я знаю о программировании, самоучка.)
В заключение, Книга Дракона - отличный "учебник". Но потратьте некоторое время на изучение одного или двух языков, прежде чем пытаться написать компилятор. Не ожидайте, что будете гуру компилятора в течение следующего десятилетия или около того.
Книга также хороша, если вы хотите научиться писать парсеры/интерпретаторы.
Ответ 15
Я нашел книгу Дракона слишком трудной для чтения, уделяя слишком много внимания теории языка, которая на самом деле не нужна для написания компилятора на практике.
Я бы добавил Oberon книгу, которая содержит полный источник удивительно быстрого и простого компилятора Oberon Проект Oberon.
Ответ 16
"... Построить компилятор..."
Я второй http://compilers.iecc.com/crenshaw/ @sasb. Забудьте купить больше книг на данный момент.
Почему? Инструменты и язык.
Необходимым языком является Pascal, и если я правильно помню, то на основе Turbo-Pascal. Так просто, если вы перейдете к http://www.freepascal.org/ и загрузите компилятор Pascal, все примеры работают прямо со страницы ~ http://www.freepascal.org/download.var О красоте Free Pascal вы можете использовать его практически независимо от того, какой процессор или ОС вы можете позаботиться.
Как только вы освоите уроки, попробуйте более продвинутый " Книга Дракона" ~ http://en.wikipedia.org/wiki/Dragon_book
Ответ 17
Я изучаю ту же концепцию и нашел эту многообещающую статью Джоэла Побара,
Создать языковой компилятор для.NET Framework - не уверен, куда это делось
Создать языковой компилятор для.NET Framework - копия оригинального документа в формате PDF
он обсуждает концепцию высокого уровня компилятора и продолжает изобретать свой собственный язык для.Net framework. Хотя он нацелен на.Net Framework, многие из этих концепций должны быть в состоянии воспроизвести. Статья охватывает:
- Определение языка
- сканер
- Парсер (немного интересует меня)
- Ориентация на.Net Framework
- Генератор кода
Есть и другие темы, но вы получите справедливое.
Он предназначен для начинающих, написан на С# (не совсем Java)
НТН
скелет
Ответ 18
Простым способом создания компилятора является использование bison и flex (или аналогичного), сборка дерева (AST) и генерация кода в C. Сгенерирующим C-кодом является наиболее важный шаг. Генерируя код C, ваш язык будет автоматически работать на всех платформах, где есть компилятор C.
Сгенерировать код C так же просто, как генерировать HTML (просто использовать печать или эквивалент), что в свою очередь намного проще, чем писать парсер S или HTML-парсер.
Ответ 19
Вы должны проверить Darius Bacon " ichbins", который является компилятором для небольшого диалекта Lisp, ориентированного на C, всего на 6 страницах кода. Преимущество, которое у него есть над большинством компиляторов игрушек, заключается в том, что язык достаточно велик, чтобы в нем был написан компилятор. (В tarball также включен интерпретатор для начальной загрузки.)
Там больше материала о том, что я нашел полезным в обучении писать компилятор на моем Ur -Schheme.
Ответ 20
Из часто задаваемые вопросы о comp.compiler:
"Программирование персонального компьютера" Пер Бринч Хансен
Prentice-Hall 1982 ISBN 0-13-730283-5
Эта печально написанная книга
объясняет дизайн и создание однопользовательской среды программирования
для микронов, используя язык, подобный Паскалю, который называется Эдисон. Автор представляет
весь исходный код и объяснения поэтапной реализации
Компилятор Edison и простая поддерживающая операционная система, все написано в
Сам Эдисон (для небольшого опорного ядра, написанного в символическом, кроме
сборщик для PDP 11/23; полный источник также может быть заказан для IBM
PC).
Самое интересное в этой книге: 1) ее способность
продемонстрировать, как создать полное, самодостаточное, самообеспечение,
полезный компилятор и операционная система, и 2) интересное обсуждение
проблемы дизайна и спецификации языка и компромиссы в главе 2.
"Бринч Хансен на компиляторах Паскаля" Пер Бринч Хансен
Prentice-Hall 1985 ISBN 0-13-083098-4
Другая теория света
тяжелая-прагматика здесь-как-к-коду-это книга. Автор представляет
дизайн, реализация и полный исходный код для компилятора и p-кода
интерпретатор для Pascal- (Pascal "минус" ), подмножество Pascal с булевым и
целочисленные типы (но не символы, не зависящие от вещественных чисел, непеременные или перечислимые типы),
постоянные и переменные определения, типы массивов и записей (но не упакованные,
вариант, набор, указатель, безымянный, переименованный или типы файлов), выражения,
операторы присваивания, определения вложенных процедур со значением и переменной
параметры, операторы if, while и начальные блоки (но нет
определения функций, процедурные параметры, операторы goto и метки,
case заявления, повторные заявления, для операторов и с заявлениями).
Компилятор и интерпретатор записываются в Pascal * (Pascal "star" ), a
Подмножество Pascal расширено некоторыми элементами стиля Edison для создания
систем разработки программного обеспечения. Компилятор Pascal * для IBM PC продается
автора, но легко переносить книгу Pascal-компилятор на любой
удобная платформа Pascal.
Эта книга упрощает разработку и реализацию компилятора. я
особенно в том, как автор относится к качеству,
надежности и тестирования. Компилятор и интерпретатор могут быть легко использованы
как основу для более сложного проекта языка или компилятора, особенно
если вам придётся быстро что-то запустить и запустить.
Ответ 21
Python поставляется в комплекте с компилятором python, написанным на Python. Вы можете увидеть исходный код, и он включает в себя все этапы: от синтаксического анализа, абстрактного синтаксического дерева, испускающего кода и т.д.
Взломайте его.
Ответ 22
Компилятор LCC (wikipedia) (домашняя страница проекта) Фрейзера и Хансона описывается в их книге "A Retargetable C Compiler: Design and Implementation". Это вполне читаемо и объясняет весь компилятор, вплоть до генерации кода.
Ответ 23
Извините, это на испанском языке, но это библиография курса под названием "Compiladores e Intérpretes" (компиляторы и переводчики) в Аргентине.
Курс был от формальной теории языка до построения компилятора, и это те темы, которые вам нужно собрать, по крайней мере, простой компилятор:
-
Составители проектов в C.
Аллен И. Голуб
Prentice-Hall. 1990.
-
Compiladores. Теория и конструкция.
Sanchís Llorca, F.J., Galán Pascual, C. Редактор Paraninfo. 1988.
-
Конструкция компилятора.
Никлаус Вирт
Addison-Wesley. 1996.
-
Lenguajes, Gramáticas y Autómatas. Un enfoque práctico.
Педро Исаси Виньуэла, Палома Мартинес Фернандес, Даниэль Боррахо Миллан. Эддисон-Уэсли Ибероамерикана (España). 1997.
-
Искусство дизайна компилятора. Теория и практика.
Томас Питтман, Джеймс Петерс.
Prentice-Hall. 1992.
-
Конструкция объектно-ориентированного компилятора.
Джим Холмс.
Prentice Hall, Энглвуд Cliffs, N.J. 1995
-
Compiladores. Концептуальные основы.
B. Teufel, S. Шмидт, Т. Теуфел.
Аддисон-Уэсли Ибероамерикана. 1995.
-
Введение в теорию автоматов, языки и вычисления.
Джон Э. Хопкрофт. Джеффрис Д. Ульман.
Эддисон-Уэсли. 1979.
-
Введение в формальные языки.
Дьёрдь Э. Ревеш.
Mc Graw Hill. 1983.
-
Методы анализа. Практическое руководство.
Дик Груне, Ceriel Jacobs.
Impreso por los autores. 1995
http://www.cs.vu.nl/~dick/PTAPG.html
-
Yacc: Еще один компилятор-компилятор.
Стивен C. Джонсон
Вычислительная наука Технический отчет № 32, 1975. Белл Лаборатории. Мюррей Хилл, Новая
Джерси.
-
Лекс: генератор лексического анализатора.
М. Э. Леск, Э. Шмидт. Компьютерные науки Технические Отчет № 39, 1975. Bell Laboratories. Мюррей Хилл, Нью-Джерси.
-
lex и yacc.
Джон Р. Левин, Тони Мейсон, Дуг Браун.
OReilly и Associates. 1995.
-
Элементы теории вычислений.
Гарри Р. Льюис, Христос Х. Пападимитриу. Сегунда Эдисьон. Prentice Hall. 1998.
-
Un Algoritmo Eficiente para la Construcción de Grafo de Dependencia de Control.
Сальвадор В. Кавадини
Trabajo Final de Grado para obtener el Título de Ingeniero en Computación.
Facultad de Matemática Aplicada. U.C.S.E. 2001.
Ответ 24
- Это обширная тема. Не стоит недооценивать этот момент. И не стоит недооценивать мою точку зрения, чтобы не недооценивать ее.
- Я слышал, что Книга Дракона - это (?) место для начала, а также поиск.:) Поймитесь в поисках, в конце концов это будет ваша жизнь.
- Построение собственного языка программирования - абсолютно хорошее упражнение! Но знайте, что он никогда не будет использоваться для какой-либо практической цели в конце. Исключения из этого несколько и очень далеко между ними.
Ответ 25
Не книга, а технический документ и невероятно интересный опыт обучения, если вы хотите больше узнать о компиляторах (и метакомпиляторах)... Этот веб-сайт проводит вас через создание полностью автономной системы компилятора, которая может скомпилировать себя и другие языки:
Учебник: Metacompilers Часть 1
Все это основано на удивительной небольшой 10-страничной технической документации:
Val Schorre META II: язык написания синтаксического ориентированного языка
от честного к богу 1964 года. Я научился создавать компиляторы с этого момента в 1970 году. Там умиротворяющий момент, когда вы, наконец, заглядываете, как компилятор может самовосстанавливаться....
Я знаю автора веб-сайта из моих дней в колледже, но я не имею никакого отношения к веб-сайту.
Ответ 26
Здесь много хороших ответов, поэтому я подумал, что просто добавлю еще один список:
Я получил книгу под названием Project Oberon более десяти лет назад, в которой есть очень хорошо написанный текст в компиляторе. Книга действительно выделяется в том смысле, что источник и объяснения очень удобны и читабельны. Полный текст (издание 2005 года) доступен в формате pdf, поэтому вы можете скачать его прямо сейчас. Компилятор обсуждается в главе 12:
http://www-old.oberon.ethz.ch/WirthPubl/ProjectOberon.pdf
Никлаус Вирт, Юрг Гуткнехт
(Обработка не такая обширная, как его книга о компиляторах)
Я прочитал несколько книг о компиляторах, и я могу записать книгу драконов, время, затраченное на эту книгу, очень полезно.
Ответ 27
Если вы заинтересованы в написании компилятора для функционального языка (а не процедурного), Саймон Пейтон-Джонс и Дэвид Лестер " Реализация функциональных языков: a учебник - отличное руководство.
Концептуальные основы того, как работают функциональные оценки, руководствуются примерами на простом, но мощном функциональном языке под названием "Core". Кроме того, каждая часть компилятора основного языка объясняется примерами кода в Miranda (чистый функциональный язык, очень похожий на Haskell).
Описаны несколько разных типов компиляторов, но даже если вы только следуете за так называемым компилятором шаблонов для Core, у вас будет отличное понимание того, что делает функциональное программирование тиком.
Ответ 28
Мне понравился учебник Crenshaw, потому что он абсолютно ясно говорит о том, что компилятор просто другая программа, которая считывает некоторые данные и записывает некоторые из них.
Прочтите.
Работайте, если хотите, но затем посмотрите на другую ссылку о том, как написаны большие и полные компиляторы.
И прочитайте На Trusting Trust, чтобы получить представление о неочевидные вещи, которые можно сделать в этой области.
Ответ 29
Вы можете использовать BCEL в Apache Software Foundation. С помощью этого инструмента вы можете генерировать ассемблерный код, но он Java с API BCEL. Вы можете узнать, как вы можете генерировать код промежуточного языка (в данном случае байтовый код).
Простой пример
-
Создайте класс 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();
}
Ответ 30
Пока эта книга не включена в список:
Основы проектирования компилятора (Torben Mogensen)
(из отдела компьютерных наук, Копенгагенский университет)
Мне также интересно узнать о компиляторах и планировать вступить в эту отрасль в ближайшие пару лет. Эта книга является идеальной книгой теории, чтобы начать изучать компиляторы, насколько я могу судить. Он БЕСПЛАТНО копировать и воспроизводить, аккуратно и тщательно писать и дает его вам на простом английском языке без какого-либо кода, но все же представляет механику с помощью инструкций и диаграмм и т.д. Стоит посмотреть imo.