Методические указания (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. Представление оптимизированного промежуточного кода в виде синтаксического дерева, преобразованного из четверок.
-
Тройки -> синтаксическое дерево















