Оптимизация «статических» циклов

Я пишу компилируемый язык для развлечения, и недавно я получил удовольствие от того, что мой оптимизирующий компилятор слишком крепкий. Я нашел несколько способов оптимизации некоторых вещей, например, 2 + 2 всегда равно 4, поэтому мы можем сделать эту математику во время компиляции, если (false ){... } можно полностью удалить, и т. д., но теперь я добрался до петель. После некоторых исследований я думаю, что то, что я пытаюсь сделать, это не совсем развертывание цикла, но это все же метод оптимизации. Позволь мне объяснить.

Возьмите следующий код.

String s = "";
for(int i = 0; i < 5; i++){
    s += "x";
}
output(s);

Как человек, я могу сесть здесь и сказать вам, что это в 100% случаев будет эквивалентно

output("xxxxx");

Таким образом, другими словами, этот цикл может быть полностью "скомпилирован". Это не развертывание цикла, а то, что я называю «полностью статичным», то есть нет никаких входных данных, которые изменили бы поведение сегмента. Моя идея состоит в том, что все, что является полностью статичным, может быть преобразовано в одно значение, все, что зависит от ввода или делает условный вывод, конечно, не может быть дополнительно оптимизировано. Так,с точки зрения машины, что мне нужно учитывать? Что делает цикл «полностью статичным»?

Я придумал три типа циклов, которые мне нужно выяснить, как классифицировать. Циклы, которые всегда заканчиваются одним и тем же состоянием машины после каждого запуска, независимо от входных данных, циклы, которые НИКОГДА не завершатся, и циклы, которые я не могу понять так или иначе. В случае, если я не могу понять (, он условно изменяет, сколько раз он будет запускаться на основе динамических входных данных ), я не беспокоюсь об оптимизации. Циклы, которые бесконечны, будут ошибкой/предупреждением компиляции, если только они специально не подавлены программистом, а циклы, которые каждый раз одинаковы, должны просто переходить непосредственно к переводу машины в правильное состояние без циклов.

Основной случай, конечно, для оптимизации — это итерации статического цикла, когда все вызовы функций внутри также статичны. Определить, есть ли в цикле динамические компоненты, достаточно просто, и если он не динамический, я думаю, он должен быть статическим. Я не могу понять, как определить, будет ли он бесконечным или нет. У кого-нибудь есть мысли по этому поводу? Я знаю, что это подмножество проблемы остановки, но я чувствую, что она решаема; проблема остановки связана с тем, что для некоторых подмножеств программ вы просто не можете сказать, что они могут работать вечно, а могут и нет, но я не хочу рассматривать эти случаи, я просто хочу рассматривать случаи где он остановится или НЕ остановится, но сначала я должен различать эти три состояния.

8
задан LadyCailin 1 May 2012 в 03:43
поделиться