1.3 Компилятор и интерпретатор — Основы программирования

Как Компилятор так и Интерпретатор имеют одно предназначение — конвертировать инструкции языка высокого уровня (как C или Java) в бинарную форму, понятную компьютеру. Это программное обеспечение, используемое для запуска высокоуровневых программ и кодов выполняемых различные задачи. Для разных высокоуровневых языков разработаны специфичные компиляторы/интерпретаторы. Не смотря на то что как компилятор так и интерпретатор преследуют одну и ту же цель, они отличаются способом выполнения своей задачи, то есть конвертирования высокоуровневого языка в машинные инструкции. В этой статье мы поговорим о базовой работе обоих и выделим главные отличия между компилятором и интерпретатором.

Компилятор

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

На картинке показано базовое очертание процесса компиляции. Тут программа написанная на языке высокого уровня показана как «Исходный код», а сконвертированный называется «Исполняемый код».

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

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

Очертание процесса интерпретации на картинке выше показывает, что сначала исходный код конвертируется в промежуточную форму, а затем выполняется интерпретатором.

Ниже перечислены главные отличия между компилятором и интерпретатором:

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

Компилятор VS интерпретатор: ключевые отличия

Интерпретаторы и компиляторы отвечают за преобразование языка программирования или сценариев (язык высокого уровня) в машинный код. Но если обе программы делают одно и то же, чем они различаются? Давайте разберемся.

Компилятор

Что такое компилятор?

Компилятор  —  это компьютерная программа, которая переводит компьютерный код с одного языка программирования на другой. Компилятор берет программу целиком и преобразует ее в исполняемый компьютерный код. Для этого требуется целая программа, так как компьютер понимает только то, что написано двоичным кодом. Задача компилятора  —  преобразовать исполняемую программу в машинный код, который и распознается компьютером. Примерами скомпилированных языков программирования являются C и C++.

Компилятор в основном используется для программ, которые переводят исходный код с языка программирования высокого уровня на язык программирования более низкого уровня.

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

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

Что такое интерпретатор?

Интерпретатор  —  это компьютерная программа, которая преобразует каждый программный оператор высокого уровня в машинный код. Сюда входят исходный код, предварительно скомпилированный код и сценарии.

Интерпретатор представляет собой машинную программу, которая непосредственно выполняет набор инструкций без их компиляции. Примерами интерпретируемых языков являются Perl, Python и Matlab.

  • И компилятор, и интерпретатор выполняют одну и ту же работу  —  преобразовывают язык программирования высокого уровня в машинный код. Однако компилятор преобразовывает исходный материал в машинный код перед запуском программы. Интерпретатор выполняет эту функцию при ее запуске.

Как это работает?

Сначала компилятор создает программу. Он анализирует все операторы языка, чтобы проверить, правильны они или нет. Если компилятор найдет какую-нибудь ошибку, он выдаст соответствующее сообщение. Если же он не обнаружит никаких ошибок, то преобразует исходный код в машинный. Компилятор связывает различные кодовые файлы в программы, которые можно запустить (например, формата .exe). После этого запускается программа.

Интерпретатор создает программу. Он не связывает файлы и не генерирует машинный код. Происходит построчное выполнение исходных операторов во время исполнения программы.

Преимущества и недостатки

Преимущества компилятора
  • Программный код уже переведен в машинный, и, следовательно, требуется меньше времени на его исполнение.
  • Файлы .exe выполняются быстрее, чем исходный код. Объектные программы сохраняются и могут быть запущены в любое время.
  • Объектные программы пользователю сложнее изменить, чем исходный код.
  • Компилятор проверяет исходный код на наличие синтаксических ошибок во время компиляции.

Недостатки компилятора
  • Поскольку переводится вся программа, она использует гораздо больше памяти компьютера.
  • При работе с компилятором невозможно изменить программу, не вернувшись к исходному коду.
  • Необходимо создавать объектную программу перед окончательным исполняемым файлом. Это может занять много времени.
  • Исходный код должен быть на 100% верным для создания исполняемого файла.

Преимущества интерпретатора
  • Интерпретатор значительно облегчает работу с исходным кодом.
  • Он переводит по одной инструкции за раз, поэтому использует минимальный объем памяти.
  • Интерпретатор может связать сообщения об ошибках с выполняемой инструкцией, что может оказаться полезным в процессе отладки.

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

Различия

Рассмотрим основные различия между компилятором и интерпретатором

Читайте также:

  • Сложные ИИ-модели созданы с помощью некачественных данных
  • ЕС ужесточает регулирование в сфере использования искусственного интеллекта
  • Парадокс надежности ИИ

Читайте нас в Telegram, VK и Яндекс. Дзен


Перевод статьи Platforuma India: Compiler Vs Interpreter

Читайте также

Как выполняется программа на C?

Всякий раз, когда файл программы C компилируется и выполняется, компилятор создает несколько файлов с тем же именем, что и у файла программы C, но с другими расширениями. Итак, что это за файлы и как они создаются?

На изображении ниже показан процесс компиляции с файлами, создаваемыми на каждом этапе процесса компиляции:

