Компиляция и интерпретация

Введение

Термин семантика происходит из языка Древней Греции, где sēmantikos означало «значительный». В современный обиход его ввёл французский учёный Мишель Бреаль.

Замечание 1

Под семантикой понимается наука, изучающая смысловое значение слов (семантика лексики) и предложений, то есть семантические текстовые структуры и фразы.

Семантика сродни таким дисциплинам, как семиология, основы логики и другие. Комплект терминов, который имеет общий фактор семантики, является семантическим полем. Семантика, как наука, занимается изучением лингвистических и философских смыслов языков, в том числе языков программирования. Она взаимосвязана со словами, фразами, символикой и всем тем, что они обозначают. Задачами трактовки языкового смысла обычно относились к сферам психологии, а не лингвистики. Но именно лингвистика занимается изучением трактовки различной символики и знаков, применяемых в разных общественных сферах при конкретных условиях и контексте. В письменности такие параметры как пунктуация, абзацы и общая структура, обладают семантическим содержанием. Формализованное представление анализа семантики тесно взаимосвязано с некоторыми другими научными сферами, такими как лексикология, синтаксис, прагматика, этимология и тому подобными.

Введение

Для термина «Интерпретация» см. другие значения.

Интерпрета́тор (языка программирования) —

Программа или техническое средство, выполняющее интерпретацию.

Вид транслятора, осуществляющего пооператорную (покомандную) обработку и выполнение исходной программы или запроса (в отличие от компилятора, транслирующего всю программу без её выполнения).

Программа (иногда аппаратное средство), анализирующая команды или операторы программы и тут же выполняющая их.

Языковой процессор, который построчно анализирует исходную программу и одновременно выполняет предписанные действия, а не формирует на машинном языке скомпилированную программу, которая выполняется впоследствии.

Введение в .Net и c Sharp

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

Среда разработки содержит:

  • Текстовый редактор для ввода и корректировки текста программы

  • Компилятор для перевода программы на язык машинных команд

  • Средства отладки и запуска программы на исполнение

  • Общие библиотеки с многократно используемыми программными элементами

  • Справочную систему и др.

Платформа .NET («дот нет»), разработанная компанией Microsoft, включает не только среду разработки для нескольких языков программирования, называемую Visual Studio .NET, но множество других средств, таких как средства поддержки баз данных, электронной почты и др.

Важнейшими задачами при разработке современных программных средств являются:

  • Переносимость-возможность исполнения на разных типах компьютерах

  • Безопасность – невозможность несанкционированных действий

  • Надежность – безотказность работы в заданных условиях

  • Использование готовых компонентов для ускорения разработки

  • Межъязыковое взаимодействие – применение нескольких языков программирования.

Все эти задачи решают в рамках платформы .NET.

Для обеспечения переносимости компиляторы платформы переводят программу не в машинный код, а в промежуточный язык MSIL (Microsoft Intermediate Language) или просто в IL. IL не содержит команд, зависящих от операционной системы или типа компьютера. Программу на IL исполняет среда выполнения CLR (Common Language Runtime), которая уже специфична для каждого типа компьютера. Перевод IL-программы в машинные коды конкретного компьютера выполняет JIT (Just In Time) –компилятор.

Схема выполнения программы на платформе .NET приведена на рис.1.

Компилятор создает сборку программы – файл с расширение .exe или .dll, который содержит IL-код. Выполнение программы организует среда CRL, которая следит за допустимостью операций, выполняет распределение и очистку памяти и обрабатывает ошибки исполнения. Это обеспечивает безопасность и надежность программ.

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

Итак, .NET – это платформа программирования.

C# (Си-Шарп) — это один из языков программирования платформы .NET. Он входит в Visual Studio — Visual Studio.NET (Версии 2008, 2010, 2012). Кроме C# в Visual Studio.NET входят Visual Basic.NET и Visual C++.

1. Типы интерпретаторов

Простой интерпретатор анализирует и тут же выполняет (собственно интерпретация) программу покомандно (или построчно), по мере поступления её исходного кода на вход интерпретатора. Достоинством такого подхода является мгновенная реакция. Недостаток — такой интерпретатор обнаруживает ошибки в тексте программы только при попытке выполнения команды (или строки) с ошибкой.

