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

Компилируемый и интерпретируемый языки в чем разница

Компилируемые и интерпретируемые языки

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

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

ch

Компоновку выполняет специальная программа, так и называемая «компоновщиком» (linker) или редактором связей. На ее вход подаются файлы с объектными модулями, а на выходе получается исполнимый модуль (executable module) – файл с полностью готовой к выполнению программой. Этот файл загружается в оперативную память и выполняется.

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

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

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

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

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

С другой стороны, интерпретаторы научились сохранять машинный код уже проинтерпретированных и выполненных операторов. При повторном выполнении этих операторов, например, в циклах, интерпретатор использует готовые машинные команды, что значительно ускоряет работу. Такие интерпретаторы называются JIT-интерпретаторами (Just-In-Time). Они работают значительно быстрее классических интерпретаторов и поэтому приобретают все большее распространение.

Компилируемые языки: список, плюсы и минусы

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

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

Что значит компилируемый язык программирования

Любой язык общения представляет собой текст, составленный из различных символов, которые известны и понятны собеседникам. Язык программирования тоже состоит из символов, чья последовательность подчиняется определенным правилам и называется кодом. С помощью кода происходит взаимодействие «человек–компьютер».

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

Компилируемый язык программирования

Компилируемый язык программирования

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

Преимущества и недостатки компилируемых языков

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

В качестве примеров компилируемых языков можно привести:

  • процедурный язык программирования Pascal;
  • высокоуровневый язык Go;
  • функциональный язык Erlang;
  • язык программирования Ada;
  • язык функционального программирования Haskell;
  • мультипарадигмальный Rust;
  • объектно-ориентированный C;
  • статически типизированный C++.

Получите подборку бесплатно (pdf 2,5 mb)
Гарантированно найдете выгодную работу за 1-2 дня
Гарантированно найдете выгодную работу за 1-2 дня

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

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

В 50-е годы прошлого века Джон Бэкус, будучи сотрудником корпорации IBM, вместе с командой разработчиков создал Fortran (FORmula TRANslator (переводчик формул)) – первый язык программирования высокого уровня, позволяющий писать программы понятными словами. Кроме языка был создан и компилятор, который позволял трансформировать на Fortran другие программы, включая улучшенные версии самого Fortran.

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

Какие бывают компиляторы

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

Язык программирования Java: стоит ли его изучать

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

Какие бывают компиляторы

Какие бывают компиляторы

Для программы, чье выполнение планируется на нескольких ОС, понадобится кросс-компилятор, то есть такая компилирующая программа, которая модифицирует высокоуниверсальный код. Например, набор компиляторов GCC совместим с Java компилируемым языком, а также с C++, Ada, Fortran, Go, Objective-C, плюс поддерживается разными процессорами.

Скачивайте и используйте уже сегодня:

Александр Сагун

Топ-30 самых востребованных и высокооплачиваемых профессий 2022

Поможет разобраться в актуальной ситуации на рынке труда

doc иконка

Подборка 50+ ресурсов об IT-сфере

Только лучшие телеграм-каналы, каналы Youtube, подкасты, форумы и многое другое для того, чтобы узнавать новое про IT

ТОП 50+ сервисов и приложений от Geekbrains

Безопасные и надежные программы для работы в наши дни

Компьютер можно снабдить не одним компилятором, а несколькими. В этих условиях выбор компилятора осуществляет интегрированная среда разработки, в которой пишется программа. Например, MS Visual Studio совместим с компиляторами для ОС Linux, Windows, Android. При выборе формата проекта Visual Studio самостоятельно идентифицирует ОС и процессор ПК, подбирая максимально соответствующий компилятор.

Ошибки, определяемые компилятором

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

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

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

Примеры интерпретируемых языков

Интерпретируемым языкам не требуется машинный код, чтобы исполнить программу, так как она строчка за строчкой выполняется при помощи интерпретаторов. До прихода JIT (Just-in-Time) компилятора в сферу программирования на процесс интерпретации затрачивалось колоссальное количество времени. Но в настоящее время разница между компилируемыми и интерпретированными языками программирования по этому параметру не существенна.

Павел Воля Павел Воля

Мы вместе с экспертами по построению карьеры подготовили документы, которые помогут не ошибиться с выбором и определить, какая профессия в IT подходит именно вам.

Благодаря этим гайдам 76% наших студентов смогли найти востребованную профессию своей мечты!

Скоро мы уберем их из открытого доступа, успейте скачать бесплатно:

Женщины в IT: мифы и перспективы в карьере

Как прокачать свою технику речи

100 тыс. руб за 100 дней с новой профессией

Список из 6 востребованных профессий с заработком от 100 тыс. руб

Критические ошибки, которые могут разрушить карьеру

Собрали 7 типичных ошибок, четвертую должен знать каждый!

Гайд по профессиям в IT

5 профессий с данными о навыках и средней заработной плате

pdf иконка4,7 MB

Примеры таких языков:

  • мультипарадигменный язык JavaScript;
  • высокоуровневый язык Ruby;
  • высокоуровневый язык Perl;
  • скриптовый язык PHP;
  • скриптовый язык Python.

Интерпретируемые языки позволили упростить ряд аспектов программирования:

  • платформо-независимость;
  • механизм рефлексии;
  • прием динамической типизации;
  • меньший объем исполняемых файлов;
  • динамические области видимости.

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

Отличия компилируемых и интерпретируемых языков

Разница между этими двумя языками заключается в следующем:

  • компилирует программу целиком после ее ввода, преобразуя в объектный код, который хранится в файле;
  • существуют этап генерации промежуточного объектного кода (например, С, С++);
  • скомпилированные программы работают с более высокой скоростью, так как компиляция происходит до исполнения;
  • потребность в памяти по большей части обусловлена созданием объектного кода;
  • информация об ошибках появляется после процесса компиляции всей программы;
  • вид цепочки: исходный код → компилятор → машинный код → вывод.

  • программа интерпретируется построчно, то есть принимает одну инструкцию в качестве одного ввода и выполняет ее;
  • не генерирует промежуточный объектный код (например, Perl, Python, Matlab);
  • медленная скорость работы, так как компиляция и выполнение происходят одновременно;
  • требуются меньшие объемы памяти;
  • отображение ошибок происходит для каждой отдельной инструкции;
  • вид цепочки: исходный код → интерпретатор → вывод.

Компиляция + интерпретация = байткод-языки

Языки, использующие для исполнения кода и компиляцию, и интерпретацию, называют байткод-языками. Наиболее характерными примерами такого языка будут фреймворк.NET и Java.

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

Компиляция + интерпретация = байткод-языки

Компиляция + интерпретация = байткод-языки

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

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

Простые выводы о языках программирования

Вышеуказанные языковые типы можно ассоциировать простыми словами:

  1. Компилируемые языки – это готовая пища. Не надо тратить время на приготовление, но такая еда не будет долго храниться. Программы, написанные с помощью этих языков, зависят от оборудования и операционной системы.
  2. Интерпретируемые языки – это замороженные сырые продукты. Хранить их можно долго, но требуется много времени на готовку. Написанные интерпретируемым языком программы не зависят от платформы, главное, чтобы был интерпретатор, поэтому они мобильны и безопасны. Однако процесс интерпретации нуждается в запасе времени, что не может не сказаться на производительности.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *