Está en la página 1de 20

Elaboró: M. en C.

Georgina Eslava García

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO


FACULTAD DE ESTUDIOS SUPERIORES ACATLÁN
DIVISIÓN DE MATEMÁTICAS E INGENIERÍA
LICENCIATURA EN MATEMÁTICAS APLICADAS Y COMPUTACIÓN

Programación II
(M. EN C. GEORGINA ESLAVA GARCÍA)

T EMA 1
Introducción a los lenguajes de programación
1.1. Concepto de un lenguaje de programación

El termino alfabeto denota cualquier conjunto finito de símbolos. Una cadena es una
secuencia finita de símbolos tomados de un alfabeto. Por lo tanto, un lenguaje es cualquier
conjunto de cadenas que cumple con ciertas reglas gramaticales.

Cualquier notación para describir algoritmos y estructuras de datos se puede calificar como
lenguaje de programación.

Los componentes de software se construyen mediante lenguajes de programación que


tiene un vocabulario limitado, una gramática definida explícitamente y reglas bien formadas de
sintaxis y semántica. Estos atributos son esenciales para la traducción hecha por la máquina.

Por lo tanto, un programa de computadora es el conjunto de instrucciones utilizadas para operar


una computadora y producir un resultado específico. El proceso de escribir programas se llama
programación.

Los lenguajes de programación pueden ser de alto nivel, bajo nivel o lenguaje máquina.

Los lenguajes de alto nivel permiten al programador y al programa independizarse de la


máquina, ya que utilizan instrucciones similares a las de los lenguajes utilizados entre los
humanos para comunicarse, como el inglés, y se pueden ejecutar en diversos tipos de
computadoras. Son lenguajes de alto nivel FORTRAN, Pascal, C, etc.

1
Elaboró: M. en C. Georgina Eslava García

Figura 1.1. Ejemplo de código en el lenguaje de alto nivel.

Los lenguajes de bajo nivel permiten hacer un uso extremadamente eficiente de la memoria y
optimizar la velocidad de ejecución del programa. Pero si el programa presenta un diseñado
incorrecto y tiene poca o nada documentación, puede convertirse en una pesadilla. El lenguaje
ensamblador es un ejemplo de lenguaje de bajo nivel.

Figura 1.2. Ejemplo de código en ensamblador.

Los lenguajes máquina se basan en una serie de unos y ceros para representar a los datos y al
conjunto de instrucciones de la CPU. El lenguaje máquina es el único que interpreta la

2
Elaboró: M. en C. Georgina Eslava García

computadora, éste utiliza el alfabeto binario que consta de los dos símbolos 0 y 1, denominados
bits; que corresponden aproximadamente a 0 y 5 voltios, respectivamente.

0011000110100001
1000100110011010
0011101010011100
0111010001110011
1110100100101100
Figura 1.3. Ejemplo de lenguaje máquina

1.2. Paradigmas de programación


Los llamados paradigmas de programación son conceptualizaciones genéricas, que reúnen
en un nombre a distintos lenguajes y técnicas empleados para escribir programas. En otras
palabras, definiremos como Paradigma de software a un conjunto de reglas que establecen la
forma para analizar, diseñar y escribir programas.
La diferencia entre los lenguajes que pertenecen a uno u otro paradigma de programación
radica en la manera en que se orientan a la resolución del problema y a la forma en que hacen
referencia a los datos.

En este subtema identificaremos los diferentes paradigmas de programación y veremos


algunos ejemplos de códigos de los lenguajes más representativos de cada uno de ellos.

1.2.1 Procedural

Es también conocido como paradigma imperativo, el cual define a la programación como el


desarrollo de procedimientos. Aquí se puede hacer la siguiente división: Lenguajes simples de
procedimientos y Lenguajes de procedimientos estructurado en bloques.

• Lenguajes simples de procedimientos. Estos lenguajes se componen de


procedimientos, llamados subprogramas, funciones o subrutinas) que se ejecutan cuando
son llamados. Ejemplos de lenguajes que caen dentro de este paradigma son Fortran y
lenguaje C. Observar el siguiente programa en lenguaje C:

#include <stdio.h>

void saludo( ){
printf ("%s", "Hola mundo");
}
main( ){
int i;
i=2;
if (i==2) saludo ( );
}
Figura 1.3. Ejemplo de programa en lenguaje C.
3
Elaboró: M. en C. Georgina Eslava García

Observar que en la función main() se invoca a la función saludo(). En este paradigma la


manera de escribir programas es crear estructuras de datos y funciones como entidades
separadas. Constatarlo con el siguiente ejemplo en lenguaje Fortran, que es también un
lenguaje simple de procedimientos, en el que el programa principal invoca a una función
definida fuera de él.

PROGRAM TRIVIAL
INTEGER i
i=2
IF (i .EQ. 2) CALL SALUDO( )
STOP
END

SUBROUTINE SALUDO
PRINT * , "HOLA MUNDO"
RETURN
END
Figura 1.4. Ejemplo de programa en lenguaje Fortran.

Observar que el programa principal TRIVIAL invoca a la subrutina SALUDO.

• Lenguajes de procedimientos estructurados en bloques. Este tipo de lenguajes


emplea reglas de alcance y una estructura de bloques anidados para guardar y tener
acceso a datos. Un lenguaje ejemplo de este paradigma es el Pascal. Observa en el
siguiente código que el procedimiento saludo esta anidado dentro del programa principal
trivial.

program trivial (input,output);


var
i=integer;
procedure saludo;
begin
writeline ("hola mundo");
end;
begin
i:=2;
if (i=2) then saludo;
end.
Figura 1.5. Ejemplo de programa en lenguaje Pascal.
Es importante señalar que la programación de los códigos anteriores es muy similar debido a que
pertenece al mismo paradigma. En seguida se tratará el paradigma lógico.

1.2.2 Lógicos

Un ejemplo de lenguaje que entra en este paradigma es Prolog, el cual no está orientado a la
programación para usos generales, sino que se orienta a resolver problemas usando el cálculo de
predicados. Veamos el siguiente código ejemplo en Prolog:

4
Elaboró: M. en C. Georgina Eslava García

/*Base de datos en prolog*/:

le_gusta (juan, libros) /*A Juan le gusta libros*/


le_gusta (juan, maria) /*A Juan le gusta María */
le_gusta (juan, pescado) /*A Juan le gusta pescado */

---------------------------------------------------------------

Consulta en Prolog:
? le_gusta (juan, libros).
Yes
? le_gusta (juan, X).
X= libros;
X= maría;
X= pescado;
No
?_

Figura 1.6. Ejemplo de programa en lenguaje Prolog.

Prolog trata de emular una plática usuario-máquina. Esta forma de programación es utilizada en
aplicaciones de inteligencia artificial, como sistemas expertos entre otros.

1.2.3 Funcionales

Como lenguajes representativos de este paradigma están Lisp, ML, Scheme, entre otros. Este tipo
de lenguajes están destinados al desarrollo en forma aplicativa.

Lisp fue creado por John McCarthy y un grupo del Massachussets Institute of Technology (MIT),
en 1960. El lenguaje se ha utilizado en la investigación en ciencias de la computación, sobre todo
en Inteligencia Artificial (robótica, procesamiento de lenguaje natural, prueba de teoremas, etc.).
En seguida se muestra un código ejemplo Lisp:

> (defun (hola i)


((cond (eq i 2) (print "Hola mundo"))
(T (print "Adios mundo"))
)
)
> (defun (hazlo)
(hola 2))
> hazlo
"Hola mundo"

Figura 1.7. Ejemplo de programa en lenguaje Lisp.

5
Elaboró: M. en C. Georgina Eslava García

1.2.4 Orientados a Objetos

En este caso las unidades de datos se consideran objetos activos. La característica principal de
los lenguajes orientados a objetos es la capacidad de representar definiciones de objetos a modo
de esqueletos que pueden usarse una y otra vez para construir múltiples objetos con las mismas
propiedades o modificarse para construir nuevos objetos con propiedades similares. Algunos
ejemplos de lenguajes de programación orientada a objetos son C++, Java, SmallTalk, Café.
Veamos el siguiente programa ejemplo en C++