Каждый файл, содержащий программу C, должен быть сохранен с расширением «.c». Это необходимо для того, чтобы компилятор понял, что это файл программы C. Предположим, файл программы имеет имя first.c. Файл first.c называется исходным файлом, в котором хранится код программы. Теперь, когда мы компилируем файл, компилятор C ищет ошибки. Если компилятор C не сообщает об ошибке, он сохраняет файл как файл .obj с тем же именем, который называется объектным файлом. Итак, здесь он создаст первый . obj. Этот файл .obj не является исполняемым. Процесс продолжается компоновщиком, который, наконец, дает исполняемый файл .exe.

Компоновщик : Прежде всего, дайте нам знать, что библиотечные функции не являются частью какой-либо программы C, но являются частью программного обеспечения C. Таким образом, компилятор не знает работу ни одной функции, будь то printf или scanf. Определения этих функций хранятся в соответствующих библиотеках, которые компилятор должен иметь возможность связать. Это то, что делает Линкер. Итак, когда мы пишем #include, он включает библиотеку stdio.h, которая дает доступ к стандартному вводу и выводу. Компоновщик связывает объектные файлы с библиотечными функциями, и программа становится файлом .exe. Здесь будет создан файл first.exe в исполняемом формате.

Загрузчик : Всякий раз, когда мы даем команду на выполнение определенной программы, загрузчик вступает в работу. Загрузчик загрузит файл .exe в оперативную память и сообщит центральному процессору начальную точку адреса, где эта программа загружена.

Регистры ЦП

Регистр инструкций : Содержит текущие инструкции, которые должен выполнять ЦП.
Счетчик программ : Содержит адрес следующих инструкций, которые должен выполнить ЦП.
Аккумулятор : Хранит информацию, связанную с вычислениями.

Загрузчик информирует счетчик программ о первой инструкции и инициирует выполнение. Затем эту задачу выполняет счетчик программ.

Разница между компоновщиком и загрузчиком

Линкер Загрузчик
Компоновщик создает исполняемый модуль исходной программы. Загрузчик загружает исполняемый модуль в оперативную память для выполнения.
Компоновщик принимает в качестве входных данных объектный код, сгенерированный ассемблером. Загрузчик принимает на вход исполняемый модуль, сгенерированный компоновщиком.
Компоновщик объединяет все объектные модули исходного кода для создания исполняемого модуля. Загрузчик выделяет адреса исполняемому модулю в основной памяти для выполнения.
Типы компоновщика: Редактор компоновки, Динамический компоновщик. Типы загрузчика: абсолютная загрузка, перемещаемая загрузка и динамическая загрузка во время выполнения.

Что такое компилятор? (Определение, как это работает)

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

Что такое компилятор и интерпретатор?

Интерпретаторы выполняют исходный код построчно, не компилируя его в машиночитаемый код. В результате интерпретируемый код работает медленнее, чем скомпилированный код, и не создает файл машинного кода. С другой стороны, интерпретируемые программы облегчают поиск ошибок в вашем коде.

 

Почему мы используем компиляторы?

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

Компиляторы играют решающую роль в процессе разработки, поскольку они помогают обнаруживать синтаксические и семантические ошибки до того, как мы запустим код, что экономит время и предотвращает сбои. Компиляторы также оптимизируют код для эффективного выполнения и создают более быстрые и компактные программы.

Еще из Технического словаря Built InЧто такое исходный код?

 

Как работает компилятор?

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

 

1. Лексический анализ

Сначала компилятор выполняет лексический анализ, в ходе которого исходный код разбивается на последовательность лексем, представляющих отдельные элементы программы, такие как ключевые слова, операторы и идентификаторы.

 

2. Синтаксический и семантический анализ

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

 

3. Оптимизация

После успешного анализа и проверки исходного кода на наличие ошибок компилятор выполняет низкоуровневую оптимизацию кода для повышения его производительности. Это может включать сокращение объема памяти, используемой программой, или оптимизацию кода для повышения скорости путем перестановки инструкций или исключения ненужных операций.

 

4. Генерация выходного кода

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

Что такое компилятор? | Видео: Neso Academy

 

Недостатки компилятора

Здесь следует помнить, что компиляция делает код зависимым от платформы. Это означает, что скомпилированный код создает машиночитаемый и специфичный для машины исполняемый файл, который может выполняться только на определенном типе машины. Это означает, что код, скомпилированный на компьютере с Windows, не будет работать в системе Mac или Linux без перекомпиляции.

 

Альтернатива компилятору: интерпретатор

Еще один основной инструмент для запуска исходного кода называется интерпретатором. Интерпретатор выполняет исходный код напрямую построчно, не компилируя его в машинный код.

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

С другой стороны, интерпретируемая программа показывает потенциальные ошибки кодирования построчно и по одной в процессе интерпретации. Это упрощает поиск ошибок в коде. Это отличается от компилятора, который показывает все ошибки сразу после компиляции, поэтому отладка — гораздо более сложный процесс.

В терминологии программирования говорят, что язык программирования либо интерпретируется, либо компилируется. Это не обязательно верно. Язык кодирования может иметь как интерпретируемые, так и скомпилированные реализации. Например, мы обычно считаем Python интерпретируемым языком, но есть и скомпилированная реализация Cython.

Подробнее о Python от Artturi JalliЧто такое символ @ в Python и как его использовать?

 

Должен ли я использовать компилятор или интерпретатор?

Основным следствием использования интерпретируемого языка, такого как Python, является то, что код выполняется построчно, что позволяет ускорить разработку и упростить отладку.