Интерпретатор компилирующего типа — это система из компилятора, переводящего исходный код программы в промежуточное представление, например, в байт-код или p-код, и собственно интерпретатора, который выполняет полученный промежуточный код (так называемая виртуальная машина). Достоинством таких систем является большее быстродействие выполнения программ (за счёт выноса анализа исходного кода в отдельный, разовый проход, и минимизации этого анализа в интерпретаторе). Недостатки — большее требование к ресурсам и требование на корректность исходного кода. Применяется в таких языках, как Java, PHP, Tcl, Python, Perl (используется байт-код), REXX (сохраняется результат парсинга исходного кода), а также в различных СУБД (используется p-код[источник не указан 779 дней]).

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

Некоторые интерпретаторы (например, для языков Лисп, Scheme, Python, Бейсик и других) могут работать в режиме диалога или так называемого цикла чтения-вычисления-печати (англ. read-eval-print loop, REPL). В таком режиме интерпретатор считывает законченную конструкцию языка (например, s-expression в языке Лисп), выполняет её, печатает результаты, после чего переходит к ожиданию ввода пользователем следующей конструкции.

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

Следует также отметить, что режимы интерпретации можно найти не только в программном, но и аппаратном обеспечении. Так, многие микропроцессоры интерпретируют машинный код с помощью встроенных микропрограмм, а процессоры семейства x86, начиная с Pentium (например, на архитектуре Intel P6), во время исполнения машинного кода предварительно транслируют его во внутренний формат (в последовательность микроопераций).

Примечания

  1. Кочергин В. И. interpreter // Большой англо-русский толковый научно-технический словарь компьютерных информационных технологий и радиоэлектроники. — 2016. — ISBN 978-5-7511-2332-1.
  2. Интерпретатор // Математический энциклопедический словарь / Гл. ред. Прохоров Ю. В.. — М.: Советская энциклопедия, 1988. — С. 820. — 847 с.
  3. ГОСТ 19781-83; СТ ИСО 2382/7-77 // Вычислительная техника. Терминология: Справочное пособие. Выпуск 1 / Рецензент канд. техн. наук Ю. П. Селиванов. — М.: Издательство стандартов, 1989. — 168 с. — 55 000 экз. — ISBN 5-7050-0155-X.
  4. Першиков В. И., Савинков В. М. Толковый словарь по информатике / Рецензенты: канд. физ.-мат. наук А. С. Марков и д-р физ.-мат. наук И. В. Поттосин. — М.: Финансы и статистика, 1991. — 543 с. — 50 000 экз. — ISBN 5-279-00367-0.
  5. Борковский А. Б. Англо-русский словарь по программированию и информатике (с толкованиями). — М.: Русский язык, 1990. — 335 с. — 50 050 (доп,) экз. — ISBN 5-200-01169-3.
  6. Толковый словарь по вычислительным системам = Dictionary of Computing / Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского. — М.: Машиностроение, 1990. — 560 с. — 70 000 (доп,) экз. — ISBN 5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания).

Типы интерпретаторов

Простой интерпретатор анализирует и тут же выполняет (собственно интерпретация) программу покомандно (или построчно), по мере поступления её исходного кода на вход интерпретатора. Достоинством такого подхода является мгновенная реакция. Недостаток — такой интерпретатор обнаруживает ошибки в тексте программы только при попытке выполнения команды (или строки) с ошибкой.

Интерпретатор компилирующего типа — это система из компилятора, переводящего исходный код программы в промежуточное представление, например, в байт-код или p-код, и собственно интерпретатора, который выполняет полученный промежуточный код (так называемая виртуальная машина). Достоинством таких систем является большее быстродействие выполнения программ (за счёт выноса анализа исходного кода в отдельный, разовый проход, и минимизации этого анализа в интерпретаторе). Недостатки — большее требование к ресурсам и требование на корректность исходного кода. Применяется в таких языках, как Java, PHP, Tcl, Perl, REXX (сохраняется результат парсинга исходного кода), а также в различных СУБД.

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

