Навчитися писати компілятор [закрито]


699

Кращі мови : C / C ++, Java та Ruby.

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


ANTLR на всьому шляху. Усі запропоновані нижче ресурси мені здаються непосильними. ANTLR - це завжди найкращий друг дизайнера-компілятора. A
A_Var

Якщо ваша основна увага полягає в тому, щоб дізнатися, як працюють ідеї компіляції в цілому - ви можете перевірити, і SICP може бути короткою для структурованої інтерпретації комп'ютерної програми, що базується на схемі (списку), але вчить загальним принципам. mitpress.mit.edu/sicp . Мені рекомендували цю книгу ветеран, який працює в компанії і робить ці твори складанням та інтерпретацією на життя!
Нішант


Я написав статтю про створення компілятора у своєму блозі: orangejuiceliberationfront.com/how-to-write-a-compiler Це фокусується на самих основах та початку роботи, насправді. Тут є ще багато статей, що стосуються компілятора / кодегена / парсера / мовного дизайну.
uliwitness

Відповіді:


1085

Великий список ресурсів:

Легенда:

  • ¶ Посилання на файл PDF
  • $ Посилання на друковану книгу

22
Я читав серії Let's Build a Compiler[ compilers.iecc.com/crenshaw/] , це дуже добре написання і є гарною відправною точкою.
TheVillageIdiot

5
Я думаю, що варто згадати курс компіляторів Coursera. У ньому є приємні відеоролики та прогулянки по створенню мови на зразок мови / простого компілятора. Посилання компіляторів Coursera
QuantumKarl

1
Я хотів, щоб ця відповідь була розміщена якнайбільше оригінальної, тому я вирішив опублікувати цю посилання тут: tutorialspoint.com/compiler_design/index.htm Що мені сподобалось на цьому сайті, це те, що він не втягується в те, щоб насправді писати будь-який код створити компілятор, але він розбиває компілятор на його частини: фази та етапи. Він описує логічний та алгоритмічний підхід до проектування без будь-якої конкретної мовної парадигми, оскільки він виражає позначення довільної мови та алфавіту. Це швидко читається, але дає вам поняття, що потрібно для кожної частини.
Френсіс Куглер

70

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

Тим не менш, одна ідея простий спосіб підійти до цієї теми (щонайменше, ми використовували в моєму класі компіляторів) - це побудувати компілятор у двох описаних вище творах. Зокрема, ви отримаєте гарне уявлення про весь процес, просто склавши верхню половину.

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

Деякі книги на цю тему, які мені здаються особливо корисними, - це Принципи та методи укладачів (або Книга Драконів, завдяки милому дракону на обкладинці). У ньому є чудова теорія і, безумовно, висвітлює граматики без контексту по-справжньому доступним чином. Крім того, для побудови лексичного аналізатора та аналізатора ви, ймовірно, будете використовувати * nix інструменти lex та yacc. І нецікаво, що книга під назвою " lex and yacc " опинилася там, де Книга Драконів залишилася для цієї частини.


55

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

Я віддаю перевагу сучасній реалізації компілятора перед книгою Дракона, тому що впровадження Modern Compiler обстежує менше поля - натомість воно має справжнє висвітлення всіх тем, про які вам знадобиться написати серйозний, гідний компілятор. Після роботи над цією книгою ви будете готові братися за наукові роботи безпосередньо для більш глибокої, якщо вона вам потрібна.

Треба зізнатися, у мене є серйозне м'яке місце для будівництва компілятора Niklaus Wirth . Він доступний в Інтернеті як PDF. Мені здається, що програмування Вірта просто естетично красива, проте деякі люди вважають його стиль занадто мінімальним (наприклад, Вірт підтримує рекурсивні аналізатори походження, але більшість курсів CS зосереджені на інструментах генератора парсера; конструкції мови Вірта досить консервативні.) Конструктор компілятора - це дуже стильна дистиляція. основних ідей Вірта, тож чи подобається вам його стиль чи ні, я дуже рекомендую прочитати цю книгу.



Я настійно рекомендую проти C версії "Сучасного втілення компілятора", вона покалічена деталями низького рівня завдяки C. Це повністю захаращує книгу. Java 1st не надто хороший, оскільки дизайн OO поганий, Java 2nd ed вже не стосується мови тигра. Тому я настійно рекомендую ML: не потрібно добре володіти ML, щоб зрозуміти це. ML безумовно добре підходить для роботи.
аким

