Обучение написанию компилятора

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

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

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

  • Основы Nanopass для обучения компиляторов ¶
  • Расширенный дизайн и реализация компилятора $
  • Инкрементальный подход к строительству компилятора ¶
  • ANTLR 3.x Видеоурок
  • Основы проектирования компилятора
  • Создание компилятора Parrot
  • Основы компилятора
  • Строительство компилятора $
  • Проектирование и строительство компилятора $
  • Создание компилятора с помощью C $
  • Устные переводчики
  • Дизайн компилятора в C ¶
  • Составители: принципы, методы и инструменты $ – aka «Книга дракона» ; широко рассматривается как «книга» для написания компилятора.
  • Разработка компилятора $
  • Основы языков программирования
  • Архив статей флип-кодов (смотрите «Внедрение скриптового движка Яна Ньестадта»)
  • Мастерство игры Scripting Mastery $
  • Как построить виртуальную машину с нуля в C # ¶
  • Внедрение функциональных языков
  • Реализация языков программирования (с BNFC)
  • Реализация языков программирования с использованием C # 4.0
  • Шаблон интерпретатора (описанный в Design Patterns $) указывает способ оценки предложений на языке
  • Шаблоны реализации языка: создайте собственные собственные языки программирования и общего программирования
  • Давайте построим компилятор Джеком Креншоу – Версия PDF ¶ (примеры приведены в Паскале, но информация, как правило, применима)
  • Линкеры и загрузчики $ (Google Книги)
  • Лисп в маленьких пьесах (LiSP) $
  • Учебное пособие по LLVM
  • Современная реализация компилятора в ML $ – Существует версия Java $ и C $ – широко считается очень хорошей книгой
  • Объектно-ориентированное построение компилятора $
  • Методы анализа – Практическое руководство
  • Проект Оберон ¶ – Посмотрите на главу 13
  • Программирование персонального компьютера $
  • Языки программирования: приложение и интерпретация
  • Кролик: компилятор для схемы ¶
  • Размышления о Trusting Trust – краткое руководство
  • Создайте собственный компилятор для платформы .NET – быстрый учебник из MSDN
  • Структура и интерпретация компьютерных программ
  • Типы и языки программирования
  • Хотите написать компилятор? – краткое руководство
  • Написание компилятора в Ruby Bottom Up

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Взгляните на книгу ниже. Автор является создателем АНТЛР .

Шаблоны реализации языка: создайте собственные собственные языки программирования и общего программирования .

alt text

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

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

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

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

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

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

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

Alt текст

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

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

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

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

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

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

НТН

скелет

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

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

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

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

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

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

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

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

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

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

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

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

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

Часто задаваемые вопросы о comp.compiler :

«Программирование персонального компьютера» Пер Бринч Хансен Прентис-холл 1982 ISBN 0-13-730283-5

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

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

«Бринч Хансен на компиляторах Паскаля» Пер Бринч Хансен Прентис-Холл 1985 ISBN 0-13-083098-4

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

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

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

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

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

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

Компилятор LCC ( wikipedia ) ( главная страница проекта ) Фрейзера и Хансона описан в их книге «A Retargetable C Compiler: Design and Implementation». Это вполне читаемо и объясняет весь компилятор, вплоть до генерации кода.

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

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

  • Компиляторы в C.
    Аллен И. Голуб

    Prentice-Hall. 1990.

  • Compiladores. Теория и конструкция.
    Санхис Ллорка, Ф. Дж., Галан Паскуаль, С. Редактор Паранфо. 1988.

  • Строительство компилятора.
    Никлаус Вирт

    Addison-Wesley. 1996.

  • Lenguajes, Gramáticas y Autómatas. Un enfoque práctico.
    Педро Исаси Виньуэла, Палома Мартинес Фернандес, Даниэль Боррахо Миллан. Addison-Wesley Iberoamericana (Испания). 1997.

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

    Prentice-Hall. 1992.

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

  • Compiladores. Концептуальные основы.
    B. Teufel, S. Schmidt, T. Teufel.

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

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

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

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

    Mc Graw Hill. 1983.

  • Методы анализа. Практическое руководство.
    Дик Груне, Кериэль Джейкобс.
    Impreso por los autores. 1995
    http://www.cs.vu.nl/~dick/PTAPG.html

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

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

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

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

  • Un Algoritmo Eficiente para la Construcción del Grafo de Dependencia de Control.
    Сальвадор В. Кавадини.
    Trabajo Final de Grado para obtener el Título de Ingeniero en Computación.
    Facultad de Matemática Aplicada. UCSE 2001.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Прочтите.

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

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

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

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

  1. Создайте class 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"; } } 

Now run BCELifier with this class

 BCELifier bcelifier = new BCELifier("MyClass", System.out); bcelifier.start(); 

You can see the result on the console for the whole class (how to build byte code MyClass.java). The code for the function is this:

 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(); } 

The Dragon Book is too complicated. So ignore it as a starting point. It is good and makes you think a lot once you already have a starting point, but for starters, perhaps you should simply try to write an math/logical expression evaluator using RD, LL or LR parsing techniques with everything (lexing/parsing) written by hand in perhaps C/Java. This is interesting in itself and gives you an idea of the problems involved in a compiler. Then you can jump in to your own DSL using some scripting language (since processing text is usually easier in these) and like someone said, generate code in either the scripting language itself or C. You should probably use flex/bison/antlr etc to do the lexing/parsing if you are going to do it in c/java.

Interesting Posts
Давайте будем гением компьютера.