Некоторые интерпретаторы (например, для языков Лисп, Scheme, Python, Бейсик и других) могут работать в режиме диалога или так называемого цикла чтения-вычисления-печати (англ. read-eval-print loop, REPL). В таком режиме интерпретатор считывает законченную конструкцию языка (например, s-expression в языке Лисп), выполняет её, печатает результаты, после чего переходит к ожиданию ввода пользователем следующей конструкции.

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

Следует также отметить, что режимы интерпретации можно найти не только в программном, но и аппаратном обеспечении. Так, многие микропроцессоры интерпретируют машинный код с помощью встроенных микропрограмм, а процессоры семейства x86, начиная с Pentium (например, на архитектуре Intel P6), во время исполнения машинного кода предварительно транслируют его во внутренний формат (в последовательность микроопераций).

Что такое компиляторы и интерпретаторы?

Статья рассчитана на пользователей, которые хотя бы немного знают о том, как устроены сети, операционные системы и языки программирования. Если вы вообще не имеете никакого представления о перечисленном, то рекомендуем почитать, ибо информация будет выглядеть достаточно сумбурно.

Для начал стоит разобраться, что же такое компилятор, ведь он буквально является основой основ. После написания кода на каком-либо языке он обязательно должен пройти стадию компиляции, т. е. сборки всех частей кода воедино. Дело в том, что проект всегда и обязательно разделяется на множество частей, каждая из которых выполняет лишь определенную роль. Будь то работа с сетью, файлами, пользователем и т. д. Такие куски кода могут быть написаны самим пользователем или взяты из стандартной библиотеки STL.

При взятии какого-либо элемента есть два варианта компиляции: автоматический и динамический. При автоматическом берутся все необходимые (включенные) библиотеки, а при динамическом — лишь выбранные части эти библиотек. Это весьма большая тема, поэтому рекомендуем прочитать про каждый способ отдельно.

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

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

3) Компиляторы и интерпретаторы

С помощью языка программирования создаётся не готовая программа, а только её текст, описывающий ранее разработанный алгоритм. Чтобы получить работающую программу, надо этот текст либо автоматически перевести в машинный код (для этого служат программы компиляторы) и затем использовать отдельно от исходного текста, либо сразу выполнять команды языка, указанные в тексте программы (этим занимаются программы-интерпретаторы).

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

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