44

Я погоджуюся з посиланням на Книгу Драконів; IMO, це остаточне керівництво для побудови компілятора. Будьте готові до деякої жорсткої теорії.

Якщо ви хочете, щоб книга була більш легкою в теорії, майстерність гри над сценаріями може бути кращою книгою для вас. Якщо ви абсолютно новачок в теорії компілятора, це забезпечує більш ніжне введення. Він не охоплює більш практичних методів розбору (вибираючи непередбачуваний рекурсивний спуск без обговорення LL або LR розбору), і, як я пам'ятаю, він навіть не обговорює жодної теорії оптимізації. Крім того, замість того, щоб компілювати машинний код, він збирається в байт-код, який повинен працювати на VM, який ви також записуєте.

Це все ще гідне читання, особливо якщо ви зможете підібрати його недорого на Amazon. Якщо ви хочете лише легкого вступу до компіляторів, майстерність гри над сценаріями - це не поганий шлях. Якщо ви хочете вийти на жорсткі передні фронти, тоді вам слід погодитися не менше ніж на Книгу Драконів.


1
Майстерність гри на сценаріях - чудовий навчальний ресурс, адже коли ви закінчите, у вас буде грати 2-пригодницька гра. Це робить кожну вправу зосередженою на певній меті і тримає читача вмотивованим.
Dour High Arch

1
Дракон трохи надто зосереджений на розборі граматики. Якщо ви не намагаєтеся проаналізувати щось абсолютно неможливе, як, наприклад, C ++ або інше, використовуючи генератори парсера, але можете використовувати, наприклад, ручну граматику LL, ви можете шукати щось, що обробляє більш складні поля компілятора, крім граматичного перетворення та доведення
Марко ван de Voort

27

"Давайте побудуємо компілятор" - приголомшливий, але він трохи застарів. (Я не кажу, що це робить його навіть трохи менш дійсним.)

Або перевірити SLANG . Це схоже на "Давайте побудуємо компілятор", але є набагато кращим ресурсом, особливо для початківців. Сюди входить навчальний посібник у форматі PDF, який застосовує 7-ступінковий підхід до навчання вам компілятора. Додаючи посилання квори, оскільки воно містить посилання на всі різні порти SLANG, в C ++, Java та JS, а також інтерпретатори в python та java, спочатку написані за допомогою C # та платформи .NET.


5
Я згоден, що ця серія трохи застаріла, хоча все ж корисна. Однак я найбільше захоплююсь тим, що він намагається вивести прямо на мову складання, а не будувати будь-який тип дерева розбору, що означає (всупереч тому, що зазначено в першій статті), що це не дуже корисно для написання перекладач.
a_m0d

23

Якщо ви хочете використовувати потужні інструменти вищого рівня, а не будувати все самостійно, проходження проектів та читання для цього курсу є досить хорошим варіантом. Це мовний курс автора двигуна Java-аналізатора ANTLR. Ви можете отримати книгу для курсу у форматі PDF від Прагматичних програмістів .

Курс перевершує стандартний компілятор, який ви побачили в іншому місці: розбір, перевірка типів та типів, поліморфізм, таблиці символів та генерація коду. Насправді, єдине, що не охоплено, - це оптимізація. Остаточний проект являє собою програму , яка становить підмножина C . Оскільки ви використовуєте такі інструменти, як ANTLR і LLVM, цілком можливо написати весь компілятор за один день (у мене є докази існування цього, хоча я маю на увазі ~ 24 години). Важко для практичної інженерії, використовуючи сучасні інструменти, трохи легше теоретично.

LLVM, до речі, просто фантастичний. У багатьох ситуаціях, коли ви, як правило, збираєтесь до складання, вам буде набагато краще складати проміжне представництво LLVM . Це вищий рівень, кросова платформа, і LLVM досить добре створює оптимізовану збірку з нього.


Перша ланка мертва.
Лінн

20

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


Якщо у вас мало часу, не пишіть компілятор.
Інго

17

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

Цей FAQ повинен допомогти вам, і цей підручник виглядає досить корисним.


17

