Найти в Дзене
Answers

Как выполняется код? Или что такое интерпретатор, компилятор и декомпилятор?

Написать код - полбеды. Нужно ещё чтобы он выполнился. А прежде чем выполниться, код должен стать понятным для компьютера. Как же все эти операторы, объекты и функции становятся последовательностью единиц и нулей? Интерпретатор Интерпретатор - программа, которая выполняет код построчно. То есть прочитала строку - выполнила, прочитала - выполнила и так до конца. Когда интерпретатор читает команду, он сразу переводит её в понятный машине код. Интерпретирование останавливается, если в программе находится команда, написанная с ошибкой. Интерпретируемые языки выгодно отличаются тем, что их можно выполнить на любой платформе, для которой существует соответствующий интерпретатор. Но выполнить код, без него невозможно. Кроме того такие программы выполняются о-о-о-очень медленно. К интерпретируемым языкам относятся: Python, Lisp, Basic, PHP, Ruby, JavaScript. Компилятор Компилятор - программа, которая превращает код на языке высокого уровня в машинный код, проще говоря переводчик с более-менее
Оглавление

Написать код - полбеды. Нужно ещё чтобы он выполнился. А прежде чем выполниться, код должен стать понятным для компьютера. Как же все эти операторы, объекты и функции становятся последовательностью единиц и нулей?

Интерпретатор

Интерпретатор - программа, которая выполняет код построчно. То есть прочитала строку - выполнила, прочитала - выполнила и так до конца. Когда интерпретатор читает команду, он сразу переводит её в понятный машине код. Интерпретирование останавливается, если в программе находится команда, написанная с ошибкой.

Интерпретируемые языки выгодно отличаются тем, что их можно выполнить на любой платформе, для которой существует соответствующий интерпретатор. Но выполнить код, без него невозможно. Кроме того такие программы выполняются о-о-о-очень медленно.

К интерпретируемым языкам относятся: Python, Lisp, Basic, PHP, Ruby, JavaScript.

Компилятор

Компилятор - программа, которая превращает код на языке высокого уровня в машинный код, проще говоря переводчик с более-менее понятного для нас языка, на язык понятный машинам. В отличие от интерпретатора, компилятор читает программу целиком, и если находятся ошибки, он говорит обо всех ошибках сразу. Но он не выполняет код, только переводит его.

Компилируемые языки в отличие от интерпретируемых, после компиляции могут быть выполнены и без компилятора. Но для каждой операционной системы существует своя версия компилятора. Это значит, что один и тот же код на Linux и Windows выполнить не получится. Кроме того, такие языки выполняются очень быстро, но вот компилируются... Не всегда быстро. А разрабатывать компилятор под каждую ОС достаточно сложно. А больше всего удручает, что при каждом изменении кода, его нужно компилировать заново.

-2

К таким языкам относятся: C/C++, Delphi, Haskell, Swift.

Байт-код

Как у компиляторов, так и у интерпретаторов есть свои недостатки. Чтобы их компенсировать, решили объединить два подхода. Основная идея заключается в том, чтобы преобразовывать код не в последовательность нулей и единиц, а в байт-код, который на него похож. Благодаря этому сохраняется скорость компилируемых языков, но не нужно компилировать код заново при каждом изменении, в точности как у интерпретируемых.

В байт-код преобразовываются языки с помощью виртуальных машин. Самый яркий пример - Java. Java-код можно запустить на всём, к чему есть Java VM.

Декомпилятор

Вот мы и добрались до самого необычного, непривычного и интересного. Декомпилятор преобразовывает машинный код программы в код какого-либо языка высокого уровня.

Как это происходит? Не обладая достаточными техническими знаниями понять это сложно, но возможно. При работе декомпилятора байты исходной программы группируются в фразы или предложения. Приведу пример таких фраз:

  • int i = 0;
  • i = a;
  • x = x - 50;

В общем, простейшие выражения. Но на данном этапе возникает проблема: отличить данные от инструкций очень сложно, ведь и те и другие просто нули и единицы. Дальше разными хитрыми способами декомпилятор старается понять где находятся инструкции, и что они делают, а где данные, и что делают с ними. В конце концов декомпилятор выводит код на нужном языке, но он может быть очень запутанным и непонятным. Может сильно отличаться от того кода, который написал программист. Но главное - работать он будет как надо.

#IT #посидеть подумать #как это работает