#include<stdlib.h>
#include<iostream>
using namespace std;
class Cuadrado{
private:
float lado;
public:
Cuadrado(float l=50){
lado=l;
}
float area(){
return(lado*lado);
}
float perimetro(){
return(4*lado);
}
};
main(){
float la;

Cuadrado c1(120);
Cuadrado c2(13);
Cuadrado c3;

cout<<"\n El area del cuadrado c1 es:"<<c1.area();

6
Elaboró: M. en C. Georgina Eslava García

cout<<"\n El perimetro del cuadrado c1 es:"<<c1.perimetro();


cout<<"\n El area del cuadrado c2 es:"<<c2.area();
cout<<"\n El perimetro del cuadrado c2 es:"<<c2.perimetro();
cout<<"\n El area del cuadrado c3 es:"<<c3.area();
cout<<"\n El perimetro del cuadrado c3 es:\n"<<c3.perimetro()<<"\n";

cout<<"\n\n Creacion del cuadrado c4 \n";


cout<<"\n Dar el lado:";
cin>>la;

Cuadrado c4(la);

cout<<"\n Area del cuadrado c4 es:"<<c4.area();


cout<<"\n Perimetro del cuadrado c4:"<<c4.perimetro()<<"\n";
system("pause");
}

Figura 1.8. Ejemplo de programa en lenguaje C++.

import java.io.*;
import java.util.Scanner;
class CuadradoDef{
private double lado;

public CuadradoDef(double obase) {


lado = obase;
}
public double areacuadrado() {
return lado * lado;
}
public double perimetrocuadrado() {
return 4* lado;
}
}
public class Cuadrado {
public static void main(String[] args) {
Scanner lee=new Scanner(System.in);
double lado;
String unaLinea;
CuadradoDef c1;

7
Elaboró: M. en C. Georgina Eslava García

System.out.print("Introduce el lado: ");


try {
unaLinea = lee.nextLine();
lado= Double.parseDouble( unaLinea );
c1=new CuadradoDef(lado);

System.out.print("El cuadrado de lado " + lado );


System.out.println("\ntiene un área de "+ c1. areacuadrado());
System.out.println("\n tiene un perímetro de "+ c1.perimetrocuadrado());
}
catch (Exception e){
System.out.println("Error:" +e);
}
}
}
Figura 1.9. Ejemplo de programa en lenguaje Java.

1.2.5 Otros

• PARADIGMA RELACIONAL

Este caso la representación utilizada se basa en un conjunto de relaciones o tablas. Este


constituye uno de los paradigmas más utilizados gracias al éxito y madurez de los sistemas
Manejadores de Bases de Datos Relacionales y se complementa en la tecnología O. O. en el
campo de las Bases de Datos Orientadas a Objetos.

Una base de datos es la colección de todos los datos operativos de una empresa o institución, de
acuerdo a un modelo específico, que son accesibles desde cualquier lugar físico y nivel de la
institución o empresa.

Un sistema de gestión de bases de datos, DBMS (Database Management System) incluye


normalmente un lenguaje de definición de datos, DDL (Data Definition Language), para la
descripción de nuevos hechos o datos; y un lenguaje de manipulación de datos, DML (Data
Manipulation Language), para la interacción con las bases de datos existentes.

Un ejemplo de este tipo de lenguajes es SQL (Structure Query Language) que es el más utilizado
y, a pesar de no ser completamente funcional en el sentido de ser tan potente como un lenguaje
procedural, dota de operaciones suficientes a las aplicaciones de base de datos. Tiene muchas
deficiencias; la más seria de ellas es que nunca fue realmente diseñado de acuerdo con ambas
partes (álgebra y cálculo) y por lo tanto, está lleno de numerosas restricciones y reglas especiales.

INSERT INTO AUTOR VALUES (10,'Benito Perez Galdos'), (20,'Lev Tolstoy');

