Представьте, что у меня есть игрушечный язык на основе стека, который поставляется с операциями Push, Pop, Jump и If.
У меня есть программа, и ее ввод - игрушечный язык.Например, я получаю последовательность
Push 1
Push 1
Pop
Pop
. В этом случае максимальный стек будет равен 2. Более сложный пример будет использовать ветви.
Push 1
Push true
If .success
Pop
Jump .continue
.success:
Push 1
Push 1
Pop
Pop
Pop
.continue:
В этом случае максимальный стек будет3. Однако получить максимальный стек невозможно, пройдя сверху вниз, как показано в этом случае, так как это фактически приведет к ошибке переполнения стека.
CFG в помощь, вы можете построить график ипройти все возможные пути из основных блоков, которые у вас есть.Однако, поскольку число путей может быстро расти для n вершин, вы получаете (n-1)!возможные пути.
Мой текущий подход состоит в том, чтобы максимально упростить график и иметь меньше возможных путей.Это работает, но я бы посчитал это уродливым.Есть ли лучший (читай: быстрее) способ решения этой проблемы?Я в порядке, если алгоритм выдает глубину стека, которая не является оптимальной.Если правильный размер стека равен m, то мое единственное ограничение - результат n равен n> = m.Возможно, есть жадный алгоритм, который даст хороший результат здесь?
Обновление: Я знаю о циклах и инварианте, что все слияния потока controlf имеют одинаковую глубину стека.Я решил написать простой игрушечный язык, чтобы проиллюстрировать проблему.По сути, у меня есть детерминированный язык на основе стека (байт-код JVM), поэтому у каждой операции есть известная дельта стека.
Обратите внимание, что у меня есть рабочее решение этой проблемы, которое дает хорошие результаты (упрощенный cfg)но я ищу лучший / более быстрый подход.