Pureza del lenguaje de programación

Pureza (en relación con un lenguaje de programación) - la ausencia de efectos secundarios . Un lenguaje de programación es puro si todas las funciones en los programas de ese lenguaje son puras .

Los programas escritos en lenguajes de programación puros son más fáciles de depurar , verificar y detectar errores que no se pudieron detectar mediante pruebas . Los programas en un lenguaje de programación puro son más fáciles de reescribir sin introducir errores. Al mismo tiempo, el proceso mismo de planificar un programa con la expectativa de pureza es más complicado.

Otra ventaja importante de los lenguajes funcionales puros es el paralelismo . Dado que todas las funciones para los cálculos usan solo sus parámetros, es posible organizar el cálculo de funciones independientes en un orden arbitrario o en paralelo, esto no afectará el resultado del cálculo. El paralelismo se puede organizar no solo a nivel de compilador de lenguaje, sino también a nivel de arquitectura de hardware. Hay computadoras experimentales basadas en arquitecturas similares, como la máquina Lisp .

Los lenguajes funcionales puros a veces se denominan "deterministas" en el sentido de que para cualquier función, cada llamada siempre tiene el mismo efecto (en los lenguajes imperativos, esto generalmente no es cierto). Al mismo tiempo, dichos lenguajes se denominan "no deterministas" en el sentido de que el orden de ejecución real del programa puede variar mucho según la implementación específica del lenguaje: los algoritmos se pueden paralelizar implícitamente, los datos intermedios se pueden excluir de la cadena de conversión, la representación de los mismos tipos puede variar incluso dentro del mismo programa, etc. (esto es simplemente imposible para los lenguajes imperativos). En pocas palabras, los lenguajes puros son deterministas a nivel de código fuente y no deterministas a nivel de implementación (los lenguajes imperativos son viceversa).

E/S y pureza

La aplicación más seria de los lenguajes de programación, en la que los efectos secundarios están constantemente presentes en las funciones, es la entrada-salida . Se puede suponer que cualquier operación de entrada de datos del usuario es una acción con un efecto secundario, ya que es imposible decir de antemano qué ingresará exactamente el usuario como valores de parámetros utilizados en el proceso computacional. Aunque algunos investigadores y teóricos argumentan que I/O no puede ser considerado como un ejemplo de la presencia de efectos secundarios, ya que en esencia I/O es un cambio en el entorno del programa, pero en cualquier caso, I/O hace que las funciones usándolo no determinista.

En la programación funcional pura, no hay operador de asignación, los objetos no se pueden cambiar ni destruir, solo se pueden crear nuevos por descomposición y síntesis de los existentes. El recolector de basura integrado en cualquier traductor de lenguaje funcional se encargará de los objetos innecesarios . Debido a esto, en lenguajes funcionales puros, todas las funciones están libres de efectos secundarios. Sin embargo, esto no impide que estos lenguajes imiten algunas características imperativas útiles, como el manejo de excepciones y matrices mutables (destructivas) . Hay métodos especiales para esto.

Sin embargo, algunas razones para la presencia de funciones con efectos secundarios no pueden eliminarse por completo de los lenguajes de programación funcionales, ya que en este caso dichos lenguajes serían demasiado limitados en el uso práctico. En primer lugar, esto se aplica específicamente a la entrada-salida. Es difícil imaginar un lenguaje de programación completo en el que no exista la posibilidad de llevar a cabo la entrada de datos del usuario en un modo interactivo, así como llevar a cabo la salida de datos para el usuario.

Mónadas

Para permitir el uso de tecnologías como E/S sin degradar la propiedad de pureza, muchos lenguajes de programación funcionales, incluido Haskell , utilizan un mecanismo especial llamado " mónada ". Las mónadas parecen envolver las necesarias propiedades imperativas, evitando que se mezclen con la pura sintaxis de un lenguaje funcional. El uso de mónadas permitió implementar todos aquellos cuellos de botella que regulaban la presencia de efectos secundarios en las funciones.

Así, por ejemplo, para proporcionar E/S en el lenguaje Haskell, se implementa una mónada estándar IO, fuera de la cual es imposible realizar ninguna operación de E/S. Todas las demás mónadas estándar implementadas para el lenguaje Haskell tienen las mismas propiedades.

Ejemplos de lenguajes de programación puros