8
Elaboró: M. en C. Georgina Eslava García

SELECT * FROM AUTOR;

INSERT INTO LIBRO VALUES (100,'Maianela'), (200,'Ana Karenina'), (300,'Romeo y Julieta');


INSERT INTO LIBRO VALUES (400, 'INVENTO');

SELECT * FROM LIBRO;

INSERT INTO AUTOR_LIBRO VALUES (10, 100), (20, 200), (30, 300), (10, 400), (20, 400);
SELECT * FROM AUTOR_LIBRO;

SELECT AUTOR.NombreAutor, LIBRO.titulo FROM autor

INNER JOIN (LIBRO INNER JOIN AUTOR_LIBRO on AUTOR_LIBRO.idLibro= LIBRO.idLibro)


on AUTOR.idAutor= AUTOR_LIBRO.idAutor;

Figura 1.9. Ejemplo de programa en lenguaje SQL.

• PARADIGMA ORIENTADO A EVENTOS

En este caso, tanto la estructura como la ejecución de los programas van determinados por los
sucesos que ocurran en el sistema, definidos por el usuario o que ellos mismos provoquen. En la
programación dirigida por eventos, al comenzar la ejecución del programa se llevarán a cabo las
inicializaciones y demás código inicial y a continuación el programa quedará bloqueado hasta que
se produzca algún evento. Cuando alguno de los eventos esperados por el programa tenga lugar,
el programa pasará a ejecutar el código del correspondiente administrador de evento. Por
ejemplo, si el evento consiste en que el usuario ha hecho clic en el botón de play de un
reproductor de películas, se ejecutará el código del administrador de evento, que será el que haga
que la película se muestre por pantalla.

Ejemplos de lenguajes de este paradigma VisualBasic, C#, etc.

9
Elaboró: M. en C. Georgina Eslava García

Figura 1.10. Ejemplo de programación orientada a eventos en lenguaje C#.

El código que debe colocarse para el evento en cada objeto de la imagen anterior es:

Código para radioButton1


if (radioButton1.Checked){
genero = "femenino";
}
Código para radioButton2
if (radioButton2.Checked){
genero = "masculino";
}

Código para radioButton3


