Sabemos que la programación imperativa se basa en resolver los problemas a partir de la ejecución de programas que indican a la computadora un conjunto de acciones precisas a realizar, por lo que la ejecución de los programas se limita a procesar cada instrucción en el orden en que se han escrito, de forma lineal.

Pero, como personas que programan, sabemos que la linealidad en los algoritmos no es útil en todos los casos. Para romper la linealidad, los primeros lenguajes de programación se apoyaron en una instrucción especial para modificar la secuencia de ejecución de las instrucciones mediante una transferencia incondicional de su control: la instrucción goto, que permite pasar el control a cualquier otra parte del programa según indique la instrucción.

Veamos un ejemplo con el siguiente bloque de código C:

#include <stdio.h>

int main(void) {
  printf("==== Prueba de Goto en C ====\\n");
  
  goto prueba;
  
  printf("Esto no se ve porque hemos saltado a la etiqueta llamada 'prueba'.");
  
  prueba:
	printf("GOTO realizado correctamente! Hemos viajado al futuro.\\n");
  
  return 0;
}

Si ejecutamos este programa, va a suceder lo siguiente:

<aside> 🔧 En este enlace puedes editar el programa y probar diferentes alternativas:

GotoInC

</aside>

¿Qué podemos aprender de este programa? Lo primero que es evidente es la dificultad para saber qué hace el programa. Para comprender como funciona un programa es necesario simular su ejecución. Pero esto no es fácil con programas grandes.

<aside> 🤓 Seguramente no recordarás haber usado goto en C cuando aprendiste a programar. Esto es porque su uso está fuertemente desaconsejado. Ya veremos la razón.

</aside>

A esta forma de programar, con etiquetas y muchas instrucciones goto se la conoce como Programación No Estructurada, el paradigma de programación más antiguo capaz de crear algoritmos Turing completos.

La programación no estructurada ha sido muy criticada por producir un código difícilmente legible, llamado código spaghetti, especialmente con la publicación de Go To Statement Considered Harmful (1968) de Edsger W. Dijkstra.

Esta crítica, dio nacimiento a una alternativa, la Programación Estructurada, que redujo al mínimo el uso de goto y lo reemplazó por estructuras más simples y comprensibles: los condicionales y los bucles, de los cuales ya hemos aprendido mucho en nuestros cursos anteriores de programación.

<aside> 🤔 Si necesitas refrescar el uso de condicionales y bucles, estas secciones del curso Algoritmos y Estructuras de la carrera de Programador Universitario de Sistemas pueden serte útiles.

Tomando decisiones

Repetir, repetir es mi trabajo

</aside>

Orientación a la acción

La programación estructurada tiende a ser orientada a la acción. Las personas que programan en este paradigma se enfocan en crear y escribir grupos de acciones que ejecutan alguna tarea común y que se agrupan para formar programas. A estos grupos los llamamos procesos.

Dado que la unidad fundamental es la acción, los datos funcionan como la materia prima para las acciones que los procesos ejecutan.

Cuando se resuelven problemas usando programación estructurada, se utiliza la metodología de refinamientos sucesivos: se plantea una operación como un todo y luego se divide en procesos más sencillos o menos complejos integrados por secuencias, selecciones o iteraciones.

La utilización de procesos, integrados por estructuras de selección o de iteración genera la existencia de bloques que estructuran los programas.