Интерпретируемый язык программирования
Интерпретируемый язык программирования — язык программирования, исходный код на котором выполняется методом интерпретации[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],
- модификация программы во время исполнения[1],
- меньшие затраты времени на разработку и отладку[5],
- простой способ создания переносимых программ[6],
- не требует затрат на компиляцию небольших программ[6].
Кроме того, принципы и стиль программирования часто не требуют создания и описания специальных конструкций, оформляющих программу (манифестов, классов, типов данных). Это позволяет разрабатывать и тестировать код постепенно, что удобно как для написания небольших программ, так и для изолированной разработки модулей для сложных систем. В силу своей универсальности их удобно применять в качестве сценарных языков.
Исключение этапа компиляции позволяет производить более быструю разработку программ, поэтому интерпретируемые языки используются при написании сложных одноразовых программ (например, для проведения однократного вычисления).
Недостатки[править | править код]
Основным недостатком является более медленное выполнение программы[1][6][7] по сравнению с выполнением программы, предварительно скомпилированной в машинный код. Например, выполнение PHP и Python может оказаться более чем в 100 раз медленнее чем C++[8]. Трансляция в байт-код и JIT-компиляция не решают этой проблемы полностью. Дополнительный слой интерпретатора или виртуальной машины замедляет выполнение программы и может требовать больше ресурсов. Во время выполнения интерпретатор всегда должен быть загружен в память (а это могут быть и большие программы, как браузер для JS или Office для VBA)[6]. Комментарии могут снижать производительность и для обхода этого создают две версии кода — готовую для использования (с удалёнными комментариями) и разрабатываемую[9].
В результате в среднем интерпретируемый код следует тестировать тщательнее компилируемого, строже придерживаться соглашений по оформлению программ и использовать дополнительные анализаторы качества кода. Последний недостаток выражен несильно, так как при серьёзной разработке на компилируемых языках также необходимо применение этих средств.
Примечания[править | править код]
- ↑ 1 2 3 4 5 6 Дорот В. Л., Новиков Ф. А. Интерпретируемый язык программирования, Интерпретация // Толковый словарь современной компьютерной лексики. — 3-е изд. — СПб.: БХВ-Петербург, 2004. — С. 215. — 608 с. — ISBN 9785941574919. — ISBN 5941574916.
- ↑ Макарова Н. В., Волков В. Б. 19.1.2. Классификация языков программирования // Информатика: Учебник для вузов. — СПб.: Питер, 2015. — С. 557. — 576 с. — ISBN 9785496015509.
- ↑ 1 2 Microsoft Press. interpret, interpreted language // Толковый словарь по вычислительной технике. — М.: Русская редакция, 1995. — С. 236. — 496 с. — ISBN 5750200086. — ISBN 1556155972.
- ↑ 1 2 I.153 interpretative language // Толковый словарь по вычислительным систамам / Под ред. В. Иллингуорта и др.. — М.: Машиностроение, 1990. — С. 241—242. — 560 с. — ISBN 521700617X.
- ↑ 1 2 Кочергин В. И. interpreter // Большой англо-русский толковый научно-технический словарь компьютерных информационных технологий и радиоэлектроники. — 2016. — ISBN 978-5-7511-2332-1.
- ↑ 1 2 3 4 Интерпретатор, Интерпретация // Толковый словарь по информатике / Под. ред. Г. Г. Пивняка. — Днепропетровск: Национальный горный университет, 2008. — С. 327-328. — 599 с. — ISBN 978-966-350-087-4.
- ↑ Воройский Ф. С. Интерпретация, Интерпретатор // Информатика. Энциклопедический словарь-справочник. — М.: Физматлит, 2006. — С. 325. — 768 с. — ISBN 5922107178. — ISBN 9785457966338.
- ↑ Макконнелл, 2010, 25.3. Где искать жир и патоку? Интерпретируемые языки, с. 585.
- ↑ Макконнелл, 2010, 32.4. Советы по эффективному комментированию. Производительность не является разумной причиной отказа от комментирования, с. 774.
Литература[править | править код]
- Интерпретация языка структурная // Энциклопедия кибернетики / Глушков В. М.. — Киев: Главная редакция УСЭ, 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.