Я пишу скомпилированный язык для удовольствия, и я недавно получил возможность сделать мой оптимизационный компилятор очень надежным. Я вычислил несколько способов оптимизации некоторых вещей, например, 2 + 2 всегда 4, поэтому мы можем выполнить эту математику во время компиляции, если (false) {...} можно полностью удалить и т. Д., Но теперь Я получил петли. После некоторых исследований я считаю, что то, что я пытаюсь сделать, - это не совсем разворачивание цикла, но это все еще метод оптимизации. Позволь мне объяснить.Оптимизация «статических» циклов
Выполните следующий код.
String s = "";
for(int i = 0; i < 5; i++){
s += "x";
}
output(s);
Как человек, я могу сидеть здесь и сказать, что это 100% времени будет эквивалентно
output("xxxxx");
Итак, другими словами, этот цикл может быть «составлен «полностью». Это не разворот цикла, но то, что я называю «полностью статическим», то есть нет входов, которые могли бы изменить поведение сегмента. Моя идея состоит в том, что все, что полностью статично, может быть разрешено к одному значению, все, что полагается на ввод или делает условный вывод, конечно, не может быть оптимизировано дальше. Итак, с точки зрения машины, что мне нужно учитывать? Что делает цикл «полностью статическим»?
Я придумал три типа петель, которые мне нужно выяснить, как классифицировать. Петли, которые всегда будут иметь одно и то же состояние машины после каждого прогона, независимо от входов, циклов, которые НИКОГДА не завершатся, и циклов, которые я не могу понять так или иначе. В случае, если я не могу понять это (он условно меняет, сколько раз он будет работать на основе динамических ресурсов), я не беспокоюсь об оптимизации. Циклы, которые являются бесконечными, будут компилировать ошибку/предупреждение, если только это не будет подавлено программистом, и петли, которые являются одинаковыми, каждый раз должны просто пропустить непосредственно, чтобы поставить машину в правильное состояние, без цикла.
Главный случай, конечно, для оптимизации - это итерации статического цикла, когда все вызовы внутри внутри также являются статическими. Определение того, является ли цикл динамическими компонентами достаточно простым, и если он не является динамическим, я предполагаю, что он должен быть статичным. Я не могу понять, как определить, будет ли оно бесконечным или нет. У кого-нибудь есть мысли по этому поводу? Я знаю, что это подмножество проблемы с остановкой, но я считаю, что она разрешима; проблема с остановкой является проблемой из-за того, что для некоторых подмножеств программ вы просто не можете сказать, что она может работать вечно, это может быть не так, но я не хочу рассматривать эти случаи, я просто хочу рассмотреть случаи где он остановится, или он НЕ остановится, но сначала я должен провести различие между тремя состояниями.
Чтобы получить представление о том, что фактически поддерживается в этой строке в настоящее время, вы можете прочитать об ограничениях на 'constexpr' в новом стандарте C++. –
Если вы можете статически определить, что условие цикла всегда истинно, и нет другого способа выйти из цикла, тогда вы знаете, что цикл не завершится. –
В вашем примере вы не обязательно знаете, что String s также не модифицируется другим файлом, ссылающимся на него через extern и изменяющим его в параллельном потоке. – TJD