Взагалі кажучи, не існує п'ятихвилинного підручника для компіляторів, оскільки це складна тема, і написання компілятора може зайняти місяці. Вам доведеться зробити власний пошук.

Пітон і Рубі зазвичай трактуються. Можливо, ви хочете почати і з перекладача. Взагалі простіше.

Перший крок - написати офіційний опис мови, граматику вашої мови програмування. Потім ви повинні перетворити вихідний код, який ви хочете скласти або інтерпретувати відповідно до граматики, в абстрактне дерево синтаксису, внутрішню форму вихідного коду, яку комп'ютер розуміє і може працювати. Цей крок зазвичай називають розбором, а програмне забезпечення, яке аналізує вихідний код, називається парсером. Часто аналізатор генерується генератором парсера, який перетворює формальну граматику у вихідний машинний код одєр. Для гарного, нематематичного пояснення розбору я рекомендую методики розбору - практичний посібник. У Вікіпедії є порівняння генераторів парсера, з яких ви можете вибрати той, який вам підходить. Залежно від генератора аналізатора, який ви вибрали,

Написати аналізатор для вашої мови може бути дуже важким, але це залежить від вашої граматики. Тому я пропоную зберігати свою граматику простою (на відміну від C ++); хороший приклад для цього - LISP.

На другому кроці абстрактне синтаксичне дерево перетворюється із структури дерева в лінійне проміжне подання. Як хороший приклад цього байт-коду Луа часто наводять. Але проміжне представництво дійсно залежить від вашої мови.

Якщо ви будуєте перекладача, вам просто доведеться інтерпретувати проміжне представлення. Ви також можете його вчасно скласти. Я рекомендую LLVM та libjit для тогочасного збирання. Щоб зробити мову корисною, вам також потрібно буде включити деякі функції введення та виведення, можливо, невелику стандартну бібліотеку.

Якщо ви збираєтеся складати мову, це буде складніше. Вам доведеться писати мітки для різних архітектур комп'ютерів і генерувати машинний код з проміжного представлення в цих пакетах. Я рекомендую LLVM для цього завдання.

На цю тему є кілька книг, але я не можу рекомендувати жодну з них для загального користування. Більшість із них занадто академічні або занадто практичні. Немає "Навчіть себе компілятору писати за 21 день", і, таким чином, вам доведеться придбати кілька книг, щоб добре зрозуміти всю цю тему. Якщо ви шукаєте в Інтернеті, ви натрапите на деякі онлайн-книги та конспекти лекцій. Можливо, поряд з вами є університетська бібліотека, де ви можете позичити книги на компіляторах.

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


++ Ви маєте рацію, що добре знати всі ці речі, і це може бути великою роботою, але я також дізнався від деяких експертів, як не робити речі великою справою. Добре знати речі, а ще краще знати, коли не користуватися ними, що є більшою частиною часу.
Майк Данлаве


11

Одна книга ще не запропонована, але дуже важлива - "Пов'язувачі та навантажувачі" Джона Левіна. Якщо ви не використовуєте зовнішній асемблер, вам знадобиться спосіб вивести об’єктний файл, який можна пов’язати з остаточною програмою. Навіть якщо ви використовуєте зовнішній асемблер, вам, мабуть, потрібно буде зрозуміти переміщення та те, як працює весь процес завантаження програми, щоб зробити робочий інструмент. Ця книга збирає багато випадкових знань навколо цього процесу для різних систем, включаючи Win32 та Linux.


10

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

Приклад у книзі розробить звичайну мову, що нагадує вираз, і її добре продумають, але, як кажуть у книзі, це добре для продуманого процесу, але дієвий лише для невеликих мов. Однак набагато швидше написати Інтерпретатора для невеликої мови з таким шаблоном, ніж дізнаватися про всі різні типи аналізаторів, yacc та lex, et cetera ...


10

Якщо ви готові використовувати LLVM, перевірте це: http://llvm.org/docs/tutorial/ . Це вчить, як написати компілятор з нуля, використовуючи рамки LLVM, і не припускає, що ти маєш будь-які знання з цього питання.

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


Але документація по її налаштуванню Visual Studio написана погано, плюс прикладів немає
SpicyWeenie

10

