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


Введение

 


Технологическая цепочка операций по созданию и исполнению новой программы:


Логическая последовательность этапов трансляции

 


Пример: функция, возвращающая наибольший общий делитель своих аргументов

Прямоугольная выноска: Нет в УПИМ (исходный модуль):

int nod( int first, int second ){

            while ( first != second )

                        if ( first < second )

                                    second -= first;

                        else

                                    first -= second;

            return first;

}


ПЛ (последовательность лексем), все числовые индексы условны:

Прямоугольная выноска: Нет в УП 


Во внутреннем представлении:

[0,13] [5,52] [2,2] [0,13] [5,87] [4,2] [0,13] [5,33] [2,3] [2,0] [0,7] [2,2] [5,87] [1,9] [5,33] [2,3] [0,3] [2,2] [5,87] [1,6] [5,33] [2,3] [5,33] [1,2] [5,87] [4,0] [0,4] [5,87] [1,2] [5,33] [1,0] [0,15] [5,87] [1,0] [2,1]

С использованием имен групп слов:

<keyword,13> <ident,52> <bracket,2> <keyword,13> <ident,87> <delimiter,2> <keyword,13> <ident,33> <bracket,3> <bracket,0> <keyword,7> <bracket,2> <ident,87> <operation,9> <ident,33> <bracket,3> <keyword,3> <bracket,2> <ident,87> <operation,6> <ident,33> <bracket,3> <ident,33> <operation,2> <ident,87> <delimiter,0> <keyword,4> <ident,87> <operation,2> <ident,33> <delimiter,0> <keyword,15> <ident,87> <delimiter,0> <bracket,1>

В исходных обозначениях:

int nod ( int first , int second ) { while ( first != second ) if ( first < second ) second -= first ; else first -= second ; return first ; }

ПФЗ (постфиксная запись):

nod int function first int argument second int argument                                                                                                                  – заголовок функции

label_0_0: first second != label_0_1 jmpOnFalse                                                                                                                  – заголовок оператора цикла

first second < label_1_0 jmpOnFalse second first -= label_1_1 jmp label_1_0: first second -= label_1_1:                                                                                                                 – условный оператор

label_0_0 jmp                                                                                                                  – завершение оператора цикла

label_0_1: first return                                                                                                                 – оператор возврата


Прямоугольная выноска: Нет в УППТ (последовательность тетрад):                                                                                                                Последовательность триад:

defineLabel

label_0_0

!=

second

first

push

jmpOnFalse

label_0_1

pop

second

first

push

jmpOnFalse

label_1_0

pop

-=

first

second

second

jmp

label_1_1

defineLabel

label_1_0

-=

second

first

first

defineLabel

label_1_1

jmp

label_0_0

defineLabel

label_0_1

return

First

defineLabel

label_0_0

!=

second

first

jmpOnFalse

label_0_1

pop

second

first

jmpOnFalse

label_1_0

pop

-=

first

second

=

pop

second

jmp

label_1_1

defineLabel

label_1_0

-=

second

first

=

pop

first

defineLabel

label_1_1

jmp

label_0_0

defineLabel

label_0_1

return

First

Последовательность пентад: