Изучение дизайна инкрементной компиляции - PullRequest
26 голосов
/ 13 мая 2011

Существует множество книг и статей о создании компиляторов, которые выполняют всю работу по компиляции одновременно. А как насчет дизайна инкрементных компиляторов / парсеров, которые используются в IDE? Я знаком с первым классом компиляторов, но никогда не работал со вторым.

Я пытался прочитать некоторые статьи об инструментах разработки Eclipse Java, но они описывают, как использовать полную инфраструктуру (т. Е. API) вместо описания внутреннего дизайна (т. Е. Как он работает внутри).

Моя цель - реализовать инкрементный компилятор для моего собственного языка программирования. Какие книги или статьи вы бы мне порекомендовали?

Ответы [ 3 ]

14 голосов
/ 01 июня 2011

Эту книгу стоит посмотреть: Создание гибкого бэкэнда инкрементного компилятора.

Цитата из гл. 10 «Выводы»:

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

Я думаю, это то, что вы ищете ...

Edit:
Итак, вы планируете создать нечто, известное как «кросс-компилятор»?!
Я начал новую попытку. До сих пор я не могу предоставить окончательную ссылку. Если вы планируете такой большой проект, я уверен, что вы опытный программист. Поэтому возможно, что вы уже знаете эти ссылки.

Compilers.net
Список определенных компиляторов, даже кросс-компиляторов (переводчиков). К сожалению, с некоторыми неработающими ссылками, но «Toba» все еще работает и имеет ссылку на свой исходный код. Может быть, это может вдохновить вас.

clang: интерфейс семейства языков C для LLVM
Хорошо, это для LVVM , но источник доступен в SVN-репозитории, и он, кажется, является внешним интерфейсом для компилятора (транслятора). Может быть, это вас тоже вдохновит.

4 голосов
/ 01 июня 2011

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

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

Вы хотите создать хакерскую программу и парсер рекурсивного спуска.

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

  1. Измените фрагмент кода (теперь «В 0700 УСТАНОВЛЕНО ПОЛУЧАЕТСЯ НА ПОСЕЛКЕ НА ПОЛНОМ»)
  2. Скомпилируйте фрагмент
  3. Измените файл кода (теперь "tests.l")
  4. Скомпилируйте из файла
  5. Переключите вывод Lexer (теперь включен)
  6. Toggle Emitter output (теперь ON)
  7. Toggle Run на домашнем оборудовании (теперь OFF)

    Ваша команда, сир?

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

def cmd_at():
    if next_token.type == cTIME:
        num = next_num()
        emit("events.setAlarm(events.DAILY, converttime(" + time[0:1] + ", " 
           + time[2:] + ", func_" + num + ");")
        match_token(cTIME)
        match_token(LOCATION)
        ...

Поэтому вам нужно написать:

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

Этот подход направлен на ускорение цикла взлома языка.Когда вы закончите этот подход, вы достигнете ЗУБР, испытательных упряжек и т. Д.

Создание собственного языка может быть прекрасным путешествием!Ожидайте учиться.Не надейтесь разбогатеть.

1 голос
/ 09 июля 2012

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

Я прочитал статью на эту тему в Википедии, и она была связана со статьей DDJ 1997 года:

http://www.drdobbs.com/cpp/codestore-and-incremental-c/184410345?pgno=1

Мясо статьи - первая страница. Это объясняет, что код в редакторе разделен на части, которые «включены» в «CodeStore» (базу данных). Части включены через рабочую очередь, которая содержит некорпоративные части. Кусок кода может быть проанализирован и возвращен в рабочую очередь несколько раз, с некоторыми сбоями при каждой попытке, пока он не пройдет успешно. База данных включает в себя зависимости между частями, чтобы при редактировании исходного кода можно было видеть эффекты на отредактированную часть и другие части, и эти части можно повторно обрабатывать.

Я считаю, что другие системы по-разному подходят к проблеме. Java представляет проблемы, отличные от C / C ++, но имеет и преимущества, поэтому Eclipse, возможно, имеет другой дизайн.

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