Книгу Дракона я виявив занадто важкою для читання з занадто великою увагою до теорії мови, яку насправді не потрібно писати компілятором на практиці.

Я додам книгу Oberon, яка містить повне джерело дивовижно швидкого та простого компілятора Oberon Project Oberon .

Alt текст


10

Я пам’ятаю, як задавали це запитання близько семи років тому, коли я досить новачка в програмуванні.

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

І так, багато людей кажуть, що читати цю книгу божевільно, і ви нічого з неї не навчитесь, але я з цим повністю не згоден.

Багато людей також кажуть, що писати компілятори - дурно і безглуздо. Ну, є кілька причин, чому розробка компілятора корисна:

  • Тому що це весело.
  • Це навчально, коли ви навчитеся писати компілятори, ви дізнаєтесь багато про інформатику та інші методики, корисні при написанні інших програм.
  • Якби ніхто не писав компілятори, існуючі мови не покращаться.

Я не написав власного компілятора одразу, але після запитання я знав, з чого почати. А тепер, вивчивши багато різних мов та прочитавши Книгу Драконів, писати це не є великою проблемою. (Я також вивчаю атм з комп’ютерної інженерії, але більшість того, що я знаю про програмування, - самоучка.)

На закінчення Книга Драконів - це чудовий «підручник». Але витратьте трохи часу на оволодіння мовою чи двома, перш ніж спробувати написати компілятор. Не очікуйте, що ви будете гуру компілятора протягом найближчого десятиліття.

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


9

"... Давайте побудуємо компілятор ..."

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

Чому? Інструменти та мова.

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

Після того як ви засвоїли уроки, тоді спробуйте вдосконалену " Книгу дракона " ~ http://en.wikipedia.org/wiki/Dragon_book


9

Я переглядаю ту саму концепцію і знайшов цю багатообіцяючу статтю Джоела Побара,

Створіть компілятор мови для .NET Framework - не впевнений, куди це пішло

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

він обговорює концепцію компілятора високого рівня і приступає до винайому власного мовного моменту для .Net Framework. Хоча його спрямовано на .Net Framework, багато концепцій повинні бути відтворені. Стаття охоплює:

  1. Визначення лангажу
  2. Сканер
  3. Парсер (трохи їх в основному цікавлять)
  4. Орієнтація на .Net Framework
  5. Генератор коду

Є й інші теми, але ви отримуєте справедливі.

Її спрямовано на людей, які починають, написані на C # (не зовсім Java)

HTH

кістки


Що означає "не зовсім Java"?
Hejazzman

ха-ха, вибачте, я мав на увазі його, написане для .Net, що в принципі схоже на Java. Обидва є стилем JIT. :)
dbones

8

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

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


8

Поширені запитання від comp.compilers :

"Програмування персонального комп'ютера" Пер Брінча Хансена Прентіс-Хола 1982 ISBN 0-13-730283-5

Ця книга під назвою, на жаль, пояснює розробку та створення середовища програмування для одного користувача для мікросхем, використовуючи мову, схожу на Паскаль, що називається Едісон. Автор представляє всі вихідні коди та пояснення покрокової реалізації компілятора Едісона та простої підтримуючої операційної системи, всі написані в самому Едісоні (за винятком невеликого підтримуючого ядра, написаного символічним асемблером для PDP 11/23; повне джерело також можна замовити для IBM PC).

Найцікавіші речі цієї книги: 1) її здатність демонструвати, як створити повноцінну, самодостатню, самодостатню, корисну компілятор та операційну систему, і 2) цікаве обговорення мовного дизайну та специфікацій проблем та торгово- в розділі 2.

"Брінч Хансен про компіляторів Паскаля" Пер Брінча Хансена Прентіс-Хол 1985 ISBN 0-13-083098-4

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

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

Ця книга спрощує проектування та реалізацію компілятора. Мені особливо подобається, як автор переймається якістю, надійністю та тестуванням. Компілятор та інтерпретатор можуть бути легко використані як основа для більш залученого мови або проекту компілятора, особливо якщо ви натиснуті, щоб швидко почати щось працювати.


8

Слід ознайомитись з « іхбінами Дарія Бекона» " , який є компілятором для невеликого діалекта Lisp, орієнтованого на C, трохи більше ніж на 6 сторінках коду. Перевага, яку вона має перед більшістю компіляторів іграшок, полягає в тому, що мова є достатньо повною, щоб компілятор написаний на ній. (Тарбол також включає перекладача для завантаження речі.)

