Anda di halaman 1dari 46

TECNOLGICO NACIONAL DE MXICO

INSTITUTO TECNOLOGICO DE ACAPULCO

Ingeniera en Sistemas Computacionales

Materia: Lenguajes y autmatas II

Profesor: Silvestre Bedolla Solano

Unidad III Optimizacin

Competencia especfica: Conocer e Identificar los diferentes tipos de


optimizacin que permita eficientar el cdigo intermedio.

Integrantes del equipo 5:

Nombre Nmero de control


Lpez Lpez Viridiana 12320769
Martnez Jurez Yashua Alejandro 12320782
Martnez Albinez Jos Carlos 12320776
Garca Campos Freddy Jahir 12320732
Christiaan Arturo Guerrero Sandoval 12320745
Victor Hugo Garrido Mendoza 11320563

Acapulco, Guerrero, 14 de abril del 2016


Contenido
Reporte de las tcnicas aplicadas para la optimizacin del cdigo intermedio
generado............................................................................................................. 2
Programa 1.................................................................................................... 12
Programa 2.................................................................................................... 14
Programa 3.................................................................................................... 16
Lista de los recursos se consumen en invocacin a funciones y expresiones
simples.............................................................................................................. 19
Ensayo que establezca las tendencias y tcnicas empleadas en lenguajes que
requieren de una mquina virtual para su ejecucin sobre multiplataforma....28
Introduccin................................................................................................... 29
Desarrollo....................................................................................................... 30
Conclusin..................................................................................................... 35
Bibliografa..................................................................................................... 35
Cuadro sinptico de los criterios de tiempo de ejecucin extensin del cdigo
generado........................................................................................................... 36
Reporte del avance por equipo del proyecto final consiste en desarrollar
software de base: traductor, intrprete o compilador.......................................37
Introduccin................................................................................................... 37
Desarrollo....................................................................................................... 39
Resultados..................................................................................................... 44

1
Actividad 1 - Reporte de las tcnicas aplicadas para la
optimizacin del cdigo intermedio generado.
INTRODUCCION

Una representacin intermedia es una estructura de datos que representa al


programa fuente durante el proceso de la traduccin a cdigo objeto. El
compilador primero traduce el cdigo fuente en una forma ms situable para la
optimizacin, para luego convertirla en el cdigo de mquina. El compilador
transforma el cdigo en un lenguaje ms manejable, usualmente cdigo de tres
direcciones, el cual representa exactamente una instruccin de cdigo de
mquina, verifica tipos y traduce expresiones.

El proceso de la compilacin se desglosa en dos partes: la parte que depende solo


del lenguaje fuente (etapa inicial o front-end) y la parte que depende solo del
lenguaje objeto (etapa final o back-end). La etapa inicial traduce un programa
fuente a una representacin intermedia s partir de la cual la etapa final genera el
cdigo objeto. De esta forma, los detalles que tienen que ver con las
caractersticas del lenguaje objeto (cdigo ensamblador, cdigo maquina absoluto
o relocalizable,...), la arquitectura de la maquina (nmero de registros, modos de
direccionamiento, tamao de los tipos de datos, memoria cache,...), el entorno de
ejecucin (estructura de registros y memoria de la mquina donde se va a ejecutar
el programa...) y el sistema operativo se engloban en la etapa final y se aslan del
resto. El cdigo intermedio es un cdigo abstracto independiente de la mquina
para la que se generar el cdigo objeto. El cdigo intermedio ha de cumplir dos
requisitos importantes: ser fcil de producir a partir del anlisis sintctico, y ser
fcil de traducir al lenguaje objeto. Con una representacin intermedia bien
definida, un compilador para el lenguaje i y la maquina j puede ser construido
combinando el front-end para el lenguaje i con el back-end de la maquina j. De
esta manera se pueden construir m*n compiladores escribiendo nicamente m
front-ends y n back-ends.

La finalidad de la optimizacin de cdigo es producir un cdigo objeto lo ms


eficiente posible. En algunos casos tambin se realiza una optimizacin del cdigo
intermedio. Algunas optimizaciones que se pueden realizar son la evaluacin de
expresiones constantes, el uso de ciertas propiedades de los operadores, tales
como la asociativa, conmutativa, y distributiva; as como la reduccin de
expresiones comunes.

2
OBJETIVO

Obtener cdigo que se ejecuta ms eficientemente segn los criterios de


optimizacin

Tiempo de ejecucin (optimizacin temporal)


Espacio de memoria utilizado (optimizacin espacial)
Obtener cdigo que se ejecuta ms eficientemente segn los criterios
Tiempo de ejecucin (optimizacin temporal)
Espacio de memoria utilizado (optimizacin espacial)
Funcionamiento
Revisa el cdigo generado a varios niveles de abstraccin y realiza las
optimizaciones aplicables al nivel de abstraccin
Representaciones de cdigo intermedio de ms a menos abstractas
rbol sintctico abstracto: optimizar sub-expresiones redundantes,
reduccin de frecuencia, etc.
Tupias o cudruplas: optimizar en uso de los registros o de las variables
temporales.
Ensamblador/Cdigo mquina: convertir saltos a saltos cortos, reordenar
instrucciones.
Funcionamiento (continuacin)
Representaciones de cdigo para extraer informacin:
Grafos.
Condiciones que se han de cumplir
El cdigo optimizado se ha de comportar igual que el cdigo de partida
excepto por ser ms rpido u ocupar menos espacio.

Ejemplo:

Si no se ha definido el orden de evaluacin de los operados la siguiente


