Подтвердить что ты не робот

Изучение инкрементной схемы компиляции

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

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

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

4b9b3361

Ответ 1

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

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

В этой статье рассмотрен дизайн back-end инкрементного сборник system. Скорее, чем построение единого фиксированного инкрементального компилятора, этот документ представил гибкая структура для построения таких систем в соответствии с потребностями пользователя.

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

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

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

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

Ответ 2

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

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

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

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

  • Измените фрагмент кода (теперь "AT 0700 SET HALLWAY LIGHTS ON FULL" )
  • Скомпилировать фрагмент
  • Измените файл кода (теперь "tests.l" )
  • Скомпилировать из файла
  • Переключить вывод Lexer (теперь включен)
  • Toggle Выход эмиттера (теперь включен)
  • Переключить запуск на домашнем оборудовании (теперь выключено)

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

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

Итак, вам нужно написать:

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

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

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

Ответ 3

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

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

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

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

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