La programación procedimental es un paradigma de programación , clasificado como programación imperativa , [1] que implica implementar el comportamiento de un programa informático como procedimientos (también conocidos como funciones, subrutinas) que se llaman entre sí. El programa resultante es una serie de pasos que forman una jerarquía de llamadas a sus procedimientos constituyentes.
Los primeros lenguajes de programación procedimental importantes aparecieron entre 1957 y 1964, incluidos Fortran , ALGOL , COBOL , PL/I y BASIC . [2] Pascal y C se publicaron entre 1970 y 1972.
Los procesadores de ordenador proporcionan soporte de hardware para la programación procedimental a través de un registro de pila e instrucciones para llamar a los procedimientos y regresar de ellos. Es posible el soporte de hardware para otros tipos de programación, como las máquinas Lisp o los procesadores Java , pero ningún intento tuvo éxito comercial. [ contradictorio ]
Ciertas prácticas de desarrollo de software suelen emplearse con programación procedimental para mejorar la calidad y reducir los costos de desarrollo y mantenimiento.
La modularidad consiste en organizar los procedimientos de un programa en módulos separados, cada uno de los cuales tiene un propósito específico y comprensible.
Minimizar el alcance de las variables y procedimientos puede mejorar la calidad del software al reducir la carga cognitiva de los procedimientos y módulos.
Un programa que carece de modularidad o de un alcance amplio tiende a tener procedimientos que consumen muchas variables que otros procedimientos también consumen. El código resultante es relativamente difícil de entender y de mantener.
Dado que un procedimiento puede especificar una interfaz bien definida y ser autónomo, admite la reutilización de código , en particular a través de la biblioteca de software .
La programación procedimental se clasifica como programación imperativa , porque implica un comando directo de ejecución.
El lenguaje procedimental es una subclase del imperativo, ya que incluye conceptos de bloque y alcanceif
, mientras que el imperativo describe un concepto más general que no requiere dichas características. Los lenguajes procedimentales generalmente usan palabras reservadas que definen bloques, como , while
, y for
, para implementar el flujo de control , mientras que los lenguajes imperativos no estructurados (es decir, el lenguaje ensamblador ) usan tablas goto y de ramificación para este propósito.
La programación orientada a objetos (POO), también clasificada como imperativa, implica dividir la implementación de un programa en objetos que exponen el comportamiento (métodos) y los datos (miembros) a través de una interfaz bien definida. Por el contrario, la programación procedimental trata de dividir la implementación del programa en variables , estructuras de datos y subrutinas . Una distinción importante es que, mientras que la programación procedimental implica procedimientos para operar sobre estructuras de datos, la POO agrupa los dos. Un objeto es una estructura de datos y el comportamiento asociado con esa estructura de datos. [3]
Algunos lenguajes OOP admiten el concepto de clase, lo que permite crear un objeto basado en una definición.
La nomenclatura varía entre ambos, aunque tienen una semántica similar:
Los principios de modularidad y reutilización de código en los lenguajes funcionales son fundamentalmente los mismos que en los lenguajes procedimentales, ya que ambos se derivan de la programación estructurada . Por ejemplo:
La principal diferencia entre los estilos es que los lenguajes de programación funcional eliminan o al menos restan importancia a los elementos imperativos de la programación procedimental. Por lo tanto, el conjunto de características de los lenguajes funcionales está diseñado para respaldar la escritura de programas tanto como sea posible en términos de funciones puras :
Sin embargo, muchos lenguajes funcionales son, de hecho, impuramente funcionales y ofrecen construcciones imperativas/procedimentales que permiten al programador escribir programas en estilo procedimental, o en una combinación de ambos estilos. Es común que el código de entrada/salida en lenguajes funcionales se escriba en un estilo procedimental.
Existen algunos lenguajes funcionales esotéricos (como Unlambda ) que evitan los preceptos de la programación estructurada por el hecho de que resulta difícil programarlos (y, por lo tanto, un desafío). Estos lenguajes son la excepción a la base común entre los lenguajes procedimentales y funcionales.
En programación lógica , un programa es un conjunto de premisas y el cálculo se realiza intentando demostrar teoremas candidatos. Desde este punto de vista, los programas lógicos son declarativos y se centran en cuál es el problema, en lugar de en cómo resolverlo.
Sin embargo, la técnica de razonamiento inverso , implementada por la resolución SLD , utilizada para resolver problemas en lenguajes de programación lógica como Prolog , trata los programas como procedimientos de reducción de objetivos. Por lo tanto, las cláusulas de la forma:
tienen una doble interpretación, tanto como procedimientos
y como implicaciones lógicas:
Un programador lógico experto utiliza la interpretación procedimental para escribir programas que sean efectivos y eficientes, y utiliza la interpretación declarativa para ayudar a garantizar que los programas sean correctos.