optimizacin es vlida

B=2*A+(A=c*d);

Pasar a

A=c*d;
B=A*3;

Generacin de Cdigo y Optimizacin

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

Se ejecuta todo junto. Generador de


Mientras se analiza se Cdigo
genera cdigo

Optimizador

Optimizacin Local:

Las optimizaciones locales se realizan sobre el bloque bsico


Optimizaciones locales
Folding
Propagacin de constantes
Reduccin de potencia
Reduccin de subexpresiones comunes

Bloque Bsico

Un bloque bsico es un fragmento de cdigo que tiene una nica entrada y


salida, y cuyas instrucciones se ejecutan secuencialmente. Implicaciones:
Si se ejecuta una instruccin del bloque se ejecutan todas en un orden
conocido en tiempo de compilacin.
La idea del bloque bsico es encontrar partes del programa cuyo anlisis
necesario para la optimizacin sea lo ms simple posible.

4
Ensamblamiento (Folding)

El ensamblamiento es remplazar las expresiones por su resultado cuando


se pueden evaluar en tiempo de compilacin (resultado constante).

Ejemplo: A=2+3+A+C -> A=5+A+C

Estas optimizaciones permiten que el programador utilice clculos entre


constantes representados explcitamente sin introducir ineficiencias.

Implementacin del Folding

Implementacin del floding durante la generacin de cdigo realizada


conjuntamente con el anlisis sintctico.

Se aade el atributo de constante temporal a los smbolos no terminales y a las


variables de la tabla de smbolos.

Se aade el procesamiento de las constantes a las reglas de anlisis de


expresiones.

Optimiza: 2+3+b -> 5+b

Hay una suma de constantes (2+3)+b

No optimiza: 2+b+3 -> 2+b+3

No hay una suma de constantes (2+b)+3

Implementacin del Folding

Implementacin posterior a la generacin de cdigo


Buscar partes del rbol donde se puede aplicar la propiedad conmutativa:

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

Desde que se asigna a una variable un valor constante hasta la siguiente


asignacin, se considera a la variable equivalente a la constante.

Ejemplo: Propagacin Ensamblamiento

PI=3.14 -> PI=3.14 -> PI=3.14

G2R=PI/180 -> G2R=3.14/180 -> G2R=0.017

PI y G2R se consideran constantes hasta la prxima asignacin.

Estas optimizaciones permiten que el programador utilice variables como


constantes sin introducir ineficiencias. Por ejemplo, en C no hay constantes y ser
lo mismo utilizar

Int a=10;

#define a 10

Con la ventaja que la variable puede ser local. Actualmente en C se puede definir:

- const int a=10;

6
Implementacin de la Propagacin de Constantes

Separar el rbol en bloques bsicos

Cada bloque bsico ser una lista de expresiones y asignaciones

Para cada bloque bsico

Inicializar el conjunto de definiciones a conjunto vaco.

Definicin: (variable, constante)

Procesar secuencialmente la lista de expresiones y asignaciones

Para expresin y asignacin

Sustituir las apariciones de las variables que se encuentran en el conjunto


de definiciones por sus constantes asociadas.

Para asignaciones

Eliminar del conjunto de definiciones la definicin de la variable asignada


Aadir la definicin de la variable asignada si se le asigna una constante.

Extensin de la P.C. Fuera del Bloque Bsico

Extender la aplicacin fuera del bloque bsico


Hay que realizar un anlisis del flujo de ejecucin y es complejo. Ejemplo:
i=0;
Loop:
i=i+1
If (i<10) goto loop;
Se transforma errneamente en
i=0;

7
Loop:
i=1
If (1<10) goto loop;

Reduccin de potencia (strength reduction)

Se busca sustituir operaciones costosas por otras ms simples. Ejemplo:


sustituir productos por sumas.
a=2*a
a=a + a
Evitar la operacin append (++)
A=length (s1 ++ s2)
Convertirlo en
A=length (s1) +length (s2)
Implementacin de la Reduccin de Potencia

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.

Eliminacin de subexpresiones redundantes.

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

Primero se aplica el folding y la propagacin de constantes (simplificar las


expresiones)
Despus se reordena el rbol sintctico hasta obtener la forma normal.
Se inicia la eliminacin de las subexpresiones redundantes.
Hay que considerar las asignaciones que pueden convertir una sub-
expresin redundante en no redundante.

Ejemplo:

Asignacin

Sustituir todas las variables asignadas por la expresin que se les ha


asignado
Generar un orden de ejecucin
Sustituir siguiendo este orden de ejecucin
Comparar los subrboles desde las ramas hacia la raz y sustituir los
subrboles repetidos.
Recorrer el grafo a cclico generado y sustituir la primera aparicin de cada
rama que sea hijo de dos o ms nodos por una asignacin a una variable
local y las otras ramas por la variable local.

Optimizaciones Dentro de Bucles

La optimizacin de bucles es muy importante por las mejoras en tiempo de


ejecucin que se obtienen
Estrategias de optimizacin dentro de bucles
Expansin de bucles (loop unrolling)
Reduccin de frecuencia (frequency reduction)
Reduccin de potencia (strength reduction)

Expansin de bucles (loop unrolling)


La expansin de bucles solo se puede aplicar a los bucles cuyo nmero de
iteraciones se conoce en tiempo de compilacin. Ejemplo:
Se puede aplicar a los bucles
For i=1 to 10 do
No se puede aplicar a los bucles

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.

Reduccin de frecuencia. (Frequency reduction)

