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?
fuente
Respuestas:
Creo que tienes razón en eso, pero
cp
,rm
,cd
y 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.fuente
La respuesta está en la "programación de shell Monadic I / O y UNIX" de Oleg Kiselyov.
fuente
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.
fuente
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"
fuente
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
fuente