You are on page 1of 22

Software de sistemas

Licenciatura en Informática

Unidad 1

Introducción
Modelo Von Newman

Von Neumann fue un experto en las


ciencias físico-matemáticas, cuyas
habilidades le permitieron deducir que
anteriormente programar computadoras
con una enorme cantidad de interruptores y
cables era algo lento, tedioso y poco
flexible, determinando que el programa
podía representarse en forma digital en la
memoria de la computadora, lo mismo que
los datos.
Von Neumann observó la torpeza de la
aritmética decimal utilizada por aquellos
ordenadores fue asi que propuso la idea de
reemplazar aquella aritmética   usando aritmética binaria, cuyo propósito seria simplificar los
problemas que la implementación electrónica de las operaciones y funciones lógicas planteaban
hasta ese entonces.

Su diseño básico, ahora conocido como el Modelo o   Máquina de Von Neumann, arquitectura que
no fu la primera en aparecer,   sí lo hizo prácticamente desde el comienzo de los ordenadores y se
sigue desarrollando actualmente.
El modelo de von Newman es la base de las arquitecturas de los ordenadores actuales.

Los ordenadores con esta arquitectura constan de cinco partes: La unidad aritmético-lógica
o ALU, la unidad de control, la memoria, un dispositivo de entrada/salida y el bus de datos
que proporciona un medio de transporte de los datos entre las distintas partes.

Un ordenador con esta arquitectura realiza o emula los siguientes pasos secuencialmente:

1. Enciende el ordenado y obtiene la siguiente instrucción desde la memoria en la dirección


indicada por el contador de programa y la guarda en el registro de instrucción.
2. Aumenta el contador de programa en la longitud de la instrucción para apuntar a la
siguiente.
3. Decodifica la instrucción mediante la unidad de control. Ésta se encarga de coordinar el
resto de componentes del ordenador para realizar una función determinada.

Manuel Ricardo Gonzá lez Sosa Pá gina 2


4. Se ejecuta la instrucción. Ésta puede cambiar el valor del contador del programa,
permitiendo así operaciones repetitivas. El contador puede cambiar también cuando se
cumpla una cierta condición aritmética, haciendo que el ordenador pueda 'tomar
decisiones', que pueden alcanzar cualquier grado de complejidad, mediante la aritmética y
lógica anteriores.
5. Vuelve al paso 1.

1.2 Del problema al programa cargado

El proceso de resolución de un problema con una computadora conduce a la escritura de un


programa y a su ejecución en la misma. Aunque el proceso de diseñar programas es esencialmente
un proceso creativo, se pueden considerar una serie de fases o pasos comunes, que generalmente
deben seguir todos los programadores.

Tabla de contenidos

1. Definición del problema


2. Análisis del problema
3. Selección de la mejor alternativa
4. Diagramación
5. Prueba de escritorio
6. Codificación
7. Trascripción
8. Compilación
9. Pruebas de computador
10. Documentación externa

Las siguientes son las etapas que se deben cumplir para resolver con éxito un problema de
programación:

1.- DEFINICIÓN DEL PROBLEMA

Está dada por el enunciado del problema, el cuál debe ser claro y completo. Es importante que
conozcamos exactamente que se desea del computador; mientras qué esto no se comprenda, no
tiene caso pasar a la siguiente etapa.

2.- ANÁLISIS DEL PROBLEMA

Entendido el problema (que se desea obtener del computador), para resolverlo es preciso analizar:
Los datos o resultados que se esperan.
Los datos de entrada que nos suministran.
El proceso al que se requiere someter esos datos a fin de obtener los resultados esperados.
Áreas de trabajo, fórmulas y otros recursos necesarios.

Manuel Ricardo Gonzá lez Sosa Pá gina 3


Una recomendación muy práctica es el que nos pongamos en el lugar del computador, y analizar
que es necesario que me ordenen y en que secuencia, para poder producir los resultados
esperados. También da buenos resultados hacer similitudes con la labor de un empleado que hace
el mismo trabajo que deseamos programarle al computador.

3.- SELECCIÓN DE LA MEJOR ALTERNATIVA

Analizado el problema, posiblemente tengamos varias formas de resolverlo; lo importante es


determinar cuál es la mejor alternativa: la que produce los resultados esperados en el menor
tiempo y al menor costo. Claro que aquí también es muy válido el principio de que las cosas
siempre se podrán hacer de una mejor forma.

4.- DIAGRAMACIÓN

Una vez que sabemos cómo resolver el problema, pasamos a dibujar gráficamente la lógica de la
alternativa seleccionada. Eso es precisamente un Diagrama de Flujo: la representación gráfica de
una secuencia lógica de pasos a cumplir por el computador para producir un resultado esperado.
La experiencia nos ha demostrado que resulta muy útil trasladar esos pasos lógicos planteados en
el diagrama a frases que indiquen lo mismo; es decir, hacer una codificación del programa pero
utilizando instrucciones en Español. Como si le estuviéramos hablando al computador. Esto es lo
que denominaremos Algoritmo o Pseudocódigo.
Cuando logremos habilidad para desarrollar programas, es posible que no elaboremos el diagrama
de flujo; en su lugar podremos hacer directamente el pseudocódigo del programa.

5.- PRUEBA DE ESCRITORIO

Para cerciorarnos de que el diagrama (y/o el pseudocódigo) esta bien, y, para garantizar que el
programa que codifiquemos luego también funcione correctamente, es conveniente someterlo a
una Prueba de Escritorio. Esta prueba consiste en que damos diferentes datos de entrada al
programa y seguimos la secuencia indicada en el diagrama, hasta obtener los resultados. El análisis
de estos nos indicará si el diagrama esta correcto o si hay necesidad de hacer ajustes (volver al
paso 4). Se recomienda dar diferentes datos de entrada y considerar todos los posibles casos, aun
los de excepción o no esperados, para asegurarnos de que el programa no producirá errores en
ejecución cuando se presenten estos casos.