if (radioButton3.Checked){
fuma = "si";
}
Código para radioButton4
if (radioButton4.Checked){
fuma = "no";
}
Código para button1
MessageBox.Show("Reporte de captura:" + textBox1.Text + " " + textBox2.Text + "
" + textBox3.Text + ", de género " + genero + " y " + fuma + " fuma ",
"Reporte.", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
Código para button2
textBox1.Text = "";
textBox2.Text = "";
textBox3.Text = "";

10
Elaboró: M. en C. Georgina Eslava García

Código para button3


Application.Exit();

Cabe mencionar que en la actualidad existen más de 2500 lenguajes y existen otros paradigmas,
sin embargo, para efectos de este curso serán suficientes los antes mencionados.

1.3. Compiladores e interpretes

Los compiladores y los interpretes son traductores que convierten a los códigos escritos en
lenguajes de alto nivel en lenguaje máquina. En seguida se establecerá la definición de ambos y
las diferencias entre ellos.

1.3.1 Definición y diferencias

En forma general, definiremos a un compilador como un programa que lee un código escrito en un
lenguaje (conocido como código fuente) y lo traduce a un programa equivalente en otro lenguaje
reconocido por la computadora (llamado lenguaje objeto). Como parte importante de este proceso
de traducción, el compilador informa al usuario de la presencia de errores en el programa fuente.

Figura 1.10. Ejemplo compilador.


Cuando cada instrucción en un programa fuente de nivel alto se traduce de manera individual y se
ejecuta inmediatamente al momento de la traducción, el lenguaje de programación utilizado se
llama lenguaje interpretado, y el programa que efectúa la traducción se llama interprete. Ejemplos
de lenguajes interpretados Motor Zend, CPython, Ruby MRI, YARV, Basic.

11
Elaboró: M. en C. Georgina Eslava García

Figura 1.11. Ejemplo interprete, Código en Basic.

El intérprete en lugar de producir un programa objeto como resultado de una traducción realiza las
operaciones que indica el programa fuente. Para una proposición de asignación, por ejemplo, un
intérprete podría construir un árbol como como el que se muestra en la figura 1.12 e
inmediatamente ejecutar las operaciones de los nodos conforme recorre el árbol. En la raíz
descubriría que tiene que realizar una asignación, y llamaría a una rutina para evaluar la
expresión de la derecha y después almacenaría el valor resultante en la localidad de memoria
asociada con el identificador posición. En el hijo derecho de la raíz, la rutina descubriría que tiene
que calcular el valor de la expresión velocidad * 60. Después sumaría ese valor al valor de la
variable inicial.

Figura 1.12. Árbol sintáctico para posición := inicial + velocidad * 60

Muchas veces los intérpretes se usan para ejecutar lenguajes de órdenes, pues cada operador
que se ejecuta en un lenguaje de órdenes suele ser una invocación de una rutina compleja, como

12
Elaboró: M. en C. Georgina Eslava García

un editor o un compilador. Del mismo modo, algunos lenguajes de alto nivel, como APL,
normalmente son interpretados porque hay muchas cosas sobre los datos, como el tamaño y la
forma de las matrices que no se pueden deducir en el momento de la compilación.

En seguida se describirán las fases de un programa compilado.

1.3.2 Análisis del programa fuente

Además de un compilador, se pueden necesitar otros programas para crear un programa


objeto ejecutable. El primer paso es contar con el programa fuente que es un código escrito en
algún lenguaje de alto nivel que cumple con una secuencia lógica orientada a la resolución de un
problema o a la obtención de algún resultado. Dicho código debe ser revisado para detectar
errores, que serán corregidos por el programador, y hasta que el programa ya no presente errores
se generará el programa ejecutable. En la figura 1.13 se muestra una compilación típica.

Figura 1.13. Sistema para procesamiento de un lenguaje

Enseguida se presentará la función de cada una de estas etapas.

1.3.2.1. Preprocesador

Los preprocesadores producen la entrada para un compilador y puede realizar las funciones
siguientes:

1. Procesamiento de Macros. Un preprocesador puede permitir a un usuario definir macros y


abreviaturas para representar una parte del programa y utilizar esa abreviatura cuantas veces lo
13
Elaboró: M. en C. Georgina Eslava García

necesite. Cada vez que aparece la abreviatura o macro llamada, el preprocesador la reemplaza
con la definición original.
#include <stdio.h>
#include <math.h>
#define PI 3.1416
char respuesta;
double areaCirculo(double r){
double area;
area=PI*pow(r,2);
return area;
}
Figura 1.14. Ejemplo de macro en lenguaje C

2. Inclusión de archivos: Algunos preprocesadores pueden insertar archivos de encabezamiento


en el texto del programa. Por ejemplo: El preprocesador de C hace que el archivo <global.h>
reemplace a la proporción #include "global.h" cuando procesa un archivo que contenga a esa
preposición.

3. Extensiones a Lenguajes: Estos preprocesadores tratan de crear posibilidades al lenguaje que


equivalen a macros incorporados. Ejemplo, el lenguaje Equel es un lenguaje de consulta de base
de datos integrado en C. El procesador considera las proposiciones que empiezan con # # como
proposiciones de acceso a la base de datos, sin relación con C y se traducen a llamadas de
procesamiento a rutinas que realizan el acceso a base de datos.

4. Eliminan Comentarios. Por ejemplo: los símbolos para los comentarios en C, // o / * */

1.3.2.2. Compilador

Conceptualmente, un compilador opera en fases, cada una de las cuales transforma el


programa fuente de una representación en otra. Ver la figura 1.15

14
Elaboró: M. en C. Georgina Eslava García

Figura 1.15. Fases de un compilador

1.3.2.2.1 Análisis Léxico

El analizador léxico es la primera fase de un compilador su principal función consiste en leer


los caracteres de entrada y elaborar como salida una secuencia de componentes léxicos que
utilizará el analizador sintáctico para hacer el análisis.

El analizador léxico debe realizar las siguientes funciones:

➢ Eliminar los espacios en blanco


➢ Reconocer las constantes
➢ Reconocer identificadores
➢ Reconocer palabras clave

15
Elaboró: M. en C. Georgina Eslava García

En general hay un conjunto de cadenas en la entrada, para lo cual, se produce como salida
el componente léxico. Este conjunto de cadenas se describe mediante una regla llamada patrón
asociado al componente léxico. Se dice que el patrón concuerda con cada cadena del conjunto.

Un lexema es una secuencia de caracteres en el programa fuente con la que concuerda el


patrón para un componente léxico.

Se considera componentes léxicos a las palabras claves, operadores, identificadores,


constantes, cadenas, literales y signos de puntuación.

En la práctica los componentes léxicos suelen tener un solo atributo que es un apuntador a
la entrada en la tabla de símbolos donde se guarda la información sobre el componente léxico.

Por ejemplo, en el análisis léxico los caracteres de la proposición de asignación

posición = inicial + velocidad * 60

1. El identificador posición
2. El símbolo de asignación =
3. El identificador inicial
4. El signo de + (suma)
5. El identificador velocidad
6. El signo de * (multiplicación)
7. El número 60

Los espacios en blanco que separan los caracteres de estos componentes léxicos
normalmente se eliminan durante el análisis léxico.

1.3.2.2.2 Análisis Sintáctico

En esta fase se agrupan los componentes léxicos del programa fuente en frases gramaticales que
el compilador utiliza para sintetizar la salida. Por lo general, las frases gramaticales del programa
fuente se representan mediante un árbol de análisis sintáctico como el que se ilustra en la figura
1.16.

16
Elaboró: M. en C. Georgina Eslava García

Figura 1.6. Árbol de análisis sintáctico para posición= inicial + velocidad * 60.

En la expresión inicial + velocidad * 60, la frase velocidad * 60 es una unidad lógica, porque
las convenciones usuales de las expresiones aritméticas indican que la multiplicación se hace
antes que la suma. Puesto que la expresión inicial + velocidad va seguida de un *, no se agrupa
en una sola frase independiente en la figura anterior.

La estructura jerárquica de un programa normalmente se expresa utilizando reglas


recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte de la definición de
expresiones:

1. Cualquier identificador es una expresión.


2. Cualquier número es una expresión.
3. Si exp1 y exp2 son expresiones, entonces también lo son
a) exp1 + exp2
b) exp1 * exp2
c) (exp1)

