35

Я ищу простой компилятор, который компилирует простой язык, мне нужно, чтобы он написал статью об этом и узнал, как работают компиляторы, я не ищу сложную вещь, просто простой язык (простым я имею в виду небольшой код, потому что, например, gcc является toooooo большим). любая помощь приветствуется.есть простой компилятор для небольшого языка

+0

Отъезд Antlr и Bison для части вашей работы, а именно лексирование и разбор. –

+0

Вас больше интересует разбор (front-end) или генерация кода (back-end)? Многие компиляторы разделяют эти две части и реализуют их независимо. –

+0

да, меня больше интересует передняя часть компилятора (этапы анализа) – Ayoub

ответ

45

Если вы хотите посмотреть код, я очень впечатлен составом Eijiro Sumii MinCaml.

  • Это всего лишь 2000 строк.

  • Он компилирует довольно интересный исходный язык.

  • Это создает реальные машинный код, ни один из этого сентиментальных С или LLVM вещи :-)

  • Скорости скомпилированного кода конкурентна с GCC и родными компиляторами OCaml.

  • Компилятор предназначен для обучения.

Я упоминал, что я был очень впечатлен?

+0

Это довольно аккуратно. – bcat

+0

благодарит за объявление о MinCaml – coolkid

0

Brainfucked - это компилятор для чрезвычайно простого мышления Brainfuck.

+0

Эта реализация действительно полезна, если вы программист на сборку Windows. Я бы добровольно выполнил мою реализацию, но в настоящее время она переписывается для обеспечения удобства. И это не так много компилятора, он просто переводит на C (или сборку NASM). –

1

Вы можете посмотреть пример калькулятора в веселой книге Bjarne Stroustrup «Язык программирования C++».

Если вы хотите что-то более продвинутое, прочитайте исходный код boost :: spirit.

+0

'boost :: spirit' не является компилятором, это генератор синтаксического анализатора (компилятор-компилятор AKA). – AraK

1

Зависит от вашего зрения. Вы можете посмотреть на один из доступных BrainFuck компиляторов. Это очень простой язык, и компиляторы очень малы. Но я не знаю, как много это скажет вам о том, как работает «настоящий» компилятор.

Как насчет просмотра небольшого компилятора C? C не очень компилируется, и я думаю, что это даст вам некоторое представление о конструкции компилятора.

+0

Возможно, вам понадобится Tiny C Compiler. http://bellard.org/tcc/ –

+0

А, да, спасибо. Это именно то, о чем я думал, но я не мог вспомнить имя. –

+0

Будь! «Поддерживается скрипт C: просто добавьте« #!/Usr/local/bin/tcc -run »! Я думаю, что нашел свой новый «скриптовый» язык для Linux! –

4

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

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

+1

+1 - вы узнаете больше и быстрее, читая книгу, чем пытаетесь понять компилятор, читая его исходный код. –

+0

Книга дракона, как мне кажется, трудно читать. –

+1

Любой, кто рекомендует книгу драконов новичку, очевидно, никогда не читал. – 2009-12-16 11:53:38

4

Есть много, что вы можете использовать, то, что вы найдете легче всего, будет зависеть от вашего опыта.

Во-первых, что касается языка:

  1. Самый простой игрушечный язык, например, составление арифметических выражений.
  2. Следующий ассемблер - снова действительно просто перевод, но показывает основы разбора и превращения в op-коды
  3. Следующий, вероятно, что-то вроде C, который очень близок к чистому ассемблеру или что-то вроде LISP, который очень близок к чистой теории.

Далее, выбрав свой компилятор.

Вы можете начать с ассемблера - превратить ассемблер в машинный код. Это был первый шаг в создании компиляторов - я бы предложил для чипа, такого как 6502 или 8080, которые оба очень просты. Что-то вроде assembler's development kit может работать хорошо для вас (в нем есть примеры)

Многие люди (включая меня) утверждают, что самые легкие языки для написания компиляторов являются функциональными - в настоящее время это, вероятно, означает Haskell, Scheme или Common Lisp. Пример того, насколько это просто, - this blog post. Он пишет компилятор, который просто компилирует арифметические выражения в нескольких строках. Это может быть достаточно для вас.

