function - ¿Por qué las funciones "puras" se llaman "puras"?
functional-programming purely-functional (5)
El concepto de una función se originó en las matemáticas. El concepto matemático de una función es más o menos un mapeo de un conjunto a otro. En este sentido, es imposible que las funciones tengan efectos secundarios; no porque sean "mejores" de esa manera o porque estén específicamente definidos para no tener efectos secundarios, sino porque el concepto de "tener efectos secundarios" no tiene ningún sentido con esta definición de función. Las funciones matemáticas no son una serie de pasos que se ejecutan, entonces, ¿cómo podría alguno de esos pasos "afectar" de algún modo a otros objetos matemáticos de los que está hablando?
Cuando las personas comenzaron a estudiar computación , se interesaron en algoritmos implementables por máquina para calcular los valores de las funciones matemáticas dadas sus entradas. La gente comenzó a hablar sobre funciones computables . Pero las funciones implementadas en una computadora (al menos en los idiomas imperativos, con los que los programadores primero trabajaron) son una serie de pasos ejecutables, que obviamente pueden tener efectos secundarios.
Así que se hizo natural que los programadores pensaran en las funciones como algoritmos, no como funciones matemáticas. Entonces, una función pura es aquella que es puramente una función matemática, a la que se aplican todos los cientos de años de teoría sobre funciones, en oposición a la función del programador generalizado, que no puede razonarse de esa manera.
Una función pura es aquella que no tiene efectos secundarios - no puede hacer ningún tipo de E / S y no puede modificar el estado de nada - y es referencialmente transparente - cuando se la llama varias veces con las mismas entradas, siempre da los mismos resultados
¿Por qué se usa la palabra "puro" para describir funciones con esas propiedades? ¿Quién utilizó por primera vez la palabra "puro" de esa manera, y cuándo? ¿Hay otras palabras que significan más o menos lo mismo?
Para responder a su primera pregunta, las funciones matemáticas a menudo se han descrito como "puras" en términos de algunas variables específicas. p.ej:
el primer término es una función pura de xy el segundo término es una función pura de y
Debido a esto, no creo que encuentres una verdadera "primera" ocurrencia.
Para los lenguajes de programación, una pequeña búsqueda muestra que Ada 95 ( pragma Pure
), High Performance Fortran (1993) ( PURE
) y VHDL-93 ( pure
) contienen nociones formales de "funciones puras".
Haskell (1990) es bastante obvio, pero la pureza no es explícita. La C de GCC tiene varios atributos de función para varios niveles diferentes de ''puro''.
Un par de libros: Justificación del lenguaje de programación C (1990) utiliza el término, al igual que los Lenguajes de programación y sus definiciones (1984). Sin embargo, ¡ambos aparentemente solo lo usan una vez! Al programar IBM Personal Computer, Pascal (también en 1984) utiliza el término, pero no está claro desde la vista restringida de Google si el compilador de Pascal tenía o no soporte para él. (Sospecho que no)
Una nota interesante es que Green, el predecesor de Ada, en realidad tenía una definición de "función" bastante estricta , incluso la asignación de memoria no se permitía. Sin embargo, esto se eliminó antes de que se convirtiera en Ada, donde las funciones pueden tener efectos secundarios (E / S o variables globales), pero no pueden modificar sus argumentos.
C28-6571-3 (el primer manual de referencia PL / I, escrito antes del compilador) muestra que PL / I tenía soporte para funciones puras, en la forma del REDUCIBLE
(= puro), ya en 1966, cuando el compilador fue lanzado por primera vez. (Esto también responde a su tercera pregunta).
Este último documento señala específicamente que incluye REDUCIBLE
como un nuevo cambio desde el documento C28-6571-2. Así REDUCIBLE
, que es posiblemente la primera encarnación de funciones puras formales en lenguajes de programación, apareció en algún lugar entre enero y julio de 1966.
Actualización: la instancia más antigua de "función pura" en los Grupos de Google en este sentido es de 1988 , que fácilmente publica las referencias del libro.
Un par de mitos:
El término "funcional puro" no proviene de las matemáticas, donde todas las funciones son por naturaleza "puras" y, por lo tanto, nunca hubo necesidad de llamar a nada una "función pura".
El término no proviene de la programación imperativa. Los primeros lenguajes de programación imperativos, Fortran, Algol 60, Pascal, etc., siempre tenían dos tipos de abstracciones: "funciones" que producían resultados basados en sus entradas y "procedimientos" que tomaban algunas entradas e hicieron una acción. Se consideró una buena práctica de programación para que las "funciones" no tuvieran efectos secundarios. No era necesario que tuvieran efectos secundarios porque siempre se podían usar procedimientos en su lugar.
Entonces, ¿de dónde más podría haber venido el término "funcional puro"? La respuesta es, algo así como obvia. Proviene de lenguajes de programación funcionales impuros, el más destacado de ellos es Lisp. Lisp fue diseñado en algún momento entre 1958 y 1960 (entre el primer y segundo informe de Algol 60, cuyo diseño McCarthy estuvo involucrado, pero no se sintió satisfecho). El diseño de Lisp se basó fundamentalmente en la programación funcional. Sin embargo, también permitió los efectos secundarios como una elección pragmática. No tenía una noción de un comando o un procedimiento. Entonces, en Lisp, uno escribía principalmente "funciones puras", pero ocasionalmente, uno escribía "funciones impuras", es decir, funciones con efectos secundarios, para hacer algo. Los términos "Lisp puro" o "subconjunto puramente funcional de Lisp" se han utilizado durante mucho tiempo. Lentamente, por ósmosis, esta idea de "pureza" ha invadido todo nuestro espacio.
Los lenguajes de programación imperativos podrían haber resistido la tendencia. Pero, una vez que C decidió abolir la idea de "procedimientos" y llamarlos "funciones nulas" en su lugar, no tenían mucho que hacer.
Viene de la definición matemática de "función", donde no es posible que las funciones tengan efectos secundarios.
¿Por qué se usa la palabra "puro" para describir funciones con esas propiedades?
De Wikcionario> pure # adjetivo
- libre de defectos o imperfecciones; inmaculado
- libre de materiales extraños o contaminantes
- libre de comportamiento o cualidades inmorales; limpiar
- de una rama de la ciencia, hecho por sí mismo en lugar de servir a otra rama de la ciencia.
Debería ser obvio que el comportamiento de las funciones que interactúan es más fácil de razonar cuando solo están influenciadas por sus entradas, y ellas mismas solo influyen en sus resultados. Por lo tanto, es inevitable que este tipo de funciones se noten y clasifiquen. Ahora, ¿qué palabra podríamos usar para describir una función con tales propiedades? "libre de material extraño o contaminantes" y "libre de comportamientos o cualidades inmorales" parecen describir esto bastante bien.
¿Quién utilizó por primera vez la palabra "puro" de esa manera, y cuándo?
Soy demasiado joven para responder a esto con cierto grado de confianza. Sin embargo, sostengo que era inevitable que la palabra puro (o algún sinónimo muy cercano) se usara para describir funciones que se comportan de esta manera.
¿Hay otras palabras que significan más o menos lo mismo?
Tú mismo lo dijiste: "referencialmente transparente". Sin embargo, parece sugerir que la "transparencia referencial" abarca solo una parte del significado de la frase "función pura". Estoy en desacuerdo; Siento que es completamente sinónimo. De Wikipedia> Transparencia referencial :
Se dice que una expresión es referencialmente transparente si puede ser reemplazada por su valor sin cambiar el comportamiento de un programa . (énfasis mío)
La comunidad Haskell a veces usa el adjetivo "seguro" de manera similar. (Consulte la Biblioteca Safe , creada para evitar excepciones. Contraste con la forma no unsafePerformIO
)
No puedo pensar en otros sinónimos ahora mismo.