Алгоритм стандартный переводчика Recompiler комбинация проста: Начало перевода. Если основной блок, который вот-вот будет выполнен были казнены п раз, перекомпиляции. Таким образом, только код, который исполняется является не трогал, и только важные части перекомпиляции.
Если мы хотим, чтобы перекомпилировать полный набор функций, этот алгоритм не достаточно. Основные блоки внутри функции, что, например, дело только с обработкой ошибок, возможно, не были проанализированы, потому что они никогда не тронут.
Стандартный алгоритм 1 Пасс
Мой реализации перекомпиляции основных блока основных блока по требованию, то есть, только если это абсолютно необходимо. Это относится к
- блоки, которые были интерпретированы чаще, чем
раз, и вот-вот будут выполняться раз * блоков, которые следуют блок, который заканчивается призыв
Система предназначена для интерпретировать код по умолчанию, и перекомпилировать блока после того, как интерпретировать определенное количество раз. Такое поведение, конечно, могут быть изменены перекомпилировать блок, как только она должна быть выполнена в первый раз. Таким образом, переводчик будет использоваться только для указания, которые не могут быть перекомпилированы (например, филиалы, если пункт назначения еще не перекомпилировать).
Когда мы начинаем перекомпиляции, мы могли бы перекомпилировать несколько блоков, чем один, даже если это единственный блок, который уже достиг порога: Если базовый блок, заканчивающимися на “вызов”, первый основной блок подфункции всегда будет либо уже перекомпиляции или перекомпиляции на следующем этапе, как это будет достичь порога. Потому что подфункции, которые мы можем предположить, как перекомпилировать уже можно вернуться к абоненту с “рублей”, обратного адреса, хранящиеся в ссылку зарегистрироваться абонента должен быть действительным i386 код адреса. Таким образом, блок после звонка всегда должен быть перекомпилирован.
Как оптимизации, блоки, которые следуют блок, который заканчивается цикл (филиал вверх) следует перекомпилировать, так что программа перехода на конец первого блока могут быть воплощены в i386 инструкция – до тех пор, как одна из целей отрасли не перекомпилировать, филиал не может быть переведен, и контроль за выполнением программ должен обрабатывать отрасли.
Пасс 2 Алгоритм
Регистрация в распределении функций может быть сделано только если все функции были проанализированы. Передать один алгоритм не будет убедиться, что функции полностью проанализированы, и в целом они не являются. Другой алгоритм необходимо. Проще всего сделать DFS. Это не убедитесь, что все функции затронуты (указатели на функции), но это то, что все функции, которые коснулись полностью проанализированы.
Заключение
Оба алгоритма не требуется. Если пользователь Recompiler настроен сделать только один проход и не пройти 2, не имеет смысла анализировать и перекомпилировать весь код, лучше только перекомпилировать код, который никогда не будет выполнен. Если Recompiler настроен делать проходит 1 и 2, то имеет смысл сделать полный анализ и быстро пройти перекомпиляции в 1: С полной анализ должен делать в любом случае для прохода 2, быстрее, чтобы сделать полный анализ, чем принять решение Какие основные блоки являются наиболее важными, их перекомпиляции, и перекомпилировать остальное позже.