Las reglas 1 y 2 son reglas no recursivas, en tanto que la regla 3 define expresiones en función de
operadores aplicados a otras expresiones. Así, por la regla 1, inicial y velocidad son expresiones.
Por la regla 2, 60 es una expresión, mientras que por la regla 3, primero podemos inferir que
velocidad * 60 es una expresión, y finalmente que inicial + velocidad * 60 también es una
expresión.

17
Elaboró: M. en C. Georgina Eslava García

1.3.2.2.3 Análisis Semántico

La fase del análisis semántico consiste en revisar el programa fuente para tratar de encontrar
errores semánticos y reúne la información sobre los tipos para la fase posterior de generación de
código. En ella se utiliza la estructura jerárquica determinada por la fase de análisis sintáctico para
identificar los operadores y operandos de expresiones y proposiciones.

Un componente importante del análisis semántico es la verificación de tipos. Aquí el compilador


verifica si cada operador tiene operandos permitidos por la especificación del lenguaje fuente. Por
ejemplo, las definiciones de muchos lenguajes de programación requieren que el compilador
indique un error cada vez que se use un número real cono índice de una matriz. Sin embargo, las
especificaciones del lenguaje pueden permitir ciertas coerciones a los operandos, por ejemplo,
cuando un operador aritmético binario se aplica a un número entero y a un número real. En este
caso, el compilador puede necesitar convertir el número entero a real.

1.3.2.2.4 Generador de código intermedio

Después de los análisis sintáctico y semántico algunos compiladores generan un código


