История изменений
Исправление
geekless,
(текущая версия)
:
ровно то самое, что записано в исходном синтаксисе for
В исходном синтаксисе for может быть записана любая херня. Вон в Сях туда вообще можно навешивать произвольные выражения. Чтобы из какого-нибудь частного случая for(int i = 0, j = k; i < n; i++, j--) {какая_то_херня(i, j);} вывести induction variable, нужен аппарат анализа, сам по себе аналогичный анализу CFG. Зачем ты этот анализ собрался делать на уровне анализа конструкций ЯП - да хер его знает.
Приводят в CFG, а потом обратно в структурное представление только для того, чтобы на уровне CFG проделать SSA-преобразование. А оно нужно для того, чтобы вычислить induction variable и инкремент, и сделать constant folding (который может привести к изменениям в понимании loop bounds). Только вот в чем прикол - SSA-преобразование можно делать и без CFG. И получается оно быстрее и дешевле, чем на dominator tree.
А потом перед твоим компилятором возникает задача прожевать что-то вроде семантики Сишечки, и всё, soosnuli. Оптимизации должны работать в общем виде, а не в сладких мечтах о правильных AST-ах с правильной семантикой, допускающей только правильные оптимизации.
Исходная версия
geekless,
:
ровно то самое, что записано в исходном синтаксисе for
В исходном синтаксисе for может быть записана любая херня. Вон в Сях туда вообще можно навешивать произвольные выражения. Чтобы из какого-нибудь частного случая for(int i = 0, j = k; i < n; i++, j--) {какая_то_херня(i, j);} вывести induction variable, нужен аппарат анализа, сам по себе аналогичный анализу CFG. Зачем ты этот анализ собрался делать делать на уровне анализа конструкция ЯП - да хер его знает.
Приводят в CFG, а потом обратно в структурное представление только для того, чтобы на уровне CFG проделать SSA-преобразование. А оно нужно для того, чтобы вычислить induction variable и инкремент, и сделать constant folding (который может привести к изменениям в понимании loop bounds). Только вот в чем прикол - SSA-преобразование можно делать и без CFG. И получается оно быстрее и дешевле, чем на dominator tree.
А потом перед твоим компилятором возникает задача прожевать что-то вроде семантики Сишечки, и всё, soosnuli. Оптимизации должны работать в общем виде, а не в сладких мечтах о правильных AST-ах с правильной семантикой, допускающей только правильные оптимизации.