Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Устранение избыточной загрузки указателей

В определенных ситуациях генератор кода Borland Pascal может

устранить избыточные инструкции загрузки указателей, уменьшая тем

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

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

постоянным на участке линейного кода (кода, не содержащего пере-

ходов на него), и когда указатель уже загружен в пару регистров

(например, ES:DI), генератор кода устраняет ненужные загрузки

указателей в блоке кода.

Указатель считается константой, если он получается из пара-

метра-переменной (параметры-переменные всегда передаются как ука-

затели) или из ссылки на переменную оператор with. Поэтому опера-

тор with часто является более эффективным (но никогда не будет

менее эффективным), чем запись для каждой ссылки на элемент пол-

ностью уточненной переменной.

Подстановка констант множественного типа

Когда правая часть оператор in является константой множест-

венного типа, компилятор генерирует включение проверки с помощью

команд CMP. Такие поставляемые проверки более эффективны чем код,

генерируемый в противном случае соответствующими булевскими выра-

жениями с использованием операций отношения. Например, оператор:

if ((Ch >= 'A') and (Ch <: 'Z')) or

((Ch >= 'a') and (Ch <= 'z')) then ...;

менее читаем и менее эффективен чем

if Ch in ['A'..'Z', 'a'..'z'] then ...;

Поскольку свертывание констант применяется к константам мно-

жественного типа также как к константам других типов, можно ис-

пользовать описания const без потери эффективности.

const

Upper = ['A'..'Z'];

Lower = ['a'..'z'];

Alpha = Upper + Lower;

С учетом данных описаний оператор if генерирует тот же код,

что и в случае предыдущего оператор if:

if Ch in Alpha then ... ;

Малые множества

Для операций с малыми множествами компилятор генерирует

очень эффективный код. Малое множество - это множество с нижним

порядковым значением в диапазоне 0..7 и верхним порядковым значе-

нием в диапазоне 0..15. Например, следующие множества TByteSet и

TWordSet являются малыми множествами:

type

TByteSet = set of 0..7;

TWordSet = set of 0..15;

Операции с малыми множествами, такие как объединение (+),

разность (-), пересечение (*) и проверка на включение in генери-

руют с помощью операций AND, OR, NOT и TEST вместо вызова библио-

тек исполняющей системы инструкции машинного кода. Аналогично,

стандартные процедуры Include и Exclude генерируют при применении

к малым множествам поставляемый код.

Порядок вычисления

Стандартами Паскаля допускается, что операнды в выражении

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

писаны (слева направо). Например, оператор:

I := F(J) div G(J)

где F и G - функции целого типа, приводит к тому, что G вычисля-

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

чить более оптимальный объектный код. Важно, поэтому, чтобы выра-

жение никогда не зависело от какого-то конкретного порядка

вычисления встроенных функций. Если вернуться к предыдущему при-

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

но использовать временную переменную:

T := F(J);

I := T div G(J);

Исключением из этого правила является вычисление по короткой

схеме (разрешенное директивой компилятора {$B-}, при котором опе-

ранды булевского типа, связанные операциями and или оr, всегда

вычисляются слева направо.

Соседние файлы в предмете Программирование на Pascal