Компиляторы полностью обрабатывают весь текст программы (он иногда называется исходный код

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

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

Недостаток компилятора
–трудоёмкость трансляции языков программирования, ориентированных на обработку данных сложных структур, часто заранее неизвестной или динамически меняющейся во время работы программы. Тогда в машинный код приходиться вставлять множество дополнительных проверок, анализировать наличие ресурсов операционной системы, динамически их захватывать и освобождать, формировать и обрабатывать в памяти компьютера сложные объекты, что на уровне жестко заданных машинных инструкций осуществить довольно трудно, а для задачи почти невозможно.

С помощью интерпретатора, наоборот, допустимо в любой момент остановить программу, исследовать содержимое памяти, организовать диалог с пользователем, выполнить сколь угодно сложные преобразования и при этом постоянно контролировать состояние окружающей программно — аппаратной среды, благодаря чему достигается высокая надёжность работы. Интерпретатор при выполнении каждого оператора проверяет множество характеристик операционной системы и при необходимости максимально подробно информирует разработчика о возникающих проблемах. Кроме того, интерпретатор очень удобен для использования в качестве инструмента изучения программирования, так как позволяет понять принципы работы любого отдельного оператора языка.

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

Языки программирования

Большая часть работы программистов связана с написанием исходного кода, тестированием и отладкой программ на одном из языков программирования. Исходные тексты и исполняемые файлы программ являются объектами авторского права и являются интеллектуальной собственностью их авторов и правообладателей[источник не указан 220 дней].

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

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

В некоторых языках вместо машинного кода генерируется интерпретируемый двоичный код «виртуальной машины», также называемый байт-кодом (byte-code). Такой подход применяется в Forth, некоторых реализациях Lisp, Java, Perl, Python, языках для .NET Framework.


Скриншот фрагмента кода на языке Java в текстовом редакторе vim, демонстрирующий подсветку синтаксиса, поддержку Unicode, фолдинг

Этапы подготовки и решения задач на компьютере

1.Постановка
задачи

формулируется цель решения задачи,
подробно описывается ее содержание;
проводится анализ условий, при которых
решается поставленная задача, выявляется
область определения входных параметров
задачи.

2.Формальное
построение модели задачи

– предполагает построение модели с
характеристиками, адекватными оригиналу,
на основе какого-либо его физического
или информационного принципа; анализируется
характер и сущность величин, используемых
в задаче.

3.Построение
математической модели задачи

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

4.Выбор
и обоснование метода решения

– модель решения задачи реализуется
на основе конкретных приемов и методов
решения.

5.Построение
алгоритма

на данном этапе составляется алгоритм
решения задачи, в соответствии с выбранным
методом решения.

6.Составление
программы

алгоритм решения переводится на
конкретный язык программирования.

7.Отладка
программы

процесс устранения синтаксических и
логических ошибок в программе.

8.Решение
задачи на компьютере и анализ результатов
.
Первоначально выполняется многократное
решение задачи на компьютере для
различных наборов исходных данных.
Получаемые результаты анализируются
специалистом.

19.Информационная
система

представляет собой аппаратно-программный
комплекс, обеспечивающий выполнение
следующих функций:

— ввод данных об
объектах некоторой предметной области;

— надежное хранение
и защита данных во внешней памяти
вычислительной системы;

— дополнение,
удаление, изменение данных;

— сортировка, выборка
данных по запросам пользователей;

— выполнение
специфических для данной предметной
области преобразований информации;

— предоставление
пользователям удобного интерфейса;

— обобщение данных
и составление отчетов.

Объем данных в
информационных системах может исчисляться
миллиардами байт. Отсюда возникает
необходимость в устройствах, способных
хранить большие объемы данных во внешней
памяти.

При структурировании
данных первоначально из всего многообразия
данных выбираются только некоторые,
другими словами создается информационная
модель объекта. Затем данные упорядочиваются
по порядку следования, по применяемым
типам или форматам данных, после чего
уже обрабатываются компьютером.

Совокупность
взаимосвязанных данных называется
структурой данных. Совокупность
структурированных данных, относящихся
к одной предметной области, называется
базой данных (БД). Совокупность программ,
реализующих в базе данных функции
информационных систем в удобной для
пользователя форме, называется системой
управления базой данных (СУБД). Программы,
производящие специфическую обработку
данных в базе данных, составляют пакет
прикладных программ (ППП).

Из сказанного ранее
можно дать следующее определение понятию
«Информационные системы». Информационные
системы – это организационное объединение
аппаратного обеспечения (АО), одной или
нескольких баз данных (БД), системы
управления базами данных (СУБД) и пакетов
прикладных программ (ППП).

20.Программное
обеспечение

– программы, указывающие последовательность
действий, которые должно выполнять
средство вычислительной техники (СВТ.

В общем виде
классификацию программного обеспечения
можно представить в виде следующей
схемы:

Основу системного
ПО составляют программы, входящие в
операционные
системы (ОС
)
компьютеров. Задача таких программ –
управление работой всех устройств
компьютерной системы и организация
взаимодействия отдельных процессов,
протекающих в компьютере во время
выполнения программ.

Служебные программы
– сервисные программы, используемые
при работе или техническом обслуживании
компьютера, – редакторы, отладчики,
диагностические программы, архиваторы,
программы для борьбы с вирусами и другие
вспомогательные программы. Данные
программы предназначены для упрощения
пользователю процесса взаимодействия
с компьютером. Так же в данный раздел
программного обеспечения относятся
программы, обеспечивающие работу
компьютера в сети.

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

Основы

Начинающий программист представляет себе работу интерпретатора примерно так:

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

Чуть более опытный программист исследовал файлы, которые порождает JVM при исполнении программы и знает, что JVM исполняет не исходный код программы, а байт-код, представляющий собой аналог ассемблера для виртуального Java-процессора. Байт-код генерируется загрузчиком классов и помещается в файлы с расширением . Загрузка классов выполняется динамически, то есть когда виртуальная машина, сталкивается с неизвестным ей (не загруженным) классом — она обращается к загрузчику. Очень хорошо информация о байт-коде представлена в статье Java Bytecode Fundamentals .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector