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

Questão 01

(Deitel, 2003) Analise as assertivas a seguir sobre o programa escrito em Simpletron Machine Language apresentado abaixo.

Programa em Simpletron Machine Language
PosiçãoPalavraInstrução
00+1017read A
01+2017load A
02+4114branch negative to 14
03+4214branch zero to 14
04+3317multiply A
05+3018add B
06+2118store B
07+2017load A
08+3016add -1
09+2117store A
10+4212branch zero to 12
11+4004branch to 04
12+1118write B
13+4300halt
14+1116write -1
15+4300halt
16-0001constant -1
17+0000variable A
18+0000variable B
  1. Caso o valor fornecido pelo usuário para a variável A seja 0, o valor impresso pelo programa será -1.
  2. Caso o valor fornecido pelo usuário para a variável A seja 4, o valor impresso pelo programa será 30.
  3. Caso o valor fornecido pelo usuário para a variável A seja 5, o valor impresso pelo programa será 15.
  4. Caso o valor fornecido pelo usuário para a variável A seja 6, o valor impresso pelo programa será 36.

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 02

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

G2 = ({A, E, T, F, V}, {a, b, c, d, e, f, x, =, +, -, *, /, (, )}, P2, A)
P2 = {AV=E
EE+T | E-T | T
TT*F | T/F | F
F → (E) | V
V → a | b | c | d | e | f | x}
  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 - (b - a * (c + b / d)) é x a b a c b d - - * + / =
  4. A notação pós-fixada da expressão aritmética x = a - (b - a * (c + b / d)) é x a b a c b 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 03

O código de três endereços é composto por uma sequência de instruções envolvendo operações binárias ou unárias e uma atribuição. O nome três endereços está associado à especificação, em uma instrução, de no máximo três variáveis: duas para os operadores binários e uma para o resultado. Assim, expressões envolvendo diversas operações são decompostas nesse código em uma série de instruções, eventualmente com a utilização de variáveis temporárias introduzidas na tradução. Dessa forma, obtém-se um código mais próximo da estrutura da linguagem assembly, e consequentemente, de mais fácil conversão para a linguagem alvo. O código de três endereços apresentado a seguir é equivalente a qual expressão aritmética.

Código de três endereços, representado por triplas
 operarg1arg2
(0)+ab
(1)-ab
(2)*(0)(1)
(3)/(1)(0)
(4)-(2)(3)
(5)/(4)(0)
(6)=x(5)

a. x = (((a - b) * (a + b)) - ((a + b) / (a - b))) / (a + b)

b. x = (((a + b) * (a - b)) / ((a - b) / (a + b))) - (a + b)

c. x = (((a + b) / (a - b)) - ((a - b) * (a + b))) / (a + b)

d. x = (((a + b) * (a - b)) - ((a + b) / (a - b))) / (a + b)

e. x = (((a + b) * (a - b)) - ((a - b) / (a + b))) / (a + b)

Questão 04

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

x = a + b + c + d;
y = e * f + a + b;
z = a + b + e * f;
G4 = ({A, E, T, F, V}, {a, b, c, d, e, f, x, y, z, =, +, -, *, /, (, )}, P4, A)
P4 = {AV=E
EE+T | E-T | T
TT*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)+T2dT3
(3)=T3 x
(4)*efT4
(5)+T4aT5
(6)+T5bT6
(7)=T6 y
(8)+abT7
(9)*efT8
(10)+T7T8T9
(11)=T9 z

Questão 05

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

Grafo acíclico dirigido
Grafo acíclico dirigido

Questão 06

Com o grafo acíclico dirigido para blocos básicos produzido na questão 05, 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)+T2dT3
(3)=T3 x
(4)*efT4
(5)+T4aT5
(6)+T5bT6
(7)=T6 y
(8)+T1T4T7
(9)=T7 z

Questão 07

(Sebesta, 2000) Os métodos de passagem de parâmetros são as maneiras pelas quais se transmite parâmetros para subprogramas chamados e/ou de subprogramas chamados. Analise as assertivas a seguir, considerando o programa escrito na sintaxe da linguagem de programação C apresentado abaixo:

void xpto(float a, float b, float c) {
a = c + 2;
b = c + 4;
}

void main() {
float x = 3;
float y = 5;

xpto(x, y, x * y);

printf("%f:%f", x, y);
}
  1. Caso os parâmetros sejam passados por valor, a saída do programa será 17:19.
  2. Caso os parâmetros sejam passados por referência, a saída do programa será 17:19.
  3. Caso os parâmetros sejam passados por nome, a saída do programa será 17:89.
  4. Caso os parâmetros sejam passados por valor-resultado, a saída do programa será 3:5.

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 08

(Aho, 2008) 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). Diante do exposto, o código objeto apresentado a seguir é equivalente a qual comando de atribuição.

LOAD   x, R0
COPY R0, R1
LOAD y, R2
ADD R2, R0
SUB R2, R1
COPY R0, R2
DIV R1, R2
SUB R2, R0
ADD R2, R0
STORE R0, z

a. z = (x + y) - (x + y) / (x - y)

b. z = (x + y) / (x - y) + (x + y) / (x - y)

c. z = (x + y) - (x - y) / (x + y) + (x - y) / (x + y)

d. z = (x + y) - (x + y) / (x - y) + (x + y) / (x - y)

e. z = (x + y) - (x + y) / (x - y) + (x + y) / (x - y) - (x + y)