Articulo de referencia

Programación modular

La programación modular es un paradigma de programación que enfatiza la organización de las funciones de un código fuente en módulos independientes , cada uno de los cuales prop...

La programación modular es un paradigma de programación que enfatiza la organización de las funciones de un código fuente en módulos independientes , cada uno de los cuales proporciona un aspecto de un programa informático en su totalidad sin proporcionar otros aspectos.

La interfaz de un módulo define los elementos que este proporciona y requiere. Los elementos definidos en la interfaz son detectables por otros módulos. La implementación contiene el código funcional que corresponde a los elementos declarados en la interfaz.

Historia

La programación modular, en forma de subsistemas (especialmente para E/S) y bibliotecas de software, se remonta a los primeros sistemas de software, donde se utilizaba para la reutilización de código . La programación modular propiamente dicha, con el objetivo de lograr la modularidad, se desarrolló a finales de la década de 1960 y en la de 1970, como una analogía a mayor escala del concepto de programación estructurada (década de 1960). El término "programación modular" data al menos del Simposio Nacional sobre Programación Modular, organizado en el Instituto de Información y Sistemas en julio de 1968 por Larry Constantine ; otros conceptos clave fueron la ocultación de información (1972) y la separación de responsabilidades (SoC, 1974).

Los módulos no se incluyeron en la especificación original de ALGOL 68 (1968), pero se incluyeron como extensiones en las primeras implementaciones, ALGOL 68-R (1970) y ALGOL 68C (1970), y posteriormente se formalizaron. [ 1 ] Uno de los primeros lenguajes diseñados desde el principio para la programación modular fue el efímero Modula (1975), de Niklaus Wirth . Otro lenguaje modular temprano fue Mesa (década de 1970), de Xerox PARC , y Wirth se basó en Mesa, así como en el Modula original, en su sucesor, Modula-2 (1978), que influyó en lenguajes posteriores, particularmente a través de su sucesor, Modula-3 (década de 1980). El uso de nombres calificados con puntos en Modula , como M.apara referirse a un objeto adesde un módulo M, coincide con la notación para acceder a un campo de un registro (y de manera similar para atributos o métodos de objetos), y ahora está muy extendido, visto en C++ , C# , Dart , Go , Java , OCaml y Python , entre otros. La programación modular se generalizó a partir de la década de 1980: el lenguaje Pascal original (1970) no incluía módulos, pero versiones posteriores, en particular UCSD Pascal (1978) y Turbo Pascal (1983), los incluyeron en forma de "unidades", al igual que Ada (1980), influenciado por Pascal. El estándar Extended Pascal ISO 10206:1990 se mantuvo más cerca de Modula2 en su soporte modular. Standard ML (1984) [ 2 ] tiene uno de los sistemas de módulos más completos, incluyendo functores (módulos parametrizados) para mapear entre módulos.

En las décadas de 1980 y 1990, la programación modular quedó eclipsada y a menudo se confundió con la programación orientada a objetos , particularmente debido a la popularidad de C++ y Java. Por ejemplo, la familia de lenguajes C tenía soporte para objetos y clases en C++ (originalmente C con Classes , 1980) y Objective-C (1983), y solo admitió módulos 30 años o más tarde. Java (1995) admite módulos en forma de paquetes , aunque la unidad principal de organización del código es una clase. Sin embargo, Python (1991) utilizó prominentemente tanto módulos como objetos desde el principio, usando módulos como la unidad principal de organización del código y "paquetes" como una unidad de mayor escala. Perl 5 (1994) también incluye soporte para módulos y objetos, con una amplia gama de módulos disponibles en CPAN (1993). OCaml (1996) siguió a ML al admitir módulos y functores.

La programación modular está muy extendida y se encuentra en prácticamente todos los lenguajes principales desarrollados desde la década de 1990. La importancia relativa de los módulos varía entre lenguajes, y en los lenguajes orientados a objetos basados ​​en clases todavía existe cierta superposición y confusión con las clases como unidad de organización y encapsulación, pero ambos conceptos están bien establecidos.

Terminología

