1
Actividad 1 - Reporte de las tcnicas aplicadas para la
optimizacin del cdigo intermedio generado.
INTRODUCCION
2
OBJETIVO
Ejemplo:
B=2*A+(A=c*d);
Pasar a
A=c*d;
B=A*3;
3
Generacin de cdigo
Se realiza mientras se analiza el programa
Libre del contexto
Optimizacin
Se realiza despus de la generacin de cdigo de todo el Programa o de
un elemento ejecutable del programa (Funcin, procedimiento, etc.).
Dependiente del contexto.
Programa fuente
Analizador
Lexicogrfico
,
Sintctico y
Semntico
Optimizador
Optimizacin Local:
Bloque Bsico
4
Ensamblamiento (Folding)
5
Sumas/restas: como la resta no es conmutativa se transforma en sumas: a
+ b c + d -> a + b+ (-c)+d
Productos/divisiones: como la divisin no es conmutativa se transforma en
productos: a*b/c*e -> a*b*(1/c)*e
Buscar las constantes y operarlas
Reconstruir el rbol.
Propagacin de constantes
Int a=10;
#define a 10
Con la ventaja que la variable puede ser local. Actualmente en C se puede definir:
6
Implementacin de la Propagacin de Constantes
Para asignaciones
7
Loop:
i=1
If (1<10) goto loop;
Buscar subrboles que se puedan sustituir por otros menos costosos. Estas
sustituciones se representan como reglas que aplicar la reduccin de
potencia
Exp*1 -> Exp
1*Exp -> Exp
Exp+0 -> Exp
0+Exp -> Exp
Exp*cte (110) -> (Exp << 2) + (Exp << 1)
Exp*0 -> {llamar a las funciones de Exp}; 0
Etc.
Las subexpresiones que aparecen ms de una vez se calculan una sola vez
y se reutiliza el resultado.
Idea: Detectar las subexpresiones iguales y que las compartan diversas
ramas del rbol. Problema: Hay que trabajar con un grafo acclico.
Dos expresiones pueden ser equivalentes y no escribirse de la misma
forma A+B es equivalente a B+A. Para comparar dos expresiones se utiliza
la forma normal
Se ordenan los operandos: Primero las constantes, despus variables
ordenadas alfabticamente, las variables indexadas y las subexpresiones.
Ejemplo
X=C+3+A+5 -> X= 3+5+A+C
Y=2+A+4+C -> Y=2+4+A+C
Divisiones y restas se ponen como sumas y productos para poder conmutar
A-B -> A+ (-B)
A/B -> A * (1/B)
8
Implementacin
Ejemplo:
Asignacin
9
For i=a to b do
La expansin de un bucle puede ser muy costosa en espacio. Hay que
poner un criterio heurstico para decidir si se aplica la expansin.
Se puede aplicar una expansin parcial en la que sigue existiendo el
bucle, pero cada iteracin del nuevo bucle corresponde a varias iteraciones
del bucle original.
En un bucle expandido se ha de sustituir el ndice del bucle por el valor
constante correspondiente.
Ejemplo:
Invariantes: +. -, *, /, sin, ln
No invariantes: printf, getchar, ++, random
Consideracin prctica
Slo pueden ser invariantes operaciones primitivas del lenguaje (son
aquellas que implementa directamente el compilador). Ejemplo:
operaciones aritmticas, comparaciones, etc.
Algunos compiladores permiten indicar que una funcin es pura para que
pueda formar parte de invariantes.
Pasos
Detectar todas las variables que se modifican en el bucle.
Marcar todas las operaciones no invariantes
10
Aplicar la siguiente regla recursiva para detectar las operaciones
invariantes
Una operacin es invariante si sus operandos son invariantes.
Asociar a cada expresin invariante una variable temporal.
Sustituir en el bucle las operaciones invariantes por las correspondientes
variables.
Aadir delante del bucle la asignacin de la expresin invariante a su
variable temporal.
Problema del mtodo anterior
Cuando no se entra en el bucle se calculan sus operaciones invariantes.
La solucin es evaluar antes la condicin de salida del bucle.
Programa 1
Multiplicacin
int main()
{ int numero;
scanf("%d",&numero);
tabla(numero);
return 0;
11
int tabla(int numero)
int espacios[10];
int indice;
espacios[indice] = numero*(indice+1);
return 0;
12
Programa 2
POTENCIA
#include <stdio.h>
#include <math.h>
int main()
scanf("%i",&base);
scanf("%i",&exponente);
for (i=0;i<exponente;i++)
13
sol=sol*base;
printf("\n\nResultado: %i\n\n\n",sol);
return 0;
14
Programa 3
.model small
.stack
.data
.code
.startup
;"del ejemplo simple"
mov al,10
mov bl,9
imul bl
mov bl,10
div bl
mov bx,ax
or bx,3030h
mov ah,02h
mov dl,bl
15
int 21h
mov ah,02h
mov dl,bh
int 21h
.exit
End
16
CONCLUSION
17
Actividad 2 - Lista de los recursos se consumen en
invocacin a funciones y expresiones simples
Prembulo
func1();
call 0x4000000
18
En realidad, lo que ocurre en las tripas de la mquina cuando se invoca una
funcin es un proceso bastante complejo, ya que la invocacin, ejecucin y retorno
de una funcin no es solo cuestin de algoritmo. Tambin hay datos de entrada
bajo la forma de los argumentos "pasados" a la funcin (en base a los cuales el
cdigo realizar cierta computacin 4.4.5) y datos de salida en forma del valor
"devuelto".
La anterior es una imagen didctica, diramos de "alto nivel" y adecuada para una
explicacin bsica de los mecanismos de invocacin de funciones. Pero como
decamos al principio, C++ es en ciertos aspectos un lenguaje de bajo nivel
(pegado a la mquina) y si se quiere entender y manejar con xito (en especial si
se utilizan programas con mdulos compilados en otros lenguajes), es
fundamental una mirada ms cercana al proceso.
En realidad no existe en absoluto algo como "paso" de argumentos (ni por valor ni
por referencia). Realmente los datos (los argumentos actuales) de la funcin
invocante se copian [6] a una zona de memoria que se crea ex-profeso en la pila
denominada marco de activacin o marco de pila ("Stack frame").
19
que en C++ se relaciona con el uso de los registros (register 4.1.8b), depende de
las circunstancias y del procesador. Ver nota adjunta sobre uso de registros para
paso de parmetros en BC++.
Por supuesto, toda esta informacin tiene que ser colocada en la pila cada vez
que se produce la llamada a una funcin. El proceso de construir el marco de pila
es lo que se denomina secuencia de llamada. A su vez, cuando termina su
ejecucin definitivamente y se devuelve el control a la funcin que la invoc, la
informacin debe ser sacada de la pila. El proceso de desmontar el marco de pila
se conoce como secuencia de retorno. Ambos procesos consumen su tiempo, a
veces bastante.
Las secuencias de llamada y retorno son realizadas por unos trozos especiales de
cdigo denominados prlogo y eplogo que incluye por su cuenta el compilador
junto con cada invocacin a funcin. Aunque en ocasiones esto puede evitarse;
son las denominadas funciones desnudas.
Recordemos tambin que los valores estticos que hubiese en la funcin tienen
espacio de almacenamiento independiente y pueden conservarse.
El marco de pila
La figura muestra la forma de ocupacin de la pila cuando es invocada una nueva
funcin y se crea el correspondiente marco de activacin. Observe que la pila
crece "hacia abajo", es decir, desde posiciones altas de memoria hacia posiciones
ms bajas.
20
La funcin
invocante ("Caller") ocupa una primera zona con copia de los argumentos pasados
a la funcin invocada. Generalmente esta copia se realiza empezando por el
ltimo y terminando por el primero (derecha-izquierda). Por ejemplo, en la
invocacin:
func(a, b, c);
21
almacenamiento correspondientes, y en el caso de las variables locales dinmicas
de las funciones, incluyendo las copias de los argumentos, estas posiciones estn
expresadas como desplazamientos en bytes ("Offset") a partir de esta posicin (de
ah el nombre de puntero "base").
...
mov ax,[bp+8]
...
Sustitucin inline
Ocurre con frecuencia, sobre todo en la invocacin a funciones pequeas, que el
costo de las secuencias de llamada y retorno supone mucho ms que el costo de
memoria necesario para el cuerpo de la propia funcin que se invoca. De hecho,
C++ dispone de un especificador de tipo de almacenamiento (que solo es
aplicable en la definicin de funciones), especialmente concebido para atender
este problema. Se trata de la directiva inline
22
inline <tipo_dev> <funcin> (<parmetros>) {<sentencias>;}
Nota: algunos compiladores exigen que la definicin inline se realice antes que
cualquier invocacin a la funcin.
Casos especiales
Las funciones con especificador de excepcin no son susceptibles de
sustitucin inline.
Evidentemente, estas funciones no son susceptibles de recursin
(invocarse a s mismas) por lo que generalmente el compilador ignora la
directiva inline en estos casos.
Nota: los compiladores de Microsoft permiten la substitucin inline si la
profundidad de recursin puede ser deducida en tiempo de compilacin, y siempre
que esta profundidad no sobrepase un lmite previamente especificado por el
programador.
23
Dependiendo de su estructura interna, algunas funciones no son
susceptibles de este tipo de sustitucin. Por ejemplo, en el compilador
Borland C++ 5.5 no pueden ser sustituidas inline las funciones que
contengan alguna sentencia de iteracin while; do... while y for .Algunos
compiladores rehsan efectuar la substitucin si el cuerpo de la funcin es
muy grande, y tampoco realizan la sustitucin en algunos casos en que la
invocacin de la funcin se realiza mediante punteros.
Las funciones que acepten algn parmetro que sea del tipo "clase con un
destructor", no pueden ser objeto de expansin inline. Sin embargo, esta
restriccin no es aplicable si se trata de un paso por referencia. En el primer caso
el compilador lanza un mensaje de aviso anunciando que la directiva inline no ser
tenida en cuenta.
Ejemplo:
struct est {
...
~est(); // Destructor
};
Cualquier funcin que devuelva una clase con destructor no puede ser objeto de
expansin inline, cuando dentro de la expresin de retorno puedan existir variables
u objetos temporales que necesiten ser destruidos.
Ejemplos:
struct est {
~est(); // destructor
24
};
return est();
est e2;
return est();
Esta funcin no puede ser sustituida, porque el objeto e2 necesita ser destruido,
en consecuencia, se genera un aviso del compilador: Functions containing some
return statements are not expanded inline in function f2().
En esta otra:
Criterio de uso
En aras a la velocidad de ejecucin, es preferible evitar en lo posible la utilizacin
de funciones pequeas, especialmente en bucles que se repiten un gran nmero
de veces. En caso de tener que utilizarlas es preferible acudir a la sustitucin
inline. Tambin son buenas candidatas a esta sustitucin las funciones-operador.
25
Nota: a menos que el compilador permita otro tipo de medida al respecto , cuando
sea importante reducir el tamao del cdigo, debe recordar definir las funciones
miembro fuera del cuerpo de la definicin de la clase, para evitar la sustitucin
inline antes aludida, que en estos casos es realizada automticamente por el
compilador.
-vi- Expansin inline OFF (las funciones inline son expendidas fuera de
lnea)
El compilador GNU Cpp ofrece la opcin -fno-default-inline, que hace que las
funciones miembro no sean consideradas inline por el mero hecho de haber sido
declaradas dentro del cuerpo de la clase.
Macro-sustitucin
La macro-sustitucin, a la que hemos hecho referencia en el prrafo anterior, es
una tcnica similar a la sustitucin inline que ha sido ampliamente utilizada (como
26
herencia del C), pero que no debe ser confundida con esta ltima. Su utilizacin
ha cado bastante en desuso y est desaconsejado, dado que presenta algunos
inconvenientes que se detallan en el captulo correspondiente (#define 4.9.10b).
Se basa en la utilizacin del preprocesador C/C++ para simular la invocacin de
funciones que no son tales. Ejemplo:
...
func f(x) {
int y = abs(x);
...
Contenido
Introduccin..29
Desarrollo.30
Conclusin35
Bibliografa35
27
Introduccin
Para que el software pueda ser considerado multiplataforma, debe ser capaz de
funcionar en ms de una arquitectura de ordenador o sistema operativo. Esto
28
puede ser una tarea que consume tiempo, ya que los diferentes sistemas
operativos tienen diferentes interfaces de programacin de aplicaciones o API (por
ejemplo, Linux utiliza una API diferente de Windows).
Desarrollo
Degradacin correcta
29
Separacin de funciones
Bibliotecas de terceros
30
Otro enfoque que se utiliza es depender de un software preexistente que oculta las
diferencias entre la platform, llamado abstraccin de la Platform, de tal manera
que el programa en s mismo no es consciente de la plataforma que se est
ejecutando. Se podra decir que este tipo de programas son independientes de la
plataforma. Los programas que se ejecutan en la mquina virtual de Java (JVM)
se construyen de esta manera.
Hay una serie de herramientas que estn disponibles para ayudar a facilitar el
proceso de programacin multiplataforma:
31
representacin del conocimiento y el apoyo a C#, Cobol, Java incluyendo Android
y BlackBerry dispositivos inteligentes, Objective-C para el de Apple dispositivos
mviles, RPG, Ruby, Visual Basic y Visual FoxPro.
Real Studio: un IDE RAD desarrollado por Real Software, utiliza un dialecto
orientado a objetos del lenguaje de programacin BASIC, y produce binarios
compilados para Mac OS X, Windows y Linux, como tambin, ser capaz de
producir cgi aplicaciones basadas en web. El soporte iOS est actualmente en
desarrollo.
32
Plataforma Smartface: Una herramienta multiplataforma para Windows que se usa
para crear aplicaciones mviles para J2ME, Symbian S60, Blackberry y Android,
usando herramientas de arrastrar y soltar y edicin de acciones.
33
convenios puede sentirse torpe o ajeno al usuario. Cuando se trabaja con
rapidez, a esas convenciones se oponen incluso puede resultar en la prdida
de datos, como en un cuadro de dilogo para confirmar si el usuario desea
guardar o descartar los cambios realizados en un archivo.
Lenguajes de secuencias de comandos y las mquinas virtuales deben ser
traducidos a cdigo ejecutable nativo cada vez que se ejecuta la aplicacin,
imponiendo una penalizacin en el rendimiento. Esta pena puede ser aliviado
mediante tcnicas avanzadas como la compilacin just-in-time, pero incluso
con estas tcnicas, algo de sobrecarga computacional puede ser inevitable.
Las diferentes plataformas requieren el uso de formatos de paquetes nativos
tales como RPM y MSI. Multiplataforma instaladores como InstallAnywhere,
JExpress, InstallBuilder o IzPack satisfacer esta necesidad.
Entornos de ejecucin multiplataforma pueden sufrir fallos de seguridad
multiplataforma, creando un ambiente frtil para el malware multiplataforma.
Conclusin
34
Bibliografa
Expresiones
Aritmticas
Generaci
n de
cdigo
para Coercin de tipos
expresion Traduccin de cdigo intermedio a
es instruccioneslgicas
Expresiones de mquina
Asignaciones
Seleccin de
Sentencia condicional
instrucciones
Generaci
n de Vectores
cdigo
para las
Organizaci Una pasada /mltiples pasadas
Iteracin
Generad estructur
Generaci
n y 35
nasdede
gestin de
or de control
Generacin
cdigo
la de cdigo para llamada a la
cdigo memoria
mquina
funcin Reserva de
Seleccin simple
registros
Memoria esttica
Memoria de pila
36
Un compilador traduce completamente un programa fuente, escrito en un
lenguaje de alto nivel, a un programa objeto, escrito en lenguaje ensamblador o
mquina. El programa fuente suele estar contenido en un archivo, y el programa
objeto puede almacenarse como archivo en memoria masiva para ser procesado
posteriormente, sin necesidad de volver a realizar la traduccin. Una vez traducido
el programa, su ejecucin es independiente del compilador, as, por ejemplo,
cualquier interaccin con el usuario slo estar controlada por el sistema
operativo. Como parte importante de este proceso de traduccin, el compilador
informa al usuario de la presencia de errores en el programa fuente, pasndose a
crear el programa objeto slo en el caso de que no hayan sido detectados errores
(por lo general, suele cancelarse la compilacin al detectar un error).
37
Un intrprete permite que un programa fuente escrito en un determinado
lenguaje vaya traducindose y ejecutndose directamente, sentencia a sentencia,
por el ordenador. El intrprete capta una sentencia fuente, la analiza e interpreta,
dando lugar a su ejecucin inmediata, no crendose, por tanto, un archivo o
programa objeto almacenaje en memoria masiva para posteriores ejecuciones. La
ejecucin del programa estar supervisada por el intrprete.
38
programa bajo un intrprete puede interrumpirse en cualquier momento para
conocer los valores de las distintas variables y la instruccin fuente que acaba de
ejecutarse. Con un compilador esto no se puede realizar, salvo que el programa se
ejecute bajo el control de un programa especial de ayuda denominado depurador
(debugger). Por este motivo, los intrpretes resultan ms pedaggicos para
aprender a programar, ya que el alumno puede detectar y corregir ms fcilmente
sus errores.
Desarrollo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ManejoDeErrores
{
public class TE
{
public TE()
{
}
public List<Tabla_Errores> TablaErrores
{
get { return TErrores; }
set { TErrores = value; }
}
public void reinicialista()
{
TErrores.Clear();
TErroresed.Clear();
}
39
public void inicialestaE(){
Tabla_Errores te4 = new Tabla_Errores(4, "error dividir por cero ", "escoja
otro numero que no sea el 0 para dividir", "posible incongruencia en divicion,o
en cualquier operacin");
TErrores.Add(te4);
40
Tabla_Errores te10 = new Tabla_Errores(10, "sintaxis erronea",
"asegurese de que la sintaxis sea correcta, verifique espacios ", "Se produce
cuando la sintaxis de la sentencia contiene algun error");
TErrores.Add(te10);
Tabla_Errores te11 = new Tabla_Errores(11, "warning", "asegurese de
que las variables no esten repetidas ", "Se produce cuando ms de una
variable estan inicializadas con el mismo nombre");
TErrores.Add(te11);
if (error.Id == id)
{
Tabla_Errores er = new Tabla_Errores();
er.Descripcion = error.Descripcion;
er.Solucion = error.Solucion;
er.Error = error.Error;
er.NumerodeLinea = nl;
TErroresed.Add(er);
}
}
public void addliste(int id)
{
foreach (var error in TErrores)
{
if (error.Id == id)
{
Tabla_Errores er = new Tabla_Errores();
er.Descripcion = error.Descripcion;
er.Solucion = error.Solucion;
er.Id = error.Id;
TErroresed.Add(er);
}
41
}
}
}
En esta otra partes donde se construye en si la tabla de errores que ser mostrada
al usuario
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ManejoDeErrores
{
public class Tabla_Errores
{
//tabla errores (numero de linea,error,como solucionarlo)
public int ID;
public int num_lineaE;
public string error;
public string descrip;
public string sol_error;
}
public Tabla_Errores( int id, string e, string se, string d)
{
ID = id;
error = e;
sol_error = se;
descrip = d;
public Tabla_Errores ()
{
42
}
public int Id
{
get { return ID; }
set { ID = value; }
}
}
}
43
Resultados
CONCLUSION GENERAL
44
En este trabajo se ha presentado la tcnica de la optimizacin de cdigo, como un
medio de mejora del cdigo objeto producido por un compilador. Dicha mejora va a
ser evaluada en una reduccin del tamao de cdigo objeto generado y, sobre
todo, en una mayor velocidad de ejecucin del programa objeto. Una vez
presentados los diversos tipos de optimizacin que se pueden presentar en un
compilador, se ha dedicado una especial atencin al anlisis global de las
ecuaciones de flujo de datos. Dentro de este anlisis global, se ha desarrollado
con atencin el denominado anlisis ud (uso-definicin), mostrando las ecuaciones
y los posibles tipos de optimizacin a que da lugar este anlisis de un programa.
BIBLIOGRAFIAS
45