есть ли простой компилятор для небольшого языка - PullRequest
37 голосов
/ 16 декабря 2009

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

Ответы [ 18 ]

48 голосов
/ 19 декабря 2009

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

  • Это всего 2000 строк.

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

  • Он генерирует реальный машинный код, ничего подобного Namby-Pamby C или LLVM: -)

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

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

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

8 голосов
/ 16 декабря 2009

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

6 голосов
/ 20 декабря 2009

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

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

6 голосов
/ 16 декабря 2009

Около 1000 строк кода. Компилирует схему в ассемблер LLVM или в C. Я бы сказал, что это отлично подходит для работы с компиляторами Если вы хотите пойти глубже, я рекомендую книгу "SICP" .

5 голосов
/ 16 декабря 2009

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

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

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

http://standardpascal.org/source.html

4 голосов
/ 16 декабря 2009

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

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

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

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

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

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

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

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

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

3 голосов
/ 17 декабря 2009

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

3 голосов
/ 16 декабря 2009

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

Концепция компилятора TIGER и проектных заданий

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

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

3 голосов
/ 16 декабря 2009

LISPes (схема и т. Д.) Являются простейшими актуальными языками. Вы можете посмотреть, как создать примитивный интерпретатор Scheme в perl с этой книгой (бумажная версия здесь, на Lulu ). Парсинг, проверка типов похожи в интерпретаторах и компиляторах. Далее приведена более хардкорная книга по теме дизайна компилятора (также доступна как dead tree на Lulu ).

3 голосов
/ 16 декабря 2009

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

Я рекомендую "книгу драконов": Принципы компиляции , автор Aho и Ullman. С тех пор, как я его прочитал, прошло много лет, поэтому я не помню, какие именно примеры имеются, но это очень хороший текст.

...