intermedio explícito del programa fuente.

La representación intermedia puede tener diversas formas, una de ellas es el código de 3


direcciones el cual consiste de un secuencia de instrucciones cada una de las cuales tiene como
máximo 3 operandos, el código de 3 direcciones tienen las siguientes reglas:

1. Cada instrucción de 3 direcciones tiene a lo más un


operador además de la asignación.
2. El compilador debe generar un nombre temporal para
guardar los valores calculados por cada instrucción.
3. Algunas instrucciones de 3 direcciones tienen menos
de 3 operandos.

Por ejemplo, la instrucción id1 = id2 + id3 * 60 en código de tres direcciones queda de la siguiente
forma

temp1 = conv_de_entero_a_real (60)


temp2 = id3 * temp1
temp3 = id2 + temp2
id1 = temp3

1.3.2.2.5 Optimizador de código

Esta fase trata de mejorar el código intermedio, de modo que resulte un código de máquina
más rápido de ejecutar. En el ejemplo anterior, el compilador puede deducir que la conversión de
60 de entero a real se puede hacer en la misma línea, temp1= velocidad * 60.0, además temporal
3 se usa sólo una vez para transmitir su valor id1. Entonces resulta seguro sustituir id1 por temp3,
a partir de lo cual la última proposición no se necesita y se obtiene el código siguiente
18
Elaboró: M. en C. Georgina Eslava García

temp1 = id3 * 60.0


id1 = id2 + temp1

1.3.2.2.6 Generador de código

La fase final de un compilador es la generación de código objeto, que por lo general consiste
en código de máquina relocalizable o código ensamblador. Las posiciones de memoria se
seleccionan para cada una de las variables usadas por el programa. Después cada una de las
instrucciones intermedias se traducen a una secuencia de instrucciones máquina que ejecuta la
misma tarea. Un aspecto decisivo es la asignación de variables a registros.

MOVF AX , 60.0
MOVF BX, id3
MULF BX, AX
MOVF DX, id2
ADDF DX, BX
MOVF id1, DX

1.3.2.2.7 Administrador de tabla de símbolos

Una tabla de símbolos es una estructura de datos que contiene un registro por cada
identificador, con los campos para los atributos del identificador.

Estos atributos proporcionan información sobre la memoria asignada a un identificador, su


tipo, su ámbito y en el caso de procedimientos o funciones el método para pasar cada argumento
(Por valor o referencia) y el tipo de dato que devuelve, si lo hay.

Desde el primer momento en que el analizador léxico detecta un identificador en el


programa fuente, el identificador se introduce a la tabla de símbolos.

1.3.2.2.7 Detección e información de errores

Cada fase puede encontrar errores. Sin embargo, después de detectar un error cada fase
debe tratar de alguna forma ese error, para poder continuar la compilación permitiendo la
detección de más errores en el programa fuente. Un compilador que se detiene cuando encuentra
el primer error no resulta tan útil como debiera.

1.3.2.3 Ensamblador

Algunos compiladores producen código ensamblador, otros realizan el trabajo del


ensamblador, produciendo código de máquina relocalizable que se puede pasar directamente al
editor de carga y enlace. El código ensamblador es una versión nemotécnica del código de
máquina.

19
Elaboró: M. en C. Georgina Eslava García

En el código máquina se usan nombres en lugar de códigos binarios para operaciones y


también se usan nombres para las direcciones de memoria.

1.3.2.4 Editor de carga y enlace

Por lo general, un programa llamado cargador realiza las 2 funciones de carga y edición de
enlace. El proceso de carga consiste en tomar el código de máquina relocalizable, modificando las
direcciones relocalizables, y ubicar las instrucciones y datos modificados en las posiciones
apropiadas de la memoria.

El editor de enlace permite formar un solo programa a partir de varios archivos de código de
máquina relocalizable. Estos archivos pueden haber sido el resultado de varias compilaciones
distintas, y uno o varios de ellos pueden ser archivos de biblioteca de rutina proporcionadas por el
sistema y disponibles para cualquier programa que los necesite.

20

También podría gustarte