Está en la página 1de 4

OPTIMIZACION

Es el proceso en el cual se revisa el código intermedio generado para encontrar todo lo que sea
redundante y superfluo, para luego eliminarlo consiguiendo entonces una reducción del tamaño
del código objeto, esto con la finalidad de reducir el tiempo de ejecución.

P1.cpp --------- > Turbo C ------- > P1.EXE 8k (4seg)

--------- > DevCpp --------> P1.EXE 6k (4+1seg)

Por que hay diferencia de tamaños en el programa objeto?

1. Por el uso de algoritmos mas eficientes


2. Por la realización de un proceso de optimización

P1.cpp --- > Analisis --- > Generacion Codigo Intermedio --- > Optimizacion --- > P1.exe

Por que un código objeto de menor tamaño es mejor?

1. Ocupa menos espacio de almacenamento


2. El de menor tamaño se ejecuta mas rápido (asumiendo que ambos ejecutables provienen
del mismo fuente)

Observacion: Los criterios para evaluar un compilador son:

1. Precio
2. IDE + facilidad de uso
3. Tamaño del código objeto generado
4. Tiempo de compilación (hay que considerar que el tiempo de optimización se suma al de
compilacion)

Observacion: La optimización se realiza mejor sobre el código intermedio porque este esta
estructurado de forma homogénea y simple.

Criterios de Optimizacion

1. Instrucciones inaccesibles
Instrucciones que nunca se van a ejecutar porque de alguna manera no se puede llegar a ese
código.
goto E1
<codigo1> // Inaccesible
E2: <codigo2>
E1: <codigo3>

2. Codigo/Operaciones redundante
Es aquel código u operación que se ejecuta pero el resultado de su acción no cambia nada.
a = a * 1;
b = b + 0;
nop // redundante, a menos que este siendo referenciado por un goto

3. Saltos redundantes
goto E1 === > goto E2
<codigo1>
E1: goto E2

No se reduce el tamaño del código, pero si se reduce el tiempo de ejecución (un salto toma la
mitad de tiempo que dos saltos)

4. Operaciones equivalentes
a=a+1; ==== > a++;
a = a * 2; ===> shl a, 1 // desplazamiento binario de a una posición a la izquierda

5. Condicion de corto circuito


Consiste en ejecutar solo lo necesario.
if ( x AND <expresión> ) // Si x es FALSO entonces no es necesari evaluar <expresion>

implementando: evaluar(x)
if FALSO goto E1
evaluar(<expresion>)
E1:
Ejm.
while () { while (…) {
if ( E1 && E2) ===> if( E1 )
<codigo> if (E2)
} <codigo>
}
6. Otros criterios a revisar

Observacion: Los compiladores modernos utilizan mas tiempo en la optimización que en el simple
análisis léxico/sintáctico, los cuales ya han sido llevados a su forma mas eficiente.

MANEJO DE ERRORES

Error --> acción que produce un resultado no esperado

Obs: Un error “deja de serlo” cuando sus efectos no son detectables

Pasos necesarios:

1. Deteccion.
Hay errores reales y errores falsos o derivados.
inta =1; // Error inta no declarado
a++; // Error a no declarado

Se debe reducir la inercia en la detección del error.

…… ifa=1 ………………………. else ……


Error detección

2. Tratamiento del error:


- Correccion de ser posible
- Ignorar / Detener
Errores: Error propio, Warning

3. Informe
Detallado, especificando tipo de error, nro de línea, posible corrección

Ejemplos de Errores:

- Type mismatched
- Missing ‘(‘
- not declared variable
- Numero de parámetros no coincide
- Index out of range
- Null pointer
-

MANEJO DINAMICO DE MEMORIA

Compilación -- > linkeo --- > Ejecucion


Linking == Resolucion de referencias externas
Ejm.
#include <math.h> --- compilación ---- linking
sqrt(x);

Puede haber enlace estatico y enlace dinamico


El enlace dinamico se resuelve en tiempo de ejecución, el estatico en tiempo de compilación
En el enlace estatico el código de la rutina externa se incluye dentro del ejecutable
En el enlace dinamico, la rutina externa permanece en la librería DLL y se llama en tiempo de
ejecución (la librería DLL necesita estar accesible)
--- eof ----

También podría gustarte