Remove ads
язык программирования, в котором исходный код не преобразуется в машинный, а исполняется программой-интерпретатором Из Википедии, свободной энциклопедии
Интерпрети́руемый язы́к программи́рования — язык программирования, исходный код на котором выполняется методом интерпретации[1]. Классифицируя языки программирования по способу исполнения[2], к группе интерпретируемых относят языки, в которых операторы программы друг за другом отдельно транслируются и сразу выполняются (интерпретируются)[3] с помощью специальной программы-интерпретатора (что противопоставляется[1] компилируемым языкам, в которых все операторы программы заранее оттранслированы в объектный код[3]). Такой язык может реализовывать конструкции, допускающие динамические изменения на этапе выполнения (модификация существовавших или создание новых подпрограмм). Эти конструкции затрудняют компиляцию и трансляцию на компилируемый язык[1].
В общем случае, любой язык может быть компилируемым и интерпретируемым. В предельном случае такой язык можно реализовать только при помощи интерпретаторов[4]. Также встречаются названия interpretative language («интерпретативный»)[4], interpretable language («поддающийся интерпретации»), interpreted language («интерпретируемый»)[5].
При этом для многих языков существует различие в производительности между компилируемой и интерпретируемой реализацией.
Большое количество языков, включая Бейсик, Си, Лисп, Паскаль и Python, имеют обе реализации. В Java используется JIT-компиляция для генерации машинного кода, хотя изначально он переводится в интерпретируемую форму. Языки Microsoft .NET Framework компилируются в Common Intermediate Language (CIL), который во время выполнения компилируется в машинный код. Большинство реализаций Лиспа позволяют смешивать оба вида кода.
В ранние годы развития программирования на языки сильно влиял выбор способа выполнения. Например, компилируемые языки требовали задания типа данных переменной в момент её описания или первого использования. В то время как интерпретируемые языки в силу своей динамической природы позволяли отказаться от этого требования, что давало больше гибкости и ускоряло разработку.
Изначально интерпретируемые языки преобразовывались в машинный код построчно, то есть каждая логическая строка компилировалась непосредственно перед выполнением. В результате каждая инструкция, заключенная в тело цикла и исполняемая несколько раз, столько же раз обрабатывалась транслятором. В настоящее время такие эффекты редки. Большинство интерпретируемых языков предварительно транслируются в промежуточное представление. Оно представляет собой байт-код или шитый код (threaded code). Это набор инструкций по вызову небольших фрагментов более низкоуровневого кода, эквивалентный нескольким командам ассемблера или командам виртуальной машины соответственно. Уже этот код исполняется интерпретатором или виртуальной машиной. Например, такую схему используют Java, Python и Ruby (использует представление кода в виде абстрактного синтаксического дерева).
Промежуточный код может создаваться как явной процедурой компиляции всего проекта (Java), так и скрытой трансляцией каждый раз перед началом выполнения программы (Perl, Ruby) и при изменении исходного кода (Python).
Есть ряд возможностей, которые значительно легче реализовать в интерпретаторе, чем в компиляторе:
Кроме того, принципы и стиль программирования часто не требуют создания и описания специальных конструкций, оформляющих программу (манифестов, классов, типов данных). Это позволяет разрабатывать и тестировать код постепенно, что удобно как для написания небольших программ, так и для изолированной разработки модулей для сложных систем. В силу своей универсальности их удобно применять в качестве сценарных языков.
Исключение этапа компиляции позволяет производить более быструю разработку программ, поэтому интерпретируемые языки используются при написании сложных одноразовых программ (например, для проведения однократного вычисления).
Основным недостатком является более медленное выполнение программы[1][6][7] по сравнению с выполнением программы, предварительно скомпилированной в машинный код. Например, выполнение PHP и Python может оказаться более чем в 100 раз медленнее чем C++[8]. Трансляция в байт-код и JIT-компиляция не решают этой проблемы полностью. Дополнительный слой интерпретатора или виртуальной машины замедляет выполнение программы и может требовать больше ресурсов. Во время выполнения интерпретатор всегда должен быть загружен в память (а это могут быть и большие программы, как браузер для JS или Office для VBA)[6]. Комментарии могут снижать производительность и для обхода этого создают две версии кода — готовую для использования (с удалёнными комментариями) и разрабатываемую[9].
В результате в среднем интерпретируемый код следует тестировать тщательнее компилируемого, строже придерживаться соглашений по оформлению программ и использовать дополнительные анализаторы качества кода. Последний недостаток выражен несильно, так как при серьёзной разработке на компилируемых языках также необходимо применение этих средств.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.