1. Evolución histórica 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:
La instrucción de transferencia incondicional: JMP (jump, es decir, salto); B
(branch, ramificación); GOTO (go to, ir a); etc.
2. 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.