Изучение дизайна инкрементной компиляции

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

Вы хотите построить хакерский жгут и парсер рекурсивного спуска.

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

  1. Измените фрагмент кода (теперь "В 0700 УСТАНОВЛЕНО ПОЛЕЗНЫЕ ДВЕРИ НА ПОЛНОМ")
  2. Скомпилируйте фрагмент
  3. Изменить файл кода (теперь "tests.l")
  4. Компилировать из файла
  5. Переключить выход Lexer (теперь включен)
  6. Переключить выход эмиттера (теперь включен)
  7. Toggle Run на домашнем оборудовании (теперь ВЫКЛ)

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

Возможно, вы захотите написать свой код на 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)
        ...

Так что вам нужно написать:

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

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

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

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

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

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

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

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

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