Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
В оптимизации компилятора, анализ эскаппа - это метод определения динамического диапазона указателей, где в программе может быть доступ к указателю. Это связано с анализом указателей и анализом формы. Когда переменная (или объект) выделяется в подпрограмме, указатель на переменную может выйти в другие потоки выполнения или вызывать подпрограммы. Если реализация использует оптимизацию хвостового вызова (обычно требуется для функциональных языков), объекты также могут рассматриваться как бегство в называемые подпрограммы. Если язык поддерживает первоклассные продолжения (как Scheme и Standard ML of New Jersey), части стека вызовов также могут ускользнуть. Если подпрограмма выделяет объект и возвращает ему указатель, к объекту можно получить доступ из неопределенных мест в программе, откуда указатель "убежал". Показатели также могут выйти из строя, если они хранятся в глобальных переменных или других структурах данных, которые, в свою очередь, выходят из текущей процедуры. Анализ утечки определяет все места, где может храниться указатель, и может ли быть доказано, что срок службы указателя ограничен только текущей процедурой и/или нитью.
In compiler optimization, escape analysis is a method for determining the dynamic scope of pointers where in the program a pointer can be accessed. It is related to pointer analysis and shape analysis. When a variable (or an object) is allocated in a subroutine, a pointer to the variable can escape to other threads of execution, or to calling subroutines. If an implementation uses tail call optimization (usually required for functional languages), objects may also be seen as escaping to called subroutines. If a language supports first class continuations (as do Scheme and Standard ML of New Jersey), portions of the call stack may also escape. If a subroutine allocates an object and returns a pointer to it, the object can be accessed from undetermined places in the program the pointer has "escaped". Pointers can also escape if they are stored in global variables or other data structures that, in turn, escape the current procedure. Escape analysis determines all the places where a pointer can be stored and whether the lifetime of the pointer can be proven to be restricted only to the current procedure and/or thread.
Практические соображения
В объектно-ориентированных языках программирования динамические компиляторы являются особенно хорошими кандидатами для выполнения анализа убегания. В традиционной статической компиляции перезапуск метода может сделать анализ убегания невозможным, поскольку любой вызванный метод может быть перезаписан версией, которая позволяет указателю убежать. Динамические компиляторы могут выполнять анализ утечки с использованием имеющейся информации о перегрузке и повторно выполнять анализ, когда соответствующие методы заменяются динамической загрузкой кода.
In object oriented programming languages, dynamic compilers are particularly good candidates for performing escape analysis. In traditional static compilation, method overriding can make escape analysis impossible, as any called method might be overridden by a version that allows a pointer to escape. Dynamic compilers can perform escape analysis using the available information on overloading, and re do the analysis when relevant methods are overridden by dynamic code loading.