Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 21
Текст из файла (страница 21)
Различие заключается в том, что хост-компьютер в этом случае специально конструируется для микропрограммированпя н способен обеспечить скорость выполнения программ на моделируемом компьютере, сравнимую со скоростью работы соответствующей аппаратной реализации. Микропрограммируемое моделирование компьютера иногда называется эмуляцией. Получившийся в результате компьютер называется виртуальным компьютером, поскольку он смоделирован микропрограммой, без которой он бы просто не существовал. 2.1.3. Трансляторы и виртуальная архитектура Теоретически возможно создать аппаратный илн программно-аппаратный компьютер, на котором непосредственно выполнялись бы программы, написанные на любом избранном языке программирования. Таким образом получился бы компьютер с соответствующим машинным языком, например С, Рго1оя, 1.1ЯР и т.
д. Но создание такого компьютера было бы в большинстве случаев экономически невыгодно. Практические соображения в отношении быстродействия, гибкости и стоимости говорят в пользу создания компьютеров с машинными языками достаточно низкого уровня. Программы же, разумеется, в большинстве случаев пишутся на языках высокого уровня, далеко отстоящих от машинного языка. Поэтому возникает вопрос: как организовать выполнение программ (написанных на языках высокого уровня) на конкретном, имеюп1емся в распоряжении программиста колшьютере, независимо от машинного языка.
Для этой задачи существует два основных решения. 1. Трансляция (компиляция). Можно сконструировать транслятор, который будет переводить программы, написанные на языках высокого уровня, в эквивалентные программы на машинном языке используемого компьютера. Затем интерпретатор и простейшие операции, встроенные в аппаратную часть компьютера, непосредственно выполняют оттранслированную в машинный код программу. Общий термин транслятор используется для обозначения любого языкового процессора, который воспринимает программы на некотором исходном языке в качестве входных данных (этот исходный язык может быть как высокого, так и низкого уровня), а на выходе выдает эквивалентные по своей функциональности программы, но уже на другом, так называемом обьектном языке (который также может быть произвольного уровня). Существуют термины для обозначения некоторых специальных типов трансляторов: + Ассемблер — это транслятор, у которого объектный язык представляет собой некую разновидность машинного языка какого-либо реального компьютера, а исходный язык, называемый языком ассемблера, или просто ассемблером, — это, как правило, символическое представление объектного машинного кода.
В большинстве слу ~аев каждая инструкция на исходном языке переводится в одну команду на объектном языке. 74 Глава 2. Влияние машинной архитектуры + Компилятор — это транслятор, для которого исходным является язык высокого уровня. Объектный язык близок к машинному языку реального компьютера — это либо язык ассемблера, либо какой-нибудь вариант машинного языка. Например, программы на языке С компилируются, как правило, в программы на языке ассемблера, которые затем транслируются ассемблером в машинный язык. + Загрузчик, или редактор связей, — это транслятор, у которого объектный язык состоит из готовых к выполнению машинных команд, а исходный язык почти идентичен объектному. Обычно он состоит из программ на машинном языке в перемев1авмой форме и таблиц данных, указывающих те точки, в которых перемещаемый код должен быть модифицирован, чтобы стать действительно выполняемым.
Например, некоторая подпрограмма Р может быть откомпилирована таким образом, что она должна размещаться и использовать область памяти с адресами от О до 999, а подпрограмма Π— область памяти с адресами от О до 1999. Помимо того, эти подпрограммы могут использовать библиотечные функции, для которых определены адреса памяти от О до 4999. Задачей загрузчика является создание единой выполняемой программы, в которой используются согласованные адреса, как показано в следую1цей таблице. Выполняемая программа устроена как единая программа с используемыми адресами от О до 7999.
Подпрограмма Адреоа после компиляции Адреоа в выполняемой программе 0-999 0-1999 0-4999 Р 0 Библиотека 0-999 1000-2999 3000-7999 + Препроцессор, или макропроцессор, — это транслятор, исходный язык которого является расширенной формой какого-либо языка высокого уровня (например,зача или С.Р-Р), а объектный язык — стандартной версией этого языка. Объектная программа, созданная препроцессором, готова к трансляции и выполнению обычными процессорами исходного стандартного языка.
Большинство компиляторов С включает в себя препроцессор, который до начала фазы компиляции сначала преобразует используемые в программе макросы в стандартные операторы языка С. Трансляция программ с исходного языка высокого уровня на машинный язык часто требует нескольких шагов. Например, нередко программа на Сея сначала транслируется в программу на С, затем компилируется в программу на языке ассемблера, которая далее транслируется в перемещаемый машинный код и, наконец, редактором связей преобразуется в выполняемый машинный код, который уже может быть загружен в память загрузчиком и выполнен.
Более того, сама фаза компиляции может включать в себя несколько последовательных этапов, каждый из которых соответствует определенной промежуточной форме программы, прежде чем получится конечная объектная программа. 2.1. Структура и принципы работы компьютера 75 2.
Программная имитация (пуограммнал интерпретация). Вместо того чтобы транслировать программы на языке высокого уровня в эквивалентные программы на машинном языке, можно смолелировать с помощью программ, выполняемых на хост-компьютере, другой компьютер, для которого машинным языком будет данный язык высокого уровня. Для этого нужно сконструировать набор программ на машинном языке хост-компьютера, которые моделируют алгоритмы и структуры данных, необхолимые для выполнения программ на языке высокого уровня.
Другими словами, при помощи программ, выполняемых на хост-компьютере, создается (мелел ируется) компьютер с машинным языком высокого уровня; этот компьютер мог бы быть создан и аппаратным способом. Подобный метод называется программной имитацией (или программной интерпретацией) компьютера с машинным языком высокого уровня на хост-компьютере. Для моделируемой машины входными данными являк>тся программы на языке высокого уровня.
Основная моделирующая программа, используя алгоритм интерпретации, аналогичный представленному на рис.2.2, декодпрует и выполняет каждый оператор заданной программы в соответствующей последовательности и производит определяемый интерпретируемой программой вывод результирующих данных. В таком случае мы говорим, что хост-компьютер создает виртуальный компьютер, моделирующий язык высокого уровня. Когда хост-компьютер выполняет программу на языке высокого уровня, сложно сказать, выполняется ли программа непосредственно аппаратной частью компьютера или сначала она преобразуется в программу на машинном языке низкого уровня, а затем уже выполняется.
Отметим разницу межлу трансляцией и программной интерпретацией. И для транслятора, и для программного интерпретатора входными данными являются программы на языке высокого уровня. Но в результате трансляции получается просто программа на объектном языке, которая затем должна выполняться аппаратным интерпретатором для этого объектного языка, а программный интерпретатор непосредственно выполняет введенную программу.
Если прослелить за обработкой введенной программы транслятором и программным интерпретатором, то окажется, что транслятор обрабатывает операторы, входящие в программу, в порядке нх фактического ввода, а интерпретатор следует логике управления выполняемой программы. Обычно транслятор обрабатывает каждый оператор только один раз, в то время как интерпретатор может обрабатывать некоторые операторы многократно (если, например, они являются частью цикла) или полностью игнорировать другие (если на них не будет передано управление).
Но чистая трансляция и чистая интерпретация — это две крайности; на практике обычно эти технологии используются вместе, лополняя друг друга. Чистая трансляция используется достаточно редко. Это происходит, как правило, если исходный язык достаточно близок к машинному языку, как в случае с ассемблером. Так же редки случаи использования чистой интерпретации — она применяется для интерактивных языков и для языков управления операционными системами.
Чаще всего для реализации языка на компьютере используется комбинированный подход, как показано на рис. 2.3. Сначала программа транслируется из своей исход- 76 Глааа 2. Влияние машинной архитектуры ной формы я форму, более удобную для выполнения. Обычно это делается с помощью нескольких независилтых частей программы, называемых процедурами или подл)тограммаии. На этапе загрузки эти независимые части объединяются с набором программ поддержки выполнения (гпп-Гппе зпррогс гоцс)пез), реализутощих программно-моделируемые операции, что приводит к созданию выполняемой формы программы, операторы которой декодируются и выполняются посредством их интерпретации.
Исходная Транслятор программа (прттграмма) , Выполняемая программа Библиотека ) поддержки выполнения, Виртуальный компьютер (полностью или частично программно смоделированный) Сообщение об ошибках трансляции Компоновщик Выходные данные Исходная Транслятор программа 1поогоамма) Объектные программы Сообщение об ошибках данные, трансляции необходимые дпя выполнения программ Сообщение об ошибках ТРАНСЛЯЦИЯ ЗАГРУЗКА ВЫПОЛНЕНИЕ Рис. 2.3. Структура типичной реализации языка программирования При реализации языка программирования и трансляция, и интерпретация имеют свои преимущества.
Некоторые структуры в программах лучше транслировать я более простые формы еще до выполнения, другие лучше оставить в первоначальном виде и обрабатывать по мере надобности в процессе выполнения. Те операторы исходной программы, которые выполняются неоднократно (например, операторы в теле цикла или внутри подпрограммы, которая вызывается более одного раза), эффективнее транслировать. Для выполнения таких операторов часто требуется сложный процесс декодирования, с помощью которого определяются требуемые операции и их операнды.