Подтвердить что ты не робот

Существует ли более современная версия OO "Let Build a Compiler"?

Существует ли более современный, возможно объектно-ориентированный, эквивалентный Jack Crenshaw " Let Build the Compiler" series?

А назад я наткнулся на " Let Build the Compiler" и мог просто не сопротивляться написанию кода. Я написал компилятор рекурсивного спуска C на С#, который выводит .NET CIL. "Пишите раз, утечка повсюду" был моим лозунгом.

Слишком плохо, что я не понимал, пока слишком поздно, что синтаксический анализ C - это кошмар.

Теперь я заинтересован в написании Java-компилятора на Java, который выводит .NET CIL или сборки с целью самообучения. Я надеялся, что могут появиться новые учебные пособия.

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

4b9b3361

Ответ 1

Похоже, вы полностью упустили точку обучения Crenshaw. LBC не собирается писать красивый, чистый или эффективный код. Все дело в том, чтобы принести что-то, что погрузилось в формальную теорию, до уровня, где случайный кодер может легко и быстро взломать рудиментарный (но рабочий!) Компилятор.

Когда я читал LBC лет назад, я переписал примеры на С#. Я уверен, что макет класса не самый лучший, или задачи разделены должным образом, но это сопоставимо с его Pascal. Я был бы рад поделиться с вами кодом, если хотите - дайте мне знать, и я могу опубликовать его в Интернете и поделиться ссылкой.

В свое свободное время я взламывал некоторые письма с целью объединить философии LBC и Basics of Compiler Design вместе - уйти с практическим рабочим кодом в конце каждого раздела/раздела, а также обсудите некоторые теоретические вещи после изучения идей, чтобы читатель понял, почему все так, как они есть. Но потребовалось годы Crenshaw, чтобы написать его неполную серию, так что мой мой сон мечтает... и я использую C (именно потому, что это не С++ или Java).

Ответ 2

Взгляните на Terence Parr "Шаблоны реализации языка" . Он написал ANTLR - генератор синтаксического анализатора для Java - так знает свои вещи. Это объясняет принципы дизайна компилятора очень хорошо и постепенно нарастает.

Мартин Фаулер "Языки домена" также хорош. У этого есть немного другая повестка дня, чем чисто курс компиляторов, но является хорошей ссылкой на ключевые концепции дизайна языка.

Ответ 3

Я поклонник "MiniJava" и связанная работа, основанная на семействе книг "Современная компиляция в Java". Это не совсем соответствует всем требованиям, которые вы упомянули, поскольку реализация MiniJava, как правило, генерирует собственный код, но бэкенд можно легко изменить, чтобы исправить MSIL или что-то еще.

Ответ 4

Вы взглянули на проект PyPy? Это Python-реализация языка Python. Может быть, это может послужить источником вдохновения для вашей цели самообучения Java?

Ответ 5

Недавно я построил компилятор в своей компании, используя BNFC, сначала мне было поручено использовать Flex и Bison (C/С++), но я обнаружил, что это боль, поэтому я использовал BNFC для генерации файлов Flex и Bison.

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

На самом деле есть книга под названием Реализация языков программирования, которую описывают как "книгу самообучения и, в некоторой степени, руководство к BNFC tool", если бы я его прочитал, я бы, вероятно, с меньшими усилиями принимал решения по внедрению, но в целом я нашел BNFC достаточно интуитивным, чтобы использовать его, только прочитав руководство и tutorial

И последнее, но не менее важное: оно также может использоваться с другими языками, включая Java (с Cup и JLex).

Ответ 8

Если вам нравится учиться на примере, код Finch, небольшой язык программирования:

  • Пишется в объектно-ориентированном С++.
  • Очень чистый.
  • Включает компилятор байт-кода.

Ответ 9

Как насчет процессоров языка Watt и Brown в Java. Он демонстрирует, какие шаблоны OO использовать в (простом) дизайне компилятора. Я использовал его с С# успешно.

Ответ 10

Это старая тема, но я бы хотел, чтобы во многих случаях люди узнали это сообщение через Google.

Я прочитал книгу Джека Креншоу и применил методы там, используя эмулятор Easy68K Motorola 68K. Компилятор в тексте нацелен на процессор Motorola 68K, поэтому вам нужно иметь систему с этим процессором или эмулятором.

Затем после этого я решил написать переводчика, используя теки, которые я узнал из этого опыта. Мое имя интерпретатора - Contra, здесь github repo.

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

Вы можете загрузить исходный код и узнать его. Его кодовая база чистая и аккуратная.

Мехмет.