¿Qué tan inteligentes son las utilidades de Unix?

8

Las utilidades de Unix como sort, find, grep, diff y otros son muy útiles para realizar tareas rápidas, a veces sin escribir ningún código.

Quería saber qué algoritmos usan internamente y cómo deciden de manera inteligente un algoritmo específico para una tarea específica. Por ejemplo, si sort obtiene un gran archivo de entrada, ¿utilizará diferentes algoritmos para diferentes tamaños de datos?

¿Grep cambia de manera inteligente los algoritmos mientras busca diferentes conjuntos de datos?

kamaal
fuente
44
Son tan inteligentes que algún día se harán cargo de la Tierra. Pero por ahora tiene que decidir cuáles se va a utilizar, como por ejemplo grep, egrepo fgrep.
Keith
1
Pero si usa egrep regularmente y luego cambia repentinamente a fgrep, podría decidir matarlo mientras duerme por ser infiel.
Shadur
1
Son tan inteligentes como las manos que los manejan.
luis.espinal

Respuestas:

7

Unix es solo un estándar, especifica lo que deberían hacer las implementaciones, pero no cómo deberían hacerlo.

Por lo tanto, las implementaciones de grep / sort / find probablemente utilizarán diferentes enfoques en diferentes sistemas (e incluso en un sistema, como Linux, hay implementaciones concurrentes).

Para Linux, siempre puede consultar el código fuente.

Šimon Tóth
fuente
2
Para completar su respuesta: gnu.org/software/coreutils
sahid
¿Por qué necesitarías mirar el código fuente? Los algoritmos greps son bien conocidos y documentados. Incluso está en la página de Wikipedia para grep. enlace
Cuenta eliminada el
@Eliminado Creo que está confundiendo los principios con la implementación.
Šimon Tóth
@Let_Me_Be: El algoritmo e incluso la implementación es bien conocido y documentado. link link
Cuenta eliminada el
@Eliminado Tal vez no entiendo lo que intenta decir, pero que grep de Linux de coreutils está usando un algoritmo específico, no significa que todas las implementaciones usen este algoritmo. Y sí, tiene razón en que los algoritmos tienden a ser bien conocidos (ya que ese es el punto de diseñarlos).
Šimon Tóth
1

El estándar UNIX no especifica detalles de implementación para las herramientas del sistema estándar, excepto en casos realmente raros. Puede encontrar la última versión de la especificación Single Unix aquí (advertencia: es necesario registrarse).

Con eso en mente, cada UNIX (Sistema V y descendientes directos como BSD, Solaris, Mac OS X, etc.) o el Sistema Operativo basado en UNIX (descendientes lejanos o similares: Linux, Minix) tiene sus propias implementaciones de las utilidades descritas en La especificación UNIX. Por ej. Eche un vistazo a los Coreutils de FreeBSD y Linux / GNU . Tenga en cuenta que algunas herramientas son proyectos completos separados por sí mismos como GNU diff o GNU grep . También otro hecho es que algunas implementaciones de estas herramientas pueden encontrar su camino en otros sistemas similares a UNIX de manera estándar, para las que fueron escritas inicialmente, por ejemplo, para algunos gnu coreutils en freebsd o GCC.

Bonificación: para comprender el árbol genealógico de UNIX, eche un vistazo a este gráfico .

Shinnok
fuente
0

Quería saber qué algoritmos utilizan internamente y cómo deciden de manera inteligente un algoritmo específico para una tarea específica. Por ejemplo, si sort obtiene un gran archivo de entrada, ¿utilizará diferentes algoritmos para diferentes tamaños de datos?

Esa es una pregunta interesante (+1 para eso). No tengo idea de cuál es la respuesta, pero si fuera usted, miraría el código fuente de las utilidades típicas de GNU para tener una idea de sus algoritmos.

¿Grep cambia de manera inteligente los algoritmos mientras busca diferentes conjuntos de datos?

No lo creo. No me cite ya que no puedo decirle con 100% de certeza, pero realmente no lo creo. La filosofía de las cosas de UNIX es que una cosa hace una y solo una. Por eso es que tenemos varias versiones de grep ( grep, egrep, fgrep).

Además, la idea es hacer una cosa y solo una cosa en tiempo de ejecución. Se pueden configurar diferentes comportamientos y algoritmos como argumentos de línea de comandos, de modo que el mismo programa pueda actuar de manera ligeramente diferente (y posiblemente un poco más optimizado) entre ejecuciones. Buenos ejemplos son el comando wcy diff.

Sin embargo, la adaptación de comportamiento se basa en la configuración (a través de argumentos de línea cmd); no cambian / adaptan el comportamiento en tiempo de ejecución. Por lo general, es una complejidad innecesaria para el tipo de artefactos que pretenden ser las herramientas UNIX.

Tal complejidad es más apropiada para las herramientas más complejas y menos generales de la OMI.

luis.espinal
fuente
2
El tema aquí es más de No, ¡en realidad son tontos! . Tienes que decirles exactamente lo que deben hacer. De todos modos, no queremos que sean demasiado inteligentes con nosotros.
tshepang
0

¿Grep cambia de manera inteligente los algoritmos mientras busca diferentes conjuntos de datos?

No lo creo, pero cambia al algoritmo "rápido" no RE cuando se le da el indicador -f (o se invoca como fgrep).

kmarsh
fuente
es decir, no es realmente inteligente :)
tshepang