La reduccin de frecuencia detecta las operaciones invariantes de bucle y


las calcula una nica vez delante del Bucle. Ejemplo:
For i=1 to n do c=i*sin (a);
sin(a) es una operacin invariante del bucle que puede pasar de
calcularse n veces a una con la siguiente transformacin
Tmp=sin (a);
For i=1 to n do c=i*tmp;
Esta transformacin no tiene en cuenta que el bucle igual no se ejecuta
ninguna vez y esto supondra perder tiempo de ejecucin calculando la
invariante de bucle innecesariamente. Adems el clculo de la invariante
puede producir un error de ejecucin. Por ejemplo una divisin por cero.
Las invariantes de bucle slo pueden estar formadas por operaciones que
son funciones puras
Su nico efecto es el clculo del resultado
El resultado solo depende de los operandos.

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 tabla(int numero);

int main()

{ int numero;

printf("\t==========> TABLA DE MULTIPLICAR <=========\n\n\n");

printf("Numero de Tabla a multiplicar: ");

scanf("%d",&numero);

tabla(numero);

return 0;

11
int tabla(int numero)

int espacios[10];

int indice;

for(indice=0; indice < 10; indice++)

espacios[indice] = numero*(indice+1);

printf("\n\nTabla del %d \n",numero);

for(indice=0; indice < 10; indice++)

printf("%d x %2d = %4d\n",numero, (indice+1), espacios[indice]);

return 0;

12
Programa 2

POTENCIA

#include <stdio.h>

#include <math.h>

int main()

int base, exponente, i, sol=1;

printf("Programa para hacer potencias\n\n\n");

printf("Introduce la base de la potencia: ");

scanf("%i",&base);

printf("\n\nIntroduce el exponente de la potencia: ");

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

INTRUCCION EN ENSAMBLADOR MUL

.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

La finalidad de la optimizacin de cdigo es producir un cdigo objeto lo ms


eficiente posible. En algunos casos tambin se realiza una optimizacin del cdigo
intermedio.

Algunas optimizaciones que se pueden realizar son la evaluacin de expresiones


constantes, el uso de ciertas propiedades de los operadores, tales como la
asociativa, conmutativa, y distributiva; as como la reduccin de expresiones
comunes.

Todo esto ocurre dentro de un compilador; Un compilador es un programa


informtico que traduce un programa escrito en un lenguaje de programacin a
otro lenguaje de programacin. Usualmente el segundo lenguaje es lenguaje de
mquina, pero tambin puede ser un cdigo intermedio (bytecode), o simplemente
texto. Este proceso de traduccin se conoce como compilacin.

17
Actividad 2 - Lista de los recursos se consumen en
invocacin a funciones y expresiones simples
Prembulo

En algunos sentidos, C++ es un lenguaje de muy bajo nivel (incluso permite


insertar instrucciones ensamblador directamente 4.10), por lo que hay ocasiones
en que el programador necesita habrselas con cuestiones muy de detalle y
conocer ntimamente el funcionamiento de los mecanismos subyacentes. Sobre
todo si pretende entender mnimamente el porqu de ciertas cosas y la
terminologa utilizada en los textos de programacin. En este captulo incluimos
algunos conceptos que sin ser estrictamente cuestiones C++ sin duda le ayudarn
en su tarea de habrselas con ese pequeo monstruo.

Carga y descarga de funciones


Es importante conocer que C y C++ son lenguajes orientados a pila y
estructurados alrededor del concepto de funcin; el funcionamiento de ambos est
ntimamente relacionado. Desde el punto de vista del programador, la invocacin
de una funcin es una sentencia del tipo:

func1();

Aunque finalmente aparece como una llamada a la direccin donde se encuentra


el recurso correspondiente. En ensamblador sera algo as:

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

Nota: observe que si el la llamada a funciones solo interviniese el cdigo, el


mecanismo de invocacin quedara reducido a un salto "jump" al punto de entrada
del nuevo bloque de cdigo.

El asunto es que, aparte de seguir el camino ("path") de ejecucin adecuado, el


programa necesita preparar el entorno de ejecucin (datos) para el nuevo trozo de
ejecutable y apuntar l mismo cierta informacin que le permita volver al punto de
partida. Para entender el mecanismo, es imprescindible desterrar la idea del
argumentos "pasados" o valores "devueltos" como datos que van y vienen
desde/hacia la funcin invocante a/desde la funcin invocada.

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").

Nota: por extensin tambin se denomina a veces registro de activacin


(aunque no debera decirse as). La razn es que la direccin de comienzo de
esta zona queda almacenada un registro del procesador denominado por
esta razn puntero de pila o SP ("Stack pointer").

Como veremos a continuacin, el marco de pila es un trozo de memoria en este


rea, que sirve como zona temporal de datos para uso de la funcin que entra en
ejecucin. En ella se almacenan los argumentos pasados a la funcin, sus
variables locales y otros datos, como direccin de retorno a la rutina que efectu la
llamada, y estado de los registros en el momento de la invocacin.

Nota: en determinadas circunstancias ciertos argumentos pueden pasar a los


registros del procesador, aunque no hay reglas fijas al respecto. Como en todo lo

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.

Conviene resaltar que en el proceso de invocacin de una funcin solo intervienen


dos actores: la funcin que realiza la invocacin ("Caller") y la funcin que es
invocada ("Called"); nosotros las denominamos funcin invocante y funcin
invocada (o llamada). Entrambas tienen que repartirse el trabajo de las secuencias
de llamada y retorno. El asunto de "quin" hace "qu" es una de las diferencias
entre las distintas convenciones de llamada que hemos visto en el captulo anterior

Normalmente en C++ es la funcin invocante la encargada de limpiar la pila y de


colocar all los parmetros. Esto es precisamente lo que hace posible el uso de
funciones con nmero variable de parmetros, ya que en tiempo de compilacin,
la funcin invocada no sabe cuntos argumentos recibir.

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);

