Алексей Молчанов - Системное программное обеспечение. Лабораторный практикум
- Название:Системное программное обеспечение. Лабораторный практикум
- Автор:
- Жанр:
- Издательство:Array Издательство «Питер»
- Год:2005
- Город:Санкт-Петербург
- ISBN:978-5-469-00391-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Молчанов - Системное программное обеспечение. Лабораторный практикум краткое содержание
Книга ориентирована на студентов, обучающихся в технических вузах по специальностям, связанным с вычислительной техникой. Но она будет также полезна всем, чья деятельность так или иначе касается разработки программного обеспечения.
Системное программное обеспечение. Лабораторный практикум - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
end;
function TTriad.MakeString(i: integer): string;
begin
Result:= Format(%d: #9 %s (%s, %s),
[i+1,TriadStr[TriadType],
GetOperStr(Opers[1]), GetOperStr(Opers[2])]);
end;
destructor TTriadList.Destroy;
{ Деструктор для удаления списка триад }
begin
Clear; { Очищаем список триад }
inherited Destroy; {Вызываем деструктор базового класса}
end;
procedure TTriadList.Clear;
{ Процедура очистки списка триад }
var i: integer;
begin { Освобождаем память для всех триад из списка }
for i:=Count-1 downto 0 do TTriad(Items[i]). Free;
inherited Clear; { Вызываем функцию базового класса }
end;
procedure TTriadList.DelTriad(iIdx: integer);
{ Функция удаления триады из списка триад }
begin
if iIdx < Count-1 then { Если это не последняя триада,
переставляем флаг ссылки на предыдущую (если флаг есть)}
TTriad(Items[iIdx+1]). IsLinked:=
TTriad(Items[iIdx+1]). IsLinked
or TTriad(Items[iIdx]). IsLinked;
TTriad(Items[iIdx]). Free; { Освобождаем память триады }
Delete(iIdx); { Удаляем ссылку на триаду из списка }
end;
function TTriadList.GetTriad(iIdx: integer): TTriad;
{ Функция выборки триады из списка по ее номеру }
begin Result:= TTriad(Items[iIdx]); end;
procedure TTriadList.WriteToList(list: TStrings);
{ Процедура вывода списка триад в список строк
для отображения списка триад }
var i,iCnt: integer;
begin
list.Clear; { Очищаем список строк }
iCnt:= Count-1;
for i:=0 to iCnt do { Для всех триад из списка триад }
{ Формируем строковое представление триады
и добавляем его в список строк }
list.Add(TTriad(Items[i]). MakeString(i));
end;
procedure DelTriadTypes(listTriad: TTriadList;
TrdType: TTriadType);
{ Процедура удаления из списка триад заданного типа }
var
i,j,iCnt,iDel: integer;
listNum: TList;
Trd: TTriad; { Список запоминания изменений индексов }
begin
iDel:= 0; { В начале изменение индекса нулевое }
iCnt:= listTriad.Count-1;
{ Создаем список запоминания изменений индексов триад }
listNum:= TList.Create;
try
for i:=0 to iCnt do { Для всех триад списка выполняем }
begin { запоминание изменений индекса }
{ Запоминаем изменение индекса данной триады }
listNum.Add(TObject(iDel));
{Если триада удаляется, увеличиваем изменение индекса}
if listTriad[i].TriadType = TrdType then Inc(iDel);
end;
for i:=iCnt downto 0 do { Для всех триад списка }
begin { изменяем индексы ссылок }
Trd:= listTriad[i];
{ Если эта триада удаляемого типа, то удаляем ее }
if Trd.TriadType = TrdType then listTriad.DelTriad(i)
else { Иначе для каждого операнда триады смотрим,
не является ли он ссылкой }
for j:=1 to 2 do
if Trd[j].OpType = OP_LINK then { Если операнд
является ссылкой на триаду, уменьшаем ее индекс }
Trd.Links[j]:=
Trd.Links[j] – integer(listNum[Trd.Links[j]]);
end;
finally listNum.Free; { Уничтожаем временный список }
end;
end;
end.
Модуль, реализующий алгоритмы оптимизации списков триад
unit TrdOpt;
interface
{ Модуль, реализующий два алгоритма оптимизации:
– оптимизация путем свертки объектного кода;
– оптимизация за счет исключения лишних операций. }
uses Classes, TblElem, LexElem, TrdType, Triads;
type {Информационная структура для таблицы идентификаторов,
предназначенная для алгоритма свертки объектного кода}
TConstInfo = class(TAddVarInfo)
protected
iConst: longint; { Поле для записи значения переменной }
{ Конструктор для создания структуры }
constructor Create(iInfo: longint);
public { Функции для чтения и записи информации }
function GetInfo(iIdx: integer): longint; override;
procedure SetInfo(iIdx: integer; iInf: longint);
override;
end;
{Информационная структура для таблицы идентификаторов,
предназначенная для алгоритма исключения лишних операций}
TDepInfo = class(TAddVarInfo)
protected
iDep: longint; { Поле для записи числа зависимости }
{ Конструктор для создания структуры }
constructor Create(iInfo: longint);
public { Функции для чтения и записи информации }
function GetInfo(iIdx: integer): longint; override;
procedure SetInfo(iIdx: integer; iInfo: longint);
override;
end;
{ Процедура оптимизации методом свертки объектного кода }
procedure OptimizeConst(listTriad: TTriadList);
{ Процедура оптимизации путем исключения лишних операций }
procedure OptimizeSame(listTriad: TTriadList);
implementation
uses SysUtils, FncTree, LexType, TrdCalc;
constructor TConstInfo.Create(iInfo: longint);
{ Создание структуры для свертки объектного кода }
begin
inherited Create; {Вызываем конструктор базового класса}
iConst:= iInfo; { Запоминаем информацию }
end;
procedure TConstInfo.SetInfo(iIdx: integer; iInf: longint);
{ Функция записи информации }
begin iConst:= iInfo; end;
function TConstInfo.GetInfo(iIdx: integer): longint;
{ Функция чтения инфоримации }
begin Result:= iConst; end;
function TestOperConst(Op: TOperand; listTriad: TTriadList;
var iConst: integer): Boolean;
{ Функция проверки того, что операнд является константой
и получения его значения в переменную iConst }
var pInfo: TConstInfo;
begin
Result:= False;
case Op.OpType of { Выборка по типу операнда }
OP_CONST: { Если оператор – константа, то все просто }
begin
iConst:= Op.ConstVal; Result:= True;
end;
OP_VAR: { Если оператор – переменная, }
begin { тогда проверяем наличие у нее
информационной структуры, }
pInfo:= TConstInfo(Op.VarLink.Info);
if pInfo <> nil then {и если такая структура есть,}
begin {берем ее значение}
iConst:= pInfo[0]; Result:= True;
end;
end;
OP_LINK: { Если оператор – ссылка на триаду, }
begin { то он является константой,
если триада имеет тип «CONST» }
if listTriad[Op.TriadNum].TrdType = TRD_CONST
then begin
iConst:= listTriad[Op.TriadNum][1].ConstVal;
Result:= True;
end;
end;
end{case};
end;
procedure OptimizeConst(listTriad: TTriadList);
{ Процедура оптимизации методом свертки объектного кода }
var
i,j,iCnt,iOp1,iOp2: integer;
Ops: TOpArray;
Trd: TTriad;
begin
{ Очищаем информационные структуры таблицы идентификаторов }
ClearTreeInfo; { Заполняем операнды триады типа «CONST» }
Ops[1].OpType:= OP_CONST;
Ops[2].OpType:= OP_CONST;
Ops[2].ConstVal:= 0;
iCnt:= listTriad.Count-1;
for i:=0 to iCnt do { Для всех триад списка }
begin { выполняем алгоритм }
Trd:= listTriad[i];
if Trd.TrdType in TriadLineSet then
begin { Если любой операнд линейной триады ссылается
на триаду «CONST», берем и запоминаем ее значение }
for j:=1 to 2 do
if (Trd[j].OpType = OP_LINK)
and (listTriad[Trd.Links[j]].TrdType = TRD_CONST)
then begin
Trd.OpTypes[j]:= OP_CONST;
Trd.Values[j]:=
listTriad[Trd.Links[j]][1].ConstVal;
end;
end
else
if Trd.TrdType = TRD_IF then
begin { Если первый операнд условной триады ссылается
на триаду «CONST», берем и запоминаем ее значение }
if (Trd[1].OpType = OP_LINK)
and (listTriad[Trd.Links[1]].TrdType = TRD_CONST)
then begin
Trd.OpTypes[1]:= OP_CONST;
Trd.Values[1]:=
listTriad[Trd.Links[1]][1].ConstVal;
end;
end
else
if Trd.TrdType = TRD_ASSIGN then
begin { Если второй операнд триады присвоения ссылается
Читать дальшеИнтервал:
Закладка: