Compiladors II - 25002
Junio 2004 (prácticas)

  1. Quants blocs bàsics trobem en el següent programa CoSeL?

Var a;
a=5;
Fun f(x,y) = > {
do {
print(x*3);
{
a=(x-y)/2;
a=a+1;
}
if(a>10) {
x=x+1;
}
Var tmp;
tmp = x * 20;
}
while(x < 100);
tmp;
}
     8
     6
     5
       7
       Cap de les anteriors
       No contesto...
 
  2. Quina seqüència d'optimitzacions es pot aplicar per passar del programa original al programa optimitzat següent?
Programa original:Programa optimitzat:
var a;
var b;
a=10;
x=(((a*6)+0/1);
if(x > a) {
var e;
e=15;
x=(10*3);
do {
var h;
h=(5-55*1)/1;
y=(e-(10+b)+f(x));
a=(1*a-1+y);
} while(a < h)
}
var a;
var b;
a=10;
x=60;
if(60 > 10) {
var e;
e=15;
x=30;
var _tmp0;
_tmp0 = (5-b);
do {
var h;
h=-50;
y=(f(x)+_tmp0);
a=((-1+y)+a);
} while(a < -50)
}
     Folding → RedPot → RedFree → PropCtants → Folding
     RedPot → RedFrec → Folding → PropCtants
     Folding → PropCtants → Folding → RedFrec → PropCtants → Folding
       a i c
       Cap de les anteriors
       No contesto...
 
  3. En la pràctica de Folding...
     Fem la búsqueda de termes i factors de manera totalment independent.
     Primer busquem termes, i després factors.
     Les funcions de Folding, BuscarTermes i BuscarFactors es criden recursivament entre elles.
       a i b
       Cap de les anteriors
       No contesto...
 
  4. Quin d'aquests arbres sintàctics de CoSeL són incorrectes?
     Apply(InstrComp, Apply(\=,b,3), Apply(f,b,2, Apply(\*,b,5)) )
     Apply(Let_in, Apply(\=, _tmp, Apply(\*,b,8)), Apply(Print, _tmp, 2) )
     Apply(If_Else, Apply(\>, a, 0), Apply(\=a, 0), Apply(\=,a,Apply(\-,a,1)) )
       Apply(\;, Apply(\=, h, 4), Apply(\;, Apply(\=, nota, Apply(\+, nota, h)), Apply(\=, h, nota)))
       Tots els anteriors són incorrectes.
       No contesto...
 
  5. En la propagació de constants si tenim en compte que les crides a funcions poden modificar les variables globals, el següent programa quedaria optimitzat com...
Programa original:
Fun f(x,y) => {
var a;
a=15;
b=25;
x = b + f(a);
(a*b*c);
}
     Fun f(x,y) => {
var a;
a=15;
b=25;
x=25+f(a);
(a*25*c);
}
     Fun f(x,y) => {
var a;
a=15;
b=25;
x=25+f(15);
(15*25*c);
}
     Fun f(x,y) => {
var a;
a=15;
b=25;
x=25+f(15);
(15*b*c);
}
       Fun f(x,y) => {
var a;
a=15;
b=25;
x=b+f(a);
(a*b*c);
}
       Cap de les anteriors
       No contesto...
 
  6. En la divisió de blocs bàsics...
     Un cop feta la divisió en blocs bàsics havíem de recórrer l'arbre sintàctic per tal d'aplicar l'algorisme de la propagació de constants.
     Utilitzàvem un procediment recursiu que s'encarregava de recórrer l'arbre sintàtic en busca d'instruccions que provoquessin un canvi de bloc bàsic.
     La funció BasicBlocks retorna una llista de llistes d'apuntadors a les intruccions del programa necessàries per aplicar Propagació de Constants.
       b i c.
       Totes les anteriors.
       No contesto...
 
  7. En la Reducció de Freqüència:
     Trèiem fora del bucle les subexpressions aritmètiques, booleanes i de comparació, minimals que no contenen cap variable modificada en el bucle.
     Trèiem fora del bucle les subexpressions aritmètiques, booleanes i de comparació, maximals que no contenen cap variable modificada en el bucle.
     Les expressions invariants de bucle no contenen crides a funcions, operacions de comparació, operacions booleanes, ni assignacions, i s'executarien en totes les iteracions del bucle si no s'hagués aplicat l'optimització
       Cal aplicar vàries vegades en un mateix bucle aquesta optimització per tal d'optimitzar el programa al màxim
       a i d
       No contesto...
 
  8. En la reducció de freqüència...
     Les expressions invariants que trèiem fora dels bucles while i do_while s'avaluen sempre, però un sol cop.
     Els bucles do_while es transformen en bucles while.
     Cal recórrer el cos del bucle com a mínim dues vegades.
       Els bucles while es mantenen com a bucles while.
       Cap de les anteriors.
       No contesto...
 
  9. La reducció de Potència du a terme la següent transformació:
     a+a → a << 1
     a/1 + 0 → a
     (3-0) + (5*1) → 8
       a i b
       Totes les anteriors
       No contesto...
 
  10. En la reducció de potència...
     La substitució d'expressions tipus <expr>*num no es pot aplicar si <expr> conté crides a funcions.
     S'aplica als blocs bàsics.
     Pot perjudicar el Folding.
       Fem servir la instrucció let_in perquè així avaluem <expr> una única vegada.
       c i d.
       No contesto...
 

Check...