Я строю CFG из произвольного IL и хочу преобразовать этот CFG обратно в IL. Порядок вершин в CFG, конечно, не равен порядку исходных инструкций IL.
Это хорошо, но некоторые вещи усложняют. Представьте себе:
Jump 'B'
'C': Return
'B': Jump 'C'
Это приведет к созданию потокового графа, подобного следующему: (переход B) -> (переход C) -> (возврат)
Это, конечно, упрощенный пример, но он показывает проблему при конвертации из CFG.
Есть ли какая-либо информация по этой теме в научных кругах? Я думал, что обход графика снизу вверх будет очень элегантным, но в более сложных случаях это не работает.
Решением может быть обход сверху вниз и поиск слияния CF, но в этом случае я не смог бы правильно обработать циклы. Таким образом, кажется, что единственный способ получить это право - поиск возможного слияния CF, если оно произойдет. Если нет, у нас должен быть цикл, что означает, что цикл является предпочтительным, а дальнейший путь оценивается впоследствии. Это звучит как разрешимая проблема, но это также очень дорого и может существовать более элегантное решение проблемы. Кроме того, цикл может также привести к слиянию CF, если подумать об операторе "break".