Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТВЕТЫ_спо.doc
Скачиваний:
8
Добавлен:
01.04.2025
Размер:
1.5 Mб
Скачать

38. Понятие компилятора, интерпретатора, отладчика, компоновщика, байт-кода

Транслятор (англ. translator – переводчик) – это программа-переводчик. Она преобразует программу, написанную на одном из языков высокого уровня, в программу, состоящую из машинных команд.

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

Интерпрета́тор языка программирования (англ. interpreter – истолкователь, устный переводчик) переводит и выполняет программу строка за строкой. Это программа для непосредственного исполнения программ (производства вычислений, предписываемых этими программами) из исходного кода на определённом языке.

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

Более сложные интерпретаторы (называемые интерпретаторами компилирующего типа) перед выполнением производят компиляцию исходного кода программы в машинный или некий «промежуточный код», и только после этого приступают к выполнению. И поэтому все синтаксические ошибки обнаруживаются до выполнения. Такие интерпретаторы быстрее выполняют большие и циклические программы, так как не занимаются анализом исходного кода (в т.ч. избыточным, например, в циклах) в реальном времени, но могут быть сложны для начинающих.

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

Компиля́тор (англ. compiler – составитель, собиратель) читает всю программу целиком, делает ее перевод и создает законченный вариант программы на машинном языке, который затем и выполняется. Это разновидность транслятора, программный модуль или отдельная программа, задачей которой является полный перевод программы, написанной на одном из языков программирования (исходный язык) в программу на другом языке программирования (целевой язык) до начала ее выполнения. Другой разновидностью трансляторов являются интерпретаторы, осуществляющие анализ и перевод текста программы в машинный код пошагово, непосредственно перед выполнением, и сразу же исполняющие получившийся машинный код.

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

Некоторые компиляторы (например, Java) переводят программу не в машинный код, а в программу на некотором специально созданном низкоуровневом языке. Например, для языка Java это язык Java Virtual Machine, JVM3 – язык виртуальной машины Java4, или так называемый байт-код Java. Для языков программирования на платформе .NET Framework (C, Managed C++, Visual Basic .NET и другие) это так называемый MSIL5 (Microsoft Intermediate Language), или «Промежуточный язык фирмы Майкрософт». Но, в отличие от Java, MSIL код всегда компилируется в код целевой машины и не подлежит интерпретации. Далее программа на этом промежуточном языке подлежит интерпретации либо ещё одной компиляции в код целевой машины непосредственно перед исполнением (для Java это делает «Just-In-Time compiler» (JIT)).

Для каждой целевой машины (IBM, Apple и т. д.) и каждой операционной системы или семейства операционных систем, работающих на целевой машине, требуется написание своего компилятора. Существуют также так называемые «кросс-компиляторы», позволяющие на одной машине и в среде одной ОС получать код, предназначенный для выполнения на другой целевой машине или в среде другой ОС. Кроме того, компиляторы для одной и той же целевой машины могут быть оптимизированы под разные процессоры. Например, компилятор, оптимизированный под процессоры фирмы Intel, создаёт машинный код, который быстрее всего выполняется на компьютерах с этими процессорами.

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

Процесс компиляции состоит из двух основных частей – собственно компиляции и компоновки (генерации исполняемого файла).

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

Компоновка (англ. linking, linkage). Все необходимые объектные файлы собираются вместе. Далее происходит процесс разрешения ссылок – все внешние по отношению к каждому отдельному модулю ссылки должны быть разрешены, то есть для каждой из них должна быть поставлена в соответствие конкретная функция из другого модуля программы, либо из внешней библиотеки. Например, если в модуле вызывается функция операционной системы, которая рисует на экране линию, то компилятор «верит на слово», что такая функция существует. В процессе сборки этой ссылке должна быть сопоставлена конкретная функция из конкретной операционной системы. Кроме того, при генерации исполняемого файла (для Windows – exe-файл) должны быть соблюдены требования операционной системы к формату исполняемых файлов. Поэтому процесс сборки зависит от операционной системы, а зачастую – и от версии операционной системы.

GNU Compiler Collection (обычно используется сокращение GCC) – набор компиляторов для различных языков программирования, разработанный в рамках проекта GNU. GCC является свободным программным обеспечением, распространяется фондом свободного программного обеспечения (FSF – Free Software Foundation). Он используется как стандартный компилятор для свободных Unix-подобных операционных систем.

Изначально названный GNU C Compiler, он поддерживал только язык C. Позднее, GCC был расширен для компиляции исходных кодов на таких языках программирования как Java, Fortran и Ada.

