Есть ли простой компилятор для небольшого языка

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

18 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

http://standardpascal.org/source.html

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

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

  1. Самый простой - это игрушечный язык, например, составление арифметических выражений.
  2. Далее идет ассемблер - опять же на самом деле просто перевод, но показывает основы парсинга и превращения в оп-коды
  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, чтобы начать.

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

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

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

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

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

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

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

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

Этот код содержит всего 300 строк нормального кода и реализует простой текстовый универсальный текст ссылки. Это то, что вы искали?

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

http://javadude.com/articles/antlr3xtut

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

Вы можете посмотреть пример калькулятора в веселой книге Бьярна Страуструпа "Язык программирования C++".

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

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

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

Вы также можете попробовать эту книгу: Элементы компьютерных систем.

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

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

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

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

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

Была работа, чтобы сделать это еще меньше. Я не думаю, что есть какие-либо практические компиляторы, основанные на этом направлении.

Об этом стоит написать статью.

Стандартный ресурс переполнения стека для ресурсов по написанию компилятора - Учимся писать компилятор

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

Другие вопросы по тегам