Анимация
JavaScript


Главная  Библионтека 

0 1 [ 2 ] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

print {average {a))

6. Блоки

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


причем объем памяти для а и Ь выделяется при вхождении в блок и забирается обратно при выходе из блока.

Такие языки, как Бейсик и Фортран, не имеют блочной структуры, Паскаль же ее имеет, но в ограниченной форме. Более современные языки - алголоподобные и язык министерства обороны США, Ада - имеют блочную структуру. Здесь мы будем считать в основном, что исходный язык обладает блочной структурой. Языки, не имеющие блочной структуры, легче компилировать с точки зрения распределения памяти и т. п.

На данном этапе нет смысла много говорить о различиях между языками высокого уровня, например, в отношении способов обеспечения циклов или условных выражений либо в типах обозначений операций. Различия в языках в представлении разработчика компиляторов хорошо показаны в работе [3].

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

ргос (геа!) real

соответствующий процедуре с одним real параметром и одним real результатом. В данной книге мы употребляем оба термина: вид - в основном в контексте Алгола 68 и тип - в остальных случаях. Считается, что некоторые языки, такие, как Алгол 68 и Паскаль, имеют явно выраженные не статические типы, т. е. типы всех значений в программе известны во время компиляции. Это привносит избыточность в язык и увеличивает число проверок, выполняемых в процессе компиляции. Например,

char х:~3



будет определена компилятором как недопустимая. В ПЛ/1, который также имеет явно выраженные типы, эта «ошибка» останется необнаруженной, так как в этом языке есть много неявных преобразований типов (например, целое в литеру).

О таких языках, как РОР-2, АПЛ и ЛИСП, говорят, что они имеют неявно выраженные, или динамические, типы, поскольку в них типы не известны до тех пор, пока не наступит время прогона программы. Например, в РОР-2 объявление

VARS X. У;

означает, что X и Y могут принимать значения любого типа. Такое присваивание, как

(в РОР-2 присваивания имеют направление слева направо), всегда является допустимым. Однако в

применение обозначения бинарной операции «-Ь» к X и У может быть допустимым или нет в зависимости от текущих типов X и» Y. Это можно проверить только во время прохождения программы. Такая проверка должна включаться в объектный код, что неизбежна замедляет объектную программу.

Возможно компромиссное решение: в основной части типы делают статическими, но вводят дополнительный тип (называемый, например, any type (любой тип) или general (универсальный)), который может принимать значения любых других типов языка. Это решение принято в CPL и ESPOL (подмножество Алгола 60 Барроуз).

Третий метод определения типов применяется в BCPL. Здесь имеется только один тип, который можно считать набором битов, а

А + В

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

Машины

В машинном коде, как ив BCPL, концепция типа или вида отсутствует. ЭВМ имеет дело с наборами двоичных чисел независимо от их значений. Подобно языкам ЭВМ существенно отличаются друг от друга в деталях; но, чтобы показать задачу компилятора, мы можем перечислить ряд их типичных характеристик. Эти характеристики для каждой конкретной машины отчасти определяются возможностью ее использования программистом и в гораздо большей степени - стоимостными и скоростными показателями конструкции ЭВМ. Общими для большинства машин являются:

1. Линейное запоминающее устройство

Это - последовательность групп битов, в которых запоминается информация. Каждая группа битов называется словом и содержит 16, 24 или 32 бита (двоичных чисел). Место размещения слова в памяти называется его адресом. Адреса, как



правило, идут от 0 до 2"- 1; где п - целое число. (В некоторых ЭВМ единицей памяти служит байт, который состоит из 8 бит и представляет собой поле, необходимое для записи одной литеры. Байты обычно имеют отдельные адреса).

2. Регистры

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

3. Набор команд

В любой машине есть набор команд, называемый машинным кодом. Каждая команда состоит из последовательности двоичных цифр и может принимать несколько параметров, которые /также являются последовательностями двоичных цифр. В эти параметры обычно входит имя регистра или адрес в основной памяти. Команда (включая параметры) занимает точное число слов (или, возможно, полуслов) и может храниться в основной памяти во время выполнения программы. В одних машинных кодах команды имеют фиксированную длину (например, в серии ICL 1900), в других - переменную (например, в серии IBM 370). Используя вместо двоичных чисел мнемоническую запись кодов команд и десятичные числа вместо последовательностей двоичных цифр, можно представить типичные команды машинного кода в виде

LDX 1 4444

что значит «поместить содержимое адреса 4444 в регистр /». (Поскольку заранее может быть неизвестно, в какой части основной памяти будет храниться программа во время выполнения, адресные поля, как правило, бывают не абсолютными, а относительными какого-либо базового значения.) Так,

означает «записать содержимое регистра 2 по адресу 2000»,

означает «сложить содержимое адреса 102 с содержимым регистра 2»,

BRN 4000

«перейти к адресу 4000 и продолжать выполнение команд с этого адреса». Остальные (перечисленные ниже) устройства ЭВМ не имеют для нас особого значения с точки зрения компиляции.

4. Устройство управления

Служит для интерпретации команд машинного кода и их размещения при выполнении.





0 1 [ 2 ] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69