Начало GCC было положено Ричардом Столмэном, который реализовал первый вариант GCC в 1985 на нестандартном и непереносимом диалекте языка Паскаль; позднее компилятор был переписан на языке Си Леонардом Тауэром и Р. Столмэном, и выпущен в 1987 как компилятор для проекта GNU, который сам по себе являлся свободным программным обеспечением. Разработка GCC курируется Free Software Foundation.

В настоящее время GCC поддерживается группой программистов со всего мира. GCC является лидером по количеству процессоров и операционных систем, которые он поддерживает.

Будучи официальным компилятором системы GNU, включая варианты системы, построенные на ядре Linux (GNU/Linux), GCC также является главным компилятором для сборки ряда других операционных систем.

GCC часто выбирается для разработки программного обеспечения, которое должно работать на большом числе различных аппаратных платформ. Различия между «родными» для каждой из аппаратных платформ компиляторами приводят к трудностям при разработке кода, который бы корректно компилировался разными компиляторами, а, кроме того, при использовании различных компиляторов сильно усложняются сборочные скрипты, которые должны собирать ПО для всех аппаратных платформ. При использовании GCC для компиляции кода для разных платформ, будет использован один и тот же синтаксический анализатор, таки образом, если удалось собрать программу для одной из целевых платформ, то велика вероятность, что программа нормально соберётся и для других платформ.

Байт-код (англ. byte-code), иногда также используется термин псевдоко́д – машинно-независимый код низкого уровня, генерируемый компилятором и исполняемый виртуальной машиной. Большинство инструкций байт-кода эквивалентны одной или нескольким командам ассемблера. Компиляция в байт-код занимает промежуточное положение между компиляцией в машинный код и интерпретацией.

Байт-код называется так, потому что длина каждого кода операции – один байт, но длина кода команды различна. Каждая инструкция представляет собой однобайтовый код операции от 0 до 255, за которым следуют такие параметры, как регистры или адреса памяти. Это в типичном случае, но спецификация байт-кода значительно различается в языке.

Программа на байт-коде обычно выполняется интерпретатором байт-кода (обычно он называется виртуальной машиной, поскольку подобен компьютеру). Преимущество – в портируемости, т.е. один и тот же бинарный код может исполняться на разных платформах и архитектурах. То же самое преимущество дают интерпретируемые языки. Однако, поскольку байт-код обычно менее абстрактный, более компактный и более «компьютерный» чем исходный код, эффективность байт-кода обычно выше, чем чистая интерпретация исходного кода, предназначенного для правки человеком. По этой причине, многие современные интерпретируемые языки на самом деле компилируют в байт-код и запускают интерпретатор байт-кода. К таким языкам относятся Perl, PHP и Python. Программы на Java обычно передаются на целевую машину в виде байт-кода, который перед исполнением транслируется в машинный код «на лету» – с помощью JIT-компиляции.

В то же время возможно создание процессоров, для которых данный байт-код является непосредственно машинным кодом (такие процессоры существуют, например, для Java, Forth).

Также некоторый интерес представляет p-код (p-code), который похож на байт-код, но физически может быть менее лаконичным и сильно варьироваться по длине инструкции. Он работает на очень высоком уровне, например «напечатать строку» или «очистить экран». P-код используется в некоторых реализациях BASIC и Паскаля.

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

Отладка – этап разработки компьютерной программы, на котором обнаруживают, локализуют и устраняют ошибки. Есть различные подходы и средства отладки; в качестве основного средства используются отладчики, которые включают в себя пользовательский интерфейс для пошагового выполнения программы: оператор за оператором, функция за функцией, с остановками на некоторых строках исходного кода или при достижении определённого условия.

Они также дают возможность отображения значений переменных. Отслеживать правильный ход программы можно расстановкой в критических её частях отладочных операторов вывода «внутренней» информации о программе. Вывод отладочных сведений в файл называется журналированием6.

GDB – переносимый отладчик проекта GNU, который работает на многих UNIX-подобных системах и умеет производить отладку многих языков программирования, включая Си, C++ и Фортран.

Первоначально написанный Ричардом Столлмэном в 1988 году. GDB предлагает обширные средства для слежения и контроля выполнения компьютерных программ. Пользователь может изменять внутренние переменные программ, и даже вызывать функции независимо от обычного поведения программы.

Отладчик не содержит собственного графического пользовательского интерфейса, и использует стандартный текстовый интерфейс консоли.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]