Отправляет email-рассылки с помощью сервиса Sendsay

Программирование для .NET

  Все выпуски  

Программирование для .NET


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

Добрый день!

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

Компиляторы

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

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

Типичные компилируемые языки: C, C++, Delphi.

Интерпретация

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

Типичные интерпретируемые языки: PHP, JavaScript, Python.

Виртуальная машина

Компиляция и интерпретация — это фактически две крайности в подходах к трансляции ЯВУ. В последнее время все большей популярностью пользуется подход, совмещающий в себе их оба. Связан он с использованием так называемой виртуальной машины. Здесь также используется компилятор, однако он переводит программу в команды не какой-то конкретной платформы, а в команды некоторой в реальности не существующей виртуальной машины. При исполнении исполняющая система берет эти команды и переводит их в команды конкретной системы, на которой программа исполняется. Виртуальная машина проектируется таким образом, чтобы интерпретация на целевой платформе выполнялась максимально эффективно. Кроме того, активно используется JIT-компиляция (just in time — как раз вовремя), когда при первом обращении к процедуре ее код компилируется в команды целевой платформы, и в дальнейшем она исполняется непосредственно процессором, то есть, без дополнительных затрат ресурсов системы.

Типичные языки, использующие виртуальные машины: Java (с собственной исполняющей системой), C# (с исполняющей системой .NET; в ней также активно используется язык VB.NET, а также созданы версии компиляторов для ряда других языков).

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


В избранное