Почти каждое введение в составление письменных компиляторов на академическом уровне начинается с минимального языка в качестве примера, всегда рекомендуется использовать the Dragon Book http://en.wikipedia.org/wiki/Dragon_Book_%28computer_science%29, но есть и другие хорошие.

В университете я использовал C--, который похож на C, но еще проще написать компилятор. Много ресурсов в: http://www.cminusminus.org/qc--.html

Если вам нужен компилятор, и вы знаете язык, подобный Java, я бы предложил что-то вроде JavaCC, где язык указан с использованием грамматик. Есть lots of example grammars here - выберите что-то простое, как C, чтобы начать.

7

Я рекомендую TinyScheme или jonesforth.

+0

Excecpt TinyScheme не является компилятором. Джонсонфорт был хорошим предложением, хотя и не знал об этом. –

3

LISPes (Схема и т. Д.) - самые простые фактические языки. Вы можете посмотреть, как построить примитивный интерпретатор схемы в perl с помощью this book (бумажная версия here on Lulu). Анализ, проверка типов аналогична интерпретаторам и компиляторам. Затем здесь находится more hardcore book on the compiler design subject (также доступен как dead tree on Lulu).

5

Посмотрите на простой компилятор для PL/0 (небольшой паскаль-подобного подмножества - без каких-либо параметров, только целые данные). Источник, написанный на Паскале, составляет всего около 500 строк кода и легко следовать. Это может быть все, что вам нужно посмотреть.

Однако, если вы хотите пойти немного дальше, как только вам станет удобно, посмотрите на источник на Pascal-S. Это компилятор для большего подмножества Pascal, но включает в себя некоторые дополнительные понятия, такие как передача параметров, дополнительные типы данных, массивы и записи (структуры). Тем не менее, это всего лишь около 2000 строк кода, и вам легко следовать, как только вы освоили PL/0.

Вы можете найти источники здесь:

http://standardpascal.org/source.html

3

В моей бывшей IT школе, мы должны были разработать компилятор в C++, но не на пустом месте: там были шаги, кривая обучения и т.д ..

The concept of the TIGER Compiler и projet assignments

Все документы доступны, но сам код не является, так что вам придется делать все это самостоятельно.

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

3

Google UCSD Pascal. Это был наземный выключатель в 70-х годах. Может быть, это больше, чем вы хотите, но тогда его легко переносили на множество микрочипов.

6

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

Для получения дополнительной информации см. "Let's Build a Compiler". Обратите внимание, что он не является полным; он закончил, прежде чем закончил, но там есть много легко усваиваемой информации.

1

Я начал видео учебник по написанию 3 компилятор ANTLR - проверить

http://javadude.com/articles/antlr3xtut

Я буду добавлять больше к нему в ближайшее время! - Scott

+0

Большое вам спасибо за это видео, не отставайте от хорошей работы – Ayoub

+0

Рад, что вам понравилось! Я буду продолжать добавлять, когда получаю время. Гораздо проще добавлять фрагменты видео, чем писать большой длинный фрагмент текста, как я сделал для учебника ANTLR 2.x! –

2

Это всего лишь 300 строк обычного кода и реализует простой универсальный язык link text, что-то в этом роде, что вы искали?

1

Вы также можете попробовать эту книгу: The Elements of Computing Systems.

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

Глава 10: Анализ синтаксиса - это то, с чем вы можете работать, если вы намерены сосредоточиться только на передней части компилятора. Тем не менее, глава 9 должна быть предпосылкой, поскольку она описывает дизайн языка высокого уровня, для которого реализован компилятор. Этот язык высокого уровня на самом деле является простым OO-java-подобным языком, поэтому компилятор фактически компилирует виртуальную машину.

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

И вы можете найти мой обзор книги here.

0

smallest practical compiler I know is MetaII, который имеет 40-строчное самоописание и может скомпилировать себя, используя специальную систему времени выполнения, которая, по общему признанию, скрывает некоторые интересные вычисления (но тогда большинство компиляторов, перечисленных здесь, предполагают какую-то систему времени выполнения, чем для MetaII. Я строить реальные компилятор, начиная с этого в качестве основы, хотя мета-самообеспечение скорее укреплено эффектно.

там в been work to make that even smaller. я не думаю, что есть какие-либо практические компиляторы, основанные на этом направлении.

Здесь стоит написать статью.