Programación genérica


La programación genérica es un estilo de programación informática en el que los algoritmos se escriben en términos de tipos que se especificarán más adelante y que luego se instancian cuando es necesario para tipos específicos proporcionados como parámetros . Este enfoque, iniciado por el lenguaje de programación ML en 1973, [1] [2] permite escribir funciones o tipos comunes que difieren solo en el conjunto de tipos en los que operan cuando se usan, lo que reduce la duplicación . Tales entidades de software se conocen como genéricos en Ada , C#, Delphi , Eiffel , F# , Java , Nim , Python , Rust , Swift , TypeScript y Visual Basic .NET . Se conocen como polimorfismo paramétrico en ML , Scala , Julia y Haskell (la comunidad de Haskell también usa el término "genérico" para un concepto relacionado pero algo diferente); plantillas en C++ y D ; y tipos parametrizados en el influyente libro de 1994Patrones de diseño . [3]

El término "programación genérica" ​​fue acuñado originalmente por David Musser y Alexander Stepanov [4] en un sentido más específico que el anterior, para describir un paradigma de programación mediante el cual los requisitos fundamentales sobre los tipos se abstraen de ejemplos concretos de algoritmos y estructuras de datos y se formalizan. como conceptos , con funciones genéricas implementadas en términos de estos conceptos, típicamente utilizando mecanismos de generidad de lenguaje como se describe anteriormente.

La programación genérica se centra en la idea de abstraerse de algoritmos concretos y eficientes para obtener algoritmos genéricos que se pueden combinar con diferentes representaciones de datos para producir una amplia variedad de software útil.

El paradigma de "programación genérica" ​​es un enfoque de la descomposición del software mediante el cual los requisitos fundamentales de los tipos se abstraen de ejemplos concretos de algoritmos y estructuras de datos y se formalizan como conceptos , de forma análoga a la abstracción de teorías algebraicas en el álgebra abstracta . [6] Los primeros ejemplos de este enfoque de programación se implementaron en Scheme y Ada, [7] aunque el ejemplo más conocido es la Biblioteca de plantillas estándar (STL), [8] [9] que desarrolló una teoría de iteradores que se utiliza para desacoplar estructuras de secuencias de datos y los algoritmos que operan sobre ellas.

Por ejemplo, dadas N estructuras de datos de secuencia, por ejemplo, lista enlazada simple, vector, etc., y M algoritmos para operar en ellos, por ejemplo find, sortetc., un enfoque directo implementaría cada algoritmo específicamente para cada estructura de datos, dando N × M combinaciones para implementar. Sin embargo, en el enfoque de programación genérica, cada estructura de datos devuelve un modelo de un concepto de iterador (un tipo de valor simple que se puede desreferenciar para recuperar el valor actual o cambiar para apuntar a otro valor en la secuencia) y cada algoritmo se escribe en su lugar. genéricamente con argumentos de tales iteradores, por ejemplo, un par de iteradores que apuntan al principio y al final de la subsecuencia o rangoprocesar. Por lo tanto, solo es necesario implementar N + M combinaciones de estructura de datos-algoritmo. En la STL se especifican varios conceptos de iterador, cada uno de los cuales es un refinamiento de conceptos más restrictivos, por ejemplo, los iteradores de avance solo proporcionan movimiento al siguiente valor en una secuencia (por ejemplo, adecuado para una lista enlazada individualmente o un flujo de datos de entrada), mientras que un iterador de acceso aleatorio iterator también proporciona acceso directo en tiempo constante a cualquier elemento de la secuencia (por ejemplo, adecuado para un vector). Un punto importante es que una estructura de datos devolverá un modelo del concepto más general que se puede implementar de manera eficiente : complejidad computacional.los requisitos forman parte explícitamente de la definición del concepto. Esto limita las estructuras de datos a las que se puede aplicar un algoritmo dado y tales requisitos de complejidad son un determinante importante de la elección de la estructura de datos. La programación genérica se ha aplicado de manera similar en otros dominios, por ejemplo, algoritmos gráficos. [10]

Tenga en cuenta que aunque este enfoque a menudo utiliza características de lenguaje de genericidad/plantillas en tiempo de compilación , de hecho es independiente de los detalles técnicos del lenguaje en particular. El pionero de la programación genérica, Alexander Stepanov, escribió: