1. Evolución de la programación
En el comienzo de la informática, sólo había una forma de programar (en
binario), que consistía en la ejecución secuencial (una tras otra) de instrucciones
de la máquina, con posibles cambios de secuencia basados en dos
tipos especiales de instrucciones de control: instrucciones de transferencia e
instrucciones de llamada de subrutina.
En el comienzo de la informática, sólo había una forma de programar (en
binario), que consistía en la ejecución secuencial (una tras otra) de instrucciones
de la máquina, con posibles cambios de secuencia basados en dos tipos
especiales de instrucciones de control.
Las instrucciones de control se dividieron en dos tipos:
instrucciones de transferencia
instrucciones de llamada de subrutina.
Las instrucciones de transferencia dan lugar a un salto sin retorno en la
ejecución, y a su vez pueden ser condicionales (si el salto se produce únicamente
cuando se cumple una condición determinada) o incondicionales.
La instrucción de llamada de subrutina guarda la dirección de retorno para que
la secuencia de ejecución original se reanude cuando termina la ejecución de la
subrutina (momento en el que se ejecutará una instrucción de retorno).
En la década de los años cincuenta surgió un nuevo tipo da lenguajes (llamados
simbólicos, o de segunda generación: assembler), que trataban de simplificar la
programación: ya que, a medida que los programas eran cada vez más complejos,
se hacía impracticable utilizar directamente el lenguaje de la máquina, en el que
las instrucciones estaban formadas por secuencias de ceros y unos.
Un lenguaje simbólico no es más que una representación codificada del lenguaje
de la máquina, donde cada instrucción simbólica se traduce (en principio) por
una sola instrucción de la máquina equivalente, y el código de operación y la
dirección de memoria asociados a cada instrucción de la máquina se representan
mediante símbolos alfanuméricos. En particular, dependiendo del lenguaje
simbólico utilizado, las instrucciones de cambio de secuencia se suelen
representar mediante los siguientes símbolos:
2. La instrucción de transferencia incondicional: JMP (jump, es decir,
salto); B (branch, ramificación); GOTO (go to, ir a); etc.
Las instrucciones de transferencia condicional: JZ (jump on zero, salto si
el resultado anterior es cero); BC (branch on condition, ramificación
condicional); etc.
La instrucción de llamada de subrutina: CALL (llamar, en inglés); BAL
(branch and link, es decir, ramificación con enlace); etc.
La instrucción de retorno de subrutina: RET (return, retorno); etcétera.
A finales de los años cincuenta, y a medida que las aplicaciones iban creciendo
en tamaño y en complicación, la programación en los lenguajes simbólicos
resultaba aún demasiado compleja, por lo que se inventaron los lenguajes de alto
nivel o de tercera generación, tales como FORTRAN, LISP, COBOL, ALGOL, APL,
PL/I, BASIC, Pascal, C, etc., que hacían más legibles los programas mediante
expresiones de aspecto matemático, como X + Y * Z (que significa, en muchos de
los lenguajes citados, sumar el valor de la variable X al resultado de multiplicar
el valor de la variable Y por el de la variable Z).
Todos estos lenguajes, y muchos más que no voy a mencionar por el momento,
no son totalmente independientes entre sí, sino que unos influyeron en el diseño
de los otros, por lo que forman una jerarquía histórica. Además de simplificar la
sintaxis de las expresiones, los lenguajes de alto nivel introdujeron una serie de
instrucciones de control para hacer más simple la definición de la estructura de
los programas. Estas instrucciones pueden agruparse en las siguientes clases:
Una instrucción de transferencia incondicional (siempre se produce un
salto sin retorno en la ejecución), generalmente representada mediante el
símbolo GOTO, GO TO, u otro equivalente.
Instrucciones de transferencia condicional, como las sentencias GO TO
calculada y asignada de FORTRAN, o la sentencia IF del mismo lenguaje,
en su forma original.
Instrucciones de ejecución condicional, como el conjunto IF- THEN-ELSE
de ALGOL y Pascal, la instrucción CASE de Pascal o el conjunto if-else y la
instrucción switch de C.
Instrucciones de ejecución en bucle, en sus formas DO-UNTIL, DO-WHILE
y FOR.
La instrucción de llamada de subrutina, representada mediante el
símbolo CALL, o implícitamente, especificando sólo el nombre de la
subrutina que se invoca, junto con un conjunto de argumentos entre
paréntesis.
La instrucción de retorno de subrutina: RETURN o equivalente.