Язык программирования интерпретируемый: Компилируемые и интерпретируемые языки программирования
Компилируемые и интерпретируемые языки программирования
Желающие освоить язык программирования сталкиваются с такими понятиями, как компилятор и интерпретатор. Компиляция и интерпретация — это основа работы языков программирования.
Языки программирования в общем подходе делятся на два класса — компилируемые и интерпретируемые. Стоит отметить, что эта классификация языков программирования на компилируемые и интерпретируемые, является весьма условной, поскольку для любого языка программирования может быть создан как компилятор, так и интерпретатор. Кроме того бывают языки программирования смешанного типа.
Мы полагаемся на такие инструменты, как компиляция и интерпретация, чтобы преобразовать наш код в форму, понятную компьютеру. Код может быть исполнен нативно, в операционной системе после конвертации в машинный (путём компиляции) или же исполняться построчно другой программой, которая делает это вместо ОС (интерпретатор).
Компилируемые языки
Программа на компилируемом языке при помощи специальной программы компилятора преобразуется (компилируется) в набор инструкций для данного типа процессора (машинный код) и далее записывается в исполняемый файл, который может быть запущен на выполнение как отдельная программа. Другими словами, компилятор переводит программу с языка высокого уровня на низкоуровневый язык, понятный процессору сразу и целиком, создавая при этом отдельную программу
Как правило, скомпилированные программы выполняются быстрее и не требуют для выполнения дополнительных программ, так как уже переведены на машинный язык. Вместе с тем при каждом изменении текста программы требуется ее перекомпиляция, что создает трудности при разработке. Кроме того, скомпилированная программа может выполняться только на том же типе компьютеров и, как правило, под той же операционной системой, на которую был рассчитан компилятор. Чтобы создать исполняемый файл для машины другого типа, требуется новая компиляция.
Компилируемые языки обычно позволяют получить более быструю и, возможно, более компактную программу, и поэтому применяются для создания часто используемых программ.
Примерами компилируемых языков являются 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
Интерпретируемый язык программирования Википедия
Интерпретируемый язык программирования — язык программирования, исходный на котором выполняется методом интерпретации.[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 позволяют смешивать оба вида а.
К интерпретируемым языкам можно отнести большинство скриптовых языков.[источник не указан 1713 дней]
История[ | ]
В ранние годы развития программирования на языки сильно влиял выбор способа выполнения. Например, компилируемые языки требовали задания типа данных переменной в момент её описания или первого использования. В то время как интерпретируемые языки в силу своей динамической природы позволяли отказаться от этого требования, что давало больше гибкости и ускоряло разработку.
Изначально интерпретируемые языки преобразовывались в машинный построчно, то есть каждая логическая строка компилировалась непосредственно перед выполнением. В результате каждая инструкция, заключенная в тело цикла и исполняемая несколько раз, столько же раз обрабатывалась транслятором. В настоящее время такие эффекты редки. Большинство инте
Интерпретируемый язык программирования — это… Что такое Интерпретируемый язык программирования?
Интерпретируемый язык программирования — язык программирования, в котором исходный код программы не преобразовывается в машинный код для непосредственного выполнения центральным процессором (как в компилируемых языках), а исполняется с помощью специальной программы-интерпретатора.
В общем случае, любой язык может быть компилируемым и интерпретируемым, так что данное разделение относится к практике применения языка, а не является его свойством. При этом для многих языков существует различие в производительности между компилируемой и интерпретируемой реализацией.
Большое количество языков, включая BASIC, C, Lisp, Pascal и Python, имеют обе реализации. В Java используется JIT-компиляция для генерации машинного кода, хотя изначально он переводится в интерпретируемую форму. Языки Microsoft .NET Framework компилируются в Common Intermediate Language (CIL), который во время выполнения компилируется в нативный код. Большинство реализаций Lisp позволяют смешивать оба вида кода.
История
В ранние годы развития программирования на языки сильно влиял выбор способа выполнения. Например, компилируемые языки требовали задания типа данных переменной в момент ее описания или первого использования. В то время как интерпретируемые языки в силу своей динамической природы позволяли отказаться от этого требования, что давало больше гибкости и ускоряло разработку.
Изначально интерпретируемые языки преобразовывались в машинный код построчно, то есть каждая логическая строка компилировалась непосредственно перед выполнением. В результате каждая инструкция, заключенная в тело цикла и исполняемая несколько раз, столько же раз обрабатывалась транслятором. В настоящее время такие эффекты редки. Большинство интерпретируемых языков предварительно транслируются в промежуточное представление. Оно представляет собой байт-код или шитый код (threaded code). Это набор инструкций по вызову небольших фрагментов более низкоуровнего кода, эквивалентный нескольким командам ассемблера или командам виртуальной машины соответственно. Уже этот код испольняется интерпретатором или виртуальной машиной.
Например, такую схему используют следующие языки:
Промежуточный код может создаваться как явной процедурой компиляции всего проекта (Java), так и скрытой трансляцией каждый раз перед началом выполнения программы (Perl, Ruby) и при изменении исходного кода (Python).
Преимущества
Есть ряд возможностей, которые значительно легче реализовать в интерпретаторе, чем в компиляторе:
Кроме того, принципы и стиль программирования часто не требуют создания и описания специальных конструкций, оформляющих программу (манифестов, классов, типов данных). Это позволяет разрабатывать и тестировать код постепенно, что удобно как для написания небольших программ, так и для изолированной разработки модулей для сложных систем. В силу своей универсальности их удобно применять в качестве скриптовых языков.
Недостатки
Основным недостатком является меньшая производительность по сравнению с компилируемыми языками, преобразуемыми в машинный код. Трансляция в байт-код и JIT-компиляция не решают этой проблемы полностью. Дополнительный слой интерпретатора или виртуальной машины замедляет выполнение программы и может требовать больше ресурсов.
Из-за отсутствия компиляции всего проекта большинство ошибок можно поймать только во время выполнения. В результате в среднем интерпретируемый код следует тестировать тщательнее компилируемого, строже придерживаться соглашений по оформлению программ и использовать дополнительные анализаторы качества кода. Последний недостаток выражен несильно, так как при серьезной разработке на компилируемых языках также необходимо применение этих средств.
Области использования
Исключение этапа компиляции позволяет производить более быструю разработку программ, поэтому интерпретируемые языки используются при написании сложных одноразовых программ (например, для проведения однократного вычисления).
Пример
Программа helloworld.py на языке Python может содержать всего одну строку:print "Hello world!"
— интерпретатор этого языка (который сам, в свою очередь, написан на компилируемом языке программирования) сможет исполнить эту программу и вывести результат.$ python helloworld.py
Hello world!
Список языков
К интерпретируемым языкам можно отнести все скриптовые языки.
Интерпретируемый язык программирования — Википедия
Интерпретируемый язык программирования — язык программирования, исходный код на котором выполняется методом интерпретации.[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 позволяют смешивать оба вида кода.
К интерпретируемым языкам можно отнести большинство скриптовых языков.[источник не указан 1027 дней]
История
В ранние годы развития программирования на языки сильно влиял выбор способа выполнения. Например, компилируемые языки требовали задания типа данных переменной в момент её описания или первого использования. В то время как интерпретируемые языки в силу своей динамической природы позволяли отказаться от этого требования, что давало больше гибкости и ускоряло разработку.
Изначально интерпретируемые языки преобразовывались в машинный код построчно, то есть каждая логическая строка компилировалась непосредственно перед выполнением. В результате каждая инструкция, заключенная в тело цикла и исполняемая несколько раз, столько же раз обрабатывалась транслятором. В настоящее время такие эффекты редки. Большинство интерпретируемых языков предварительно транслируются в промежуточное представление. Оно представляет собой байт-код или шитый код (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 2 3 4 5 6 7 Дорот В. Л., Новикав Ф. А. Интерпретируемый язык программирования, Интерпретация // Толковый словарь современной компьютерной лексики. — 3-е изд. — СПб.: БХВ-Петербург, 2004. — С. 215. — 608 с. — ISBN 9785941574919. — ISBN 5941574916.
- ↑ 1 2 3 Макарова Н. В., Волков В. Б. 19.1.2. Классификация языков программирования // Информатика: Учебник для вузов. — СПб.: Питер, 2015. — С. 557. — 576 с. — ISBN 9785496015509.
- ↑ 1 2 3 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 5 6 7 Интерпретатор, Интерпретация // Толковый словарь по информатике / Под. ред. Г.Г. Пивняка. — Днепропетровск: Национальный горный университет, 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.
- ↑ 1 2 Макконнелл, 2010.
- ↑ 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.
Компилируемые и интерпретируемые языки программирования и место Java среди них
Языки программирования делятся на три типа:
1. Комплируемые языки
Работу компилируемых языков можно представить следующей схемой:
То есть жизненный цикл программы представляет собой следующие этапы:
1. Написание исходного текста программы (source code)
2. Компиляция в исполнимый файл (.exe например)
3. Выполнение программы на ПК
Такой подход обеспечивает высокое быстродействие. То есть программа готовится заранее, в тот момент когда она нужна, она просто запускается.
Все пользователи привыкли именно к такому подходу
Примеры таких языков: assembler, C, C++, Pascal
2. Интерпретируемые языки
Соответственно, жизненный цикл программы сводится к:
1. Написание
2. Выполнение
По сути интерпретируемые программы это так называемые «скрипты» — описание набора действий которые должен выполнить интерпретатор.
То есть, интерпретатор это большая программа со множеством различных функций. А программа это указание какие функции в каком порядке вызвать, описание взаимодействия этих функций
Это специфические языки, например языки для создания веб-страниц.
Примеры: PHP, JavaScript, Python
3. Смешанного типа
Принцип работы языков смешанного типа (компилируемо-интерпретируемые) проиллюстрируем такой схемой:
Java относится именно к компилируемо-интерпретируемым языкам программирования. Интерпретатор в Java называется «виртуальная машина», именно поэтому он так обозначен на рисунке.
Возникает вопрос, зачем такая сложность? Дело в том что такой подход объединяет преимущества компилируемых языков (скорость выполнения) и интерпретируемых (независимость от ОС и безопасность)
Примеры таких языков: Java, C#
Эти три подхода можно проиллюстрировать следующим образом:
1. Компилируемые языки это готовая еда. Хорошо иметь ее под рукой, но она быстро портится.
Программы, написанные на компилируемых языках зависят от ОС и от аппаратного оборудования
2. Интерпретируемые языки это замороженные продукты. Они хорошо хранятся, но их долго готовить
Программы, написанные для интерпретируемых языков очень мобильны, работают везде, где есть интерпретатор, безопасны, но…
Процесс преобразования занимает время, что сказывается на производительности
3. Комбинированные языки можно сравнить с полуфабрикатом. Его быстро готовить, он долго хранится. Но как вы понимаете, вкус будет хуже, чем у свежеприготовленной пищи.
Программы написанные на комбинированных языках программирования, ограничены функциональностью своего интерпретатора. То есть возможностей которые может использовать такая программа всегда будет меньше чем возможностей, которые может использовать программа написанная на компилируемом языке
Компилируемые и интерпретируемые языки — Студопедия.Нет
Содержание:
1.Понятие языка програмирования (ЯП)…………………………………………… 3
2.Понятие окна………………………………………………………………………………… 8
3.Понятие строки, столбца, ячейки и диапозона ячеек таблицы…………. 10
4.Развитие индустрии ЭВМ за рубежом и в нашей стране………………… 12
5.Программы-архиваторы: назначение, виды, примеры…………………… 17
6. Список литературы………………………………………………………………………………………. 18
Понятие языка програмирования (ЯП).
Язык программирования — формальная знаковая система, предназначенная для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, задающих внешний вид программы и действия, которые выполнит исполнитель (компьютер) под её управлением.
Классификация ЯП.
Языки программирования низкого уровня
Низкоуровневый язык программирования (язык программирования низкого уровня) — язык программирования, близкий к программированию непосредственно в машинных кодах используемого реального или виртуального (например, Java, Microsoft .NET) процессора. Для обозначения машинных команд обычно применяется мнемоническое обозначение. Это позволяет запоминать команды не в виде последовательности двоичных нулей и единиц, а в виде осмысленных сокращений слов человеческого языка (обычно английских). Как правило, использует особенности конкретного семейства процессоров. Общеизвестный пример низкоуровнего языка — язык ассемблера, хотя правильнее говорить о группе языков ассемблера. Для одного и того же процессора существует несколько видов языка ассемблера. Они совпадают в машинных командах, но различаются набором дополнительных функций (директив и макросов). Пример низких языков:
Ассемблер
Языки программирования высокого уровня
Высокоуровневый язык программирования — язык программирования, разработанный для быстроты и удобства использования программистом. Основная черта высокоуровневых языков — это абстракция, то есть введение смысловых конструкций, кратко описывающих такие структуры данных и операции над ними, описания которых на машинном коде (или другом низкоуровневом языке программирования) очень длинны и сложны для понимания.
Так, высокоуровневые языки стремятся не только облегчить решение сложных программных задач, но и упростить портирование программного обеспечения. Использование разнообразных трансляторов и интерпретаторов обеспечивает связь программ, написанных при помощи языков высокого уровня, с различными операционными системами и оборудованием, в то время как их исходный код остаётся, в идеале, неизменным.
Примеры высоких языков:
C++
С#
Visual Basic
Python
Perl
Fortran
Delphi(Pascal)
Lisp
Безопасные и небезопасные
В общем и целом, язык называется безопасным, если программы на нём, которые могут быть приняты компилятором как правильно построенные, в динамике никогда не выйдут за рамки допустимого поведения. Это не значит, что такие программы не содержат ошибок вообще. Термин «хорошее поведение программы» (англ. well behavior) означает, что даже если программа содержит некий баг (в частности, логическую ошибку), она тем не менее не способна нарушить целостность данных и обрушиться. Хотя термины неформальны, безопасность некоторых языков (например, Standard ML) математически доказуема. Безопасность других (например, Ada) была обеспечена ad hoc-образом, без обеспечения концептуальной целостности, что может обернуться катастрофами, если положиться на них в ответственных задачах .
Языки C и его потомок C++ являются небезопасными. В программах на них обширно встречаются ситуации ослабления типизации (приведение типов) и прямого её нарушения (каламбур типизации), так что ошибки доступа к памяти являются в них статистической нормой (но крах программы наступает далеко не сразу, что затрудняет поиск места ошибки в коде). Самые мощные системы статического анализа для них способны обнаруживать не более 70 — 80 % ошибок, но их использование обходится очень дорого в денежном смысле. Достоверно же гарантировать безотказность программ на этих языках невозможно, не прибегая к формальной верификации, что не только ещё дороже, но и требует специальных знаний. У Си есть и безопасные потомки, такие как Cyclone или Rust. Язык Forth не претендует на звание «безопасного», но, тем не менее, на практике существование программ, способных повредить данные, почти исключено, так как содержащая потенциально опасную ошибку программа аварийно завершается на первом же тестовом запуске, принуждая к коррекции исходного кода. В сообществе Erlang принят подход «let it crash» , также нацеленный на раннее выявление ошибок.
Компилируемые и интерпретируемые языки
Программа на компилируемом языке при помощи специальной программы компилятора преобразуется (компилируется) в набор инструкций для данного типа процессора (машинный код) и далее записывается в исполнимый модуль, который может быть запущен на выполнение как отдельная программа. Другими словами, компилятор переводит исходный текст программы с языка программирования высокого уровня в двоичные коды инструкций процессора.
Если программа написана на интерпретируемом языке, то интерпретатор непосредственно выполняет (интерпретирует) исходный текст без предварительного перевода. При этом программа остаётся на исходном языке и не может быть запущена без интерпретатора. Можно сказать, что процессор компьютера — это интерпретатор машинного кода.
Кратко говоря, компилятор переводит исходный текст программы на машинный язык сразу и целиком, создавая при этом отдельную исполняемую программу, а интерпретатор выполняет исходный текст прямо во время исполнения программы.
Разделение на компилируемые и интерпретируемые языки является несколько условным. Так, для любого традиционно компилируемого языка, как, например, Паскаль, можно написать интерпретатор. Кроме того, большинство современных «чистых» интерпретаторов не исполняют конструкции языка непосредственно, а компилируют их в некоторое высокоуровневое промежуточное представление (например, с разыменованием переменных и раскрытием макросов).
Для любого интерпретируемого языка можно создать компилятор — например, язык Лисп, изначально интерпретируемый, может компилироваться без каких бы то ни было ограничений. Создаваемый во время исполнения программы код может так же динамически компилироваться во время исполнения.
Как правило, скомпилированные программы выполняются быстрее и не требуют для выполнения дополнительных программ, так как уже переведены на машинный язык. Вместе с тем, при каждом изменении текста программы требуется её перекомпиляция, что создаёт трудности при разработке. Кроме того, скомпилированная программа может выполняться только на том же типе компьютеров и, как правило, под той же операционной системой, на которую был рассчитан компилятор. Чтобы создать исполняемый файл для машины другого типа, требуется новая компиляция.
Интерпретируемые языки обладают некоторыми специфическими дополнительными возможностями (см. выше), кроме того, программы на них можно запускать сразу же после изменения, что облегчает разработку. Программа на интерпретируемом языке может быть зачастую запущена на разных типах машин и операционных систем без дополнительных усилий.
Однако интерпретируемые программы выполняются заметно медленнее, чем компилируемые, кроме того, они не могут выполняться без дополнительной программы-интерпретатора. Примеры компилированных языков: assembler, C++, Pascal Примеры интерпритируемых языков: PHP, JavaScript, Python Некоторые языки, например, Java и C#, находятся между компилируемыми и интерпретируемыми.
Интерпретация и компиляция | Веб-программирование
Одной из ключевых характеристик PHP является то, что это интерпретируемый язык программирования. С другой стороны, языки программирования наподобие C, изначально разрабатывались для компиляции. Что это значит?
Компилируется ли язык программирования или интерпретируется, на самом деле это не зависит от природы языка программирования. Любой язык программирования может интерпретироваться так называемым интерпретатором или компилироваться с помощью так называемого компилятора.
При использовании любого языка программирования существует определенный рабочий цикл создания кода. Вы пишете его, запускаете, находите ошибки и отлаживаете. Таким образом, вы переписываете и дописываете программу, проверяете ее. То, о чем пойдет речь в этой статье, это «запускаемая» часть программы.
Когда пишете программу, вы хотите, чтобы ее инструкции работали на компьютере. Компьютер обрабатывает информацию с помощью процессора, который поэтапно выполняет инструкции, закодированные в двоичном формате. Как из выражения «a = 3;» получить закодированные инструкции, которые процессор может понять?
Мы делаем это с помощью компиляции. Существует специальные приложения, известные как компиляторы. Они принимают программу, которую вы написали. Затем анализируют и разбирают каждую часть программы и строят машинный код для процессора. Часто его также называют объектным кодом.
На одном из этапов процесса обработки задействуется компоновщик, принимающий части программы, которые отдельно были преобразованы в объектный код, и связывает их в один исполняемый файл. Вот схема, описывающая данный процесс:
Конечным элементом этого процесса является исполняемый файл. Когда вы запускаете или сообщаете компьютеру, что это исполняемый файл, он берет первую же инструкцию из него, не фильтрует, не преобразует, а сразу запускает программу и выполняет ее без какого-либо дополнительного преобразования. Это ключевая характеристика процесса компиляции — его результат должен быть исполняемым файлом, не требующим дополнительного перевода, чтобы процессор мог начать выполнять первую инструкцию и все следующие за ней.
Первые компиляторы были написаны непосредственно через машинный код или с использованием ассемблеров. Но цель компилятора очевидна: перевести программу в исполняемый машинный код для конкретного процессора.
Некоторые языки программирования разрабатывались с учетом компиляции. C, например, предназначался для того, чтобы дать возможность программистам с легкостью реализовать разные вещи. Но в итоге он разрабатывался таким образом, чтобы его можно было легко перевести на машинный код. Компиляция в программировании это серьезно!
Не все языки программирования учитывают это в своей концепции. Например, Java предназначался для запуска в «интерпретирующей» среде, а Python всегда должен интерпретироваться.
Альтернативой компиляции является интерпретация. Основная разница между компилятором и интерпретатором заключается в том, как они работают. Компилятор берет всю программу и преобразует ее в машинный код, который понимает процессор.
Интерпретатор — это исполняемый файл, который поэтапно читает программу, а затем обрабатывает, сразу выполняя ее инструкции.
Другими словами, интерпретатор выполняет программу поэтапно как часть собственного исполняемого файла. Объектный код не передается процессору, интерпретатор сам является объектным кодом, построенным таким образом, чтобы его можно было вызвать в определенное время.
Это ломает рабочий цикл, который был приведен на диаграмме выше. Теперь у нас есть новая диаграмма:
На ней мы видим, что в отличие от компилятора, интерпретатор всегда должен быть под рукой, чтобы мы могли вызвать его и запустить нашу программу. В некотором смысле интерпретатор становится процессором. Программы, написанные для интерпретации, называются «скриптами», потому что они являются сценариями действий для другой программы, а не прямым машинным кодом.
Например, так работают такие языки программирования, как Python. Вы пишете программу. Затем вводите код в интерпретатор Python, и он выполняет все описанные вами шаги. В командной строке вы можете ввести примерно следующее:
В этой команде Python — это исполняемый файл. Вы вводите в него все, что находится в файле myprogram.py, и он выполняет эти инструкции. Компьютер не запустит myprogram.py без Python. Это не машинный код, который понимает процессор. Можно скомпилировать программы Python в объектный или машинный код и запустить его непосредственно в процессоре. Но эта процедура включает в себя компиляцию кода и добавление в качестве ее части всего интерпретатора Python.
Интерпретаторы могут создаваться по-разному. Существуют интерпретаторы, которые читают исходную программу и не выполняют дополнительной обработки. Они просто берут определенное количество строк кода за раз и выполняют его.
Некоторые интерпретаторы выполняют собственную компиляцию, но обычно преобразуют программу байтовый код, который имеет смысл только для интерпретатора. Это своего рода псевдо машинный язык, который понимает только интерпретатор.
Такой код быстрее обрабатывается, и его проще написать для исполнителя (части интерпретатора, которая исполняет), который считывает байтовый код, а не код источника.
Есть интерпретаторы, для которых этот вид байтового кода имеет более важное значение. Например, язык программирования Java «запускается» на так называемой виртуальной машине. Она является исполняемым кодом или частью программы, которая считывает конкретный байтовый код и эмулирует работу процессора. Обрабатывая байтовый код так, как если бы процессор компьютера был виртуальным процессором.
У меня есть эмулятор для игровой приставки NIntendo. Когда я загружаю ROM-файл Dragon Warrior, он форматируется в машинный код, который понимает только процессор NES. Но если я создаю виртуальный процессор, который интерпретирует байтовый код во время работы на другом процессоре, я могу запустить Dragon Warrior на любой машине с эмулятором.
Это использует концепция компиляции Java, а также все интерпретаторы. На любом процессоре, для которого я могу создать интерпретатор / эмулятор, можно запускать мои интерпретируемые программы / байтовый код. В этом заключается основное преимущество интерпретатора над компилятором.
Основным аргументом за использование процесса компиляции является скорость. Возможность компилировать любой программный код в машинный, который может понять процессор ПК, исключает использование промежуточного кода. Можно запускать программы без дополнительных шагов, тем самым увеличивая скорость обработки кода.
Но наибольшим недостатком компиляции является специфичность. Когда компилируете программу для работы на конкретном процессоре, вы создаете объектный код, который будет работать только на этом процессоре. Если хотите, чтобы программа запускалась на другой машине, вам придется перекомпилировать программу под этот процессор. А перекомпиляция может быть довольно сложной, если процессор имеет ограничения или особенности, не присущие первому. А также может вызывать ошибки компиляции.
Основное преимущество интерпретации — гибкость. Можно не только запускать интерпретируемую программу на любом процессоре или платформе, для которых интерпретатор был скомпилирован. Написанный интерпретатор может предложить дополнительную гибкость. В определенном смысле интерпретаторы проще понять и написать, чем компиляторы.
С помощью интерпретатора проще добавить дополнительные функции, реализовать такие элементы, как сборщики мусора, а не расширять язык.
Другим преимуществом интерпретаторов является то, что их проще переписать или перекомпилировать для новых платформ.
Написание компилятора для процессора требует добавления множества функций, или полной переработки. Но как только компилятор написан, можно скомпилировать кучу интерпретаторов и на выходе мы имеем перспективный язык. Не нужно повторно внедрять интерпретатор на базовом уровне для другого процессора.
Самым большим недостатком интерпретаторов является скорость. Для каждой программы выполняется так много переводов, фильтраций, что это приводит к замедлению работы и мешает выполнению программного кода.
Это проблема для конкретных real-time приложений, таких как игры с высоким разрешением и симуляцией. Некоторые интерпретаторы содержат компоненты, которые называются just-in-time компиляторами (JIT). Они компилируют программу непосредственно перед ее исполнением. Это специальные программы, вынесенные за рамки интерпретатора. Но поскольку процессоры становятся все более мощными, данная проблема становится менее актуальной.
Имейте всегда в виду, что некоторые языки программирования специально предназначены для компиляции кода, например, C. В то время как другие языки всегда должны интерпретироваться, например Java.
Для меня не имеет значения, скомпилировано что-то или интерпретировано, если оно может выполнить задачу эффективно.
Некоторые системы не предлагают технические условия для эффективного использования интерпретаторов. Поэтому вы должны запрограммировать их с помощью чего-то, что может быть непосредственно скомпилировано, например C. Иногда нужно выполнить вычисления настолько интенсивно, насколько это возможно. Например, при точном распознавании голоса роботом. В других случаях скорость или вычислительная мощность могут быть не столь критичными, и написать эмулятор на оригинальном языке может быть проще.
Сообщите мне, что бы вы предпочли: интерпретацию или компиляцию? Спасибо за уделенное время!
Данная публикация представляет собой перевод статьи «Interpretation Versus Compilation» , подготовленной дружной командой проекта Интернет-технологии.ру
телеграм канал. Подпишись, будет полезно!
Интерпретируемые и компилируемые языки программирования
: в чем разница?
Каждая программа представляет собой набор инструкций, будь то добавление двух чисел или отправка запроса через Интернет. Компиляторы и интерпретаторы берут удобочитаемый код и преобразуют его в машиночитаемый машинный код.
На скомпилированном языке целевая машина напрямую переводит программу. В интерпретируемом языке исходный код не транслируется напрямую целевой машиной.Вместо этого другая программа , также известная как интерпретатор, считывает и выполняет код.
Хорошо … но что на самом деле означает ?
Представьте, что у вас есть рецепт хумуса, который вы хотите приготовить, но он написан на древнегреческом языке. Вы, не говорящий на древнегреческом языке, можете следовать его указаниям двумя способами.
Первый — если кто-то уже перевел его на английский для вас. Вы (и любой другой, кто говорит по-английски) можете прочитать английскую версию рецепта и приготовить хумус.Думайте об этом переведенном рецепте как о скомпилированной версии .
Второй способ — если у вас есть друг, знающий древнегреческий язык. Когда вы будете готовы приготовить хумус, ваш друг садится рядом с вами и переводит рецепт на английский, строка за строкой. В этом случае ваш друг является интерпретатором интерпретируемой версии рецепта .
Скомпилированные языки
Скомпилированные языки преобразуются непосредственно в машинный код, который может выполнять процессор.В результате они, как правило, быстрее и эффективнее выполняются, чем интерпретируемые языки. Они также дают разработчику больше контроля над аппаратными аспектами, такими как управление памятью и использование ЦП.
Для скомпилированных языков требуется этап «сборки» — сначала их нужно скомпилировать вручную. Вам нужно «перестраивать» программу каждый раз, когда вам нужно внести изменения. В нашем примере с хумусом весь перевод написан до того, как он попадет к вам. Если первоначальный автор решит, что он хочет использовать другой вид оливкового масла, весь рецепт нужно будет снова перевести и повторно отправить вам.
Примерами чистых скомпилированных языков являются C, C ++, Erlang, Haskell, Rust и Go.
Языки перевода
Интерпретаторы запускают программу построчно и выполняют каждую команду. Здесь, если автор решает использовать другой вид оливкового масла, он может вычеркнуть старое и добавить новое. Затем ваш друг-переводчик может передать вам это изменение, когда оно произойдет.
Интерпретируемые языки когда-то были значительно медленнее, чем компилируемые языки.Но с развитием своевременной компиляции этот разрыв сокращается.
Примеры общепринятых интерпретаций la
.
концепций программирования: компилируемые и интерпретируемые языки
Серия Programming Concepts:
Как и в моем предыдущем посте Programming Concepts , посвященном стеку и куче, в этой серии я стремлюсь оглянуться на основные вычислительные темы, которые влияют на все в том, как мы развиваемся сегодня, но являются темами, которые большинство разработчиков используют более высокого уровня. с языками никогда не нужно иметь дело, и поэтому они могут не понимать их полностью (в том числе и я).Точно так же, как изучение другого языка программирования сделает вас лучшим разработчиком, понимание того, как работают разные языки программирования, многому вас научит. Сегодняшняя тема: Скомпилированные языки и языки перевода .
Как разработчики, мы часто сталкиваемся с такими терминами, как компилятор или интерпретатор , когда читаем сообщения в блогах, статьи, ответы на StackOverflow и т. Д., Но мне кажется, что это термины, которые мы замалчиваем в наши дни, не совсем понимая их.Компиляция и интерпретация лежат в основе того, как выполняются все языки программирования; Давайте посмотрим, как на самом деле работают эти концепции.
Введение
Мы зависим от таких инструментов, как компиляция и интерпретация, чтобы преобразовать наш написанный код в форму, которую может выполнить компьютер. Код может либо выполняться изначально через операционную систему после преобразования в машинный код (посредством компиляции), либо его можно оценивать построчно через другую программу, которая обрабатывает выполнение кода вместо самой операционной системы (посредством интерпретации).
Скомпилированный язык — это язык, в котором однажды скомпилированная программа выражается в инструкциях целевой машины; этот машинный код не поддается расшифровке людьми. Интерпретируемый язык — это язык, в котором инструкции не выполняются напрямую целевой машиной, а вместо этого читаются и выполняются какой-либо другой программой (обычно — это , написанное на языке собственной машины). Как компиляция, так и интерпретация имеют свои преимущества и недостатки, о чем мы и поговорим.
Прежде чем мы продолжим, необходимо сказать, что большинство языков программирования имеют как скомпилированные реализации, так и интерпретированные реализации, и поэтому вы не можете классифицировать весь язык как компилируемый или интерпретируемый — только конкретную реализацию. Однако для простоты в оставшейся части сообщения я буду использовать либо «компилируемые языки», либо «интерпретируемые языки».
Скомпилированные языки
Основным преимуществом компилируемых языков перед интерпретируемыми языками является их скорость выполнения.Поскольку скомпилированные языки преобразуются непосредственно в машинный код, они работают значительно быстрее и эффективнее, чем интерпретируемые языки, особенно учитывая сложность операторов в некоторых более современных интерпретируемых языках сценариев.
Языки нижнего уровня, как правило, компилируются, потому что эффективность обычно важнее, чем кроссплатформенная поддержка. Кроме того, поскольку скомпилированные языки преобразуются непосредственно в машинный код, это дает разработчику гораздо больше контроля над аппаратными аспектами, такими как управление памятью и использование ЦП.Примеры чистых скомпилированных языков включают C, C ++, Erlang, Haskell и более современные языки, такие как Rust и Go.
Однако некоторые из подводных камней компилируемых языков довольно существенны. Чтобы запустить программу, написанную на скомпилированном языке, вам необходимо сначала вручную скомпилировать ее. Это не только дополнительный шаг для запуска программы, но и при отладке программы вам потребуется перекомпилировать программу каждый раз, когда вы захотите протестировать свои новые изменения. Это может сделать отладку очень утомительной.Еще один недостаток компилируемых языков заключается в том, что они не зависят от платформы, поскольку скомпилированный машинный код специфичен для машины, на которой он выполняется.
Языки перевода
В отличие от компилируемых языков, интерпретируемые языки не требуют машинного кода для выполнения программы; вместо этого интерпретаторы будут запускать программу построчно и выполнять каждую команду. На заре интерпретации это было недостатком по сравнению с компилируемыми языками, поскольку для выполнения программы требовалось значительно больше времени, но с появлением новых технологий, таких как своевременная компиляция, этот разрыв сокращается.Примеры некоторых распространенных интерпретируемых языков включают PHP, Perl, Ruby и Python. Вот некоторые из концепций программирования, которые упрощают интерпретируемые языки:
Основным недостатком интерпретируемых языков является более низкая скорость выполнения программы по сравнению с компилируемыми языками. Однако, как упоминалось ранее, своевременная компиляция помогает путем преобразования часто выполняемых последовательностей интерпретируемых инструкций в код главной машины.
Бонус: языки байт-кода
Языки байт-кода — это тип языков программирования, которые подпадают под категории как компилируемых, так и интерпретируемых языков, потому что они используют как компиляцию, так и интерпретацию для выполнения кода.Java и среда .Net — это, пожалуй, наиболее распространенные примеры языков байт-кода (в .Net он получил название Common Intermediate Language ). Фактически, виртуальная машина Java (JVM) является настолько распространенной виртуальной машиной для интерпретации байт-кода, что несколько языков имеют реализации, созданные для работы на JVM.
В языке байт-кода первым шагом является компиляция текущей программы с ее удобочитаемого языка в байт-код. Байт-код — это форма набора команд, который разработан для эффективного выполнения интерпретатором и состоит из компактных числовых кодов, констант и ссылок на память.С этого момента байт-код передается на виртуальную машину, которая действует как интерпретатор, которая затем продолжает интерпретировать код, как это сделал бы стандартный интерпретатор.
В языках с байт-кодом существует задержка при первом запуске программы для компиляции кода в байт-код, но скорость выполнения значительно увеличивается по сравнению со стандартными интерпретируемыми языками, поскольку байт-код оптимизирован для интерпретатора. Самым большим преимуществом языков байт-кода является независимость от платформы, которая обычно доступна только для интерпретируемых языков, но программы имеют гораздо более высокую скорость выполнения, чем интерпретируемые языки.Подобно тому, как интерпретируемые языки используют своевременную компиляцию, виртуальные машины, интерпретирующие байт-код, также могут использовать этот метод для повышения скорости выполнения.
Обзор
Большинство языков сегодня можно скомпилировать или интерпретировать с помощью различных реализаций, что делает разницу между двумя менее значимыми. Стиль исполнения одного языка не лучше другого, но у него, безусловно, есть свои сильные и слабые стороны.
Вкратце, скомпилированные языки являются наиболее эффективным типом языков программирования, потому что они выполняются непосредственно как машинный код и могут легко использовать больше аппаратных характеристик работающей машины.В свою очередь, это требует значительно более строгого стиля кодирования, и одна программа обычно не может быть запущена в разных операционных системах. С другой стороны, интерпретируемые языки предлагают гораздо больше разнообразия стилей кодирования, не зависят от платформы и легко позволяют использовать такие методы динамической разработки, как метапрограммирование. Однако интерпретируемые языки выполняются намного медленнее, чем скомпилированные языки — хотя своевременная компиляция помогает ускорить это.
Языки байт-кода также широко распространены и пытаются использовать сильные стороны как компилируемых, так и интерпретируемых языков.Это позволяет использовать языки программирования, которые не зависят от платформы, как интерпретируемые языки, но при этом выполняются со скоростью, значительно превышающей скорость интерпретируемых языков.
Я знаю, что здесь не было примеров кода, но мне очень хотелось углубиться в эту тему, потому что я чувствую, что это одна из тех концепций программирования, которые всегда будут актуальны для нас, независимо от того, насколько абстрактны наши языки более высокого уровня из аппаратный уровень. Не стесняйтесь оставлять комментарии, если вы хотите видеть какие-либо конкретные сообщения Programming Concepts в будущем!
Подлинный запрос
Всем привет — спасибо, что прочитали мой пост! Если бы тебе понравилось, я бы
мне нравится, если вы подумали о поддержке меня.Я не прошу денег
или что-нибудь из этой чуши типа «купи мне пива»; Мне бы просто понравилось, если бы ты
рассмотрит возможность загрузки (и использования) браузера Brave с помощью
мой реферальный код!
Храбрый фокусируется на
безопасность и конфиденциальность — и категорически против рекламы.
Это означает, что такие сайты, как мой, не приносят дохода.
если вы смотрели их в Brave — ничего страшного; Я только делаю около
10 долларов в месяц с рекламой, и это идет прямо на хостинг.Если вы используете
мой реферальный код, чтобы загрузить Brave и использовать его немного,
Я получаю около 5 долларов за валюту Brave — токен базового внимания или
BAT для краткости.
Неважно, планируете вы использовать это или нет, я просто рад, что вы прочитали этот пост. Еще раз спасибо!
Реферальный код: https://brave.com/the124
.