Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 22
Текст из файла (страница 22)
Каждый раз при выполнении операторов этот процесс или большая его часть выполняется заново. Так, если какой-то оператор должен быть выполнен 1000 раз, то и один и тот же процесс его декодирования должен повториться 1000 раз. Если же этот оператор оттранслирован в более простой для декодирования код (например, в последовательность машинных команд), то сложный процесс декодирования происходит только один раз при транслировании, а потом в каждом из 1000 случаев повторного выполнения этого оператора требуется декодировать уже более простой код.
Главным недостатком трансляции является потеря информации о программе. Если данные исходной программы транслируются в последовательность адресов на машинном языке и в программе имеется ошибка (например, один из этих объектов данных делится на О), часто бывает трудно определить, какой из операторов программы на исходном языке выполнялся и какие объекты данных использова- 2,1.
Структура и принципы работы компьютера 77 лись в нем. При интерпретации вся зта информация ош ается доступной для пользователя. Кроме того, поскольку оператор на языке высокого уровня содержит горыло больше информации, чем команда машинного языка, при трансляции размер программы значительно возрастает, то есть программа иа машинном языке занимает в памяти гораздо болыце места, чем исходная программа. Интерпретация имеет свои достоинства, почти прямо противоположные перечисленным для трансляции. Операторы остаются в своей исходной форме до тех пор, пока они ие понадобятся при вьшолнении, тем самым не расходуется память для хранения нескольких копий длинных последовательностей машинных команд; все необходимые команды достаточно сохранить один раз в моделирующей программе (интерпретаторе).
Однако за это приходится расплачиваться необходимостью многократно декодировать один и тот жс оператор, если он, например, встречается в цикле или часто вызываемой подпрограмме. Ключевой вопрос реализации языка программирования заключается в том, какое представление имеет программа во время ее выполнения на реальном компьютере. Иначе говоря, является этот язык машинным языком данного компьютера или нет? В зависимости от ответа на этот вопрос языки (вернее, их реализации) делятся на компилируемые и и итсрпртпирувмые. 1. Компилируемые языки.
Языки С, Сл+, ЕОКТКАК, Равса! и Лг!а принято считать компилируемыми. Это означает, что программы, написанные на этих языках, транслируются в машинный код данного компьютера перед началом выполнения. Программная интерпретация при этом ограничивается только интерпретацией набора програим поддержки вьтолнения, которые моделируют элементарные операции исходного языка, не имеющие близкого аналога в машинном языке. Транслятор компилируемого языка является обычно довольно большой и сложной программой, и при трансляции основное значение имеет создание максимально эффективных с точки зрения их выполнения программ.
2. Интерпретируемые языки. Языки 1.15Р, М1., Рег!, Розгвспрс, Рго1ой и Вша11- га1!г часто реализуются с использованием программного интерпретатора. При такой реализации транслятор выдает не машшщ ый код используемого компьютера, а некую промежуточную форму программы.
Эта форма легче для выполнения, чем исходная программа, но все же она отличается от машинного кода. Процесс интерпретации для выполнения полученной программы должен быть реализован программным образом, поскольку аппаратный интерпретатор в данном случае непосредственно применить невозможно. Использование программного интерпретатора обычно приводит к относительно медленному выполнению программы. Трансляторы интерпретируемых языков обычно представляют собой довольно простые программы, основная сложность реализуется в программном обеспечении процесса интерпретации. Развитие Всемирной паутины Чч%% и появление языка) ача внесли некоторые изменения в описанную схему.
Язык )ача похож скорее на Разов! и Сл-л-, чем на 1.!ВР, но в большинстве случаев оц реализуется как интерпретируемый язык. Компилятор)ача вырабатывает промежуточный набор байт-кодов (Ьугесодез) для 78 Глава 2. Влияние машинной архитектуры виртуальной машины )ана. Основной причиной неэффективности тчеЬ-приложений является потеря времени при передаче по сети затребованных пользователем страниц, а не выполнение программ на хост-компьютере. Передача байт-кодов на локальный компьютер (даже если он медленнее, чем ъ еЬ-сервер) выгоднее в отношении временных затрат, чем передача результатов выполнения программы на ъ еЬ- сервере.
Однако цеЬ-сервер не в состоянии предугадать машинную архитектуру хост-компьютера. Поэтому браузер создает виртуальную машину )ака, которая н выполняет стандартный набор байт-кодов) ака. 2.2. Виртуальные компьютеры и время связывания В предыдущем разделе компьютер был определен как интегрированный набор алгоритмов и структур данных, способный хранить и выполнять программы. Мы рассмотрели, каким образом можно сконструировать требуемый компьютер, 1. Путем аппаратной реализации, когда структуры данных и алгоритмы непосредственно представлены физическими устройствами.
2. Путем программно-аппаратной реализации, когда структуры данных и алгоритмы представлены микропрограммами, которые выполняются на соответствующем микропрограммируемом аппаратном компьютере. 3. Как виртуальный компьютер, то есть путем моделирования структур данных и алгоритмов программами, написанными на каком-либо другом языке программирования. 4. Посредством комбинации перечисленных методов, когда некоторые части требуемого компьютера реализованы аппаратным способом, другие — программно-аппаратным, третьи — при помощи программного моделирования, то есть виртуальным способом.
При реализации языка программирования структуры данных и алгоритмы, задействованные при выполнении программы, определяют некоторую вычислительную машину (компьютер). Поскольку этот компьютер всегда (хотя бы частично) моделируется программным образом (как в случае с программно-аппаратной реализацией компьютера), он называется виртуальныч компьютером, опрвдвлявмыч реализацией языка. Машинным языком этого виртуального компьютера будет являться выполняемая программа, выдаваемая транслятором этого языка.
Если язык компилируемый, эта программа может состоять из машинных команд реального компьютера; она может быть представлена произвольной структурой данных, если язык интерпретируемый. Структурами данных этого виртуального компьютера являются структуры данных, которые используются во время выполнения программы.
Примитивные операции — зто те операции, которые действительно выполняются аппаратным компьютером при выполнении программы. Аналогично структуры управления последовательностью действий, данными и памятью — это те же структуры, которые используются при выполнении программ, независимо от того, поддерживаются ли они аппаратной частью, микропрограммами или смоделированы программным образом.
2.2. Виртуальные компьютеры и время связывания 79 2.2.1. Виртуальные компьютеры и реализация языка Если бы языки программирования определялись в терминах своих виртуальных компьютеров, так что каждый язык ассоциировался бы с некоторым однозначно определенным и понимаемым виртуальным компьютером, то описание семантики языка в терминах виртуального компьютера было бы очевидным. Но в действительности языки обычно определяются путем индивидуального задания семантики для каждой своей синтаксической конструкции, поэтому определение виртуального базового компьютера осуществляется только неявным образом.
Каждый раз, когда язык программирования реализуется на новом компьютере, разработчик видит несколько (или совершенно) иной виртуальный компьютер в определении того же самого языка. Таким образом, две различные реализации одного и того же языка программирования могут использовать различные структуры данных и различные наборы операций, особенно это относится к структурам данных и опершшям, которые скрыты в программном синтаксисе. Каждый разработчик имеет достаточную широту в определении структур виртуального компьютера, которые составляют основу для конкретной реализации языка. Когда язык программирования реализуется на каком-либо конкретном компьютере, в первую очередь требуется определить виртуальньш компьютер, который представляет собой интерпретацию семантики языка.
Затем этот виртуальный компьютер конструируется на основе возможностей аппаратной части и программных элементов, предоставляемых конкретным базовым компьютером. Например, если в виртуальном компьютере присутствуют операция целочисленного сложения и операция извлечения квадратного корня, то разработчик может выбрать следующий вариант.
Для реализации целочисленного сложения можно использовать аналогичную операцию, непосредственно встроенную в аппаратную часть базового компьютера, а извлечение квадратного корня можно смоделировать программным образом в виде подпрограммы, вычисляющей квадратные корни. Можно привести пример, иллюстрирующий различные возможности реализации структур данных.
Если в виртуальном компьютере имеется простая целочисленная переменная Х, можно реализовать ее, непосредственно выделив область памяти, в которой хранится значение этой переменной. Но можно сделать иначе — выделить область памяти, в которой будет содержаться информация о типе данных, хранящихся в переменной (в нашем случае целый тип), и указатель на другую область памяти, в которой содержится фактическое значение переменной Х. Организация и структура реализации языка складываются из множества подобных решений, которые принимает разработчик с учетом аппаратных и программных возможностей базового компьютера и стоимости их использования.
Разработчик также должен точно решить, что именно должно быть сделано в процессе трансляции программы, а что — во время выполнения. Часто бывает так, что использование какого-то конкретного способа представления структуры данных или операции виртуального компьютера во время выполнения программы возможно, только если во время трансляции были проделаны определенные действия, необходимые для создания структуры во время выполнения программы.
Если разработчик решит сделать транслятор более простым, опустив эти действия, 80 Глава 2. Влияние машинной архитектуры тогда во время выполнения могут потребоваться различные представления струк- туры. Таким образом, различия в реализациях одного и того же языка объясняются следующими тремя факторами. 1. Разные разработчики могут иметь различные мнения о том, как должен быть устроен виртуальньш компьютер, неявно определяемый данным языком программирования, 2. Различные базовые компьютеры, на которых реализуется язык, предоставляют различные возможности. 3. Каждый разработчик выбирает собственные решения для реализации элементов виртуального компьютера, используя возможности, предоставляемые базовым компьютером, и для конструирования транслятора таким образом, чтобы он поддерживал выбранные решения для представления виртуального компьютера.