En ocasiones, se utiliza el término «ensamblaje» (como en lenguajes .NET como C# , F# o Visual Basic ) o «paquete» (como en Dart , Go o Java ) en lugar de «módulo» . En otras implementaciones, estos son conceptos distintos; en Python, un paquete es un conjunto de módulos, mientras que en Java 9 se introdujo el Sistema de Módulos de la Plataforma Java , que implementó un nuevo concepto de módulo que implica un conjunto de paquetes con un control de acceso mejorado. (Estos paquetes no son lo mismo que otros tipos de paquetes en software, como los paquetes de gestores de paquetes ).

En Java , el término paquete se utiliza para el concepto de módulo en la especificación del lenguaje Java. [ 3 ] El módulo , una especie de conjunto de un paquete, se introdujo en Java 9 .

En algunos dialectos de Pascal , el término unidad se utiliza para el concepto de módulo.

Un componente es un concepto similar, pero generalmente se refiere a un nivel superior; un componente es una parte de un sistema completo , mientras que un módulo es una parte de un programa individual. La escala del término "módulo" varía significativamente entre lenguajes; en Python es de escala muy pequeña y cada archivo es un módulo, mientras que en Java 9 es de escala grande, donde un módulo es un conjunto de paquetes, que a su vez son conjuntos de archivos.

Soporte de idiomas

Los lenguajes que admiten formalmente el concepto de módulo incluyen Ada , ALGOL , BlitzMax , C++ , C# , Clojure , COBOL , Common Lisp , D , Dart , eC, Erlang , Elixir , Elm , F , F# , Fortran , Go , Haskell , IBM/360 Assembler , IBM System/38 y AS/400 Control Language (CL), IBM RPG , Java , Julia , MATLAB , ML , Modula , Modula-2 , Modula-3 , Morpho, NEWP , Oberon , Oberon-2 , Objective-C , OCaml , varios derivados de Pascal ( Component Pascal , Object Pascal , Turbo Pascal , UCSD Pascal ), Perl , PHP , PL/I , PureBasic , Python , R , Ruby , [ 4 ] Rust , JavaScript , [ 5 ] Visual Basic (.NET) y WebDNA.

Ejemplos notables de lenguajes que carecen de soporte para módulos son C y, en sus formas originales, C++ y Pascal. Sin embargo, C y C++ permiten especificar interfaces declarativas y de compilación separadas mediante archivos de cabecera, lo que comúnmente se considera modularización. Los módulos se agregaron a Objective-C en iOS 7 (2013) y a C++ con C++20 . [ 6 ] Pascal fue reemplazado por Modula y Oberon , que incluían módulos desde el principio, y varios derivados que también los incluían. JavaScript ha tenido módulos nativos desde ECMAScript 2015. Los módulos de C++ han permitido la retrocompatibilidad con las cabeceras (con "unidades de cabecera"). Los dialectos de C permiten módulos; por ejemplo, Clang admite módulos para el lenguaje C , [ 7 ] aunque la sintaxis y la semántica de los módulos de Clang C difieren de los módulos de C++.

La programación modular puede realizarse incluso cuando el lenguaje de programación carece de características sintácticas explícitas para admitir módulos con nombre, como por ejemplo en C. Esto se logra utilizando las características existentes del lenguaje, junto con, por ejemplo, convenciones de codificación , modismos de programación y la estructura física del código. IBM i también utiliza módulos al programar en el Entorno de Lenguaje Integrado (ILE).

Aspectos clave

En la programación modular, las responsabilidades se separan de tal manera que los módulos realizan funciones lógicamente independientes, interactuando a través de interfaces bien definidas. A menudo, los módulos forman un grafo acíclico dirigido (DAG); en este caso, una dependencia cíclica entre módulos indica que deberían constituir un único módulo. Cuando los módulos forman un DAG, pueden organizarse jerárquicamente, donde los módulos de nivel inferior son independientes y no dependen de otros, y los de nivel superior dependen de los de nivel inferior. Un programa o biblioteca en particular es un módulo de nivel superior dentro de su propia jerarquía, pero a su vez puede considerarse un módulo de nivel inferior dentro de un programa, biblioteca o sistema de nivel superior.

Al crear un sistema modular, en lugar de crear una aplicación monolítica (donde el componente más pequeño constituye el todo), se escriben varios módulos más pequeños por separado, de modo que, al combinarlos, se construye el programa ejecutable. Normalmente, estos módulos también se compilan por separado, mediante compilación independiente , y luego se enlazan con un enlazador . Un compilador justo a tiempo puede realizar parte de esta construcción "sobre la marcha" durante la ejecución .

Estas funciones independientes se clasifican comúnmente como funciones de control de programa o funciones de tarea específica. Las funciones de control de programa están diseñadas para funcionar con un solo programa. Las funciones de tarea específica se preparan cuidadosamente para ser aplicables a diversos programas.

Esto hace que los sistemas de diseño modular, si se construyen correctamente, sean mucho más reutilizables que un diseño monolítico tradicional, ya que todos (o muchos) de estos módulos pueden reutilizarse (sin modificaciones) en otros proyectos. Esto también facilita la división de proyectos en varios proyectos más pequeños. En teoría, un proyecto de software modularizado será más fácil de ensamblar para grandes equipos, ya que ningún miembro del equipo crea el sistema completo ni necesita conocerlo en su totalidad. Pueden centrarse únicamente en la tarea más pequeña que se les ha asignado.

Véase también

Referencias

  1. Lindsey, Charles H. (febrero de 1976). "Propuesta para una instalación de módulos en ALGOL 68" (PDF) . Boletín ALGOL (39): 20–29 . Archivado del original (PDF) el 3 de marzo de 2016. Recuperado el 1 de diciembre de 2014 .
  2. David MacQueen (agosto de 1984). "Módulos para ML estándar" . Actas del Simposio ACM de 1984 sobre LISP y programación funcional , LFP '84. págs. 198–207 . doi : 10.1145/800055.802036 . 
  3. James Gosling ; Bill Joy ; Guy Steele ; Gilad Bracha (2005). Especificación del lenguaje Java, tercera edición . ISBN 0-321-24678-0.En la introducción se indica que "el capítulo 7 describe la estructura de un programa, que se organiza en paquetes similares a los módulos de Modula". La palabra módulo no tiene un significado especial en Java.
  4. "Módulo de clase - Documentación para Ruby 3.5" .
  5. Especificación del lenguaje ECMAScript® 2015, 15.2 Módulos
  6. "N4720: Borrador de trabajo, Extensiones a C++ para módulos" (PDF) .
  7. "Módulos" . clang.llvm.org .
  • Cómo descomponer un sistema en módulos
  • Plataforma SMC
Obtenido de " https://en.wikipedia.org/w/index.php?title=Modular_programming&oldid=1354833922 "