T>>Узлы не меняются в процессе анализа, поэтому ничего делать не надо.
M>Вот я Java все методы интерфейса public, но писать этот public не нужно, он автоматически вставляется.
M>Ты анализируешь AST, обнаруживаешь, что метод интерфейса не имеет флага public и этот флаг ему вставляешь.
M>Или ты вставляешь всем типам супер-тип Object. И так далее.
M>Нет?
M>Ты вставил методу интерфейса флаг public ещё в процессе парсинга?
M>Ты автоматом вставил супер-тип, если он не указан?
M>Отлично. Так можно. Но это hardcoded семантика. Подобный компилятор очень трудно модифицировать, даже под новую версию языка.
Это вам трудно, нам как два байта переслать.
T>>Структуру всё равно надо пересоздавать в процессе синтеза структуры по результатам анализа. Я уж находился в своё время по изменяемым структурам. Чихнул разок, и перестраивай инварианты. Не дай бог, что забудешь.
M>Нужно. В один pass компилятора можно уместить кучу анализа, и пересоздать дерево один раз за pass.
M>Тогда у тебя весь анализ смешан в кучу. Ты уже не сможешь разделить анализ супер-типа и флагов методов, если они делаются в один проход.
M>Зато, если всё свалить в кучу и минимизировать количетво проходов — получается быстро.
M>Но нерасширяемо.
Объясни. Не понял.
Это противоречит или подтверждает мои слова?
T>>Ты объясни, зачем нужно родителя искать.
T>>Типовой пример приведи, пожалуйста.
M>Ну, переписать одну семантическую конструкцию на другую. Заменить один узел на другой. Такскать за собой список родителей не интересно, так как в общем случае у нас граф, а не дерево.
M>Или просто найти узел по имени (резолвинг символов). Надо пройти по дереву с листика до корешка. Делать этот резолвинг один раз, обходя дерево от корня к листикам — не получится, подставил макрос, и тебе надо делать резолвинг по новой.
Это я опять не понимаю.
У нас есть отдельный этап анализа окружения, чтобы все имена были определены. Его, наверное, надо делать после макросов, нат?
T>>А то писал-писал транслятор, да так ни разу родителя и не пришлось искать. Может, я что упускаю?
M>Расширяемость арихитектуры.
M>Можно без родителя, можно без расширяемости и независимости отдельных частей компилятора. Это даже в 100 раз быстрее будет работать (если не ставить себе целью испльзовать только immutable данные). Но модифицируемость и расширяемость компилятора будет на нуле.
Как в компиляторе заменили изменяемое представление графа на чисто функциональное, и как от этого случилось сокращение кода втрое, исчезло большинство ошибок, стало возможным написать многие дополнительные оптимизации и (барабанная дробь!)
СКОРОСТЬ УВЕЛИЧИЛАСЬ НА 10%
Я эту ссылку постил всюду, но она того стоит.
Короче говоря, опыт опровергает твои слова.