Download Diapositiva 1 - Docencia FCA-UNAM

Document related concepts
no text concepts found
Transcript
UNIVERSIDAD LATINA (UNILA)
V. GESTIÓN DE TIPOS Y GENERACIÓN DE
CÓDIGOS.
LE, EI, Profesor Ramón Castro Liceaga
Gestión de tipos de código
Un compilador debe comprobar si el programa fuente sigue tanto las convenciones
sintácticas como las semánticas del lenguaje fuente. Esta comprobación garantiza la
detección y comunicación de algunas clases de errores de programación por ejemplo
del manejo de diferentes tipos de datos.
Es el proceso de administración de tipos de código del compilador donde éste se
asegura que el tipo de una construcción coincida con el previsto en su contexto.
Por ejemplo, el operador aritmético predefinido mod en MODULA exige operandos
de tipo entero, de modo que mediante la gestión de tipos debemos asegurar que
dichos operandos sean de tipo entero. De igual manera, la gestión de tipo debe
asegurarse de que la desreferenciación se aplique sólo a un apuntador, de que la
indización se haga sólo sobre una matriz, de que una función definida por el usuario
se aplique la cantidad y tipo correctos de argumentos, etc.
Practica : Gestión de tipos de código
Hacer un programa en Java considerando el proceso siguiente:
Practica : Gestión de tipos de código
Utilizando los siguientes tipos:
private int precio; // Las instrucciones y declaraciones finalizan con ;
private int importe_acumulado;
private String profesor;
private String aula;
private int capacidad;
private boolean funciona;
private boolean esVisible;
private float diametro;
private float peso;
private short edad;
private long masa;
private char letra1;
Practica : Gestión de tipos de código
Utilizando los siguientes tipos:
Precio = 42; // Entero tipo int. Un número sin punto decimal se interpreta
normalmente como int.
importe_acumulado = 210; // Entero tipo int
profesor = “Ernesto Juárez Pérez”; // Tipo String
aula = “A-44”; // Tipo String
capacidad = 1500; // Entero tipo int
funciona = true; // Tipo boolean
esVisible = false; // Tipo boolean
diametro = 34.25f; // Tipo float. Una f o F final indica que es float.
peso = 88.77; // Tipo double. Un número con punto decimal se interpreta
normalmente como double.
edad = 19; // Entero tipo short
masa = 178823411L; // Entero tipo long. Una l o L final indica que es long.
letra1 = ‘h’; // Tipo char (carácter). Se escribe entre comillas simples.
Practica: Gestión de tipos de codigo.
• Hacer un programa en java que
actualice los diferentes tipos de
código que se muestran en la
diapositiva anterior
Generación de códigos.
• Es el proceso de recibir como entrada una representación
intermedia del programa fuente y la asigna al lenguaje
destino. PF -> LD
• Si el lenguaje destino es código máquina, se seleccionan
registros o ubicaciones (localidades) de memoria para cada
una de las variables que utiliza el programa. LD -> M
• Después, las instrucciones intermedias se traducen en
secuencias de instrucciones de máquina que realizan la misma
tarea. II -> IM
• Un aspecto crucial de la generación de código es la asignación
juiciosa de los registros para guardar las variables. A := B
Generación de códigos.
Generación y Optimización.
• Generación de código
– Se realiza mientras se analiza el programa
– “Libre del contexto”
• Optimización
– Se realiza después de la generación de código de todo el
programa o de un elemento ejecutable del programa
(función, procedimiento, etc).
– “Dependiente del contexto”
Optimización
• Es el proceso de eliminación de instrucciones
innecesarias en el código objeto, o la
sustitución de una secuencia de instrucciones
por una secuencia más rápida de instrucciones
que haga lo mismo, a este proceso se le
conoce como mejora de código u optimización
de código.
Practica: De optimización de código.
• Una empresa del área de recursos humanos requiere
ordenar tres números en orden ascendente. hacer el
programa en java que pida los tres números y
muestre dicho ordenamiento.
• Implementar el algoritmo de la burbuja
con un código optimizado
Practica: De optimización de código.
• El algoritmo de la burbuja es uno de los métodos de
ordenación más conocidos y uno de los primeros que
aprenden los programadores.
• Consiste en comparar pares de elementos adyacentes en un
array y si están desordenanos intercambiarlos hasta que estén
todos ordenados.
• Si A es el array a ordenar, se realizan A.length-1 pasadas. Si la
variable i es la que cuenta el número de pasadas, en cada
pasada i se comprueban los elementos adyacentes desde el
primero hasta A.length-i-1 ya que el resto hasta el final del
array están ya ordenados. Si los elementos adyacentes están
desordenados se intercambian.
Practica: De optimización de código.
• El método de ordenación de la burbuja
en java para ordenar un array A es el
siguiente:
public static void burbuja(int [] A){
int i, j, aux;
for(i=0;i<A.length-1;i++)
for(j=0;j<A.length-i-1;j++)
if(A[j+1]<A[j]){
aux=A[j+1];
A[j+1]=A[j];
A[j]=aux;
}
}
Practica: De optimización de código.
Practica: De optimización de código.
Ya están ordenados, pero los dos bucles for seguirán
ejecutándose hasta el final.
El tiempo de ejecución del algoritmo de la burbuja es del
orden O(n2)
Es uno de los peores algoritmos de ordenación en cuanto a
tiempo de ejecución, solamente es recomendable su uso
para ordenar listas con un número pequeño de elementos.
Ensamblamiento (Folding).
Es el proceso del compilador que consiste en remplazar
las expresiones por su resultado cuando se pueden
evaluar en tiempo de compilación (resultado
constante).
– Ejemplo:
Expresión A=2+3+A+C
Remplazo -> A=5+A+C
• Estas optimizaciones permiten que el programador
utilice cálculos entre constantes representados
explícitamente sin introducir ineficiencias.
Practica :Ensamblamiento (Folding).
Hacer un programa en Java que remplace las siguientes
expresiones: Usar variables y que sea para cualquier
expresión.
Expresión A=2+3+A+C
Remplazo -> A=5+A+C
Expresión B=55 * 2+A+B+C
Remplazo -> B=110+A+B+C
Expresión D=(5+8+4)/2+A+B
Remplazo -> D=8.5+A+B
Expresión A=(5*25) / (4 + 3) * 4
Remplazo -> A=125 / 6 * 4
Grafos de flujo
Es el proceso del compilador que se realiza
cuando un programa de código intermedio
se particiona en bloques básicos
relacionados entre si, representando el
flujo de control entre ellos mediante un
grafo de flujo.
Los nodos del grafo de flujo son los nodos
básicos.
Ejemplo: Grafos de flujo
Hacer un programa en Java con métodos o clases B1, B2, B3, B4, B5 y
B6 que simule el grafo de flujo de la figura anterior (8.9)
public class B3 {
// Método B1
static void metodoB1(){
int i = 1;
System.out.println("i = 1 es " + i);
}
// Método B2
static void metodoB2(){
int j = 5;
System.out.println("j = 5 es " + j);
}
public static void main(String[] args) {
System.out.print(" Metodo B1 ");
metodoB1();
System.out.print(" Metodo B2 ");
metodoB2();
}
}
Metodo B1 i = 1 es 1
Metodo B2 j = 5 es 5