Компиляторлар мен виртуалды машиналардың аралық өкілдігі
Intermediate representation
Компилятордағы аралық өрнек (IR) – бастапқы кодты өңдеуге арналған құрылым. Деректерді жоғалтпай, тілге тәуелсіздікпен өңдейді. Оптимизация үшін маңызды!
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Деректер құрылымы немесе компилятор немесе виртуалды машинаның бастапқы кодты көрсету үшін ішкі түрде пайдаланатын коды.
Data structure or code used internally by a compiler or virtual machine to represent source code
Аралық өрнек (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.