Programación procedimental - Procedural programming

La programación procedimental es un paradigma de programación , derivado de la programación imperativa , basado en el concepto de llamada a procedimiento . Los procedimientos (un tipo de rutina o subrutina ) simplemente contienen una serie de pasos computacionales a realizar. Cualquier procedimiento dado puede ser llamado en cualquier momento durante la ejecución de un programa, incluso por otros procedimientos o por sí mismo. Los primeros lenguajes de programación procedimentales importantes aparecieron alrededor de 1957-1964, incluidos Fortran , ALGOL , COBOL , PL / I y BASIC . Pascal y C se publicaron alrededor de 1970-1972.

Los procesadores de computadora brindan soporte de hardware para la programación de procedimientos 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, pero ningún intento tuvo éxito comercial (por ejemplo, máquinas Lisp o procesadores Java ).

Procedimientos y modularidad

La modularidad es generalmente deseable, especialmente en programas grandes y complicados. Las entradas generalmente se especifican sintácticamente en forma de argumentos y las salidas se entregan como valores de retorno .

La determinación del alcance es otra técnica que ayuda a que los procedimientos sean modulares. Evita que el procedimiento acceda a las variables de otros procedimientos (y viceversa), incluidas instancias anteriores de sí mismo, sin autorización explícita.

Los procedimientos menos modulares, que a menudo se utilizan en programas pequeños o de escritura rápida, tienden a interactuar con una gran cantidad de variables en el entorno de ejecución , que otros procedimientos también pueden modificar.

Debido a la capacidad de especificar una interfaz simple, ser autónomo y reutilizarse, los procedimientos son un vehículo conveniente para crear fragmentos de código escritos por diferentes personas o diferentes grupos, incluso a través de bibliotecas de programación .

Comparación con otros paradigmas de programación

Programación imperativa

Los lenguajes de programación procedimental también son lenguajes imperativos , porque hacen referencias explícitas al estado del entorno de ejecución. Esto podría ser cualquier cosa, desde variables (que pueden corresponder a registros del procesador ) hasta algo así como la posición de la "tortuga" en el lenguaje de programación Logo .

A menudo, los términos "programación procedimental" y "programación imperativa" se utilizan como sinónimos. Sin embargo, la programación procedimental se basa en gran medida en los bloques y el alcance , mientras que la programación imperativa en su conjunto puede o no tener tales características. Como tal, los lenguajes de procedimiento generalmente usan palabras reservadas que actúan sobre bloques, como if, whiley for, para implementar el flujo de control , mientras que los lenguajes imperativos no estructurados usan sentencias goto y tablas de ramas para el mismo propósito.

Programación orientada a objetos

El enfoque de la programación procedimental es dividir una tarea de programación en una colección de variables , estructuras de datos y subrutinas , mientras que en la programación orientada a objetos es dividir una tarea de programación en objetos que exponen el comportamiento (métodos) y los datos (miembros o atributos) utilizando interfaces. La distinción más importante es que mientras que la programación procedimental usa procedimientos para operar en estructuras de datos, la programación orientada a objetos agrupa los dos juntos, por lo que un "objeto", que es una instancia de una clase, opera en su "propia" estructura de datos.

La nomenclatura varía entre los dos, aunque tienen una semántica similar:

Procesal Orientado a objetos
Procedimiento Método
Registro Objeto
Módulo Clase
Llamada a procedimiento Mensaje

Programación funcional

Los principios de modularidad y reutilización de código en los lenguajes funcionales prácticos son fundamentalmente los mismos que en los lenguajes de procedimiento, ya que ambos se derivan de la programación estructurada . Así por ejemplo:

  • Los procedimientos corresponden a funciones. Ambos permiten la reutilización del mismo código en varias partes de los programas y en varios puntos de su ejecución.
  • Del mismo modo, las llamadas a procedimientos corresponden a la aplicación de funciones.
  • Las funciones y su separación modular entre sí de la misma manera, mediante el uso de argumentos de función, valores de retorno y alcances de variables.

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 admitir programas de escritura tanto como sea posible en términos de funciones puras :

  • Mientras que los lenguajes de procedimiento modelan la ejecución del programa como una secuencia de comandos imperativos que pueden alterar implícitamente el estado compartido, los lenguajes de programación funcional modelan la ejecución como la evaluación de expresiones complejas que solo dependen unas de otras en términos de argumentos y valores de retorno. Por esta razón, los programas funcionales pueden tener un orden libre de ejecución de código y los lenguajes pueden ofrecer poco control sobre el orden en el que se ejecutan varias partes del programa. (Por ejemplo, los argumentos para la invocación de un procedimiento en Scheme se ejecutan en un orden arbitrario).
  • Los lenguajes de programación funcional admiten (y utilizan en gran medida) funciones de primera clase , funciones anónimas y cierres , aunque estos conceptos se incluyen en lenguajes de procedimiento más nuevos.
  • Los lenguajes de programación funcional tienden a depender de la optimización de llamadas de cola y funciones de orden superior en lugar de construcciones de bucle imperativas.

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 de procedimiento.

Existen algunos lenguajes funcionales esotéricos (como Unlambda ) que evitan los preceptos de programación estructurados en aras de ser difíciles de programar (y por lo tanto desafiantes). Estos lenguajes son la excepción al terreno común entre los lenguajes procedimentales y funcionales.

Programación lógica

En la programación lógica , un programa es un conjunto de premisas y el cálculo se realiza intentando probar teoremas candidatos. Desde este punto de vista, los programas lógicos son declarativos , centrándose en cuál es el problema, más que en cómo resolverlo.

Sin embargo, la técnica de razonamiento hacia atrás , implementada por 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. Así cláusulas de la forma:

H: - B 1 ,…, B n .

tienen una interpretación dual, tanto como procedimientos

para mostrar / resolver H , mostrar / resolver B 1 y… y B n

y como implicaciones lógicas:

B 1 y B ... y n implica H .

Los programadores lógicos experimentados utilizan la interpretación procedimental para escribir programas que son efectivos y eficientes, y utilizan la interpretación declarativa para ayudar a garantizar que los programas sean correctos.

Ver también

Referencias

enlaces externos