¿La programación en la filosofía UNIX es igual a la programación funcional?

30

El entorno de programación de UNIX (el texto clásico) establece que el enfoque de UNIX para la programación es construir herramientas pequeñas y bien definidas que se puedan combinar para resolver problemas más complejos. Al aprender C y el shell Bash, he descubierto que este es un concepto poderoso que se puede utilizar para tratar una amplia gama de problemas de programación.

Simplemente usando una plataforma Linux, el concepto es bastante claro y se usa todo el tiempo. Cualquier expresión formada en la línea de comando que redirige las E / S, vinculando herramientas del sistema como ls, grep, más, etc., muestra cuán poderoso es este concepto.

Lo que me confunde es que muchos de estos programas están escritos en C, usando un estilo de programación imperativo / procesal, sin embargo, la forma en que se usan y se unen en la línea de comandos me parece mucho más una programación funcional, donde cada programa es Una función aislada que no depende del estado de ningún otro programa al que se pueda unir.

¿Es esto correcto, comprender la filosofía de programación de UNIX es básicamente una programación funcional que utiliza herramientas que pueden haber sido construidas usando un estilo de programación imperativo?

dvanaria
fuente
55
No creo que sea importante si esa analogía es precisa o no. La pregunta es, ¿es una analogía útil para usted? ¿Pensarlo en esos términos te ayuda a escribir programas y hacer el trabajo?

Respuestas:

19

Creo que tienes razón en eso, pero cp, rm, cdy muchos otros de cambio de estado, por lo que en realidad no son funciones. La filosofía de UNIX es más sobre hacer una sola cosa pero hacerlo bien; a menudo hacerlo bien significa permitir el uso funcional, pero no siempre.

dancek
fuente
9

La respuesta está en la "programación de shell Monadic I / O y UNIX" de Oleg Kiselyov.

Este es un ensayo inspirado en el artículo de Philip Wadler "Cómo declarar un imperativo" [ Wadler97 ]. Mostraremos asombrosas similitudes entre la E / S monádica en Haskell y las composiciones de filtro UNIX basadas en tuberías y redirecciones. Las canalizaciones UNIX (tratadas semánticamente como escritura en archivos temporales) son bastante similares a las mónadas. Además, a nivel de programación UNIX, todas las E / S pueden considerarse monádicas ...

horsh
fuente
6

Bueno, supongo que puedes mirarlo de esa manera si ignoras todo el problema de los efectos secundarios. Los comandos de Unix con frecuencia NO actúan en función de devolver siempre el mismo conjunto de datos con las mismas entradas. Sin embargo, como mencionó, el aspecto de las tuberías es similar a cómo se puede realizar la programación funcional.

Brian Knoblauch
fuente
1
¿Realmente tienes un avión? ;) (perdón por el comentario fuera del tema)
BlackBear
@BlackBear No es el mío personal. Estoy en un club donde unos 50 de nosotros colectivamente poseemos 4 aviones. Es un poco más asequible de esa manera. :-)
Brian Knoblauch
@Brian Knoblauch: Me gustaría tener un avión en el futuro ... si el dinero lo permite: P
BlackBear
55
La programación funcional no implica "sin efectos secundarios". El concepto donde la misma función siempre produce el mismo resultado se llama "idempotencia" y no es una condición necesaria para que un programa sea funcional. Esto también se conoce como "puramente funcional".
2

Hasta cierto punto puedes decir eso. Pero eso no es necesariamente cierto. Creo que deberías leer eso más como 'capacidad para lograr más' con un enfoque de diseño simplista. Y para ser simple, tendrá que dividir la tarea en partes fácilmente comprensibles y fáciles de ensamblar. La filosofía de UNIX para ser sincero con usted puede explicarse con el siguiente ejemplo.

¡Toda la programación es una especie de manipulación de datos! Y en algunos casos, la programación también es manipulación del programa en sí (Meta programación). Ahora, la forma en que funciona la filosofía UNIX es: Imagine procesar texto. ¿Qué es el texto? El texto es algún tipo de datos después de todo. Cuando se ensambla en definición organizada, el texto también se convierte en XML y JSON. El texto también puede ser una lista de números, el texto también puede ser csv, tsv y ¡qué no! En otro texto o cadena puede representar un área realmente enorme de datos de programación, ¡solo porque su contexto puede torcerse y convertirse en lo que queremos!

Toda la programación requiere la organización de datos de algún tipo. Organizar requiere buscar ...

a. Ahí vas con solo tener 'grep', 'fgrep' y su familia para hacer eso.

Una vez que realice la búsqueda, debe hacer una clasificación.

si. Ahora tenemos el comando 'ordenar' para hacer eso.

Acaba de ordenar dos archivos, ahora desea compararlos.

do. Ahora tenemos 'diff', 'cmp' y otros para hacer eso.

Acabas de descubrir que no hay diferencia entre los archivos. Necesita más datos organizados ahora.

re. Tiene operadores de 'gato', tuberías y redireccionamiento para escribir en un archivo.

Necesita un análisis más específico.

mi. Tienes cabeza, cola, más, menos, corta y más para hacer eso ...

Todo esto cose juntos usando el '|' para generar cosas realmente poderosas en algún momento sin escribir ningún código en absoluto. Para más búsquedas y costura tienes ...

F. awk, concha y sed.

awk, shell y sed le dan más control sobre el texto que lo que puede cortar, diff et al. ¿Alguna vez te has preguntado ese comando1 | comando2 | command3 ... series es una especie de mecanismo de flujo de trabajo. Cuando se combina con If, esto se vuelve más poderoso.

Ahora viene más divertido.

¿Alguna vez has oído hablar de una utilidad llamada 'Perl'? Esta cosa es tan poderosa que prácticamente puedes hacer cualquier tarea con tan poco trabajo imaginable. Cosido junto con una utilidad como DBM, puede hacer incluso pequeñas demandas de persistencia para su aplicación. Recuerde que ni siquiera hemos salido del mundo del texto, pero hemos logrado cubrir la mayoría de los aspectos de un entorno de programación.

Así que creo que UNIX es más que un sistema operativo. Es una colección de herramientas y entornos diseñados para resolver los problemas de la manera más simple. Una forma simple no necesariamente implica simplicidad de implementación de la solución. Pero la simplicidad en sí no te lleva muy lejos.

Leí esto en algún lugar de reddit.

"Si su único objetivo de diseño es la simplicidad, obtendrá tantos usuarios como Plan9"

kamaal
fuente
1

La forma en que se unen en la línea de comandos e interactúan entre sí es muy funcional. Sin embargo, diría que esto tiene más que ver con el diseño del shell, y menos que ver con si esos programas subyacentes están escritos de manera imperativa o funcional. La mayoría de los buenos lenguajes funcionales admiten conceptos imperativos / de procedimiento, a pesar de que su diseño general se presta a la programación funcional. Sí, muchas de las características de shell de UNIX emplean conceptos funcionales, pero, una vez más, esto se debe más al diseño del shell que a la implementación particular de los programas subyacentes.

Espero que esto ayude,

-tjw

Travis Webb
fuente