Основные принципы программирования: компилируемые и интерпретируемые языки

Рассказывает Аарон Краус 


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

Будучи разработчиками, мы часто сталкиваемся с такими понятиями, как компилятор и интерпретатор, но я считаю, что многие не совсем понимают, что они означают. Между тем, компиляция и интерпретация — это основы работы всех языков программирования. Давайте взглянем на то, как на самом деле устроены эти понятия.

Вступление

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

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

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

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

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

Низкоуровневые языки как правило являются компилируемыми, поскольку эффективность обычно ставится выше кроссплатформенности. Кроме того, компилируемые языки дают разработчику гораздо больше возможностей в плане контроля аппаратного обеспечения, например, управления памятью и использованием процессора. Примерами компилируемых языков являются C, C++, Erlang, Haskell и более современные языки, такие как Rust и Go.

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

Интерпретируемые языки

В отличие от компилируемых языков, интерпретируемым для исполнения программы не нужен машинный код; вместо этого программу построчно исполнят интерпретаторы. Раньше процесс интерпретации занимал очень много времени, но с приходом таких технологий, как JIT-компиляция, разрыв между компилируемыми и интерпретируемыми языками сокращается. Примерами интерпретируемых языков являются PHP, Perl, Ruby и Python. Вот некоторые из концептов, которые стали проще благодаря интерпретируемым языкам:

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

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

Бонус: байткод-языки

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

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

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

Заключение

Многие языки в наши дни имеют как компилируемые, так и интерпретируемые реализации, сводя разницу между ними на нет. У каждого вида исполнения кода есть преимущества и недостатки.

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

Байткод-языки, в свою очередь, пытаются использовать сильные стороны обоих видов языков, и у них это неплохо получается.

Перевод статьи «Programming Concepts: Compiled and Interpreted Languages»

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

Автор Сергей Тимофеев На чтение 10 мин Просмотров 5к. Обновлено

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

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

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

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

Первый транслятор ПП-1 (Программирующая Программа) была разработана и использована в 1954 году. Уже в следующем году была создана ПП-2 с собственным загрузчиком, отладчиком, библиотекой стандартных процедур.

В 1957 году был запущен компилятор для Fortran и после этого высокоуровневые языки стали активно использоваться программистами. Разработчиками последнего является группа специалистов из IBM во главе с Джоном Бэкусом.

Джон Бэкус – руководитель группы разработчиков IBM создателей компилятора для FORTRAN

В настоящее время в среде специалистов принята следующая классификация высокоуровневых языков по способу выполнения:

  • Компилируемые. К этой категории относятся языки C, C++, Object Pascal и другие, использующие для преобразования в машинные инструкции программы-компиляторы. На первом этапе исходный код переводится в объектные модули, на втором происходит их сборка в единый исполняемый файл при помощи линковщика.
  • Интерпретируемые. Данную категорию составляют языки типа Forth, Basic и им подобные. Исходный код считывается программой-интерпретатором и выполняется последовательно шаг за шагом.

Помимо перечисленных категорий высокоуровневых языков существуют и иные: компилируемые на базе псевдокода и совмещенные.

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

Содержание

  1. Компилируемые языки
  2. Интерпретируемые языки
  3. Чем отличаются компилируемые и интерпретируемые языки программирования
  4. Преимущества и недостатки
  5. Области применения
  6. Так какой же язык использовать?

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

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

Служебная программа-компилятор, образно говоря, обеспечивает перевод высокоуровневого языка на низкоуровневый и работает следующим образом:

  1. Исходный текст прикладной программы трансформируется в машинный код, который состоит из понятных процессору инструкций.
  2. Получившийся набор команд и данных записывается в специальный файл, который идентифицируется операционной системой как исполняемый.
  3. Программа, записанная в этом файле в двоичном коде, считывается и выполняется центральным процессором.
Алгоритм работы программы-компиляции исходного кода в машинный

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

Перечень наиболее известных компилируемых языков программирования высокого уровня включает:

  • Ada, Algol (его обновленные версии Algol 60 и 68, а также SMALL).
  • BASIC и PureBasic.
  • C и его вариации C++, Objective-C.
  • COBOL, Delphi и Fortran.
  • Pascal и Turbo Pascal.
  • Visual Basic в шести версиях.
  • ML и Standard ML.

