Чем отличаются компилируемые и интерпретируемые языки программирования?
Что такое компилируемый язык программирования?
Приведенная выше команда превращает код из формата, удобного для восприятия человеком, в машинный код, который может выполнить компьютер. gcc сам является скомпилированной программой ( компилятор gnu c ).
Скомпилированную программу можно выполнить, просто запустив имя программы следующим образом:
Преимущества использования компилятора заключаются в том, что он обычно работает быстрее, чем интерпретируемый код, так как ему не нужно обрабатывать код « на лету » во время работы приложения.
Кроме этого, скомпилированная программа будет проверена на наличие ошибок во время компиляции. Если есть команды, которые не понравились компилятору, то о них будет сообщено. Это позволяет исправлять все ошибки перед запуском программы.
Но то, что программа скомпилирована успешно, еще не означает, что она будет работать так, как вы ожидаете. Поэтому все равно нужно протестировать приложение.
Что такое интерпретируемый язык?
Для выполнения кода нужно его компилировать сначала. Вместо этого я могу просто запустить следующую команду:
Приведенный выше код не нужно компилировать. Но необходимо, чтобы python был установлен на компьютере, на котором будет работать скрипт.
Интерпретатор python принимает удобный для восприятия человеком код и превращает его в промежуточное « состояние », прежде чем сформировать то, что может прочитать ПК. Все это происходит за кадром, и пользователь увидит только слова « hello world ».
Принято считать, что интерпретируемый код будет работать медленнее, чем скомпилированный код, потому что он должен проходить этап преобразования кода в отличие от скомпилированный кода, который просто выполняется.
Еще одно преимущество заключается в том, что код всегда доступен для чтения, и его можно легко изменить. В случае со скомпилированным кодом нужно найти, где находится код, изменить его, скомпилировать и заново запустить программу.
В случае использования интерпретируемого кода вы открываете программу, меняете ее, и она готова к работе.
Так какой же язык использовать?
Сомневаюсь, что выбор языка программирования для изучения будет определен тем, что вы узнали, какие языки являются компилируемыми.
Трансляторы программ: Компиляторы и интерпретаторы
Идет мужик мимо магазина с вывеской «Коммутаторы, аккумуляторы» и читает:
– Кому таторы, а кому ляторы
В рамках подготовки к следующим выпускам назрела необходимость пояснить, как программы переводятся с языков программирования в машинный код.
Но переводчики эти бывают разного типа, что накладывает отпечаток и на сами языки.
В переводе с английского это тоже переводчик, но особого типа. Это синхронный переводчик, который присутствует на разных деловых встречах и делает перевод синхронно с тем, как выступающий говорит. Сказали одну фразу – интерпретатор перевел. Сказали ещё одну – интерпретатор опять перевел. И так далее.
Точно так же работает и программный интерпретатор. Прочитал одну строчку программы, перевел её в машинный код, выполнил. Прочитал следующую строчку, перевёл, выполнил.
Это переводится как «сборщик» или «составитель». Похож на переводчика художественной литературы. Такой переводчик сначала читает книгу целиком, находит в ней взаимосвязи и отсылки к различным фактам, собирает все сведения и только потом переводит. Так же поступает и компилятор. Он собирает все данные о программе и переводит их в машинный код. После чего код выполняется целиком и непрерывно.
Компиляция программ очевидно выгоднее. Во-первых, машинный код исполняется максимально быстро. Во-вторых, готовой программе не нужен интерпретатор, то есть ещё одна программа. Ведь она уже и так в машинных кодах, поэтому запускаться может уже самостоятельно.
Чтобы выполнить интерпретируемую программу, вам вместе с ней нужно носить интерпретатор – ещё одну программу.
Кроме того, так как интерпретатор выполняет программу строчка за строчкой, он тут же забывает о том, что выполнял. Если программа возвращается на уже исполнявшиеся строчки (например, вызывается одна и та же функция, или делается цикл), то эти строчки интерпретатор переводит повторно. Это, конечно, приводит к лишним затратам времени и программа выполняется медленнее.
Но у интерпретаторов есть и плюс. Каждый раз, когда вы делаете какое-то изменение в программе, вы можете просто перезапустить её и сразу увидеть это изменение. Если программа компилируется, то каждый раз после изменения её нужно сначала скомпилировать, и только потом запустить. Хотя сама компиляция длится недолго (если это не огромный проект), даже лишние несколько секунд всё-таки мешают, особенно в процессе обучения.
И еще один плюс – интерпертируемая программа может работать везде, где есть интерпретатор. Например, программа, написанная на Питоне, может работать под Windows или под MacOS или под Android, лишь бы там был интерпретатор Питона.
А скомпилированная программа переведена уже в конкретные машинные коды под конкретную систему. Поэтому программа, скомпилированная для Windows, не будет работать в Linux, MacOS и др. Также программа, скомпилированная для процессора Intel, не будет работать на процессоре «Эльбрус» или PDP-11, потому что у них разные машинные коды. Нужно для каждой системы и архитектуры процессора собирать свой вариант программы. При этом, возможно, придется менять даже её исходный код.
Компилятору Java не нужно переводить программы в разные машинные коды для разных систем – он переводит их всегда в один и тот же код для своей собственной виртуальной машины, которая на всех системах работает одинаково. Но так как этот код – не нативный, т.е. не «родной» код для процессора, то он по-прежнему интерпретируется виртуальной машиной, которая переводит его в нативный код. Но так как этот код уже оптимизирован для интерпретации (он почти машинный, «полуфабрикат»), то и интерпретатор работает гораздо быстрее.
Я думаю, все интерпретаторы сейчас так или иначе используют байт-код. Кроме того, интерпретируемые программы часто бывает можно скомпилировать в нативный код. Правда, скорее всего это будет всё тот же интерпретатор, который будет содержаться внутри скомпилированной программы и по-прежнему интерпретировать её. И размер программы, конечно, станет существенно больше из-за этого.
В целом, как мне кажется, сейчас компиляторы востребованы только для программ, где важна скорость и размер (тяжелые игры, операционные системы, системные приложения, базы данных, драйвера, обработчики событий реального времени, системы с очень маленьким объемом памяти). Интерпретаторы и виртуальные машины достигли уже неплохих скоростей для большинства задач и поддерживаются «из коробки» на многих платформах. Скажем, тот же JavaScript работает в любом современном браузере.
Так как современная разработка ориентируется в большой степени на универсальные (в том числе мобильные) приложения, то требуется писать программы, которые работают везде. Именно это приводит к популярности интерпретируемых языков или языков с виртуальными машинами, а также кросс-компиляторов – компиляторов, которые переводят программы не в машинный код, а с одного языка на другой.
Статьи
Компилируемые и интерпретируемые языки программирования
Желающие освоить язык программирования сталкиваются с такими понятиями, как компилятор и интерпретатор. Компиляция и интерпретация — это основа работы языков программирования.
Языки программирования в общем подходе делятся на два класса — компилируемые и интерпретируемые. Стоит отметить, что эта классификация языков программирования на компилируемые и интерпретируемые, является весьма условной, поскольку для любого языка программирования может быть создан как компилятор, так и интерпретатор. Кроме того бывают языки программирования смешанного типа.
Мы полагаемся на такие инструменты, как компиляция и интерпретация, чтобы преобразовать наш код в форму, понятную компьютеру. Код может быть исполнен нативно, в операционной системе после конвертации в машинный (путём компиляции) или же исполняться построчно другой программой, которая делает это вместо ОС (интерпретатор).
Компилируемые языки
Программа на компилируемом языке при помощи специальной программы компилятора преобразуется (компилируется) в набор инструкций для данного типа процессора (машинный код) и далее записывается в исполняемый файл, который может быть запущен на выполнение как отдельная программа. Другими словами, компилятор переводит программу с языка высокого уровня на низкоуровневый язык, понятный процессору сразу и целиком, создавая при этом отдельную программу
Как правило, скомпилированные программы выполняются быстрее и не требуют для выполнения дополнительных программ, так как уже переведены на машинный язык. Вместе с тем при каждом изменении текста программы требуется ее перекомпиляция, что создает трудности при разработке. Кроме того, скомпилированная программа может выполняться только на том же типе компьютеров и, как правило, под той же операционной системой, на которую был рассчитан компилятор. Чтобы создать исполняемый файл для машины другого типа, требуется новая компиляция.
Компилируемые языки обычно позволяют получить более быструю и, возможно, более компактную программу, и поэтому применяются для создания часто используемых программ.
Примерами компилируемых языков являются Pascal, C, C++, Erlang, Haskell, Rust, Go, Ada.
Интерпретируемые языки
Если программа написана на интерпретируемом языке, то интерпретатор непосредственно выполняет (интерпретирует) ее текст без предварительного перевода. При этом программа остается на исходном языке и не может быть запущена без интерпретатора. Можно сказать, что процессор компьютера — это интерпретатор машинного кода. Кратко говоря, интерпретатор переводит на машинный язык прямо во время исполнения программы.
Программы на интерпретируемых языках можно запускать сразу же после изменения, что облегчает разработку. Программа на интерпретируемом языке может быть зачастую запущена на разных типах машин и операционных систем без дополнительных усилий. Однако интерпретируемые программы выполняются заметно медленнее, чем компилируемые, кроме того, они не могут выполняться без дополнительной программы-интерпретатора.
Примерами интерпретируемых языков являются PHP, Perl, Ruby, Python, JavaScript. К интерпретируемым языкам также можно отнести все скриптовые языки.
Многие языки в наши дни имеют как компилируемые, так и интерпретируемые реализации, сводя разницу между ними к минимуму. Некоторые языки, например, Java и C#, находятся между компилируемыми и интерпретируемыми. А именно, программа компилируется не в машинный язык, а в машинно-независимый код низкого уровня, байт-код. Далее байт-код выполняется виртуальной машиной. Для выполнения байт-кода обычно используется интерпретация, хотя отдельные его части для ускорения работы программы могут быть транслированы в машинный код непосредственно во время выполнения программы по технологии компиляции «на лету». Для Java байт-код исполняется виртуальной машиной Java (Java Virtual Machine, JVM), для C# — Common Language Runtime.
Перепечатка статьи допускается только при указании активной ссылки на сайт itmentor.by
Хочешь получать новые статьи первым? Вступай в сообщества ITmentor Вконтакте и Facebook
Опубликован: 06-01-2017 


