Re[6]: AST в функциональном стиле
От: thesz Россия http://thesz.livejournal.com
Дата: 20.02.09 21:17
Оценка: 60 (1) +1
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%

Я эту ссылку постил всюду, но она того стоит.

Короче говоря, опыт опровергает твои слова.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.