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?
text-processing
grep
sort
coreutils
kamaal
fuente
fuente
grep
,egrep
ofgrep
.Respuestas:
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.
fuente
Puede que le interese esta publicación de la lista de correo del autor original de GNU grep que explica algunas de las optimizaciones de GNU grep. Otra exploración agradable por ridiculous_fish (autor de Hex Fiend)
fuente
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 .
fuente
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.
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
wc
ydiff
.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.
fuente
No lo creo, pero cambia al algoritmo "rápido" no RE cuando se le da el indicador -f (o se invoca como fgrep).
fuente