Quanto sono intelligenti le utility unix?


8

Le utility Unix come sort, find, grep, diff et al sono molto utili per eseguire operazioni rapide, a volte senza scrivere alcun codice.

Volevo sapere quali algoritmi usano internamente e come decidere in modo intelligente un algoritmo specifico per un compito specifico? Ad esempio, se l'ordinamento ottiene un enorme file di input, utilizzerà algoritmi diversi per dimensioni di dati diverse?

Grep commuta in modo intelligente algoritmi durante la ricerca di diversi set di dati?


4
Sono così intelligenti che un giorno conquisteranno la Terra. Ma per ora si deve decidere quali quelli che si intende utilizzare, come ad esempio grep, egrepo fgrep.
Keith,

1
Ma se usi egrep regolarmente e poi passi all'improvviso a fgrep, potrebbe decidere di ucciderti nel sonno per essere infedele.
Shadur,

1
Sono intelligenti come le mani che le impugnano.
luis.espinal,

Risposte:


7

Unix è solo uno standard, specifica cosa dovrebbero fare le implementazioni, ma non come dovrebbero farlo.

Pertanto le implementazioni di grep / sort / find useranno molto probabilmente approcci diversi su sistemi diversi (e persino un sistema, come Linux, ci sono implementazioni simultanee).

Per Linux, puoi sempre esaminare il codice sorgente.


2
Per completare la risposta: gnu.org/software/coreutils
sahid

Perché dovresti guardare il codice sorgente? Gli algoritmi greps sono ben noti e documentati. È anche nella pagina di Wikipedia per grep. link
Account eliminato

@Deleted Penso che stai confondendo i principi con l'implementazione.
Šimon Tóth

@Let_Me_Be: l'algoritmo e persino l'implementazione sono ben noti e documentati. link link
Account eliminato

@Deleted Forse non capisco cosa stai cercando di dire, ma che grep Linux da coreutils sta usando un algoritmo specifico, non significa che tutte le implementazioni utilizzino questo algoritmo. E sì, hai ragione nel dire che gli algoritmi tendono ad essere ben noti (poiché è questo il punto di progettarli).
Šimon Tóth


1

Lo standard UNIX non specifica i dettagli di implementazione per gli strumenti di sistema standard, ad eccezione di casi davvero rari. Puoi trovare l'ultima versione della specifica Single Unix qui (avviso: è richiesta la registrazione).

Tenendo presente ciò, ogni UNIX (Sistema V e discendenti diretti come BSD, Solaris, Mac OS X, ecc.) O Sistema operativo basato su UNIX (lontani discendenti o simili: Linux, Minix) ha le sue implementazioni delle utilità descritte in la specifica UNIX. Per es. dai un'occhiata a FreeBSD e Linux / GNU Coreutils . Attenzione che alcuni strumenti sono separati da un intero progetto, come GNU diff o GNU grep . Un altro fatto è che alcune implementazioni di questi strumenti potrebbero trovare la loro strada in altri sistemi simili a UNIX come standard rispetto a quelli per cui sono stati inizialmente scritti, ad esempio alcuni coreutils di gnu in freebsd o GCC.

Bonus: per avvolgere la testa intorno all'albero genealogico UNIX, dai un'occhiata a questo grafico .


0

Volevo sapere quali algoritmi usano internamente e come decidere in modo intelligente un algoritmo specifico per un compito specifico? Ad esempio, se l'ordinamento ottiene un enorme file di input, utilizzerà algoritmi diversi per dimensioni di dati diverse?

Questa è una domanda interessante (+1 per quello). Non ho idea di quale sia la risposta, ma se fossi in te, guarderei il codice sorgente delle tipiche utility GNU per avere un'idea dei loro algoritmi.

Grep commuta in modo intelligente algoritmi durante la ricerca di diversi set di dati?

Io non la penso così. Non citarmi perché non posso dirtelo con certezza al 100%, ma non credo proprio. La filosofia delle cose UNIX è che una cosa fa una cosa e una sola cosa. Ecco perché abbiamo diverse versioni di grep ( grep, egrep, fgrep).

Inoltre, l'idea è di fare una cosa e solo una cosa in fase di esecuzione. Diversi comportamenti e algoritmi possono essere configurati come argomenti della riga di comando, in modo che lo stesso programma possa agire in modo leggermente diverso (e forse leggermente più ottimizzato) tra le esecuzioni. Buoni esempi sono il comando wce diff.

Tuttavia, l'adattamento comportamentale è basato sulla configurazione (tramite argomenti della riga cmd); non cambiano / adattano il comportamento in fase di esecuzione. È in genere una complessità non necessaria per il tipo di artefatti che gli strumenti UNIX mirano a essere.

Tale complessità è più appropriata degli strumenti IMO più complessi e meno generici.


2
Il tema qui è più di No, in realtà sono stupidi! . Devi dire loro esattamente cosa deve fare. Ad ogni modo, non vogliamo che siano troppo intelligenti con noi, sai.
Tshepang,

0

Grep commuta in modo intelligente algoritmi durante la ricerca di diversi set di dati?

Non credo, ma passa all'algoritmo "RE" non veloce quando viene dato il flag -f (o invocato come fgrep).


cioè non molto intelligente :)
tshepang
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.