Є більше інформації про те, що мені було корисно в навчанні писати компілятор на моїй веб-сторінці Ur-Scheme .


8
  1. Це величезна тема. Не варто недооцінювати цей момент. І не варто недооцінювати мою думку, щоб не недооцінювати його.
  2. Я чую Книгу Драконів - це (з?) Місце для початку, а також пошук. :) Попрацюйте краще, зрештою, це буде ваше життя.
  3. Створення власної мови програмування - це абсолютно гарна вправа! Але знайте, що вона ніколи не буде використана з будь-якою практичною метою. Винятки з цього небагато, і між ними дуже далеко.

4
Якщо ви ще не читали книгу Дракона. Будь ласка, не рекомендую. Насправді, ви коли-небудь реалізували компілятор?

Так, як випливає з назви, Книга Драконів - це чудовисько. Дуже глибокий, але дуже хороший ресурс. Я б не рекомендував це для початківців ...
Zachary Murray

2
@Neil: Ви мене не google'd, чи не так? Лол. blog.280z28.org Але ні, я не читав цієї книги.
Сем Харвелл

Я читаю це (книга дракона) зараз, а також Лекс / Якк одночасно, я вважаю книгу досить хорошою. Особисто.
Симеон Пілігрим

1
Щоб бути справедливим, я заздалегідь поставив це "Я чую ...". :) # 1 і # 3 - це моменти, які я вважаю надзвичайно важливими, щоб знати, що проходять, але не згадуються так часто.
Сем Харвелл

8

Компілятор LCC ( wikipedia ) ( домашня сторінка проекту ) ( github.com/drh/lcc ) Фрейзера та Гансона описаний у їхній книзі "Компілятор, що підлягає відповідальності": Проектування та впровадження ". Він досить читабельний і пояснює весь компілятор, аж до генерації коду.


Це здається надзвичайно гарним ресурсом дякую.
gideon

7

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


7

Вибачте, це іспанською мовою, але це бібліографія курсу під назвою "Compiladores e Intérpretes" (укладачі та перекладачі) в Аргентині.

Курс був від теорії формальної мови до побудови компілятора, і це теми, які потрібно побудувати, принаймні, з простих компіляторів:

  • Дизайн компіляторів у C.
    Allen I. Holub

    Prentice-Hall. 1990 рік.

  • Компілядори. Teoría y Construcción.
    Sanchís Llorca, FJ, Galán Pascual, C. Редакція Paraninfo. 1988 рік.

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

    Аддісон-Веслі. 1996 рік.

  • Lenguajes, Gramáticas y Autómatas. Un enfoque práctico.
    Педро Ісасі Віньюела, Палома Мартінес Феррандес, Даніель Боррала Міллан. Аддісон-Веслі Ібероамерикана (Іспанія). 1997 рік.

  • Мистецтво оформлення компілятора. Теорія та практика.
    Томас Піттман, Джеймс Пітерс.

    Prentice-Hall. 1992 рік.

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

  • Компілядори. Conceptos Fundamentales.
    Б. Теуфель, С. Шмідт, Т. Теуфель.

    Аддісон-Веслі Ібероамерикана. 1995 рік.

  • Вступ до теорії автоматів, мов та обчислень.

    Джон Е. Хопкрофт. Джеффреф Д. Уллман.
    Аддісон-Веслі. 1979 рік.

  • Вступ до формальних мов.
    Дьорджі Е. Ревеш.

    Mc Graw Hill. 1983 рік.

  • Техніка розбору. Практичний посібник.
    Дік Грюн, Ceriel Jacobs.
    Impreso por los autores. 1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc: Ще один компілятор-компілятор.
    Стівен Ч. Джонсон з
    технічних звітів з обчислювальної техніки № 32, 1975. Bell Laboratories. Мюррей Хілл, Нью-
    Джерсі.

  • Lex: Генератор лексичного аналізатора.
    М. Е. Леск, Е. Шмідт. Технічний звіт з обчислювальної науки № 39, 1975. Bell Laboratories. Мюррей Хілл, Нью-Джерсі.

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

  • Елементи теорії обчислення.
    Гаррі Р. Льюїс, Крістос Х. Пападімітріу. Segunda Edición. Prentice Hall. 1998 рік.

  • Un Algoritmo Eficiente para la Construcción del Grafo de Dependencia de Control.
    Сальвадор В. Кавадіні.
    Фінал Трабаджо-де-Градо для відвідувача El Título de Ingeniero en Computación.
    Facultad de Matemática Aplicada. UCSE 2001.