6.- CODIFICACIÓN

Una vez que hayamos verificado el diagrama mediante las pruebas de escritorio, codificamos el
programa en el lenguaje de computador seleccionado. Esto es, colocamos cada paso del diagrama
en una instrucción o sentencia, utilizando un lenguaje que el computador reconoce.
Todos los lenguajes de programación proveen facilidades para incluir líneas de comentarios en los
programas. Estos comentarios aclaran lo que se ordena al computador y facilitan entender el
programa. Puesto que estos comentarios no son tenidos en cuenta como instrucciones, y
aparecen en los listados del programa, resulta muy conveniente agregar abundantes comentarios
a todo programa que codifiquemos. Esto es lo que se denomina Documentación Interna.

Manuel Ricardo Gonzá lez Sosa Pá gina 4


7.- TRANSCRIPCIÓN

El programa codificado es necesario que lo llevemos a un medio que sea aceptado como entrada
por el computador: lo perforamos en tarjetas, lo grabamos en un disco flexíble o lo grabamos en
un disco duro. Este programa es el que se conoce como Programa Fuente (Source).

8.- COMPILACIÓN

Utilizamos ahora un programa de computador llamado Compilador o Traductor, el cúal analiza


todo el programa fuente y detecta errores de sintaxis ocasionados por fallas en la codificación o en
la transcripción. Las fallas de lógica que pueda tener nuestro programa fuente no son detectadas
por el compilador. Cuando no hay errores graves en la compilación, el compilador traduce cada
instrucción del programa fuente a instrucciones propias de la máquina (Lenguaje de Maquina),
creando el Programa Objeto.
Algunos computadores utilizan Interpretadores, (Generalmente para el Lenguaje Basic), en
reemplazo de programas compiladores. La diferencia consiste en que el interpretador recibe,
desde una terminal, sólo una instrucción a la vez, la analiza y, si esta bien, la convierte al formato
propio de la maquina. Si la instrucción tiene algún error, el interpretador llama la atención de la
persona para que corrija dicha instrucción.
Como resultado de la corrida del compilador, podemos obtener varios listados:
Listado del programa fuente
Listado de los errores detectados
Listado de campos utilizados, etc.
Los errores los debemos corregir sobre el mismo programa fuente, ya sea reemplazando las
tarjetas mal perforadas o regrabando en el disco flexible o en el disco duro. Este paso de la
compilación lo repetimos hasta eliminar todos los errores y obtener el programa ejecutable.

9.- PRUEBAS DE COMPUTADOR

Cuando tenemos el programa ejecutable (en lenguaje de maquina), ordenamos al computador


que lo ejecute, para lo cuál suministramos datos de prueba, como lo hicimos en la prueba de
escritorio (paso 5). Los resultados obtenidos los analizamos, luego de lo cuál puede ocurrir
cualquiera de estas situaciones:
a.- La lógica del programa esta bien, pero hay errores sencillos, los cuales los corregimos
modificando algunas instrucciones o incluyendo unas nuevas; el proceso debemos repetirlo desde
el paso 6 .
b.- Hay errores ocasionados por fallas en la lógica, lo que nos obliga a regresar a los pasos 4 y 5
para revisión y modificación del diagrama.
c.- Hay errores muy graves y lo más aconsejable es que regresemos al paso 2 para analizar
nuevamente el problema, y repetir todo el proceso.
d.- No hay errores y los resultados son los esperados. En este caso, el programa lo podemos
guardar permanentemente en una librería o biblioteca del computador, para sacarlo de allí
cuando necesitemos ejecutarlo nuevamente.

Manuel Ricardo Gonzá lez Sosa Pá gina 5


10.- DOCUMENTACIÓN EXTERNA

Cuando el programa ya se tiene listo para ejecutar, es conveniente que hagamos su


documentación externa siguiendo las normas de la instalación o las recomendaciones indicadas
por el profesor. Una buena documentación incluye siempre:
-Enunciado del problema -Diagrama de pasada -Narrativo con la descripción de la solución
-Relación de las variables o campos utilizados en el programa, cada uno con su respectiva función
-Diagrama del programa -Listado de la última compilación -Resultados de la ejecución del
programa.

1.3 Lenguaje formal

El lenguaje formal es aquel que el hombre ha


