Sei sulla pagina 1di 6

UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN

FACULTAD DE INGENIERÍA
ESCUELA EN INFORMÁTICA Y SISTEMAS

LECTURA N° 02

“Introducción a los compiladores”

CURSO : Compiladores y teoría de lenguajes

2017

1.1. EJERCICIOS PARA LA SECCIÓN 1.1

1 .1 .1: ¿Cuál es la diferencia entre un compilador y un intérprete?

Solución:

Es un programa que lee totalmente un programa escrito en un


1. COMPILADOR lenguaje; el lenguaje fuente, y lo traduce a un programa
equivalente a otro lenguaje, lenguaje objeto.
Lee un programa en un lenguaje (lenguaje fuente) y traducirlo a
otro lenguaje (lenguaje destino).
Detecta cualquier error en el programa mientras lo traduce.
Hablando de la velocidad de ejecución un archivo compilado es de
10 a 20 veces más rápido que un archivo interpretado.
Es un programa que lee línea a línea un programa escrito en un
2. INTERPRETE lenguaje; en lenguaje fuente y lo va traduciendo a un código
intermedio, para ejecutarlo.
No produce programa destino, da la apariencia de ejecutar
directamente las operaciones especificadas en el programa origen
No genera un ejecutable
El proceso de traducción se realiza en cada ejecución

1 .1 .2: ¿Cuáles son las ventajas de (a) un compilador sobre un intérprete, y (b) las de un
intérprete sobre un compilador?

Solución:

Un archivo compilado puede ser distribuido fácilmente conociendo


a) COMPILADOR la plataforma, mientras que un archivo interpretado no funciona si
no se tiene el intérprete.
El programa destino del compilador, es más rápido que un
intérprete al momento de asignar las entradas a las salidas
Genera un ejecutable

La ventaja del intérprete es que dado cualquier programa se puede


b) INTERPRETE interpretarlo en cualquier plataforma (sistema operativo).
El intérprete puede ofrecer mejores diagnósticos de error que un
compilador, ya que ejecuta el programa fuente instrucción por
instrucción
No genera un ejecutable

1 .1 .3: ¿Qué ventajas hay para un sistema de procesamiento de lenguajes en el cual el


compilador produce lenguaje ensamblador en vez de lenguaje máquina?

Solución:

Los lenguajes ensambladores presentan la ventaja frente a los lenguajes máquina de su


mayor facilidad de codificación y, en general, su velocidad de cálculo.
El lenguaje ensamblador tiene un mejor entendimiento dado que usa símbolos que
representan dichas operaciones, pero este se acerca mucho al lenguaje de una máquina
que es el binario.

1 .1 .4: A un compilador que traduce un lenguaje de alto nivel a otro lenguaje de alto nivel se
le llama traductor de source-to-source. ¿Qué ventajas hay en cuanto al uso de C como
lenguaje destino para un compilador?
Solución:

Es un lenguaje muy eficiente puesto que es posible utilizar sus características de bajo nivel
para realizar implementaciones óptimas.
A pesar de su bajo nivel es el lenguaje más portado en existencia, habiendo compiladores
para casi todos los sistemas conocidos.
Proporciona facilidades para realizar programas modulares y/o utilizar código o bibliotecas
existentes.
“C” es un lenguaje de medio nivel y dispone de las estructuras típicas de los lenguajes de
alto nivel pero también permite control a muy bajo nivel y los compiladores suelen ofrecer
extensiones al lenguaje que posibilitan mezclar código en ensamblador con código C ,
entonces aquí C utilizaría un compilador de alto nivel o el source to source

1 .1 .5: Describa algunas de las tareas que necesita realizar un ensamblador.

Solución:

La tarea fundamental de un ensamblador es traducir un programa en lenguaje de


ensamblador al código correspondiente en lenguaje de máquina. En esencia, el
ensamblador debe realizar las siguientes tareas:

Convertir los códigos (“opcode” o mnemónicos: ej. LDA, STX) a su código


equivalente en lenguaje de máquina, Traduce el lenguaje ensamblador a lenguaje
máquina ya que usa código binario usualmente se ocupa para los
microprocesadores y utiliza operaciones aritméticas y lógicas.
Convertir los operandos simbólicos (las etiquetas o variables) en las direcciones
correspondientes de los operandos
Construir las instrucciones en lenguaje de máquina en el formato apropiado
Convertir las constantes definidas en el programa en su verdadera representación
Escribir el “listing” en lenguaje de ensamblador con el código en lenguaje de
máquina correspondiente
Procesar las directrices al ensamblador (las directrices son instrucciones o
comandos dirigidos al ensamblador, que éste procesa y ejecuta al hallarlos en el
programa en lenguaje de ensamblador; estas directrices no se traducen a lenguaje
de máquina, si no que el ensamblador ejecuta alguna acción, como reservar
memoria para variables, entre otras)

1.3. EJERCICIOS PARA LA SECCIÓN 1.3

1 .3 .1: Indique cuál de los siguientes términos:

a) imperativo b) declarativo
c) von Neumann d) orientado a objetos
e) funcional g) de cuarta generación
h) secuencias de comandos f) de tercera generación

se aplican a los siguientes lenguajes:


1) C 2) C + + 3) Cobol
4) Fortran 5) Java 6) Lisp
7) ML 8) Perl 9) Python
10) VB.

Solución:

a) imperativo C++, Java


b) declarativo ML
c) von Neumann C, Fortran
d) orientado a objetos C++, Java, VB
e) funcional ML
f) de tercera generación C, C++, Cobol, Fortran, Java, Lisp
h) secuencias de comandos Perl, Python

1.6 EJERCICIOS PARA LA SECCIÓN 1.6

1 .6 .1: Para el código en C estructurado por bloques de la figura 1.13(a), indique


los valores asignados a w, x, y y z.

int w, x , y , z;
int i = 4; int j = 5;
{
Int j = 7;
i = 6;
w = i + j ;
}
x = i + j ;
{
int i = 8;
y = i + j ;
}
z = i + j ;

Solución:
w = 13
x=9
y = 13
z=9

1 .6 .2: Repita el ejercicio 1.6.1 para el código de la figura 1.13(b).

int w, x , y , z;
int i = 3; int j = 4;
{
int i = 5;
w = i + j ;
}
x = i + j;
{
int j = 6;
i = 7;
y = i + j ;
}
z = i + j;
Solución:

w=9
x=7
y = 13
z=7

1 .6 .3: Para el código estructurado por bloques de la figura 1.14, suponiendo el


alcance estático usual de las declaraciones, dé el alcance para cada una de las doce
declaraciones.

Figura 1.13: Código estructurado por bloques

{ int w, x, y, z ; /* Block B1 */
{ int x, z; /* Block B2 */
{ int w, x; /* Block B3 */}
}
{ int w, x ; /* Block B4 */
{ int y, z ; /* Block B5 */ }
}
}

Solución:
DECLARACION ALCANCE
w del B1 B1;B2
x del B1 B1
y del B1 B1;B2;B3;B4
z del B1 B1;B4
x del B2 B2
z de B2 B2;B3
w de B3 B3
w de B4 B4;B5
x de B4 B4;B5
y de B5 B5
z de B5 B5

Ejercicio 1.6.4: ¿Qué imprime el siguiente código en C?

#define a (x+1)
int x=2;
void b() { x = a ; printf ("%d\n", x ) ; }
void c() { int x = 1; printf("%d\n"), a;}
void main () { b( ); c( ); }

Solución:

El código imprime el número 3.

Potrebbero piacerti anche