6

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

Навчальний посібник: Метакомпілятори, частина 1

Все це базується на дивовижному невеликому технічному документі на 10 сторінок:

Val Schorre META II: Мова написання компілятора, орієнтована на синтаксис

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

Я знаю автора веб-сайту ще з моїх днів коледжу, але я не маю нічого спільного з веб-сайтом.


Як кажуть інші, це ВЕЛИКИЙ аргумент, я думаю, що завдання суші - це підсумкова робота для бакалавра, вона потребує багато понять з математики, інформатики тощо.
ingconti

Якщо ви не знаєте цих тем, ви не повинні намагатися створити серйозний компілятор. Однак якщо у вас є 2-3 роки бакалаврської освіти з інформатики (програмування, структури даних, мова складання), документ MetaII буде працювати для вас.
Іра Бакстер

5

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

Читати.

Працюйте, якщо хочете, але потім подивіться ще одну посилання на те, наскільки насправді написані більші та повні компілятори.

І читайте про довірену довіру , щоб отримати підказку про непомітні речі, які можна зробити в цій галузі.


5

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

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

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


5

Можна використовувати BCEL програмою Apache Software Foundation. За допомогою цього інструменту ви можете генерувати код, схожий на асемблер, але це Java з BCEL API. Ви можете дізнатися, як можна генерувати проміжний код мови (у цьому випадку байт-код).

Простий приклад

  1. Створіть клас Java за допомогою цієї функції:

    public String maxAsString(int a, int b) {
        if (a > b) {
            return Integer.valueOf(a).toString();
        } else if (a < b) {
            return Integer.valueOf(b).toString();
        } else {
            return "equals";
        }
    }
    

Тепер запустіть BCELifier з цим класом

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

Результат можна побачити на консолі для всього класу (як побудувати байт-код MyClass.java). Код функції такий:

private void createMethod_1() {
  InstructionList il = new InstructionList();
  MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);

  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
  il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
    BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
  il.append(if_icmple_2);
  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
  il.append(InstructionFactory.createLoad(Type.INT, 2));
    BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
  il.append(if_icmpge_15);
  il.append(InstructionFactory.createLoad(Type.INT, 2));
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  if_icmple_2.setTarget(ih_13);
  if_icmpge_15.setTarget(ih_26);
  method.setMaxStack();
  method.setMaxLocals();
  _cg.addMethod(method.getMethod());
  il.dispose();
}

5

Тут є багато хороших відповідей, тому я думав, що я просто додам ще один до списку:

Більше десятиліття тому я отримав книгу під назвою Project Oberon, в якій є дуже добре написаний текст на компіляторі. Книга справді виділяється в тому сенсі, що джерело та пояснення дуже зручні і читаються. Повний текст (видання 2005 року) доступний у форматі pdf, тому його можна завантажити вже зараз. Компілятор обговорюється в главі 12:

http://www.ethoberon.ethz.ch/WirthPubl/ProjectOberon.pdf

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

(Лікування не таке обширне, як його книга про упорядники)

Я прочитав кілька книг про компілятори, і я можу віднести книгу-дракона, час, витрачений на цю книгу, дуже вартий.


4

Поки не включена до списку ця книга:

Основи дизайну компіляторів (Torben Mogensen) (з кафедри комп'ютерних наук, Копенгагенський університет)

Мені також цікаво дізнатися про компілятори та планувати вступити в цю галузь у найближчі пару років. Ця книга є ідеальною теоретичною книгою, щоб почати вивчати компілятори, наскільки я бачу. БЕЗКОШТОВНО копіювати та відтворювати, чітко та ретельно написано та надає їх простою англійською мовою без будь-якого коду, але все ще представляє механіку за допомогою інструкцій та діаграм тощо. Варто виглядати imo.


Додав його до списку дякую :)
Антон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.