1. Señale dos ventajas de la generación de código intermedio
· El código objeto es abstraído para una maquina virtual. esta abstracción ayuda a separar operaciones de alto nivel y realizar dependientes de la maquina.
· La generación de código y el asignamiento de registros temporales son separados de las rutinas semánticas, los cuales solo trabajan con la abstracción presentada por la representación intermedia. las dependencias del código objeto son aisladas de las rutinas de generación de código.
· La abstracción puede ser hecha en el nivel de representación intermedia. esta organización ayuda a hacer una optimización completamente independiente del código objeto, con lo que hace que las rutinas de optimización complejas sean más transportables. debido a que las representaciones intermedias son por diseño más abstracta y uniforme, las rutinas de optimización puede ser más simples.
2. Explique con un ejemplo la optimización de código.
Optimación de Código
La fase de optimación de código trata de mejorar el código intermedio de modo que resulte un código de máquina más rápido de ejecutar. Algunas optimaciones son triviales. Por ejemplo, un algoritmo natural genera el código intermedio (2) utilizando una instrucción para cada operador de la representación del árbol después del análisis semántico, aunque hay una forma mejor de realizar los mismos cálculos usando las dos instrucciones
Posición := inicial + velocidad * 60 (1) Código Inicial
temp1 := entarea1(60)
temp2 := id3 * temp1 (2) Generación de código intermedio
temp3 := id2 + temp2
id1 := temp3
Temp1 := id3 * 60.0 (3) Optimización de Código
Id1 := id2 + temp1
Este sencillo algoritmo no tiene nada de malo, puesto que el problema se puede solucionar en la fase de optimación de código. Esto es, el compilador puede deducir que la conversión de 60 de entero a real se puede hacer de una vez por todas en el momento de la compilación, de modo que la operación entero a real se puede eliminar. Además, temp3 se usa sólo una vez, para transmitir su valor a id1. Entonces resulta seguro sustituir a id1 por temp3, a partir de lo cual la última proposición de (2) no se necesita y se obtiene el código de (3).
Hay muchas variaciones en la cantidad de optimación de código que ejecutan los distintos compiladores. En lo que hacen mucha optimación llamados “compiladores optimadores”, una parte significativa del tiempo del compilador se ocupa en esta fase. Sin embargo hay optimaciones sencillas que mejoran significativamente del tiempo del compilador se ocupa en esta fase. Sin embargo, hay optimaciones sencillas que mejoran sensiblemente el tiempo de ejecución del programa objeto sin retardar demasiado la compilación.
3. Señale el proceso de compilación de un programa en C#.
Cuando estemos escribiendo código, lo estaremos haciendo en un lenguaje (X), en nuestro caso C#, todos nuestros archivos deberán tener la extensión .CS, estos archivos describen y muestran todo lo que hace nuestra aplicación en un lenguaje entendible para los humanos, cuanto más entendible sea el código más nivel tendrá el lenguaje y cuanto menos entendible menos nivel, de aquí el termino lenguajes de alto y bajo nivel, y el piso es el lenguaje maquina, ahora bien estos archivos que crearemos son el tesoro más preciado de nuestra comunidad, y se lo conoce como código fuente, ahora éste código no es ejecutable ya que la PC no lo entiende por ese motivo hay que traducirlo a un lenguaje que sea entendible por la PC, a este proceso de traducción se lo conoce como compilación, y consta de llevar el código fuente a un bajo nivel, que por lo general tras el proceso de compilación el resultado es un archivo de tipo .EXE,
ARCHIVO FUENTE (.CS) - COMPILACION - (MSIL) ARCHIVO EJECUTABLE (.EXE)
Pasos
· Lo primero que le ocurre a un fichero .c de código C es el preprocesado. En este paso se sustituyen todas las macros y se eliminan los comentarios. El resultado, si lo vemos independientemente, es un fichero de código C preprocesado, o .i.
· El segundo paso es la compilación propiamente dicha, en el que el código C preprocesado se convierte en código ensamblador, que si lo vemos independientemente es un fichero .s.
· El tercer paso es el ensamblado del código ensamblador, lo que lo convierte en código máquina. Un fichero de código máquina también es llamado fichero objeto, y su extensión típica es .o.
· Dado que el camino anterior normalmente convierte un fichero en un fichero, se suele hacer en un sólo paso, de código C a fichero objeto.
· El último paso es el enlazado de los ficheros objeto en el ejecutable final.
4. Generar CI para el código siguiente: