Ybadoo - Soluções em Software Livre
Turmas
1º Semestre de 2018

Questão 01

(Deitel, 2003) Considere o programa escrito em Simpletron Machine Language.

Programa em Simpletron Machine Language
PosiçãoPalavraInstrução
00+1010read A
01+2010load A
02+4208branch zero to 08
03+3111subtract B
04+4100branch negative to 00
05+2010load A
06+2111store B
07+4000branch to 00
08+1111write B
09+4300halt
10+0000variable A
11+0000variable B

Com base no programa apresentado, avalie as assertivas a seguir.

  1. Caso os valores fornecidos pelo usuário sejam 1, 2, 3 e 0, o valor impresso pelo programa será 3.
  2. Caso os valores fornecidos pelo usuário sejam 3, 2, 1 e 0, o valor impresso pelo programa será 3.
  3. Caso os valores fornecidos pelo usuário sejam 1, 2, 3 e 0, o valor impresso pelo programa será 0.
  4. Caso os valores fornecidos pelo usuário sejam 3, 2, 1 e 0, o valor impresso pelo programa será 1.

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.

Questão 02

(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.

  1. Uma das vantagens da aplicação da fase de geração de código intermediário é a possibilidade de realização de otimização e a tradução do código para diversas máquinas.
  2. Árvores de sintaxe e códigos de três endereços são algumas das possibilidades de representação intermediária.
  3. Na geração de código intermediário, são realizadas tarefas como seleção de instruções, alocação e atribuição de registrador e escalonamento de instruções que dependem do conhecimento da máquina-alvo para a qual será gerado o código objeto.

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.

Questão 03

(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}
  1. A notação pré-fixada da expressão aritmética x = a * b + c * d - e * f é = x + * a b - * c d * e f.
  2. A notação pré-fixada da expressão aritmética x = a * b + c * d - e * f é = x - + * a b * c d * e f.
  3. A notação pós-fixada da expressão aritmética x = a + a * (b - c) + (b - c) * d é x a a b c - * b c - d * + + =.
  4. A notação pós-fixada da expressão aritmética x = a + a * (b - c) + (b - c) * d é x a a b c - * + b c - d * + =.

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.

Questão 04

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

Questão 05

(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.

  1. Caso os valores fornecidos pelo usuário sejam 5 e 6 e os parâmetros sejam passados por valor, os valores impressos serão 5 e 6.
  2. Caso os valores fornecidos pelo usuário sejam 1 e 2 e os parâmetros sejam passados por referência, os valores impressos serão 3 e 6.
  3. Caso os valores fornecidos pelo usuário sejam 2 e 3 e os parâmetros sejam passados por nome, os valores impressos serão 8 e 33.
  4. Caso os valores fornecidos pelo usuário sejam 3 e 4 e os parâmetros sejam passados por valor-resultado, os valores impressos serão 10 e 28.

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.

Questão 06

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}
Código de três endereços, representado por quádruplas
 operarg1arg2result
(0)-abT1
(1)+T1cT2
(2)=T2 x
(3)-abT3
(4)-cdT4
(5)+T4eT5
(6)/T3T5T6
(7)=T6 y
(8)-cdT7
(9)-abT8
(10)*T7T8T9
(11)=T9 z

Questão 07

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.

Grafo acíclico dirigido
Grafo acíclico dirigido

Questão 08

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.

Código de três endereços, representado por quádruplas
 operarg1arg2result
(0)-abT1
(1)+T1cT2
(2)=T2 x
(3)-cdT3
(4)+T3eT4
(5)/T1T4T5
(6)=T5 y
(7)*T3T1T6
(8)=T6 z