Предпочтительные языки : C / C ++, Java и Ruby.
Я ищу некоторые полезные книги / учебники о том, как написать свой собственный компилятор просто для образовательных целей. Я больше всего знаком с C / C ++, Java и Ruby, поэтому я предпочитаю ресурсы, которые включают один из этих трех, но любой хороший ресурс приемлем.
Ответы:
Большой список ресурсов:
Условные обозначения:
источник
Let's Build a Compiler
[ compilers.iecc.com/crenshaw/] , это действительно хорошая рецензия и хорошая отправная точка.Это довольно расплывчатый вопрос, я думаю; только из-за глубины вовлеченной темы. Однако компилятор можно разложить на две отдельные части; верхняя половина и нижняя. Верхняя половина обычно берет исходный язык и преобразует его в промежуточное представление, а нижняя половина занимается генерацией кода для конкретной платформы.
Тем не менее, одна идея для простого подхода к этой теме (по крайней мере, той, которую мы использовали в моем классе компиляторов) состоит в том, чтобы собрать компилятор из двух частей, описанных выше. В частности, вы получите хорошее представление обо всем процессе, просто собрав верхнюю половину.
Простое выполнение верхней половины позволяет вам получить опыт написания лексического анализатора и анализатора и перейти к генерации некоторого «кода» (это промежуточное представление, которое я упомянул). Таким образом, он возьмет вашу исходную программу и преобразует ее в другое представление и выполнит некоторую оптимизацию (если хотите), которая является сердцем компилятора. Нижняя половина затем будет принимать это промежуточное представление и генерировать байты, необходимые для запуска программы в конкретной архитектуре. Например, нижняя половина будет принимать ваше промежуточное представление и генерировать исполняемый файл 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 обычно интерпретируются. Возможно, вы хотите начать с переводчика. Это вообще проще.
Первый шаг - написать формальное описание языка, грамматику вашего языка программирования. Затем вам нужно преобразовать исходный код, который вы хотите скомпилировать или интерпретировать в соответствии с грамматикой, в абстрактное синтаксическое дерево, внутреннюю форму исходного кода, которую компьютер понимает и может работать. Этот шаг обычно называется синтаксическим анализом, а программное обеспечение, которое анализирует исходный код, называется синтаксическим анализатором. Часто анализатор генерируется генератором синтаксического анализатора, который преобразует формальную грамматику в исходный машинный код. Для хорошего нематематического объяснения синтаксического анализа я рекомендую Технику синтаксического анализа - Практическое руководство. В Википедии есть сравнение генераторов парсеров, из которых вы можете выбрать тот, который подходит вам. В зависимости от генератора парсера, который вы выбрали,
Написание парсера для вашего языка может быть очень сложным, но это зависит от вашей грамматики. Поэтому я предлагаю сохранить вашу грамматику простой (в отличие от C ++); Хороший пример для этого - LISP.
На втором этапе абстрактное синтаксическое дерево трансформируется из древовидной структуры в линейное промежуточное представление. В качестве хорошего примера для этого часто упоминается байт-код Lua. Но промежуточное представление действительно зависит от вашего языка.
Если вы создаете интерпретатор, вам просто придется интерпретировать промежуточное представление. Вы также можете просто скомпилировать его. Я рекомендую LLVM и libjit для своевременной компиляции. Чтобы сделать язык пригодным для использования, вы также должны будете включить некоторые функции ввода и вывода и, возможно, небольшую стандартную библиотеку.
Если вы собираетесь скомпилировать язык, это будет сложнее. Вам придется писать бэкэнды для разных компьютерных архитектур и генерировать машинный код из промежуточного представления в этих бэкэндах. Я рекомендую LLVM для этой задачи.
На эту тему есть несколько книг, но я не могу рекомендовать ни одну из них для общего пользования. Большинство из них слишком академичны или практичны. Там нет «Научитесь писать компилятором за 21 день», и, следовательно, вам придется купить несколько книг, чтобы получить хорошее понимание всей этой темы. Если вы будете искать в Интернете, вы обнаружите некоторые онлайн-книги и конспекты лекций. Может быть, рядом с вами есть университетская библиотека, где вы можете брать книги по компиляторам.
Я также рекомендую хорошие базовые знания в области теоретической информатики и теории графов, если вы собираетесь сделать свой проект серьезным. Степень в области компьютерных наук также будет полезна.
источник
Посмотрите на книгу ниже. Автор является создателем ANTLR .
Шаблоны языковой реализации: создайте свои собственные доменные и общие языки программирования .
источник
Одна книга, еще не предложенная, но очень важная, - «Линкеры и загрузчики» Джона Левина. Если вы не используете внешний ассемблер, вам понадобится способ вывести объектный файл, который можно связать с вашей конечной программой. Даже если вы используете внешний ассемблер, вам, вероятно, понадобится понять перемещения и как весь процесс загрузки программы работает, чтобы сделать рабочий инструмент. Эта книга собирает много случайных знаний об этом процессе для различных систем, включая Win32 и Linux.
источник
Книга Дракона, безусловно, является книгой «Сборка компиляторов», но если ваш язык не такой сложный, как у языков нынешнего поколения, вы можете захотеть взглянуть на шаблон Интерпретатор из Шаблонов проектирования .
Пример в книге разрабатывает язык, подобный регулярному выражению, и хорошо продуман, но, как говорится в книге, он хорош для продумывания процесса, но эффективен только на небольших языках. Однако гораздо быстрее написать интерпретатор для небольшого языка с этим шаблоном, чем изучать все типы синтаксических анализаторов, yacc и lex, и так далее ...
источник
Если вы хотите использовать LLVM, проверьте это: http://llvm.org/docs/tutorial/ . Он учит вас, как написать компилятор с нуля, используя инфраструктуру LLVM, и не предполагает, что у вас есть какие-либо знания по этому вопросу.
Учебное пособие предлагает вам написать свой собственный синтаксический анализатор, лексер и т. Д., Но я советую вам разобраться с зубрами и гибкостью, как только вы поймете идею. Они делают жизнь намного проще.
источник
Я обнаружил, что книгу «Дракон» слишком трудно читать, слишком много внимания уделяется теории языка, которая на самом деле не требуется для написания компилятора на практике.
Я хотел бы добавить книгу об Обероне, которая содержит полный источник удивительно быстрого и простого компилятора Оберона Project Oberon .
источник
Я помню, как задавал этот вопрос около семи лет назад, когда я был довольно новичком в программировании.
Я был очень осторожен, когда спросил, и на удивление, я не получил столько критики, как ты здесь. Однако они указали мне на « Книгу Дракона », которая, на мой взгляд, является действительно замечательной книгой, которая объясняет все, что вам нужно знать, чтобы написать компилятор (вам, конечно, придется освоить один или два языка. языки вы знаете, веселее.).
И да, многие люди говорят, что чтение этой книги - сумасшествие, и вы ничему не научитесь из нее, но я полностью не согласен с этим.
Многие также говорят, что писать компиляторы глупо и бессмысленно. Ну, есть несколько причин, почему разработка компилятора полезна:
Я не сразу написал свой собственный компилятор, но, спросив, я знал, с чего начать. И теперь, изучив много разных языков и прочитав «Книгу Дракона», написание не представляет особой проблемы. (Я также изучаю компьютерную инженерию, но большинство из того, что я знаю о программировании, самоучка.)
В заключение, Книга Дракона - отличный «учебник». Но потратьте некоторое время на изучение одного или двух языков, прежде чем пытаться написать компилятор. Не ожидайте, что будете гуру компилятора в течение следующего десятилетия или около того.
Книга также хороша, если вы хотите научиться писать парсеры / интерпретаторы.
источник
Я бы второй http://compilers.iecc.com/crenshaw/ от @sasb . Забудьте о покупке большего количества книг на данный момент.
Почему? Инструменты и язык.
Требуемый язык - Паскаль, и, если я правильно помню, основан на Турбо-Паскале. Так и происходит, если вы зайдете на http://www.freepascal.org/ и загрузите компилятор Pascal. Все примеры работают прямо со страницы ~ http://www.freepascal.org/download.var . Паскаль - это то, что вы можете использовать его практически на любом процессоре или ОС, которые вам нужны.
Как только вы освоите уроки, попробуйте более продвинутую « Книгу Дракона » ~ http://en.wikipedia.org/wiki/Dragon_book
источник
Я изучаю ту же концепцию и нашел эту многообещающую статью Джоэла Побара,
Создать языковой компилятор для .NET Framework - не уверен, куда это делось
Создайте языковой компилятор для .NET Framework - копия оригинального документа в формате PDF
он обсуждает концепцию компилятора высокого уровня и продолжает изобретать свой собственный язык для платформы .Net. Хотя он нацелен на .Net Framework, многие из этих концепций должны быть в состоянии воспроизвести. Статья охватывает:
Есть и другие темы, но вы получите справедливое.
Он предназначен для начинающих, написан на C # (не совсем Java)
НТН
скелет
источник
Простой способ создать компилятор - это использовать bison и flex (или аналогичные), построить дерево (AST) и сгенерировать код на C. С генерацией C-кода является наиболее важным шагом. Создавая код на C, ваш язык будет автоматически работать на всех платформах, где есть компилятор C.
Генерировать код на C так же просто, как генерировать HTML (просто использовать print или эквивалент), что, в свою очередь, намного проще, чем написание C-анализатора или HTML-анализатора.
источник
Из 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.
Эта книга упрощает разработку и реализацию компилятора. Мне особенно нравится, как автор обеспокоен качеством, надежностью и тестированием. Компилятор и интерпретатор могут легко использоваться в качестве основы для более сложного языка или проекта компилятора, особенно если вам необходимо быстро что-то запустить и запустить.
источник
Вы должны проверить « ichbins » Дариуса Бэкона , который является компилятором для небольшого диалекта Лиспа, ориентированного на C, чуть более чем на 6 страницах кода. Преимущество, которое он имеет перед большинством игрушечных компиляторов, состоит в том, что язык достаточно полон, чтобы на нем был написан компилятор. (В tar-архив также входит переводчик для начальной загрузки.)
На моей веб-странице Ur-Scheme есть еще кое-что о том, что я нашел полезным в обучении написанию компилятора .
источник
источник
Компилятор LCC ( википедия ) ( домашняя страница проекта ) ( github.com/drh/lcc ) Фрейзера и Хансона описан в их книге «Компилятор C с возможностью ретаргетинга: проектирование и реализация». Он довольно читабелен и объясняет весь компилятор, вплоть до генерации кода.
источник
Python поставляется в комплекте с компилятором Python, написанным на Python. Вы можете увидеть исходный код, и он включает в себя все этапы, начиная с синтаксического анализа, абстрактного синтаксического дерева, создания кода и т. Д. Взломайте его.
источник
К сожалению, это на испанском языке, но это библиография курса под названием "Compiladores e Intérpretes" (составители и переводчики) в Аргентине.
Курс был от теории формального языка до построения компилятора, и вот темы, которые вам нужно создать, по крайней мере, простой компилятор:
источник
Не книга, а технический документ и невероятно увлекательный опыт обучения, если вы хотите узнать больше о компиляторах (и метакомпиляторах) ... Этот веб-сайт проведет вас через создание полностью автономной системы компиляторов, которая может компилировать себя и другие языки:
Учебник: метакомпиляторы, часть 1
Все это основано на удивительном небольшом 10-страничном техническом документе:
Val Schorre META II: синтаксически-ориентированный язык написания компиляторов
от честного до бога 1964 года. Я научился создавать компиляторы из этого еще в 1970 году. Есть потрясающий момент, когда вы, наконец, понимаете, как компилятор может сам себя восстановить ...
Я знаю автора сайта со времен учебы в колледже, но я не имею ничего общего с сайтом.
источник
Мне также понравился учебник по Crenshaw , потому что он ясно дает понять, что компилятор - это просто еще одна программа, которая читает некоторые входные данные и записывает некоторые из них.
Прочитайте это.
Работайте, если хотите, но посмотрите на другую справку о том, как на самом деле написаны большие и более полные компиляторы.
И прочитайте О доверительном доверии , чтобы получить представление о неочевидных вещах, которые можно сделать в этой области.
источник
Если вы заинтересованы в написании компилятора для функционального языка (а не для процедурного) Саймона Пейтона-Джонса и Дэвида Лестера « Реализация функциональных языков: учебное пособие » - отличное руководство.
Концептуальные основы того, как работает функциональная оценка, руководствуются примерами на простом, но мощном функциональном языке, называемом «ядром». Кроме того, каждая часть компилятора языка Core объясняется с помощью примеров кода в Miranda (чистый функциональный язык, очень похожий на Haskell).
Описаны несколько различных типов компиляторов, но даже если вы будете следовать только так называемому шаблонному компилятору для Core, у вас будет отличное понимание того, что делает функциональное программирование эффективным.
источник
Вы можете использовать BCEL от Apache Software Foundation. С помощью этого инструмента вы можете генерировать код, подобный ассемблеру, но это Java с BCEL API. Вы можете узнать, как генерировать код промежуточного языка (в данном случае - байт-код).
Простой пример
Создайте класс Java с этой функцией:
Теперь запустите BCELifier с этим классом
Вы можете увидеть результат на консоли для всего класса (как построить байт-код MyClass.java). Код для этой функции:
источник
Здесь много хороших ответов, поэтому я решил добавить еще один в список:
Я получил книгу под названием Project Oberon более десяти лет назад, в которой есть очень хорошо написанный текст на компиляторе. Книга действительно выделяется в том смысле, что источник и объяснения очень практичны и читабельны. Полный текст (издание 2005 года) доступен в формате PDF, поэтому вы можете скачать его прямо сейчас. Компилятор обсуждается в главе 12:
http://www.ethoberon.ethz.ch/WirthPubl/ProjectOberon.pdf
Никлаус Вирт, Юрг Гуткнехт
(Лечение не так обширно, как его книга о компиляторах)
Я прочитал несколько книг о компиляторах, и я могу поддержать книгу о драконах, время, потраченное на эту книгу, стоит того.
источник
Пока в эту книгу не вошла эта книга:
Основы проектирования компиляторов (Торбен Могенсен) (факультет компьютерных наук, Университет Копенгагена)
Я также заинтересован в изучении компиляторов и планирую войти в эту отрасль в ближайшие пару лет. Эта книга - идеальная книга по теории, чтобы начать изучать компиляторы, насколько я вижу. Это БЕСПЛАТНО для копирования и воспроизведения, аккуратно и аккуратно написано и дает вам на простом английском языке без какого-либо кода, но по-прежнему представляет механику в виде инструкций и диаграмм и т. Д. Стоит посмотреть IMO.
источник