(Deitel, 2003) Considere o programa escrito em Simpletron Machine Language.
Posição | Palavra | Instrução |
---|---|---|
00 | +1010 | read A |
01 | +2010 | load A |
02 | +4208 | branch zero to 08 |
03 | +3111 | subtract B |
04 | +4100 | branch negative to 00 |
05 | +2010 | load A |
06 | +2111 | store B |
07 | +4000 | branch to 00 |
08 | +1111 | write B |
09 | +4300 | halt |
10 | +0000 | variable A |
11 | +0000 | variable B |
Com base no programa apresentado, avalie as assertivas a seguir.
A respeito dessas asserções, assinale a alternativa correta.
a. apenas as assertivas I e II.
b. apenas as assertivas I e III.
c. apenas as assertivas II e III.
d. apenas as assertivas II e IV.
e. apenas as assertivas III e IV.
(POSCOMP, 2017) Uma representação intermediária do programa fonte pode ser gerada com a transformação da árvore de derivação em um segmento de código. Em relação à etapa de geração de código intermediário do compilador, analise as seguintes assertivas.
A análise permite concluir que:
a. apenas a assertiva I está correta.
b. apenas a assertiva II está correta.
c. apenas a assertiva III está correta.
d. apenas as assertivas I e II estão corretas.
e. apenas as assertivas II e III estão corretas.
(Price, 2005) A notação tradicional para expressões aritméticas, que representa uma operação binária na forma x + y, ou seja, com o operador entre seus dois operandos, é conhecida como notação infixada. Uma notação alternativa para esse tipo de expressão é a notação pré-fixada, na qual o operador é expresso antes de seus operandos, como por exemplo, + x y. Outra notação alternativa é a notação pós-fixada, na qual o operador é expresso após seus operandos, como por exemplo, x y +. O atrativo das notações pré-fixada e pós-fixada é que elas dispensam o uso de parênteses ao adotar a noção de pilha para a representação das expressões. Analise as assertivas a seguir, considerando a gramática livre de contexto G₃.
G₃ = ({A, E, T, F, V}, {a, b, c, d, e, f, g, =, +, -, *, /, (, )}, P₃, A)
P₃ = {A → V=E
E → T+E | T-E | T
T → F*T | F/T | F
F → (E) | V
V → a | b | c | d | e | f | g}
Quais das assertivas apresentadas estão corretas?
a. apenas as assertivas I e II.
b. apenas as assertivas I e III.
c. apenas as assertivas II e III.
d. apenas as assertivas II e IV.
e. apenas as assertivas III e IV.
Os principais requisitos impostos a geradores de código objeto são os seguintes: a) o código gerado deve ser correto e de alta qualidade; b) o código deve fazer uso efetivo dos recursos da máquina e; c) o código gerado deve executar eficientemente. O problema de gerar código ótimo é insolúvel (indecidível) como tantos outros. Na prática, devemos contentar-nos com técnicas heurísticas que geram bom código (não necessariamente ótimo).
Conforme exposto, qual é o melhor código objeto apresentado para a instrução x = (a + b) / (b + c) / (c - d)
a.
LOAD a, R0
LOAD b, R1
ADD R1, R0
LOAD c, R2
ADD R2, R1
DIV R0, R1
LOAD d, R1
SUB R1, R2
DIV R2, R0
STORE R0, x
b.
LOAD a, R0
LOAD b, R1
ADD R1, R0
LOAD c, R2
ADD R1, R2
DIV R0, R1
LOAD d, R1
SUB R1, R2
DIV R2, R0
STORE R0, x
c.
LOAD a, R0
LOAD b, R1
ADD R1, R0
LOAD c, R2
ADD R2, R1
DIV R1, R0
LOAD d, R1
SUB R1, R2
DIV R0, R2
STORE R2, x
d.
LOAD a, R0
LOAD b, R1
ADD R1, R0
LOAD c, R2
ADD R2, R1
DIV R1, R0
LOAD d, R1
SUB R2, R1
DIV R2, R0
STORE R0, x
e.
LOAD a, R0
LOAD b, R1
ADD R1, R0
LOAD c, R2
ADD R2, R1
DIV R1, R0
LOAD d, R1
SUB R1, R2
DIV R2, R0
STORE R0, x
(Price, 2005) Considere o seguinte programa escrito na sintaxe C:
void xpto(int a, int b, int c)
{
a = b + c;
b = b * c;
}
void main()
{
int x;
int y;
scanf("%d", &x);
scanf("%d", &y);
xpto(x, y, x + y);
printf("%d", x);
printf("%d", y);
}
Com base no programa apresentado, avalie as asserções a seguir.
A respeito dessas asserções, assinale a alternativa correta.
a. apenas as assertivas I e II.
b. apenas as assertivas I e III.
c. apenas as assertivas II e III.
d. apenas as assertivas II e IV.
e. apenas as assertivas III e IV.
A fase de otimização do código intermediário vem logo após a fase de geração desse código e tem por objetivo tornar o código intermediário mais apropriado para a produção de código objeto (código de máquina) eficiente, tanto em relação ao tamanho como ao tempo de execução. Uma das técnicas de otimização de código intermediário consiste em identificar segmentos sequencias do programa, chamados blocos básicos, e representá-los através de grafos dirigidos e submetê-los a um processo de otimização. Apresente o código de três endereços não otimizado da seguinte sequência de comandos, sobre a gramática livre de contexto abaixo.
x = a - b + c;
y = (a - b) / (c - d + e);
z = (c - d) * (a - b);
G = ({A, E, T, F, V}, {a, b, c, d, e, f, x, y, z, =, +, -, *, /, (, )}, P, A)
P = {A → V=E
E → E+T | E-T | T
T → T*F | T/F | F
F → (E) | V
V → a | b | c | d | e | f | x | y | z}
oper | arg1 | arg2 | result | |
---|---|---|---|---|
(0) | - | a | b | T1 |
(1) | + | T1 | c | T2 |
(2) | = | T2 | x | |
(3) | - | a | b | T3 |
(4) | - | c | d | T4 |
(5) | + | T4 | e | T5 |
(6) | / | T3 | T5 | T6 |
(7) | = | T6 | y | |
(8) | - | c | d | T7 |
(9) | - | a | b | T8 |
(10) | * | T7 | T8 | T9 |
(11) | = | T9 | z |
Um grafo acíclico dirigido também é uma representação intermediária de um compilador, sendo utilizado para a identificação de subexpressões comuns existentes no mesmo bloco básico. Diante disso, apresente o grafo acíclico dirigido para blocos básicos, do código de três endereços não otimizado elaborado na Questão 6.
Com o grafo acíclico dirigido para blocos básicos produzido na Questão 7, onde foram identificados as subexpressões comuns existentes no bloco básico considerado, apresente o código de três endereços otimizado, o qual futuramente será convertido em código objeto.
oper | arg1 | arg2 | result | |
---|---|---|---|---|
(0) | - | a | b | T1 |
(1) | + | T1 | c | T2 |
(2) | = | T2 | x | |
(3) | - | c | d | T3 |
(4) | + | T3 | e | T4 |
(5) | / | T1 | T4 | T5 |
(6) | = | T5 | y | |
(7) | * | T3 | T1 | T6 |
(8) | = | T6 | z |