Методические указания (1114907), страница 14
Текст из файла (страница 14)
int f = 4;
char[] useless = “bad string”;
int x = f;
int j;
for (int i = 0; i < strlen(str); i++) {
scanf(“%d”, &j);
int k = x * j;
printf(“%c - %d”, str[x * j], k);
}
char[] str = “something”;
int f = 4;
char[] useless = “bad string”;
int x = f;
int j;
for (int i = 0; i < strlen(str); i++) {
scanf(“%d”, &j);
int k = x * j;
printf(“%c - %d”, str[k], k);
}
-
Проведем распространение копий для последующей оптимизации путем удаления бесполезного кода



char[] str = “something”;
int f = 4;
char[] useless = “bad string”;
int x = f;
int j;
for (int i = 0; i < strlen(str); i++) {
scanf(“%d”, &j);
int k = x * j;
printf(“%c - %d”, str[k], k);
}
char[] str = “something”;
int f = 4;
char[] useless = “bad string”;
int x = f;
int j;
for (int i = 0; i < strlen(str); i++) {
scanf(“%d”, &j);
int k = f * j;
printf(“%c - %d”, str[k], k);
}
-
Удалим бесполезный код
char[] str = “something”;
int f = 4;
char[] useless = “bad string”;
int x = f;
int j;
for (int i = 0; i < strlen(str); i++) {
scanf(“%d”, &j);
int k = f * j;
printf(“%c - %d”, str[k], k);
}
char[] str = “something”;
int f = 4;
int j;
for (int i = 0; i < strlen(str); i++) {
scanf(“%d”, &j);
int k = f * j;
printf(“%c - %d”, str[k], k);
}
Запишем полученный оптимизированный промежуточный код.
-
В виде синтаксического дерева.
Рис. 5.5. Представление оптимизированного промежуточного кода в виде синтаксического дерева
-
В виде дага.
Рис. 5.6. Представление оптимизированного промежуточного кода в виде дага
-
В виде четверок.
Ячейки памяти для констант
Номер ячейки | Значение |
D01 | “something” |
D02 | “%d” |
D03 | “%c - %d” |
Op | arg1 | arg2 | result | |
(0) | assign | D01 | str | |
(1) | assign | 4 | f | |
(2) | assign | 0 | i | |
(3) | param | str | ||
(4) | call | strlen | 1 | t1 |
(5) | < | i | t1 | t2 |
(6) | if | t2 | (8) | |
(7) | goto | (22) | ||
(8) | param | D02 | ||
(9) | & | j | t3 | |
(10) | param | t3 | ||
(11) | call | scanf | 2 | |
(12) | * | j | f | t4 |
(13) | assign | t4 | k | |
(14) | param | D03 | ||
(15) | [] | str | k | t5 |
(16) | param | t5 | ||
(17) | param | k | ||
(18) | call | printf | 3 | |
(19) | + | i | 1 | t6 |
(20) | assign | t6 | i | |
(21) | goto | (3) | ||
(22) |
-
В виде троек.
Ячейки памяти для констант
Номер ячейки | Значение |
D01 | “something” |
D02 | “%d” |
D03 | “%c - %d” |
op | arg1 | arg2 | |
(0) | assign | str | D01 |
(1) | assign | f | 4 |
(2) | assign | i | 0 |
(3) | param | str | |
(4) | call | strlen | 1 |
(5) | < | i | (4) |
(6) | if | (5) | (8) |
(7) | goto | (22) | |
(8) | param | D02 | |
(9) | & | j | |
(10) | param | (9) | |
(11) | call | scanf | 2 |
(12) | * | j | f |
(13) | assign | k | (12) |
(14) | param | D03 | |
(15) | [] | str | k |
(16) | param | (15) | |
(17) | param | k | |
(18) | call | printf | 3 |
(19) | + | i | 1 |
(20) | assign | i | (19) |
(21) | goto | (3) | |
(22) |
-
В виде косвенных троек.
Ячейки памяти для констант
Номер ячейки | Значение |
D01 | “something” |
D02 | “%d” |
D03 | “%c - %d” |
Непосредственно тройки.
Op | arg1 | arg2 | |
(30) | assign | str | D01 |
(31) | assign | f | 4 |
(32) | assign | i | 0 |
(33) | param | str | |
(34) | call | strlen | 1 |
(35) | < | i | (34) |
(36) | If | (35) | (38) |
(37) | goto | (52) | |
(38) | param | D02 | |
(39) | & | j | |
(40) | param | (39) | |
(41) | call | scanf | 2 |
(42) | * | j | f |
(43) | assign | k | (42) |
(44) | param | D03 | |
(45) | [] | str | k |
(46) | param | (45) | |
(47) | param | k | |
(48) | call | printf | 3 |
(49) | + | i | 1 |
(50) | assign | i | (49) |
(51) | goto | (33) | |
(52) |
Таблица, содержащая ссылки на тройки.
statement | |
(0) | (30) |
(1) | (31) |
(2) | (32) |
(3) | (33) |
(4) | (34) |
(5) | (35) |
(6) | (36) |
(7) | (37) |
(8) | (38) |
(9) | (39) |
(10) | (40) |
(11) | (41) |
(12) | (42) |
(13) | (43) |
(14) | (44) |
(15) | (45) |
(16) | (46) |
(17) | (47) |
(18) | (48) |
(19) | (49) |
(20) | (50) |
(21) | (51) |
(22) | (52) |
-
Запись оптимизированного кода в другом формате.
-
Синтаксическое дерево -> даг
-
Синтаксическое дерево -> четверки
-
Синтаксическое дерево -> тройки
-
Синтаксическое дерево -> косвенные тройки
-
Даг -> синтаксическое дерево
-
Даг -> четверки
-
Даг -> тройки
-
Даг -> косвенные тройки
-
Четверки -> тройки
-
Четверки -> косвенные тройки
-
Тройки -> четверки
-
Тройки -> косвенные тройки
-
Косвенные тройки -> четверки
-
Косвенные тройки -> тройки
При проведении описанных выше преобразований промежуточный код будет выглядеть точно так же, как и в п.3. задачи.
-
Четверки -> синтаксическое дерево
Рис. 5.7. Представление оптимизированного промежуточного кода в виде синтаксического дерева, преобразованного из четверок.
-
Тройки -> синтаксическое дерево