desarrollado para expresar las situaciones
que se dan en especifico en cada área del
conocimiento científico. Las palabras y
oraciones de un lenguaje formal son
perfectamente definidas(una palabra
mantiene el mismo significado prescindiendo
de su contexto o uso.
Los lenguajes formales son exentos de
cualquier componente semántico fuera de
sus operadores y relaciones. Los lenguajes
formales pueden ser utilizados para modelar
una teoría de la mecánica, fisica, matemática,
ingeniería eléctrica, o de otra naturaleza, con
la ventaja de que en estos toda ambigüedad
es eliminada.
En resumen las características de los
lenguajes formales son las siguientes:

1. Se desarrollan de una teoría preestablecida.

2. Componente semántico mínimo.

3. Posibilidad de incrementar el componente semántico de acuerdo con la teoría a formalizar.

Manuel Ricardo Gonzá lez Sosa Pá gina 6


4. La sintaxis produce oraciones no ambiguas.

5. La importancia del rol de los números.

6. Completa formalización y por esto, el potencial de la construcción computacional.

1.4 Editores

1.4.1 Editores de carácter…

Editor de Caracteres Privados

Situación

El uso de logos u otros ítems para ser usados en cualquier documento se puede volver engorroso
con los métodos tradicionales.
Recomendación
Windows XP tiene una característica que permite personalizar logos o cualquier otro ítem para ser
utilizado en cualquier documento. El Editor de Caracteres Privados (Private Character Editor) se
puede acceder en digitando “Eudcedit” sin las comillas en la ruta Inicio/Ejecutar
Una vez haya construido y guardado el diseño de su selección, puede accederlo a través del Mapa
de Caracteres, al cual se llega por la ruta
Inicio/Todos los programas/Accesorios/Mapa de caracteres

Manuel Ricardo Gonzá lez Sosa Pá gina 7


En el tipo de letra se selecciona Todas las Fuentes (caracteres privados) y aparecerán sus
adiciones. Las podrá copiar y pegar en cualquier documento.

1.4.2 EDITOR DE LÍNEAS


El editor de líneas se usa para crear o editar la Tabla de Definición de Campos y la Tabla de
Selección de Campos Estas tablas están formadas por una o más líneas, cada una de las cuales
representa un elemento descriptivo. Aunque cada tabla tiene una estructura propia de sus
elementos, los comandos del editor de líneas en ambos casos es idéntico. Para cada nuevo
elemento de la tabla creado, el editor de líneas presenta un renglón en el que se muestra la
posición y longitud de cada campo con líneas de subrayado (en coincidencia con el encabezado de
la tabla presentado en la parte de arriba de la pantalla, y que contiene los nombres
correspondientes a cada campo), y posiciona el cursor en el primer campo donde se van a teclear
los datos.
Nótese que cuando se crea una nueva línea en la tabla, la primera posición (que tiene
encabezado ?) no se usa, y que el cursor se posiciona en el primer campo donde se deben teclear
datos (la primera posición se utiliza cuando se editan líneas ya existentes en la tabla, tal como se
explica más adelante).
Se pueden teclear los diversos campos según sea necesario, y mover el cursor de uno al siguiente
usando la tecla <CR>. La tecla <TAB> devuelve el cursor al campo precedente. Nótese que todos
los campos de más de un carácter de longitud activan al editor de campos (recordar que cuando el
editor de campos está activo, el modo de edición se visualiza en la parte inferior izquierda de la. En
este caso se pueden usar todas las facilidades del editor de campos, incluyendo las operaciones de
manejo de bloques.
Para campos de un sólo carácter, simplemente debe teclearse el carácter relevante, el cursor
pasará automáticamente al campo siguiente.
Por ejemplo, después de teclear el (ID) en una línea de una FST, se presiona <CR> para pasar a
indicar la técnica de indizado (IT). Siendo un campo IT de un sólo carácter, basta con teclear uno
de los códigos correspondientes (sin presionar <CR>), para pasar al campo siguiente. El formato es
un campo de texto, por lo que CDS/ISIS activará al editor de campos. Después del formato si se
presiona <CR> CDS/ISIS pasará a la siguiente línea, ya que el formato es el último campo de la
línea.
Al mover el cursor de un campo a otro, CDS/ISIS presenta un mensaje o un submenú relacionado
con cada campo, en el área de mensajes (líneas 22–24).
Después de completar el último campo de una línea, el editor de líneas queda listo para la línea
siguiente, para lo cual presenta el renglón correspondiente. Al presionar <CR> en este punto
terminará la operación con la tabla y hará que se presente el mensaje siguiente:
Mensaje 105: <CR> Pág. sgte. M - Modifica C - Cancela X - Salida
Las respuestas que se pueden dar a esta solicitud son:
• <CR> para salir del editor de líneas. CDS/ISIS en este caso creará o actualizará la tabla
• R para editar (modificar) la tabla
• C para salir del editor de líneas sin actualizar la tabla. Todas las modificaciones que se hubieran
hecho son ignoradas.
Si se usa la opción M, el editor coloca el cursor en la posición de comando de la primera línea de la
tabla, y presenta el submenú siguiente en el área de mensajes: Mensaje 381/382/383:
A - Insertar(desp) B - Insertar(antes) C - Cambiar línea D -Borrar línea

Manuel Ricardo Gonzá lez Sosa Pá gina 8


P - Página previa N - Próxima página T - Comienzo pág. E - Fin página
X - Salida <CR> - Próx. entrada
Las opciones se explican a continuación:
o A Insertar una nueva línea después de esta
o B Insertar una nueva línea antes de esta
o C Editar (modificar) línea (ver más adelante)
o D Borrar la línea
o E Final de la tabla (Las cinco últimas líneas se presentan en la parte superior de la pantalla)
o N Página siguiente
o P Página anterior
o T Inicio de la tabla (la primera línea se presenta en la parte superior de la pantalla)
o X Salir
o <CR> Deja sin cambios esta línea y salta a la siguiente. Si esta es la última, el editor pasará al
modo de ingreso, con lo que pueden generarse nuevas líneas al final de la tabla, del modo que ya
se describió.
o <TAB> Deja la línea sin cambios y pasa a la anterior Para editar una línea debe presionar una C
en la posición de comando. El editor en este caso posicionará el cursor en el primer campo de esa
línea. Para modificar un campo, puede teclearse de nuevo (si el editor de campos no está activo), o
editarlo usando el editor de campos. Si se presiona <CR>, el cursor pasa al campo siguiente, y
<TAB> lo pasa al campo anterior.

1.4.3 Editor de pantalla completa

El editor más frecuente en Unix es vi. Es un editor que trabaja línea a línea y que muestra
una pantalla de texto a la vez.

Para iniciar una sesión de edición, se ejecuta el programa vi seguido del nombre del archivo
a editar, y dado el caso también la trayectoria. Por ejemplo, para editar el arvhivo
/tmp/borrame, basta con dar vi /tmp/borrame, o para editar un archivo en el directorio
actual: vi borrame.

Si el archivo no existe vi lo crea. De igual manera, podemos simplemente invocar a vi,


comenzar a escribir y despúes nombrar el archivo al momento de salvarlo.

Al ser ejecutado vi, presenta una pantalla con el texto del archivo, y las líneas después del
final del archivo aparecen con el carácter ~ para indicar que a partir de ahí el archivo está
vacio. Obviamente, si comenzamos a editar un archivo nuevo, todas las líneas aparecerán
con éste carácter.

Tiene tres modos de trabajo. El modo de inserción, el de edición y el de comandos.

En el modo de inserción, toda la entrada que demos en el teclado se inserta en el archivo en


el punto donde se encuentre el cursor. En el modo de edición daremos instrucciones que
alteran el contenido, como por ejemplo para posicionarse en determinado punto, hacer
reemplazos de texto, copiar o mover bloques de texto, etc. En el modo comandos se dan

Manuel Ricardo Gonzá lez Sosa Pá gina 9


instrucciones para salvar el archivo, traer a edición otro, insertar otro archivo en el punto
donde se está, terminar la edición, etc.

En el modo edición, las instrucciones para mover el cursor en del texto son:

comando se desplaza:

 l un espacio a la derecha
 h un espacio a la izquierda
 j una línea hacia abajo
 k una línea hacia arriba
 $ al final de la línea
 ^ al principio de la línea
 w a la siguiente palabra
 e al final de la palabra
 b al principio de la palabra
 ) al final de la frase
 ( al inicio de la frase
 { al inicio del párrafo
 } al final del párrafo
 n| a la columna n-ésima
 H a la primera columna de la primera línea de la ventana
 L a la primera columna de la última línea de la ventana
 nG a la primera columna de la n-ésima línea del archivo Para el control de la parte
del texto que se despliega en la pantalla:

instrucción acción:

 ^d desliza el texto hacia arriba


 ^u desliza el texto hacia abajo
 ^f despliega la ventana de texto siguiente
 ^b despliega la ventana de texto anterior
 ^l redespliega el texto en la ventana actual Las instrucciones para borrar texto:
 dw suprime la palabra donde está el cursor
 dd suprimir la línea donde está el cursor
 D borra el texto entre el cursor y el fin de la línea
 x borra el carácter sobre el que esta el cursor
 Para hacer reemplazos de texto:
 cw cambiar la palabra actual
 cc cambiar la línea actual
 C cambiar desde el cursor hasta el final de la línea
 r cambiar el carácter sobre el que está el cursor

Algunas instrucciones suplementarias:

Manuel Ricardo Gonzá lez Sosa Pá gina 10


 u anular la última instrucción dada
 / realiza una búsqueda hacia adelante
 ? realiza una búsqueda hacia atrás
 n busca la siguiente ocurrencia de la última búsqueda
 . repite la última instrucción
 Y extrae la línea
 p se coloca en la línea de abajo
 P se coloca en la línea de arriba
 ZZ salva el archivo y termina la edición
 ESC cancela una orden
 : se cambia a modo comandos

Cuando vi esta en modo de edición, para cambiarse a modo inserción se hace con el
carácter i y se posiciona antes del cursor y con a después de éste. Con Esc se cambia a
modo edición de nuevo.

En modo de comandos, se tienen las siguientes funciones:

 :w salva el archivo en el disco


 :q abandona la edición sin guardar los cambios
 :wq escribe y termina
 :q! abandona sin escribir cuando se realizó algún cambio.
 :r carga otro archivo
 :e edita el archivo
 :f cambia o dá nombre al archivo actual
 :n se posiciona en la n-ésima línea
 :Esc se pasa a modo de edición

vi tiene muchas más instrucciones y es capáz de realizar tareas muy complejas. Es


importante conocer la mayoría de ellas para hacer más eficiente nuestro trabajo, pero son
demasiado extensas para incluirlas todas en este curso. Existen libros especializados donde
se describe con toda sobriedad esta poderosa herramienta.

Existen además de vi otros editores para Unix, incluso más poderosos que él, pero esto
depende de cada implementación de Unix. vi y ex (que por ser algo más limitado, no
trataremos aquí) son los únicos que se garantiza que se pueden encontrar en cualquier
instalación de Unix. Entre los editores más populares se encuentra Emacs, pero cuenta con
un conjunto de instrucciones realmente complejo, lo cual forma parte de su tradición de ser
para usuarios avanzados.

Haremos ahora un ejemplo para familiarizarnos con vi.

Comenzaremos editando un archivo nuevo que se llamará cordero.txt. Invocamos a vi con


este argumento,

Manuel Ricardo Gonzá lez Sosa Pá gina 11


$vi cordero.txt

ahora la pantalla se limpia y aparecen varios renglones con tildes en el márgen izquierdo y
en la parte inferior izquierda aparece el mensaje ¨cordero.txt¨ [New file], que indica que se
esta creando un archivo nuevo.

“cordero.txt” [NEW FILE] 1 line, 1 char

En este momento nos encontramos en el modo de edición con el cual podemos iniciar la
captura del texto. Para esto damos la instrucción i y nos pasamos a modo inserción. Ahora
podemos escribir cualquier texto que necesitemos.

Cuando se tengan un par o más párrafos podemos ejercitar algunas de las instrucciones para
movernos por el texto y para realizar búsquedas e incluso reemplazos.

1.5 lenguajes de programación


1.5.1 niveles

Lenguaje de alto nivel

Un lenguaje de programación de alto nivel se caracteriza por expresar los algoritmos de


una manera adecuada a la capacidad cognitiva humana, en lugar de a la capacidad ejecutora
de las máquinas.

En los primeros lenguajes de alto nivel la limitación era que se orientaban a un área
específica y sus instrucciones requerían de una sintaxis predefinida. Se clasifican como
lenguajes procedimentales.

Otra limitación de los lenguajes de alto nivel es que se requiere de ciertos conocimientos de
programación para realizar las secuencias de instrucciones lógicas. Los lenguajes de alto
nivel se crearon para que el usuario común pudiese solucionar un problema de
procesamiento de datos de una manera más fácil y rápida.

Por esta razón, a finales de los años 1950 surgió un nuevo tipo de lenguajes de
programación que evitaba estos inconvenientes, a costa de ceder un poco en las ventajas.
Estos lenguajes se llaman de tercera generación o de alto nivel, en contraposición a los de
bajo nivel o de nivel próximo a la máquina.

Ventajas e inconvenientes
Ventajas

 Genera un código más sencillo y comprensible.


 Escribir un código válido para diversas máquinas y, posiblemente, sistemas operativos.

Inconvenientes

Manuel Ricardo Gonzá lez Sosa Pá gina 12


 Reducción de velocidad al ceder el trabajo de bajo nivel a la máquina.
 Algunos requieren que la máquina cliente posea una determinada plataforma.

Principales lenguajes de alto nivel

• Ada • ALGOL • Basic • C (en realidad es un lenguaje de medio nivel). • C++ • CT •


Clipper • Cobol • Fortran • Java • Lexico • Logo • Object Pascal • Pascal • Perl • PHP •
PL/SQL • Python • Modula-2 • Lenguajes funcionales o Haskell o Lisp

Lenguaje de medio nivel

Se dice del lenguajes de programación como C, que se encuentran entre los lenguajes de
alto nivel y los lenguajes de bajo nivel. Estos lenguajes son clasificados muchas veces de
alto nivel, pero permiten ciertos manejos de bajo nivel. Son precisos para ciertas
aplicaciones como la creación de sistemas operativos, ya que permiten un manejo abstracto
(independiente de la máquina, a diferencia del ensamblador), pero sin perder mucho del
poder y eficiencia que tienen los lenguajes de bajo nivel.

Una característica distintiva, por ejemplo, que convierte a C en un lenguaje de medio nivel
y al Pascal en un lenguaje de alto nivel es que en el primero es posible manejar las letras
como si fueran números (en Pascal no), y por el contrario en Pascal es posible concatenar
las cadenas de caracteres con el operador suma y copiarlas con la asignación (en C es el
usuario el responsable de llamar a las funciones correspondientes).

Lenguaje de bajo nivel

Un lenguaje de programación de bajo nivel es el que proporciona poca o ninguna


abstracción del microprocesador de un ordenador. Consecuentemente es fácilmente
trasladado a lenguaje de máquina.

La palabra “bajo” no implica que el lenguaje sea inferior a un lenguaje de alto nivel; se
refiere a la reducida abstracción entre el lenguaje y el hardware. Uso: ventajas e
inconvenientes.

En general se utiliza este tipo de lenguaje para programar controladores (drivers).

La programación en un lenguaje de bajo nivel como el lenguaje de la máquina o el lenguaje


simbólico tiene ciertas ventajas:

• Mayor adaptación al equipo.

• Posibilidad de obtener la máxima velocidad con mínimo uso de memoria.

Pero también tiene importantes inconvenientes:

• Imposibilidad de escribir código independiente de la máquina.

Manuel Ricardo Gonzá lez Sosa Pá gina 13


• Mayor dificultad en la programación y en la comprensión de los programas.

Primera generación

El lenguaje de programación de primera generación (por sus siglas en inglés, 1GL), es el


lenguaje de código máquina. Es el único lenguaje que un microprocesador entiende de
forma nativa. El lenguaje máquina no puede ser escrito o leído usando un editor de texto, y
por lo tanto es raro que una persona lo use directamente.

Segunda generación

El lenguaje de programación de segunda generación (por sus siglas en inglés, 2GL), es el


lenguaje ensamblador. Se considera de segunda generación porque, aunque no es lenguaje
nativo del microprocesador, un programador de lenguaje ensamblador debe entender la
arquitectura del microprocesador (cosas como sus registros e instrucciones).

1.5.2 Tipos (interpretes y


compiladores).

Compilador:

Es un programa que traduce los programas escritos en lenguajes de alto nivel a lenguaje
máquina.

Los programas escritos en lenguajes de alto nivel se llaman programas fuente y

El programa traducido se llama programa objeto.

El compilador traduce sentencia a sentencia el programa fuente.

Algunos lenguajes compiladores típicos son:

 C
 C++
 Pascal
 FORTRAN
 COBOL

Manuel Ricardo Gonzá lez Sosa Pá gina 14


Un intérprete es un traductor que toma un programa fuente, lo traduce y a continuación
lo ejecuta.
Los programas interpretes clásicos son:
 BASIC
 QBASIC
 QUICKBASIC
 VISUALBASIC
 SMALLTALK
 JAVA

1.5.3 Comparación entre intérpretes

y compiladores.

Un compilador acepta programas escritos en un lenguaje de alto nivel y los traduce a otro
lenguaje, generando un programa equivalente independiente, que puede ejecutarse tantas
veces como se quiera.

En un compilador hay que distinguir tres lenguajes diferentes:

• El de los programas de partida (LA)

• El de los programas equivalentes traducidos (LB), normalmente el lenguaje de máquina

• El lenguaje en que está escrito el propio compilador (LC), que puede ser igual o diferente
a uno de los otros dos.

Los programas interpretados suelen ser más lentos que los compilados, pero los intérpretes
son más flexibles como entornos de programación y depuración. Comparando su actuación
con la de un ser humano, un compilador equivale a un traductor profesional que, a partir de
un texto, prepara otro independiente traducido a otra lengua, mientras que un intérprete
corresponde al intérprete humano, que traduce de viva voz las palabras que oye, sin dejar
constancia por escrito.

¿Qué es un compilador?

Un traductor es cualquier programa que toma como entrada un texto escrito en un lenguaje,
llamado fuente y da como salida otro texto en un lenguaje, denominado objeto.

Compilador

Manuel Ricardo Gonzá lez Sosa Pá gina 15


En el caso de que el lenguaje fuente sea un lenguaje de programación de alto nivel y el
objeto sea un lenguaje de bajo nivel (ensamblador o código de máquina), a dicho traductor
se le denomina compilador. Un ensamblador es un compilador cuyo lenguaje fuente es el
lenguaje ensamblador. Un intérprete no genera un programa equivalente, sino que toma una
sentencia del programa fuente en un lenguaje de alto nivel y la traduce al código
equivalente y al mismo tiempo lo ejecuta. Históricamente, con la escasez de memoria de los
primeros ordenadores, se puso de moda el uso de intérpretes frente a los compiladores, pues
el programa fuente sin traducir y el intérprete juntos daban una ocupación de memoria
menor que la resultante de los compiladores. Por ello los primeros ordenadores personales
iban siempre acompañados de un intérprete de BASIC (Spectrum, Commodore VIC-20, PC
XT de IBM, etc.). La mejor información sobre los errores por parte del compilador así
como una mayor velocidad de ejecución del código resultante hizo que poco a poco se
impusieran los compiladores. Hoy en día, y con el problema de la memoria prácticamente
resuelto, se puede hablar de un gran predominio de los compiladores frente a los
intérpretes, aunque intérpretes como los incluidos en los navegadores de Internet para
interpretar el código JVM de Java son la gran excepción.

Ventajas de compilar frente a interpretar:

Se compila una vez, se ejecuta n veces.

En bucles, la compilación genera código equivalente al bucle, pero interpretándolo se


traduce tantas veces una línea como veces se repite el bucle.

El compilador tiene una visión global del programa, por lo que la información de mensajes
de error es mas detallada. Ventajas del intérprete frente al compilador:

Un intérprete necesita menos memoria que un compilador. En principio eran más


abundantes dado que los ordenadores tenían poca memoria.

Permiten una mayor interactividad con el código en tiempo de desarrollo.

Un compilador no es un programa que funciona de manera aislada, sino que necesita de


otros programas para conseguir su objetivo: obtener un programa ejecutable a partir de un
programa fuente en un lenguaje de alto nivel. Algunos de esos programas son el
preprocesador, el linker, el depurador y el ensamblador. El preprocesador se ocupa
(dependiendo del lenguaje) de incluir ficheros, expandir macros, eliminar comentarios, y
otras tareas similares. El linker se encarga de construir el fichero ejecutable añadiendo al
fichero objeto generado por el compilador las cabeceras necesarias y las funciones de
librería utilizadas por el programa fuente. El depurador permite, si el compilador ha
generado adecuadamente el programa objeto, seguir paso a paso la ejecución de un
programa. Finalmente, muchos compiladores, en vez de generar código objeto, generan un
programa en lenguaje ensamblador que debe después convertirse en un ejecutable mediante
un programa ensamblador.

Clasificación de Compiladores

Manuel Ricardo Gonzá lez Sosa Pá gina 16


El programa compilador traduce las instrucciones en un lenguaje de alto nivel a
instrucciones que la computadora puede interpretar y ejecutar. Para cada lenguaje de
programación se requiere un compilador separado. El compilador traduce todo el programa
antes de ejecutarlo. Los compiladores son, pues, programas de traducción insertados en la
memoria por el sistema operativo para convertir programas de cómputo en pulsaciones
electrónicas ejecutables (lenguaje de máquina). Los compiladores pueden ser de:

• una sola pasada: examina el código fuente una vez, generando el código o programa
objeto.

• Pasadas múltiples: requieren pasos intermedios para producir un código en otro lenguaje,
y una pasada final para producir y optimizar el código producido durante los pasos
anteriores.

• Optimación: lee un código fuente, lo analiza y descubre errores potenciales sin ejecutar el
programa.

• Compiladores incrementales: generan un código objeto instrucción por instrucción (en vez
de hacerlo para todo el programa) cuando el usuario teclea cada orden individual. El otro
tipo de compiladores requiere que todos los enunciados o instrucciones se compilen
conjuntamente.

• Ensamblador: el lenguaje fuente es lenguaje ensamblador y posee una estructura sencilla.

• Compilador cruzado: se genera código en lenguaje objeto para una máquina diferente de
la que se está utilizando para compilar. Es perfectamente normal construir un compilador
de Pascal que genere código para MS-DOS y que el compilador funcione en Linux y se
haya escrito en C++.

• Compilador con montador: compilador que compila distintos módulos de forma


independiente y después es capaz de enlazarlos.

• Autocompilador: compilador que está escrito en el mismo lenguaje que va a compilar.


Evidentemente, no se puede ejecutar la primera vez. Sirve para hacer ampliaciones al
lenguaje, mejorar el código generado, etc.

• Metacompilador: es sinónimo de compilador de compiladores y se refiere a un programa


que recibe como entrada las especificaciones del lenguaje para el que se desea obtener un
compilador y genera como salida el compilador para ese lenguaje. El desarrollo de los
metacompiladores se encuentra con la dificultad de unir la generación de código con la
parte de análisis. Lo que sí se han desarrollado son generadores de analizadores léxicos y
sintácticos. Por ejemplo, los conocidos:

generador de analizadores léxicosLEX:

Manuel Ricardo Gonzá lez Sosa Pá gina 17


generador deYACC: analizadores sintácticos desarrollados para UNIX. Los inconvenientes
que tienen son que los analizadores que generan no son muy eficientes.

• Descompilador: es un programa que acepta como entrada código máquina y lo traduce a


un lenguaje de alto nivel, realizando el proceso inverso a la compilación.

Funciones de un compilador

A grandes rasgos un compilador es un programa que lee un programa escrito es un


lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el
lenguaje objeto. Como parte importante de este proceso de traducción, el compilador
informa a su usuario de la presencia de errores en el programa fuente.

A primera vista, la diversidad de compiladores puede parecer abrumadora. Hay miles de


lenguajes fuente, desde los lenguajes de programación tradicionales, como FORTRAN o
Pascal, hasta los lenguajes especializados que han surgido virtualmente en todas las áreas
de aplicación de la informática. Los lenguajes objeto son igualmente variados; un lenguaje
objeto puede ser otro lenguaje de programación o el lenguaje de máquina de cualquier
computador entre un microprocesador y un supercomputador. A pesar de existir una
aparente complejidad por la clasificación de los compiladores, como se vio en el tema
anterior, las tareas básicas que debe realizar cualquier compilador son esencialmente las
mismas. Al comprender tales tareas, se pueden construir compiladores para una gran
diversidad de lenguajes fuente y máquinas objeto utilizando las mismas técnicas básicas.

Nuestro conocimiento sobre cómo organizar y escribir compiladores ha aumentado mucho


desde que comenzaron a aparecerlos primeros compiladores a principios de los años
cincuenta. Es difícil dar una fecha exacta de la aparición del primer compilador, porque en
un principio gran parte del trabajo de experimentación y aplicación se realizó de manera
independiente por varios grupos. Gran parte de los primeros trabajos de compilación estaba
relacionada con la traducción de fórmulas aritméticas a código de máquina.

En la década de 1950, se consideró a los compiladores como programas notablemente


difíciles de escribir. EL primer compilador de FORTRAN, por ejemplo, necesitó para su
implantación de 18 años de trabajo en grupo (Backus y otros [1975]). Desde entonces, se
han descubierto técnicas sistemáticas para manejar muchas de las importantes tareas que
surgen en la compilación. También se han desarrollado buenos lenguajes de implantación,
entornos de programación y herramientas de software. Con estos avances, puede hacerse un
compilador real incluso como proyecto de estudio en un curso de un semestre sobre diseño
sobre de compiladores.

Una clasificación muy importante de los lenguajes es la de hacer dos grupos en base a su
funcionamiento, esto es considerarlos como intérpretes y compiladores, según se describe
seguidamente.

Un lenguaje se dice que es un intérprete, por ejemplo los BASIC, cuando para ejecutar un
programa el lenguaje ha de leer y traducir al lenguaje de la máquina las instrucciones una

Manuel Ricardo Gonzá lez Sosa Pá gina 18


por una. Como es lógico el proceso se enlentece, por ejemplo si una operación está dentro
de la estructura conocida como ciclo y este se repite 100 veces, el lenguaje tiene que
traducirlo 100 veces al código de la máquina. No todo son desventajas, pues la parte buena
de este tipo de lenguajes es que los errores se pueden corregir al momento y seguir
facilmente la ejecución del programa, por lo cual son idóneos para aprender a programar,
proceso en el que da lo mismo la lentitud.

Por contra un lenguaje se dice que es compilado, cuando el programa entero se traduce
mediante el compilador de dicho lenguaje al lenguaje máquina correspondiente y el
resultado se almacena de manera permanente en un archivo. De esta forma el programa se
ejecutará de forma mucho más rápida que con un intérprete, sobre todo si hay estructuras
que se repiten, caso de los ciclos. La principal desventaja es cuando se produce un error,
que muchas veces se detecta en el momento de la ejecución , y la corrección no se puede
hacer de inmediato, sino que hay que realizar todo el proceso de compilado desde el
principio. Un ejemplo típico de lenguaje de este tipo el C ++, ampliamente usado en el
desarrollo de programas.

Hay un lenguaje difundido en el ámbito de la enseñanza, es el Turbo Pascal, cuya ventaja es


que aunque se trata de un compilador tiene un entorno de trabajo como si fuera un
intérprete y cualquier error se puede corregir al momento, reanudándose la ejecución del
programa de inmediato.

Un ejemplo en la vida real que visualiza la diferencia entre un intérprete y un compilador es


el siguiente, supongamos que tenemos un libro escrito en una lengua distinta al castellano,
hay dos procesos de acceder a su contenido cuando se necesite su uso, una es traducir en el
momento de su empleo la parte del libro que se necesite, pero sin transcribirla a papel, sino
simplemente mediante lectura traduciendo, esto sería el proceso de interpretado, mientras
que la otra opción sería traducir el libro entero al castellano y dejar dicha versión escrita
sobre papel, esto sería equivalente al compilado.

El proceso de compilado no es tan inmediato como parece, se describe seguidamente de


forma muy esquematizada:

1. Se escribe el programa (conocido como programa fuente) mediante un editor de textos y


se almacena en un fichero.

2. Este programa fuente es invocado por la primera etapa del compilador, que efectúa un
análisis léxico, se puede considerar como una interpretación del programa fuente
preparándolo para un tratamiento posterior con detalle. En esta etapa se ejecutan los tres
procesos indicados seguidamente:

Adaptar el código fuente a un formato independiente de la forma en que se haya


introducido en el sistema Eliminación de información redundante como espacios y
comentarios

Tratar las palabras clave y los símbolos para su paso a símbolos clave, conocido como
“tokens”

Manuel Ricardo Gonzá lez Sosa Pá gina 19


3. Análisis sintáctico es el paso siguiente, el compilador determina la estructura, y de
alguna forma el significado del programa fuente. El conjunto del programa se analiza en
bloques, que se descomponen en instrucciones y se procede a identificar los elementos
individuales. Como la sintaxis está expresada mediante un conjunto de reglas, cada una
indica como se construye una estructura del programa a partir de otras estructuras de menor
entidad. El proceso mediante el cual el compilador aplica estas reglas es conocido como
“parsing”.

Durante la compilación se genera gran cantidad de información, que se almacena en una


estructura de datos conocida como diccionario o tabla de símbolos, en algún momento del
proceso se necesitará la información guardada previamente. La mayor parte es información
sobre variables, por ejemplo para X en el programa anterior, se tendría en el diccionario,

4. El paso siguiente es la generación de código, conocido como objeto Para ello se recorre
el código intermedio generado y se busca cada uno de los “tokens” en el diccionario, lo que
permite insertar las direcciones en el código máquina que se está generando.

5. El proceso siguiente es la optimización de código objeto generado, con lo que se


consigue un programa más eficiente. Generalmente donde se consiguen los mejores
resultados es en los bucles, cuyo objetivo es reducir al máximo el número de operaciones
que se ejecutan en él.

6. Normalmente hay una etapa posterior conocida como “linkado “ en la que el o los
módulos objetos generados previamente se unen entre sí y/o con otros módulos disponibles
en librerías, para formar un fichero que contiene un programa ejecutable directamente
desde el sistema operativo, sin necesidad de disponer del compilador correspondiente.
Incluso se pueden unir programas escritos en lenguajes distintos si los módulos objeto
creado se han estructurado de forma adecuada. En cualquier fase del proceso pueden
detectarse errores que se podrán de manifiesto, implicando el volver hasta el programa
fuente, efectuar las correcciones pertinentes y repetir todo el proceso, lo cual suele ser algo
laborioso.

En el contexto de los lenguajes de programación, un intérprete es un programa que toma un


programa fuente escrito en un lenguaje de alto nivel, lo analiza y lo ejecuta instrucción a
instrucción bajo su control. En este caso, no se genera un programa equivalente en otro
lenguaje de menor nivel, como ocurre con un compilador por lo que, si se desea repetir la
ejecución del programa es preciso volver a traducirlo.

Así, un intérprete realizaría el siguiente ciclo

 repetir
 leer instrucción
 ejecutar instrucción
 hasta el fin

Manuel Ricardo Gonzá lez Sosa Pá gina 20


En un intérprete sólo hay que distinguir dos lenguajes diferentes, el de los programas de
partida (LA), y el lenguaje en que está escrito el intérprete (LC).

Comparando su actuación con la de un ser humano, un compilador equivale a un traductor


profesional que, a partir de un texto, prepara otro independiente traducido a otra lengua,
mientras que un intérprete corresponde al intérprete humano, que traduce de viva voz las
palabras que oye, sin dejar constancia por escrito.

Así, mientras un intérprete toma las instrucciones del programa fuente y las traduce y
ejecuta a lenguaje máquina una a una, un compilador realiza la traducción completa del
programa fuente a código máquina, sin ejecutarlo, siendo posteriormente cuando se ejecute
el programa una vez compilado.

Ventajas del intérprete frente al compilador:

• El programa se puede ejecutar de inmediato, sin esperar a ser compilado.

• Puede ser interrumpido con facilidad.

• puede ser rápidamente modificado y ejecutado nuevamente.

• Resultan muy apropiados durante la fase de desarrollo de un programa, ya que la


compilación no permite la ejecución paso a paso del programa y con ello impide la edición
seguimiento y depuración del programa.

Desventajas del intérprete frente al compilador:

• La ejecución es más lenta, pues cada instrucción debe ser traducida a código máquina
tantas veces como sea ejecutada.

• No son adecuados en la fase de explotación del programa ya que el proceso de


interpretación se ha de repetir cada vez que se ejecuta el programa, mientras que con la
compilación, una vez obtenido el programa en leguaje máquina éste puede ser ejecutado sin
necesidad de compilarlo de nuevo.

Un intérprete es un traductor de lenguaje, igual que un compilador, pero difiere de éste en


que ejecuta el programa fuente inmediatamente, en vez de generar un código objeto que se
ejecuta después de que se completa la traducción. En principio, cualquier lenguaje de
programación se puede interpretar o compilar, pero se puede preferir un intérprete a un
compilador dependiendo del lenguaje que se esté usando y de la situación en la cual se
presenta la traducción.

Los intérpretes se utilizan con frecuencia en situaciones relacionadas con la enseñanza o


con el desarrollo de software, donde los programas son probablemente traducidos y vueltos
a traducir muchas veces. Por otra parte, es preferible usar un compilador si lo que importa

Manuel Ricardo Gonzá lez Sosa Pá gina 21


es la velocidad de ejecución, ya que el código de objeto compilado es siempre más rápido
que el código fuente interpretado, en ocasiones hasta por un factor de 10 o más.

No obstante, los intérpretes comparten muchas de sus operaciones con los compiladores, y
ahí pueden incluso ser traductores híbridos, de manera que quedan en alguna parte entre los
intérpretes y los compiladores. Existen lenguajes cuyos traductores se idearon como
intérpretes y otros como compiladores. No obstante, para un lenguaje dado, pueden existir
tanto compiladores como interpretes.

Manuel Ricardo Gonzá lez Sosa Pá gina 22

You might also like