Изучение инкрементной схемы компиляции
Существует множество книг и статей о создании компиляторов, которые выполняют всю работу по компиляции за раз. А как насчет дизайна инкрементных компиляторов/парсеров, которые используются IDE? Я знаком с первым классом компиляторов, но я никогда не работаю со вторым.
Я попытался прочитать некоторые статьи о инструментах разработки Java Eclipse, но они описывают, как использовать полную инфраструктуру (например, API) вместо описания внутреннего дизайна (то есть как он работает внутри).
Моя цель - реализовать инкрементный компилятор для моего собственного языка программирования. Какие книги или статьи вы бы мне рекомендовали?
Ответы
Ответ 1
Эта книга заслуживает внимания: создание гибкого инкрементного компилятора.
Цитата из гл. 10 "Выводы":
В этой статье рассмотрен дизайн back-end инкрементного сборник system. Скорее, чем построение единого фиксированного инкрементального компилятора, этот документ представил гибкая структура для построения таких систем в соответствии с потребностями пользователя.
Я думаю, что это то, что вы ищете...
Edit:
Итак, вы планируете создать что-то, что называется "кросс-компилятор"?!
Я начал новую попытку. До сих пор я не могу дать окончательную ссылку. Если вы планируете такой большой проект, я уверен, что вы опытный программист. Поэтому возможно, что вы уже знаете эти ссылки.
Compilers.net
Список определенных компиляторов, даже кросс-компиляторов (переводчиков). К сожалению, с некоторыми сломанными ссылками, но Toba все еще работает и имеет ссылку на исходный код. Может быть, это может вас вдохновить.
clang: интерфейс семейства языков C для LLVM
Хорошо, это для LVVM, но источник доступен в репозитории SVN, и он кажется передним для компилятора (переводчика). Может быть, это тоже может вас вдохновить.
Ответ 2
Я собираюсь не согласиться с общепринятой мудростью на этом, потому что большинство общепринятых соображений делают неписаные предположения о ваших целях, таких как полные языковые проекты и потребность в максимальной эффективности. Из вашего вопроса я принимаю эти цели:
- узнать о написании собственного языка.
- играйте со своим языком, пока он не станет элегантным.
- попытайтесь исправить код на другой язык или байт-код для фактического выполнения.
Вы хотите создать хакерский жгут и рекурсивный синтаксический анализатор спуска.
Вот то, что вы, возможно, захотите создать для жгута проводов, используя только текстовый процессор.
Вероятно, вы захотите написать свой код на 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, возможно, имеет другой дизайн.