Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Структура данных или код, используемый компилятором или виртуальной машиной для представления исходного кода.
Data structure or code used internally by a compiler or virtual machine to represent source code
Промежуточное представление (IR) – это структура данных или код, используемый компилятором или виртуальной машиной для представления исходного кода. IR разрабатывается таким образом, чтобы быть удобным для дальнейшей обработки, такой как оптимизация и трансляция. "Хорошее" IR должно быть точным – способным представлять исходный код без потери информации – и независимым от какого-либо конкретного исходного или целевого языка. В последнем случае оно также называется промежуточным языком. Канонический пример можно найти в большинстве современных компиляторов. Например, интерпретатор CPython преобразует линейный, читаемый человеком текст, представляющий программу, в промежуточную графовую структуру, которая позволяет проводить анализ потока управления и переупорядочивание перед выполнением. Использование промежуточного представления, подобного этому, позволяет компиляторным системам, таким как GNU Compiler Collection и LLVM, использоваться для множества исходных языков для генерации кода для множества различных целевых архитектур.
An intermediate representation (IR) is the data structure or code used internally by a compiler or virtual machine to represent source code. An IR is designed to be conducive to further processing, such as optimization and translation. A "good" IR must be accurate – capable of representing the source code without loss of information – and independent of any particular source or target language. In the latter case it is also called an intermediate language. A canonical example is found in most modern compilers. For example, the CPython interpreter transforms the linear human readable text representing a program into an intermediate graph structure that allows flow analysis and re arrangement before execution. Use of an intermediate representation such as this allows compiler systems like the GNU Compiler Collection and LLVM to be used by many different source languages to generate code for many different target architectures.
Промежуточный язык
Промежуточный язык — это язык абстрактной машины, предназначенный для облегчения анализа компьютерных программ. Этот термин возник из-за их использования в компиляторах, где исходный код программы преобразуется в форму, более подходящую для оптимизирующих преобразований, прежде чем генерировать объектный или машинный код для целевой платформы. Конструкция промежуточного языка обычно отличается от конструкции практического машинного языка тремя фундаментальными аспектами:
An intermediate language is the language of an abstract machine designed to aid in the analysis of computer programs. The term comes from their use in compilers, where the source code of a program is translated into a form more suitable for code improving transformations before being used to generate object or machine code for a target machine. The design of an intermediate language typically differs from that of a practical machine language in three fundamental ways:
Каждая инструкция представляет ровно одну базовую операцию; например, режимы адресации типа "shift add", распространенные в микропроцессорах, отсутствуют. Информация о потоке управления может не включаться в набор инструкций. Количество доступных регистров процессора может быть большим, даже неограниченным. Популярным форматом для промежуточных языков является трехадресный код. Этот термин также используется для обозначения языков, применяемых в качестве промежуточных некоторыми языками программирования высокого уровня, которые сами не генерируют объектный или машинный код, а выводят только промежуточный язык. Этот промежуточный язык затем передается компилятору для данного языка, который и генерирует конечный объектный или машинный код. Обычно это делается для упрощения процесса оптимизации или повышения переносимости за счет использования промежуточного языка, для которого существуют компиляторы для множества процессоров и операционных систем, например, C. Языки, используемые в этом качестве, по сложности занимают промежуточное положение между языками высокого и низкого уровня, такими как языки ассемблера.
Each instruction represents exactly one fundamental operation; e. g. "shift add" addressing modes common in microprocessors are not present. Control flow information may not be included in the instruction set. The number of processor registers available may be large, even limitless. A popular format for intermediate languages is three address code. The term is also used to refer to languages used as intermediates by some high level programming languages which do not output object or machine code themselves, but output the intermediate language only. This intermediate language is submitted to a compiler for such language, which then outputs finished object or machine code. This is usually done to ease the process of optimization or to increase portability by using an intermediate language that has compilers for many processors and operating systems, such as C. Languages used for this fall in complexity between high level languages and low level languages, such as assembly languages.
Другое
Инструменты статического анализа часто используют промежуточное представление. Например, Radare2 — это набор инструментов для анализа двоичных файлов и реверс-инжиниринга. Он использует промежуточные языки ESIL и REIL для анализа двоичных файлов.
Static analysis tools often use an intermediate representation. For instance, Radare2 is a toolbox for binary files analysis and reverse engineering. It uses the intermediate languages ESIL and REIL to analyze binary files.