Перечень языков, исходный код которых нужно компилировать в машинный, этим не ограничивается. Список можно дополнить менее популярными: Sather, Common Lisp, Swift, CLEO, LabVIEW, Ocaml, Haskell, Eiffel, Ubercode, Go, JOVIAL, Lush, Alice, Rust, Visual Foxpro и Visual Prolog.

Компиляция программы в байт-код

Помимо названных существуют три группы высокоуровневых языки программирования, которые компилируются в байт-код:

  1. Java (Scala, Kotlin, Groovy, Clojure, Jython).
  2. Технология .NET (C#, Visual Basic, F#, Cobra).
  3. Erlang.

Помимо традиционных программ-компиляторов используется еще один их тип – транспайлеры (transpiler). Они предназначены для перевода исходного кода, написанного на Emscripten , kPHP, Closure Compiler, coffeescript, Dart, Haxe, TypeScript или Coccinelle, на другие высокоуровневые языки программирования типа ActionScript , C++, Lua либо Python.

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

Алгоритм работы программы-транспилятора

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

Интерпретируемые языки

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

Интерпретируемые языки программирования

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

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

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

Современные программы-интерпретаторы используют другие более совершенные алгоритмы работы:

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

Описанная схема применяется при работе наиболее распространенных языков программирования: Java, Python и Ruby. В последнем варианте исходный текст преобразуется в форму абстрактной синтаксической древовидной структуры. Такой подход позволяет оптимизировать процесс генерации кода на этапе промежуточного (внутреннего) представления между деревом разбора и формированием структуры данных.

Среди интерпретируемых высокоуровневых языков наибольшее распространение получили следующие:

  • APL (J), BASIC, Forth, Lisp, Python, Excel, Logo Perl, Visual Basic for Applications и PHP.
  • Скриптовые: JavaScript, Madness Script, VBScript, PostScript и F-Script.
  • Системы решения математических уравнений: Mathematica, GNU Octave, TK Solver, Interactive Data Language (IDL) и MATLAB.
  • Группа объектно-ориентированных языков: Smalltalk в версиях Dolphin и Little, а также VisualAge и VisualWorks.

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

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

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

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

Сложность рассматриваемого способа классификации заключается в том, что некоторые языки высокого уровня могут использовать и те, и другие алгоритмы. Для примера возьмем JavaScript – компилируемый или интерпретируемый это язык определить будет не так и сложно. Он относится к классу объектно-ориентированных с поддержкой мультипарадигменных сценариев. Для обеспечения работы программ, написанной на JavaScript, требуется интерпретация. Этим он отличается от похожего по названию языка Java, который относится к статическому типу и реализует иной подход, основанный на классах. Для его загрузки необходима предварительная компиляция байт-кода.

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

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

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

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

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

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

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

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

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

Области применения

По подсчетам специалистов существует порядка 10 тысяч языков программирования высокого уровня. Часть из них устарели и практически не используются. Актуальных направлений в сфере разработки ПО на деле не так много. Рассматриваемые в обзоре высокоуровневые языки находят применение в следующих областях:

  • Компилируемые. Создание игр и программ для операционных систем Windows и Linux и разработка мобильных приложений.
  • Интерпретируемые. Веб-программирование, создание кроссплатформенных прикладных программ и математические вычисления.
Сферы применения языков программирования: классификация

Существуют и универсальные языки программирования такие как C, C++, C#, Java или Python, которые могут использоваться в любой из перечисленных сфер. Выбор языка для написания тех или иных программ в значительной мере определяется средой разработки.

Так какой же язык использовать?

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

  1. Для создания сложных одноразовых программ для математических вычислений и выполнения логических операций наилучшим образом подойдут интерпретируемые языки: Mathematica , MATLAB, JavaScript или PHP.
  2. Если требуется небольшая компактная программа с высокой скоростью обработки, лучше использовать компилируемые языки: Object Pascal, C или C++.
Выбор компилируемого или интерпретируемого языка программирования

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

компилируемых и интерпретируемых языков программирования — C, C++, Rust, Go, Haskell, C#, Java, Python, Ruby, Javascript — Finematics

Видео по информатике

Введение

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

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

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

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

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

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

Хорошим примером компилируемого языка является C++.

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

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

Основными недостатками являются плохая переносимость, так как программы приходится компилировать под конкретную архитектуру ЦП и длительное время, которое требуется для фактической компиляции.

Другими примерами популярных компилируемых языков являются C, Go, Haskell или Rust.

Языки перевода

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

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

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

Несмотря на то, что довольно сложно найти какой-либо популярный язык в категории полностью интерпретируемых языков, мы можем легко найти их множество в категории интерпретируемых байт-кодом. Примерами являются Java, C#, Python или Ruby.

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

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

Золотая середина? Компиляция JIT

Пока что похоже, что оба языка, компилируемые и интерпретируемые, имеют свои плюсы и минусы.

Что, если я скажу вам, что вы все еще можете достичь скорости полностью скомпилированного языка, не жертвуя переносимостью и более быстрым временем компиляции? Звучит невозможно? Вот тут-то и вступает в игру JIT-компиляция.

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

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

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

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

Некоторые из языков, использующих JIT-компиляцию, — это Java, C#, Pypy (альтернативная реализация Python) и V8 (движок Javascript).

Резюме

Давайте последовательно сравним несколько основных характеристик компилируемых, интерпретируемых и JIT-компилируемых языков.

Скомтилирован Интерпретируется JIT-COPPILED
Скорость исполнения FAST SLOSE Обычно FAST (DEPENDING INTERATION). хорошо
время компиляции медленно быстро (байт-код) быстро (байт-код)

полностью интерпретируемых языков осталось.

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

Extra

Прежде чем мы закончим, еще один интересный факт.

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

Это неполный список альтернативных реализаций Python 9.0003

  • IronPython (Python, работающий на .NET)
  • Jython (Python, работающий на виртуальной машине Java)
  • PyPy (Python с JIT-компилятором)

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

В чем разница между скомпилированной и интерпретируемой программой?

В чем разница между скомпилированной и интерпретируемой программой?

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

Большинство программ написано на языке высокого уровня, таком как C, Perl или Java. Так же, как человек язык позволяет людям общаться друг с другом, поэтому компьютерные языки упрощают работу по указанию компьютеру, что делать. Однако, поскольку компьютер понимает только числа, разговор с одним это как говорить с кем-то, с кем вы не говорите на одном языке. Ты нужен переводчик для правильного общения, и вот что интерпретаторы и компиляторы делают.

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

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

Потому что разные компьютеры не говорят на машинах друг друга языки, скомпилированная программа будет работать только на той платформе, на которой она была предназначен для. Например, программа, написанная для HP-UX обычно не будет работать на компьютере Mac OS или компьютере работает Солярис. Несмотря на этот недостаток, скомпилированные программы быстрее, чем те, которые нужно запускать через интерпретатор. Также, часто можно перекомпилировать программу, чтобы она работала на разные платформы. Примеры языков, которые обычно используются для создавать скомпилированные программы, включая C, Fortran и КОБОЛ.

С другой стороны, в интерпретируемой программе исходный код обычно это программа. Программы этого типа (часто называемые сценарии) требуется интерпретатор, который анализирует команды в программы, а затем выполняет их. Некоторые интерпретаторы, такие как Оболочки Unix ( sh , csh , ksh и т. д.), читать и тут же выполнять каждый команда, в то время как другие, такие как Perl, анализируют весь сценарий, прежде чем отправка соответствующих инструкций машинного языка. Преимущество скрипта в том, что он очень портативен. Любой компьютер с установленный соответствующий интерпретатор может более или менее запускать программу без изменений. Это тоже недостаток, потому что программа вообще не запускаться, если интерпретатор недоступен. В общем, интерпретируемые программы медленнее, чем скомпилированные программы, но легче отлаживать и пересматривать. Другие примеры интерпретируемых языков включают JavaScript и Python.

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