ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 24.12.2021

Просмотров: 12171

Скачиваний: 10

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

3 4 8 Глава 5. Уровень архитектуры команд

теперь это входные регистры с R24 по R31. Восемь глобальных регистров не меня-
ются. Это всегда один и тот же набор регистров.

В отличие от памяти, которая квазибесконечна (по крайней мере, в отноше-

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

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

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

В системе UltraSPARC II есть также 32 регистра с плавающей точкой, которые

могут содержать либо 32-битные (одинарная точность), либо 64-битные (двойная

точность) значения. Возможно также использовать пары этих регистров, чтобы

поддерживать 128-битные значения.

Архитектура UltraSPARC II — архитектура загрузки/хранения. Это значит,

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

Общий обзор виртуальной машины Java

Уровень команд машины JVM необычен, но достаточно прост. Мы уже отчасти

рассмотрели его во время изучения машины JVM. Модель памяти JVM точно такая

же, как у IJVM, о которой мы говорили в главе 4 (см. рис. 4.9), но с одной дополни-
тельной областью, о которой мы сейчас расскажем. Порядок байтов обратный.

Память содержит 4 основные области: фрейм локальных переменных, стек опе-

рандов, область процедур и набор констант. Напомним, что в реализациях Mic-x
машины IJVM на эти области указывают регистры LV, SP, PC и СРР. Доступы к
памяти должны осуществляться только по смещению от одного из этих регистров;
указатели и абсолютные адреса памяти не используются. Хотя JVM не требует

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

Отсутствие указателей для доступа к локальным переменным и константам не

случайно. Это нужно для достижения одной из главных целей языка Java: возмож-
ности загружать двоичную программу из Интернета и выполнять ее, не опасаясь
шпионских программ или какого-либо сбоя в машине, на которой это программа

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

Напомним, что ни одна из областей памяти, определенных в машине IJVM, не

может быть очень большой. Объем области процедур может быть всего лишь
64 Кбайт. Пространство, занимаемое локальными переменными, не должно пре-

вышать 64 Кбайт. Набор констант также ограничивается 64 Кбайт. JVM характе-
ризуется теми же ограничениями по той же причине: смещения для индексирова-
ния этих областей ограничиваются 16 битами.


background image

Типы данных 349

Область локальных переменных меняется с каждой процедурой, поэтому каж-

дая вызываемая процедура имеет собственные 64 Кбайт для своих локальных пе-

ременных. Точно так же определенный набор констант распространяется только

на определенный класс, поэтому каждый из них имеет собственные 64 Кбайт. Здесь
нет места для хранения больших массивов и динамических структур данных, на-
пример списков и деревьев. Именно поэтому в JVM включается дополнительная

область памяти, так называемая «куча», которая предназначена для хранения ди-
намических объектов, а также очень крупных объектов. Когда компилятор Java
воспринимает следующее выражение:

int a[]-new -int[4096]

он посылает сигнал распределителю памяти, который определяет место в памяти
для «кучи» и возвращает ей указатель. Таким образом, указатели используются

в JVM, но программисты не могут непосредственно манипулировать ими.

Если в «куче» создаются все новые и новые структуры данных, она в конце

концов переполнится. Когда специальная система определяет, что «куча» почти

заполнилась, она вызывает

 программу чистки памяти (сборщик мусора),

 кото-

рая ищет ненужные объекты в «куче». Для этого применяется сложный алгоритм.

Ненужные объекты отбрасываются, чтобы освободить место в «куче». Схема дей-

ствия автоматической программы чистки памяти полностью отличается от исполь-
зования стека локальных переменных. Эти два метода находятся в отношении до-

полнительности; каждый из них имеет свое место.

JVM не содержит регистров общего назначения, которые могут загружаться или

сохраняться под управлением программы. Это машина со стековой организацией.

Хотя для наших дней это необычно, такая машина дает простую архитектуру ко-

манд, которую легко компилировать.

Однако у машины со стековой организацией есть один недостаток: здесь тре-

буется большое количество обращений к памяти. Но, как мы видели в разделе

«Микроархитектура процессора picojava II» главы 4, при умелой разработке мож-

но устранить большую часть из них путем свертывания команд JVM. Более того,

поскольку данная архитектура очень проста, ее можно реализовать в небольшом

кусочке кремния, оставив большую часть пространства микросхемы свободной

для кэш-памяти первого уровня, которая в дальнейшем сократит число обращений

к основной памяти. (Размер кэш-памяти picojava II составляет максимум 16 Кбайт +

16 Кбайт, поскольку основной целью было создание дешевой микросхемы.)

Типы данных

Всем компьютерам нужны данные. Для многих компьютерных систем основной

задачей является обработка финансовых, промышленных, научных, технических

и других данных. Внутри компьютера данные должны быть представлены в какой-
либо особой форме. На уровне архитектуры команд используются различные типы
данных. Они будут описаны ниже.

Ключевым вопросом является вопрос о том, существует ли аппаратная поддер-

жка для конкретного типа данных. Под аппаратной поддержкой подразумевается,
что одна или несколько команд ожидают данные в определенном формате

 и

 пользо-


background image

3 5 0 Глава 5. Уровень архитектуры команд

ватель не может брать другой формат. Например, бухгалтеры привыкли писать

знак «минус» справа у отрицательных чисел, а специалисты по вычислительной

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

ла во всех компьютерах, чтобы знаковый бит был самым правым битом (а не са-

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

Теперь рассмотрим другую бухгалтерскую фирму, которая только что заключи-

ла договор на проверку федерального долга. 32-битная арифметика здесь не подой-
дет, поскольку числа превышают 2

32

 (около 4 миллиардов). Одно из возможных

решений — использовать два 32-битных целых числа для представления каждого

числа, то есть все 64 бита. Если машина не поддерживает такие

 числа с удвоенной

точностью,

 то все арифметические операции над ними должны выполняться про-

граммным обеспечением, но эти две части могут располагаться в произвольном
порядке, поскольку для аппаратного обеспечения это не важно. Это пример типа

данных без аппаратной поддержки и, следовательно, без аппаратной реализации.

В следующих разделах мы рассмотрим типы данных, которые поддерживаются

аппаратным обеспечением и для которых требуются специальные форматы.

Числовые типы данных

Типы данных можно разделить на две категории: числовые и нечисловые. Среди
числовых типов данных главными являются целые числа. Они бывают различной
длины: обычно 8,16,32 и 64 бита. Целые числа применяются для подсчета различ-
ных предметов (например, они показывают, сколько на складе имеется отверток),

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

ся в двоичной записи, хотя в прошлом использовались и другие системы. Двоич-
ные числа обсуждаются в приложении А.

Некоторые компьютеры поддерживают целые числа и со знаком, и без знака.

В целом числе без знака нет знакового бита, и все биты содержат данные. Этот тип

данных имеет преимущество: у него есть дополнительный бит, поэтому 32-битное

слово может содержать целое число без знака от 0 до 2

л

-1 включительно. Двоич-

ное целое число со знаком, напротив, может содержать числа только до 2

3 1

-1, но

зато включает и отрицательные числа.

Для выражения нецелых чисел (например, 3,5) используются числа с плаваю-

щей точкой. Они обсуждаются в приложении Б. Их длина составляет 32,64, а иногда
и 128 битов. В большинстве компьютеров есть команды для выполнения операций
с числами с плавающей точкой. Во многих компьютерах имеются отдельные реги-

стры для целочисленных операндов и для операндов с плавающей точкой.

Некоторые языки программирования, в частности COBOL, допускают в каче-

стве типа данных десятичные числа. Машины, предназначенные для программ на

языке COBOL, часто поддерживают десятичные числа в аппаратном обеспечении,


background image

Типы данных 351

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

ды должны знать выход переноса бита 3. Вот почему код условия часто содержит

бит служебного переноса. Между прочим, проблема 2000 года была вызвана про-
граммистами на языке COBOL, которые решили, что дешевле будет представлять
год в виде двух десятичных разрядов, а не в виде 16-битного двоичного числа.

Нечисловые типы данных

Хотя самые первые компьютеры работали в основном с числами, современные ком-

пьютеры часто используются для нечисловых приложений, например, для обра-
ботки текстов или управления базой данных. Для этих приложений нужны дру-
гие, нечисловые, типы данных. Они часто поддерживаются командами уровня
архитектуры команд. Здесь очень важны символы, хотя не каждый компьютер
обеспечивает аппаратную поддержку для них. Наиболее распространенными
символьными кодами являются ASCII и UNICODE. Они поддерживают 7-бит-

ные и 16-битные символы соответственно. Эти коды обсуждались в главе 2.

На уровне команд часто имеются особые команды, предназначенные для опе-

раций с цепочками символов. Эти цепочки иногда разграничиваются специаль-

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

Кроме того, важны значения булевой алгебры. Этих значений два: истина и ложь.

Теоретически булево значение может представлять один бит: 0 — ложь, а 1 — истина

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

Единственная ситуация, в которой булево значение представлено 1 битом, —

это когда имеется целый массив бит и 32-битное слово может содержать 32 буле-

вых значения. Такая структура данных называется битовым отображением. Она
встречается в различных контекстах. Например, битовое отображение может ис-
пользоваться для того, чтобы следить за свободными блоками на диске. Если диск
содержит п блоков, тогда битовое отображение содержит п битов.

Последний тип данных — это указатели, которые представляют собой машин-

ные адреса. Мы уже неоднократно рассматривали указатели. В машинах Mic-д: ре-
гистры SP, PC, LV и СРР — это примеры указателей. Доступ к переменной на фик-
сированном расстоянии от указателя (а именно так работает команда I LOAD) широко

применяется на всех машинах.

Типы данных процессора Pentium II

Pentium II поддерживает двоичные целые числа со знаком, целые числа без знака,

числа двоично-десятичной системы счисления и числа с плавающей точкой по стан-
дарту IEEE 754 (табл. 5.2). Эта машина является 8-, 16-разрядной и оперирует с


background image

3 5 2 Глава 5. Уровень архитектуры команд

целыми числами такой длины. У нее имеются многочисленные арифметические
команды, булевы операции и операции сравнения. Операнды необязательно долж-

ны быть выровнены в памяти, но если адреса слов кратны 4 байтам, то наблюдает-

ся более высокая производительность.

Таблица 5.2. Числовые типы данных процессора Pentium II. Поддерживаемые типы

отмечены крестом (х)

Тип 8 битов 16 битов 32 бита 64 бита 128 битов

Целые числа со знаком
Целые числа без знака

Двоично-десятичные целые числа

Числа с плавающей точкой

X

X

X

X

X

X

X

X

Pentium II также может манипулировать 8-разрядными символами ASCII:

существуют специальные команды для копирования и поиска цепочек символов.

Эти команды используются и для цепочек, длина которых известна заранее, и для
цепочек, в конце которых стоит специальный маркер. Они часто используются
в библиотеках операций над строками.

Типы данных машины UltraSPARC II

UltraSPARC II поддерживает широкий ряд форматов данных (табл. 5.3). Эта
машина может поддерживать 8-, 16-, 32- и 64-битные целочисленные операнды со

знаком и без знака. Целые числа со знаком используют дополнительный код. Кроме
того, имеются операнды с плавающей точкой по 32,64 и 128 битов, которые соответ-

ствуют стандарту ШЕЕ 754 (для 32-битных и 64-битных чисел). Двоично-десятич-
ные числа не поддерживаются. Все операнды должны быть выровнены в памяти.

Таблица 5.3.

 Числовые типы данных компьютера UltraSPARC II

Тип 8 битов 16 битов 32 бита 64 бита 128 битов

Целые числа со знаком
Целые числа без знака

Двоично-десятичные целые числа

Числа с плавающей точкой

X

X

X

X

X

X

X

X

X

X

UltraSPARC II представляет собой регистровую структуру, и почти все коман-

ды оперируют с 64-разрядными регистрами. Символьные и строковые типы дан-

ных специальными командами аппаратного обеспечения не поддерживаются.

Типы данных виртуальной машины Java

Java — это язык со строгим контролем типов. Это значит, что каждый операнд

имеет особый тип и размер, который известен в период компиляции. Это отраже-
но в типах, поддерживаемых JVM. JVM поддерживает числовые типы, приве-

денные в табл.

 5Л.

 Целые числа со знаком используют дополнительный код.