Los argumentos seran pasados en el orden c,b, a. En la figura su colocacin sera


de abajo a arriba a partir del punto comienzo del nuevo registro de activacin.

Nota: el paso de argumentos incluye naturalmente su evaluacin previa (recuerde


que la sintaxis C/C++ permite utilizar argumentos que son el resultado de una
expresin). En lo que respecta al orden en que son pasados, y evaluados, los
argumentos, aunque la convencin derecha-izquierda es la usual en plataformas
Intel, puede variar en otras, por lo que en orden a la portabilidad, y como regla de
buena prctica, NO se deben hacerse suposiciones relativas al orden en que
sern evaluados los argumentos en las funciones C/C++, y mucho menos, utilizar
argumentos cuyo valor dependa de este orden.

La direccin del enlace dinmico est contenida en un registro del procesador


denominado puntero base BP ("Base Pointer" H.3.2). Esta direccin es importante
porque en el proceso de enlazado desaparecen todos los nombres de variables.
En el fichero objeto los nombres son sustituidos por las direcciones de

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").

Por ejemplo: para traer un valor cuyo desplazamiento es 8 de la pila al acumulador


(registro AX), al procesador le basta una sola instruccin que en ensamblador
puede tener el siguiente aspecto:

...

mov ax,[bp+8]

...

A partir de la posicin del enlace dinmico se sita un rea, rellenada por la


funcin invocada ("Called"), que contiene todas las variables locales dinmicas de
la nueva funcin (las variables estticas disponen de su propio espacio de
almacenamiento ( 1.3.2). A continuacin viene un rea denominada de variables
temporales que contiene datos auxiliares del compilador

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

Durante la fase de enlazado, en cada punto del cdigo donde aparece la


invocacin a una funcin, se coloca una direccin que seala la situacin del
recurso correspondiente (el cdigo compilado de la misma), pero mediante la
directiva inline, se indica al compilador que en vez del comportamiento habitual,
sustituya esta direccin por una copia del cdigo de la funcin, lo que se denomina
expansin inline. Resulta evidente que de esta forma se eliminan las secuencias
de llamada y retorno, lo que se traduce en una ejecucin mucho ms rpida. La
contrapartida es que el tamao del ejecutable resultante es mayor, ya que existe
ms de una copia de la funcin; tantas como sustituciones inline se hayan
efectuado. Adems, el artificio presenta algunos inconvenientes que sern
comentados a continuacin.

La declaracin de una funcin como sustituible inline, se realiza en el sitio de su


definicin, y tiene la forma general:

22
inline <tipo_dev> <funcin> (<parmetros>) {<sentencias>;}

En cualquier sitio donde el cdigo encuentre una invocacin a <funcin>, el


compilador sustituir la invocacin por el cdigo contenido en <sentencias>,
incluyendo la creacin de las variables locales pertinentes. Por ejemplo [2]:

inline float mod (float x, float y) { return sqrt(x*x + y*y); }

inline char* cat_func(void) { return char*; }

Nota: algunos compiladores exigen que la definicin inline se realice antes que
cualquier invocacin a la funcin.

En ocasiones, el compilador puede hacer caso omiso de la indicacin inline; se


trata de la misma situacin que con las peticiones register es decir, un mandato no
imperativo para el compilador. En cambio, otras veces el compilador supone una
sustitucin inline aunque no se indique explcitamente. Es el caso de las
denominadas funciones inline, mtodos cuya declaracin y definicin se realizan
dentro del cuerpo de la clase o el de determinadas invocaciones a funciones muy
pequeas incluidas en el cuerpo de otras. En estos casos, el mecanismo de
optimizacin del compilador puede decidir que su cdigo sea incluido en el cuerpo
de la funcin invocante.

En cualquier caso, las correspondientes directivas de compilacin, suelen permitir


al programador bastante control al respecto de este tipo de sustituciones,
incluyendo posturas intermedias y extremas. Por ejemplo, con objeto de facilitar la
depuracin del programa, es posible indicar al compilador que provisionalmente no
realice este tipo de sustituciones. En otros casos, se le puede ordenar que utilice
su criterio para establecer que funciones pequeas son merecedoras de la
sustitucin inline. Finalmente, cabe la opcin de dejar la sustitucin
exclusivamente a criterio del programador.

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(); // Constructor por defecto

~est(); // Destructor

};

inline void f1(est& e) { /* ... */ }

inline void f2(est e) { /* ... */ }

La definicin de f1 compilar sin problema, ya que el parmetro es una clase con


destructor, pero pasa por referencia. En la compilacin de f2 se producir un
mensaje de aviso: Functions taking class-by-value argument(s) are not expanded
inline in function f2(est).

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(); // constructor por defecto

~est(); // destructor

24
};

