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

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Интерпретируемый язык программированияязык программирования, исходный код на котором выполняется методом интерпретации.[1] Классифицируя языки программирования по способу исполнения[2], к группе интерпретируемых относят языки, в которых операторы программы друг за другом отдельно транслируются и сразу выполняются (интерпретируются)[3] с помощью специальной программы-интерпретатора (что противопоставляется[1] компилируемым языкам, в которых все операторы программы заранее оттранслированы в объектный код[3]). Такой язык может реализовывать конструкции, позволяющие динамические изменения на этапе времени выполнения (модификация существовавших или создание новых подпрограмм). Эти конструкции затрудняют компиляцию и трансляцию на компилируемый язык.[1]

В общем случае, любой язык может быть компилируемым и интерпретируемым. В предельном случае такой язык можно реализовать только при помощи интерпретаторов.[4] Также встречается название interpretative language - интерпретативный язык[4], interpretable (букв. поддающийся интерпретации) programming language - интерпретируемый язык программирования и interpreted language - интерпретируемый язык[5].

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

Большое количество языков, включая BASIC, C, Lisp, Pascal и Python, имеют обе реализации. В Java используется JIT-компиляция для генерации машинного кода, хотя изначально он переводится в интерпретируемую форму. Языки Microsoft .NET Framework компилируются в Common Intermediate Language (CIL), который во время выполнения компилируется в нативный код. Большинство реализаций Lisp позволяют смешивать оба вида кода.

К интерпретируемым языкам можно отнести большинство скриптовых языков.[источник не указан 1045 дней]

История[править | править код]

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

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

Например, такую схему используют следующие языки:

Промежуточный код может создаваться как явной процедурой компиляции всего проекта (Java), так и скрытой трансляцией каждый раз перед началом выполнения программы (Perl, Ruby) и при изменении исходного кода (Python).

Преимущества[править | править код]

Есть ряд возможностей, которые значительно легче реализовать в интерпретаторе, чем в компиляторе:

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

Недостатки[править | править код]

Основным недостатком является более медленное выполнение программы[1][6][7] по сравнению с выполнением программы, предварительно скомпилированной в машинный код. Например выполнение PHP и Python может оказаться в более чем 100 раз медленнее чем C++.[8] Трансляция в байт-код и JIT-компиляция не решают этой проблемы полностью. Дополнительный слой интерпретатора или виртуальной машины замедляет выполнение программы и может требовать больше ресурсов. Во время выполнения интерпретатор всегда должен быть загружен в память (а это могут быть и большие программы, как браузер для JS или Office для VBA)[6]. Комментарии могут снижать производительность и для обхода этого создают две версии кода - готовую для использования (с удалёнными комментариями) и разрабатываемую.[9]

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

Области использования[править | править код]

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

Пример[править | править код]

Программа helloworld.ру на языке Python может содержать всего одну строку:
print "Hello world!" для версии языка 2.7, или print("Hello world!\n") для версий от 3.0 и выше — интерпретатор этого языка (который сам, в свою очередь, написан на компилируемом языке программирования) сможет исполнить эту программу и вывести результат.
$ python helloworld.py
Hello world!

Список часто используемых интерпретируемых языков[править | править код]

Примечания[править | править код]

  1. 1 2 3 4 5 6 7 Дорот В. Л., Новикав Ф. А. Интерпретируемый язык программирования, Интерпретация // Толковый словарь современной компьютерной лексики. — 3-е изд. — СПб.: БХВ-Петербург, 2004. — С. 215. — 608 с. — ISBN 9785941574919. — ISBN 5941574916.
  2. 1 2 3 Макарова Н. В., Волков В. Б. 19.1.2. Классификация языков программирования // Информатика: Учебник для вузов. — СПб.: Питер, 2015. — С. 557. — 576 с. — ISBN 9785496015509.
  3. 1 2 3 Microsoft Press. interpret, interpreted language // Толковый словарь по вычислительной технике. — М.: Русская редакция, 1995. — С. 236. — 496 с. — ISBN 5750200086. — ISBN 1556155972.
  4. 1 2 I.153 interpretative language // Толковый словарь по вычислительным систамам / Под ред. В. Иллингуорта и др.. — М.: Машиностроение, 1990. — С. 241-242. — 560 с. — ISBN 521700617X.
  5. 1 2 Кочергин В. И. interpreter // Большой англо-русский толковый научно-технический словарь компьютерных информационных технологий и радиоэлектроники. — 2016. — ISBN 978-5-7511-2332-1.
  6. 1 2 3 4 5 6 7 Интерпретатор, Интерпретация // Толковый словарь по информатике / Под. ред. Г.Г. Пивняка. — Днепропетровск: Национальный горный университет, 2008. — С. 327-328. — 599 с. — ISBN 978-966-350-087-4.
  7. Воройский Ф. С. Интерпретация, Интерпретатор // Информатика. Энциклопедический словарь-справочник. — М.: Физматлит, 2006. — С. 325. — 768 с. — ISBN 5922107178. — ISBN 9785457966338.
  8. Макконнелл, 2010, 25.3. Где искать жир и патоку? Интерпретируемые языки, с. 585.
  9. Макконнелл, 2010, 32.4. Советы по эффективному комментированию. Производительность не является разумной причиной отказа от комментирования, с. 774.
  10. 1 2 Макконнелл, 2010.
  11. 1 2 3 4 Пратт Т., Зелковиц М. 2.1.3 Трансляторы и виртуальная архитектура // Языки программирования: разработка и реализация. — СПб.: Питер, 2002. — 688 с. — ISBN 5318001890.

Литература[править | править код]

  • Интерпретация языка структурная // Энциклопедия кибернетики / Глушков В. М.. — Киев: Главная редакция УСЭ, 1974. — Т. 1. — С. 390-391. — 608 с.
  • Кнут Д. Э. 1.4.3 Программы-интерпретаторы // Искусство программирования. Том 1. Основные алгоритмы = The Art of Computer Programming. Volume 1. Fundamental Algorithms / под ред. С. Г. Тригуб (гл. 1), Ю. Г. Гордиенко (гл. 2) и И. В. Красикова (разд. 2.5 и 2.6). — 3. — Москва: Вильямс, 2002. — Т. 1. — 720 с. — ISBN 5-8459-0080-8.
  • Макконнелл С. Совершенный код. — М.: Русская редакция, 2010. — 896 с. — ISBN 9785750200641.
  • Роберт У. Себеста. 1.7.2 Чистая интерпретация // Основные концепции языков программирования. — 5-е изд. — М.: Вильямс, 2001. — С. 50-52. — 672 с. — ISBN 5845901928.
  • Michael L. Scott. Programming Language Pragmatics. — Morgan Kaufmann, 2000. — ISBN 1558604421.