Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 23
Текст из файла (страница 23)
2.2.2. Иерархия виртуальных компьютеров Виртуальная машина, используемая программистом для создания приложений, состоит фактически из иерархии виртуальньп компьютеров. В основании этой иерархии, разумеется, должен находиться реальный компьютер. Но обычно программисты крайне редко имеют дело непосредственно с ним. Этот реальный компьютер последовательно преобразуется слоями программного обеспечения (или микропрограммами) в виртуальную машину, которая может значительно отличаться от реального компьютера. Вторым слоем (или третьим, если микропрограммы формируют второй слой) является опврациояппя систпема, представляющая собой сложный набор программ. Обычно операционная система моделирует некоторое количество новых элементарных операций н структур данных, которые не обеспечены непосредственно аппаратной частью компьютера (например, структуры внешних файлов или функции определения времени). Помимо того, из виртуального компьютера, определяемого операционной системой, исключаются и становятся недоступными для пользователя некоторые элементарные аппаратные операции (например, простейшие операции ввода-вывода, выключения компьютера, мультипрограммирования и организации мультипроцессорной работы).
Обычно разработчик, который занимается реализацией языка высокого уровня, имеет дело именно с таким, определяемым операционной системой виртуальным компьютером. В процессе этой реализации разработчик создает новый слой программного обеспечения, которое выполняется на этом виртуальном компьютере и моделирует операции виртуального компьютера для языка высокого уровня. Кроме того, он создает транслятор для языка высокого уровня, переводягций программы пользователя на машинный язык виртуального компьютера.
Фактически описанная иерархическая система не заканчивается на реализации языка высокого уровня. Программы, создаваемые программистом, добавляют следующие уровни к этой иерархии. На рис. 2.4 представлена иерархия вирзуальных компьютеров, как она выглядит с точки зрения пользователя %%Ю. 2.2. Виртуальные компьютеры и время связывания 81 Входные данные Выходные данные КОМПЬЮТЕР УЧЕВ-ПРИЛОЖЕНИЯ (реализованный как НТМ(.-страница) ВИРТУАЛЬНЫЙ УЧЕВ-КОМПЬЮТЕР (браузер — программа на языке С или Зача) ВИРТУАЛЬНЫЙ КОМПЬЮТЕР ЯЗЫКА С (реализуется программами из библиотеки подцержки выполнения, загружаемой вместе с откомпилированной программой) ВИРТУАЛЬНЫЙ КОМПЬЮТЕР ОПЕРАЦИОННОЙ СИСТЕМЫ (реализуется программами на машинном языке, которые выполняются на виртуальном программно-аппаратном компьютере) ПРОГРАММНО-АППАРАТНЫЙ ВИРТУАЛЬНЫЙ КОМПЬЮТЕР (машинный язык этого компьютера реализуется микропрограммами, выполняемыми на аппаратном компьютере) РЕАЛЬНЫЙ АППАРАТНЫЙ КОМПЬЮТЕР (реализован физическими устройствами) Рис.
2.4. Иерархия виртуальных компьютеров для веб-приложения Над виртуальным компьютером языка С, создаваемым компилятором этого языка, программист с использованием языка С (или другого, ему эквивалентного) строит программу, называемую тчеЬ-браузером. Этот браузер создает виртуальный тчеЬ-компьютер, который способен обрабатывать основные структуры данных 'ту%%, гиперссылки (()(с).) для перехода к другим тчеЬ-сайтаьг, основные элементы языка НТМ1. для отображения тчеЬ-страниц, а также выполнять интерактивные программы (апплеты) для пользователей браузера.
Самый верхний уровень ватой конкретной иерархии занимает компьютер чеЬ-приложения, реализованный как тчеЬ-страница. тйгеЬ-разработчик использует свойства виртуального тчеЬ-компьютера (НТМЦ апплеты и т. п.) для предоставления пользователям возможности работать с этой ч еЬ-страницей. Центральная концепция, неявно присутствующая в приведенных рассуждениях, заключается в эквивалент тгости про гргьтьи и и даниьгх. Мы п ризы клн воспринимать одни типы объектов в программировании как программы, а другие — как данные. Часто это интуитивное разделение оказывается полезным, но, как следует из вышеприведенных рассуждений, оно скорее иллюзорное, а не обьективно существуюгцее.
Например, тот объект, который в каком-то контексте является программой, в другом может представлять собой некую структуру данных. Например, задаюгций некоторую ч еЬ-страницу код НТМЬ является структурой данных для виртуального чеЬ-компьютера, который обрабатывает эти данные и определяет, 82 Глава 2. Влияние машинной архитектуры как следует располагать иа странице информацию. С другой стороны, для юеЪ- разработчика, использующего НТМЕ для обработки той информации, которую ои хочет поместить иа страницу, этот код является программой.
Область применения принципа эквивалентности данных и программ можно расширить. В языках типа С и ЕОВТВАЫ выполняемые программы обычно храиятся отдельно от тех данных, которые используются в этих программах. В других языках, таких как Рго!оя или Е1БР, такого разделения ие существует. Программы и данные хранятся вместе и различие между ними проявляется только в процессе выполнения, 2.2.3. Связывание и время связывания Если ие ставить задачу быть предельно точными, можно сказать, что связывание элемента программы с конкретной характеристикой или свойством — это просто выбор определенного свойства из некоторого ряда допустимых свойств.
Момент времени, когда при составлении или выполнении программы происходит это связываиие, называется временем связьгван я данного свойства с данным элементом. В языках программироваиия существует множество различных типов связывания, так же как и множество вариаитов для времени связывания. Кроме того, в понятия связывания и времени связывания мы включаем свойства элементов программ, которые устанавливаются либо определением языка, либо его реализацией, Классификация времени связывания Хотя ие существует простого способа классифицировать различные типы связываиия, все же можно выделить несколько классов времени связывания.
В основе этой классификации лежит наше предположение о том, что обработка программы независимо от языка всегда включает в себя фазу трансляции, эа которой следует выполнение оттраислироваииой программы. 1. Во время выполнения программы. Связывание часто происходит во время выполнения программы. Сюда входят связывание перемеииых с их зиачеииями, а также (во миогих языках) связывание переменных с конкретными областями памяти. Здесь можно выделить две важные подкатегории: + При входе в подпрограмму или блок. В большинстве языков связывание допустимо только при входе в подпрограмму или блок при выполнении программы.
Например, в языках С и С++ связывание формальных параметров с фактическими и связывание формальных параметров с определенными областями памяти происходит только во время входа в подпрограмму. + В произвольных точках программы во время ее выполнения, Некоторые типы связывания могут происходить в произвольных точках программы во время ее выполнения. Наиболее важным примером этого является связывание переменных с их значениями путем присваивания. В таких языках, как ПИР, М1. и Бгпа!1га1!г допустимо также связывание имен с областями памяти в произвольный момент при выполнении программы. Чтобы проиллюстрировать многообразие связывания и времен связывания, рассмотрим следующий простой оператор присваивания: Х=Х+ 10. Предположим, что этот оператор появился в некоторой программе, написанной на гипотетическом языке 1.
Можно исследовать типы связывания и времена связывания следующих элементов этого оператора. 2. 3. 2.2. Виртуальные компьютеры и время связывания 83 Во время трансляции (компиляции). Можно выделить три класса связываний, происходящих во время трансляции. + Связывание по выбору программиста. При написании программы программист принимает множество решений по вопросам выбора типов и имен переменных, струкгуры элементов программы н т. п. Эти решения определяют связывания, происходящие при трансляции. Транслятор данного языка использует этн связьгвания для определения окончательной формы объектной программы. + Связывание по выбору транслятора.
В некоторых случаях связывание определяется транслятором языка без непосредственного участия программиста. Например, относительное расположение объекта данных в области памяти, отведенной под некоторую процедуру, обычно задается транслятором без какого-либо вмешательства со стороны программиста. Хранение массивов данных и создание (при необходимости) дескрипторов массивов — это также прерогатива транслятора. Для различных реализаций одного и того же языка это связывание может происходить по-разному. + Связывание по выбору загрузчика.
Обычно программа состоит из нескольких подпрограмм, которые должны быть объединены в одну выполняемую программу. Как правило, транслятор связывает переменные с адресами относительно областей памяти, определенных для каждой подпрограммы. Но этн области должны быть размещены в физической памяти с действительными адресами компьютера, на котором программа будет выполняться. Это происходит во время загрузки, также называемое временем редактирования связей. Время реализации языка. Некоторые аспекты определений языка в рамках некоторой его реализации могут быть одними и теми же для всех выполняемых программ, однако они могут различаться в других его реализациях.
Например, часто представление чисел и арифметических операций определяется тем, как эти операции реализованы с помощью аппаратной части базового компьютера. Если программа написана на языке, использующем возможности, определения которых были заданы при его реализации, то эта программа не обязательно будет работать в другой реализации этого же языка; хуже того, программа может работать, но выдавать неверный результат. Время определения языка. В основном структура языка формируется во время определения языка на основе спецификации альтернатив, доступных программисту при написании программы.