inline est f1() { // Ok: puede ser sustituida inline

return est();

inline est f2() { // Aviso: No sustituible inline

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:

inline est f3() { // Aviso: No sustituible inline

return ( est(), est() );

se genera un mensaje de aviso anlogo al anterior. Tampoco puede ser sustituida


porque el valor devuelto contiene objetos temporales.

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.

Aunque lo anterior supone ir contra dos reglas generales de la buena


programacin: la reutilizacin del cdigo, y la compartimentacin de datos y
procedimientos. En este sentido, la sustitucin inline supone una situacin
intermedia; sin las desventajas de la llamada y retorno a funcin, pero (desde el
punto de vista del programador), con las ventajas de la utilizacin de funciones en
cuanto suponen el encapsulamiento del cdigo en un nico sitio. La opcin a elegir
en cada caso (funcin tradicional o sustitucin inline), es como siempre una
cuestin definir prioridades entre el cronmetro y el tamao del cdigo resultante.

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.

Cuando se trata de optimizar funciones que no son escritas por el programador.


Por ejemplo, cuando se utilizan los recursos de la Librera Estndar, es
conveniente recordar que los modernos compiladores traen algunas de estas
libreras en dos formatos: como funciones y como macros, y el programador puede
optar entre una y otra forma

Depuracin de funciones inline


Puesto que en estas sustituciones el compilador reemplaza la llamada a funcin
por "su versin" del cdigo de la misma, aun cuando en la compilacin se hayan
incluido las opciones de depuracin no existe una correspondencia entre las lneas
de cdigo del fuente y el ejecutable, lo que hace difcil la depuracin de este tipo
de funciones. Para evitar estas dificultades, los compiladores ofrecen una serie de
opciones con las que se pueden controlar diversos aspectos de la construccin del
ejecutable en las versiones de depuracin.

Nota: para facilitar la depuracin de estas funciones, algunos compiladores


ignoran la directiva inline cuando se compila en modo "debug".

En el caso concreto del compilador BC++ se ofrece el siguiente abanico de


posibilidades de compilacin ( 1.4.3):

-v Opciones de depuracin ON; expansin inline OFF

-v- Opciones de depuracin OFF; expansin inline ON

-vi Expansin inline ON

-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:

#define abs (x) (x < 0? (-x) > x)

...

func f(x) {

int y = abs(x);

...

Es frecuente que algunas rutinas de librera, que adoptan la forma de funciones


pequeas, puedan venir en formas dos formatos: como funcin y como macro,
pudiendo optar el programador entre una y otra forma. Esta ltima (las macros)
viene a ser el equivalente de la sustitucin inline para tales funciones de librera.

Actividad 3 - Ensayo que establezca las tendencias y


tcnicas empleadas en lenguajes que requieren de una
mquina virtual para su ejecucin sobre multiplataforma

La programacin multiplataforma hoy en da

Contenido
Introduccin..29

Desarrollo.30

Conclusin35

Bibliografa35

27
Introduccin

En informtica, multiplataforma es un atributo conferido a programas informticos


o mtodos y conceptos de cmputo que son implementados e interoperan en
mltiples plataformas informticas. El software multiplataforma puede dividirse en
dos tipos; uno requiere una compilacin individual para cada plataforma que le da
soporte, y el otro se puede ejecutar directamente en cualquier plataforma sin
preparacin especial, por ejemplo, el software escrito en un lenguaje interpretado
o bytecode pre compilado portable para los cuales los intrpretes o paquetes en
tiempo de ejecucin son componentes comunes o estndar de todas las
plataformas. Por ejemplo, una aplicacin multiplataforma puede ejecutarse en
Microsoft Windows en la arquitectura x86, Linux en la arquitectura x86 y Mac OS X
ya sea en el PowerPC o sistemas Apple Macintosh basados en x86. Una
aplicacin multiplataforma se puede ejecutar tanto en todas las plataformas
existentes, como en tan solo dos plataformas.

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

El hecho de que un determinado sistema operativo se pueda ejecutar en


diferentes arquitecturas de computadora no quiere decir que el software escrito
para ese sistema operativo automticamente funcione en todas las arquitecturas
que soporta el sistema operativo. Por ejemplo, a partir de agosto de 2006
OpenOffice.org no se ejecutaba de forma nativa en los AMD64 o Intel 64 lneas de
procesadores los estndares para computadores de x86-64 64 bit. Sin embargo,
desde entonces la situacin ha cambiado, y la suite OpenOffice.org de software ha
sido portada a los sistemas de 64-bit. Esto tambin significa que slo porque un
programa se escriba en un popular lenguaje de programacin como C o C++, no
tiene por qu funcionar en todos los sistemas operativos que soporten la
programacin de dicho lenguaje o incluso en el mismo sistema operativo en una
arquitectura diferente.

Las aplicaciones Web suelen ser descritas como multiplataforma, ya que,


idealmente, se puede acceder desde cualquiera de los diversos navegadores web
en diferentes sistemas operativos. Tales aplicaciones generalmente emplean una
arquitectura de sistema cliente-servidor, y pueden variar ampliamente en
complejidad y funcionalidad. Esta amplia variabilidad complica considerablemente
la meta de capacidad multi-plataforma, que es rutinariamente en contradiccin con
el objetivo de funcionalidad avanzada.

Desarrollo

A causa de los intereses en conflicto de compatibilidad entre plataformas y


funcionalidades avanzadas, han surgido numerosas alternativas de diseo de
aplicaciones web.

Tales estrategias incluyen:

Degradacin correcta

Degradacin correcta intenta proporcionar la misma funcionalidad o similar para


todos los usuarios y plataformas, mientras que la disminucin de la funcionalidad
de un "mnimo comn denominador" para obtener ms exploradores cliente
limitados. Por ejemplo, un usuario que intenta usar una caracterstica limitada de
un navegador para acceder a Gmail puede notar que Gmail cambia al "modo
bsico", con funcionalidad reducida. Algunos ven esta estrategia como una forma
menor de la capacidad multiplataforma.

29
Separacin de funciones

La separacin de las funcionalidades para simplificar la omicin de los


subconjuntos de funciones que no soportan los exploradores de los clientes dentro
de ciertos sistemas operativos, sin dejar de ofrecer una "completa" aplicacin para
el usuario.

Cdigo base mltiple

Mltiples aplicaciones codebase presentar diferentes versiones de una aplicacin


en funcin del cliente especfico en uso. Esta estrategia es sin duda la forma ms
complicada y costosa de cumplir la capacidad multiplataforma, ya que incluso las
diferentes versiones del navegador del cliente mismo (dentro del mismo sistema
operativo) puede diferir considerablemente entre s. Esto se complica an ms por
el apoyo a plugins que puede o no estar presente para cualquier instalacin dada
de un navegador web particular.

Bibliotecas de terceros

Bibliotecas de terceros intentan simplificar la capacidad multiplataforma de


"esconder" las complejidades de las diferencias de los clientes detrs de un API
unificada.

La programacin multiplataforma es la prctica de la forma activa de la escritura


de software que funciona en ms de una plataforma.

Mtodos de programacin multi-plataforma

Hay diferentes maneras de abordar el problema de escribir una aplicacin


multiplataforma. Una de ellos es simplemente crear varias versiones del mismo
programa en diferentes rboles de cdigo fuente, es decir, la versin de Windows
de un programa puede tener un conjunto de archivos de cdigo fuente y la versin
de Macintosh podra tener otro, mientras que un software libre con sistema Unix
podra tener otro. Si bien este es un enfoque simple para el problema, tiene el
potencial de ser mucho ms caro en costos de desarrollo, tiempo de desarrollo, o
ambos, sobre todo para las entidades corporativas. La idea detrs de esto es crear
ms de dos programas diferentes que tienen la capacidad de comportarse de
manera similar a la otra. Tambin es posible que este medio de desarrollo de una
aplicacin multi-plataforma dar lugar a ms problemas de seguimiento de errores
y corregir, porque los dos rboles diferentes fuentes tendra programadores
diferentes, y por lo tanto los defectos diferentes en cada versin. Cuanto menor
sea el equipo de programacin, ms rpido las correcciones de errores tienden a
ser.

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.

Algunas aplicaciones de mezclar diversos mtodos de programacin


multiplataforma para crear la aplicacin final. Un ejemplo de esto es el navegador
web Firefox, que utiliza la abstraccin para construir algunos de los componentes
de nivel inferior, sub-estructuras separadas de cdigo para implementar las
caractersticas especficas de la plataforma (como la interfaz grfica de usuario), y
la aplicacin de ms de un lenguaje de scripting para ayudar a facilitar facilidad de
portabilidad. Firefox implementa XUL, CSS y JavaScript para la extensin del
navegador, adems de plugins al estilo del clsico navegador Netscape. Gran
parte del mismo navegador en s est escrito en XUL, CSS y JavaScript, tambin.

Herramientas de programacin y entornos multiplataforma

Hay una serie de herramientas que estn disponibles para ayudar a facilitar el
proceso de programacin multiplataforma:

El Cairo: Un software libre, biblioteca que se utiliza para proporcionar un vector


basado en grficos, independiente del API del dispositivo. Est diseado para
proporcionar primitivas para dibujos 2-dimensionales a travs de un nmero de
diferentes sistemas de apoyo. El Cairo est escrito en C y tiene enlaces para
muchos lenguajes de programacin.

Eclipse: Entorno de desarrollo multiplataforma, cdigo abierto. Implementado en


Java con una arquitectura configurable que soporta muchas herramientas para
desarrollo de software. Complementos disponibles para varios lenguajes, como
Java y C++.

FLTK: Otro cdigo abierto multiplataforma. Kit de herramientas, pero ms ligero,


ya que se limita a la GUI.

fpGUI: Un conjunto de herramientas de fuente abierta widget de que est


completamente implementado en Object Pascal. Actualmente es compatible con
Linux, Windows y un poco de Windows CE.

GeneXus: En Windows es una solucin rpida de desarrollo de software para la


creacin de aplicaciones multiplataforma y de despliegue basado en la

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.

GTK+: Un conjunto de herramientas de cdigo abierto para el widget de sistemas


tipo Unix con X11 y Microsoft Windows.

haXe: Un lenguaje multiplataforma de cdigo abierto.

Juce: Un framework de aplicaciones escritas en C++, que se utiliza para escribir


software nativo en numerosos sistemas (Microsoft Windows, POSIX, Mac OS X),
sin cambios en el cdigo.

Max/MSP: Un lenguaje de programacin Visual que encapsula independiente de la


plataforma del cdigo con un entorno de ejecucin especfico de la plataforma en
las aplicaciones para Mac OS X y Windows.

Mono (una versin de cdigo abierto de Microsoft NET.): Un marco multiplataforma


para las aplicaciones y lenguajes de programacin.

Monocross es una fuente abierta del patrn de diseo modelo-vista-controlador en


el que se comparten el modelo y el controlador multi-plataforma, pero la vista es
especfica de la plataforma.

MoSync es un SDK de cdigo abierto para el desarrollo de aplicaciones mviles


en la plataforma C++ familia.

Framework de la aplicacin Mozilla: Una plataforma de cdigo abierto para el


desarrollo de Mac OS X, las aplicaciones de Windows y Linux.

OpenGL: Una biblioteca multiplataforma de grficos 3D.

Qt (toolkit): Una estructura de aplicaciones y Widget Toolkit para sistemas Unix


con X11, Microsoft Windows, Mac OS X, disponible tanto en virtud de cdigo
abierto y licencias propietarias.

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.

Simple DirectMedia Layer: Una librera de multimedia multiplataforma de cdigo


abierto, escrita en C que proporciona acceso de nivel bajo y alto a los grficos, de
entrada, audio, etc.

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.

Ultimate++: es un marco de desarrollo rpido de aplicaciones multiplataforma de


C++ centrado en la productividad de los programadores. Incluye un conjunto de
bibliotecas de usuario (GUI, SQL, etc.), Y un entorno de desarrollo integrado. Es
compatible con Windows y Unix OS-s. El U++ compite con lenguajes de scripting
populares preservando caractersticas de C/C++ de tiempo de ejecucin. Tiene su
propio entorno de desarrollo integrado, TheIDE, que cuenta con BLITZ-construir
tecnologa para aceleracin de C++ reconstruyendo hasta 4 veces el compilado.

wxWidgets: un juego de herramientas widget de fuente abierta que es tambin un


marco de aplicacin. Se ejecuta en sistemas Unix con X11, Microsoft Windows y
Mac OS X. Se permite que las aplicaciones escritas para usarlo para funcionar en
todos los sistemas que lo soporta, si la aplicacin no utiliza ningn sistema
operativo especfico de programacin, adems de a la misma.

XPower++: es un IDE multiplataforma para Windows, Linux, Mac OS X y sistemas


operativos mviles.

Hay algunos desafos relacionados con el desarrollo de multi-plataforma. Algunos


de estos incluyen:

Pruebas de aplicaciones multiplataforma puede ser mucho ms complicado,


ya que las diferentes plataformas pueden exhibir comportamientos
ligeramente diferentes o errores sutiles. Este problema ha llevado a algunos
desarrolladores a ridiculizar el desarrollo multiplataforma como escribir una
vez, depurar en todas partes, eslogan de marketing.
Los desarrolladores a menudo se limitan a utilizar el mnimo comn
denominador subconjunto de caractersticas que estn disponibles en todas
las plataformas. Esto puede afectar al rendimiento de la aplicacin o prohibir
el uso de los desarrolladores caractersticas ms avanzadas de la
plataforma.
Las diferentes plataformas a menudo tienen diferentes convenciones de
interfaz de usuario, que aplicaciones multiplataforma no siempre acomodar.
Por ejemplo, las aplicaciones desarrolladas para Mac OS X y GNOME se
supone que coloque el botn ms importante en la parte derecha de la
ventana o cuadro de dilogo, mientras que Microsoft Windows y KDE tienen
la convencin opuesta. Aunque muchas de estas diferencias son sutiles, una
aplicacin multiplataforma que no se ajusta adecuadamente a estos

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

Elegir lenguaje de programacin es el primer paso para realizar un proyecto, pero


para ello hay que saber lo que queremos conseguir con nuestro programa.
Cuando nos decidimos por el desarrollo de aplicaciones multiplataforma, es decir,
para distintos dispositivos, debemos tener muy en cuenta el diseo de sta. Lo
importante es ser realista y plantear objetivos que se puedan cumplir a la hora de
realizar una migracin a plataformas de software libre. Para ello es fundamental
decantarse por herramientas multiplataforma en lugar de por aplicaciones
especficas de un nico sistema operativo, que luego te costara un huevo poner
en funcionamiento en otro entorno. La razn es muy sencilla, los sistemas
operativos son una cosa que cambia y evoluciona realmente rpido en el tiempo.
Por tanto lo fundamental es promover el uso de herramientas multiplataforma
entre los usuarios siempre que se pueda, esto hace mucho menos traumtico el
cambio a una nueva plataforma y hace que los costes de implantacin de la
migracin se reduzcan considerablemente.

34
Bibliografa

Cceres P., Marcos E. (2003). Procesos giles para el desarrollo de aplicaciones


web. Universidad Rey Juan Carlos. Madrid. Recuperado de:
http://www.dlsi.ua.es/webe01/articulos/s112.pdf

Escalona M.J. & Koch N. (2002). Ingeniera de Requisitos en Aplicaciones para la


Web: Un estudio comparativo. Universidad de Sevilla. Sevilla.
http://lsiweb.lsi.us.es/docs/informes/LSI-2002-4.pdf

Jacobson, I., Booch, G. & Rumbaugh, J. (2000). El proceso unificado de desarrollo


de software.Madrid: Pearson.

Actividad 4 - Cuadro sinptico de los criterios de tiempo


de ejecucin extensin del cdigo generado

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

Funciones y tablas de smbolos

Actividad 5 - Reporte del avance por equipo del proyecto


Seleccin simple
final consiste en desarrollar software de base: traductor,
intrprete o compilador.
Introduccin

Un traductor es un metaprograma que toma como entrada un programa (o


parte de un programa) escrito en lenguaje simblico, alejado de la mquina,
denominado programa fuente y proporciona como salida otro programa,
semnticamente equivalente, escrito en un lenguaje comprensible por el hardware
del ordenador, denominado programa objeto. Veremos dos tipos de traductores,
los compiladores e intrpretes, que representan dos aproximaciones muy distintas
a la tarea de permitir el funcionamiento de los programas escritos en un
determinado lenguaje de programacin de alto nivel.

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

La traduccin por un compilador (la compilacin) consta de dos etapas


fundamentales, que a veces no estn claramente diferenciadas a lo largo del
proceso: la etapa de anlisis del programa fuente y la etapa de sntesis del
programa objeto. Cada una de estas etapas conlleva la realizacin de varias
fases. El anlisis del texto fuente implica la realizacin de un anlisis del lxico, de
la sintaxis y de la semntica. La sntesis del programa objeto conduce a la
generacin de cdigo y su optimizacin.

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.

En la prctica, el usuario crea un archivo con el programa fuente. Esto


suele realizarse con un editor especfico del propio intrprete del lenguaje. Segn
se van almacenado las instrucciones simblicas, se analizan y se producen los
mensajes de error correspondientes; as, el usuario puede proceder
inmediatamente a su correccin. Una vez creado el archivo fuente, el usuario
puede dar la orden de ejecucin y el intrprete lo ejecuta lnea a lnea. Siempre el
anlisis antecede inmediatamente a la ejecucin.

Si utilizamos un intrprete para traducir un programa, cada vez que necesitemos


ejecutar el programa se volver a analizar, ya que, no se genera un fichero objeto.
En cambio, con un compilador, aunque sea ms lenta, la traduccin slo debe
realizarse una vez. Adems los traductores no permiten realizar optimizaciones del
cdigo (que eliminan rdenes innecesarias compactando el cdigo) ms all del
contexto de cada sentencia del programa.

La principal ventaja de los intrpretes frente a los compiladores es que resulta ms


fcil localizar y corregir errores de los programas, ya que la ejecucin de un

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

El compilador contar con una seccin de tabla de errores en la cual se mostraran


los errores detectados, segn los hayamos declarado en la estructura de nuestro
lenguaje.

En esta parte hacemos la declaracin de los posibles errores que se pueden


suscitar y el mensaje correspondiente que se mostrara en caso que durante el
anlisis sintctico que se realiza lnea por lnea detecte alguno.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ManejoDeErrores
{
public class TE
{

//tabla errores (numero de linea,error,como solucionarlo)


public List<Tabla_Errores> TErrores = new List<Tabla_Errores>();
public List<Tabla_Errores> TErroresed = new List<Tabla_Errores>();

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 te = new Tabla_Errores(0, "valor incorrecto", "escriba el


valor aceptado por el tipo de variable", "valor diferente al aceptado por el
tipo");
TErrores.Add(te);

Tabla_Errores te1 = new Tabla_Errores(1, "se espera un valor", "escriba


un valor para la variable ", "se espera un valor despues de...");
TErrores.Add(te1);

Tabla_Errores te2 = new Tabla_Errores(2, "error al abrir", "revise la


extencion del archivo o la direccion del mismo", "error al abrir el archivo");
TErrores.Add(te2);

Tabla_Errores te3 = new Tabla_Errores(3, "error aritmetico", "revise la


operacin que esta realizando", "excepciones producidas durante operaciones
aritmticas");
TErrores.Add(te3);

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);

Tabla_Errores te5 = new Tabla_Errores(5, "error de conversion de tipo",


"verifique que los tipos de las variables sea el mismo ", "Se produce cuando
tiene lugar un error en tiempo de ejecucin en una conversin explcita de un
tipo base a una interfaz o a un tipo derivado.");
TErrores.Add(te5);

Tabla_Errores te6 = new Tabla_Errores(6, "error referencia nula", "revise


que esta dando un valor ala variable", "Se produce al intentar hacer referencia
a un objeto cuyo valor es null.");
TErrores.Add(te6);

Tabla_Errores te7 = new Tabla_Errores(7, "error de desbordamiento",


"asegurese del tamao del resultado ", "Se produce cuando una operacin
aritmtica en un contexto produce un desbordamiento.");
TErrores.Add(te7);
Tabla_Errores te8 = new Tabla_Errores(8, "error de Ambito", "asegurese
de que las llaves '{' tengan su contraparte '}' ", "Se produce cuando hay
alguna llave sin cerrar, ambito incompleto");
TErrores.Add(te8);
Tabla_Errores te9 = new Tabla_Errores(9, "sintaxis desconocida",
"asegurese de que la sintaxis sea correcta ", "Se produce cuando se desconoce
la sintaxis de la sentencia");
TErrores.Add(te9);

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);

public List<Tabla_Errores> llamatablaE()


{
return TErroresed;
}

public void addliste(int id,int nl)


{
foreach (var error in TErrores)
{

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,int nl,string e, string se,string d)


{
ID = id;
num_lineaE = nl;
error = e;
sol_error = se;
descrip = d;

}
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; }
}

public int NumerodeLinea


{
get { return num_lineaE; }
set { num_lineaE = value; }
}

public string Error


{
get { return error; }
set { error = value; }
}

public string Solucion


{
get { return sol_error; }
set { sol_error = value; }
}
public string Descripcion
{
get { return descrip; }
set { descrip = 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

Lopez Vera, N. (22 de noviembre de 2013). Tipos de Optimizacin.


Recuperado el 18 de octubre de 2015, de Lenguajes y Automatas 2:
http://noeliy22.blogspot.mx/2013/11/tipos-de-optimizacion.html
Optimizacion de codigo. (s.f.). Recuperado el 18 de octubre de 2015, de
Compiladores 2:
http://www.cvc.uab.es/shared/teach/a25002/Optimizacion%20de
%20codigo.pdf

45

Anda mungkin juga menyukai