sort、find、grep、diffなどのUnixユーティリティは、コードをまったく記述しなくても、すばやくタスクを実行するのに非常に便利です。
彼らが内部で使用しているアルゴリズムと、特定のタスクの特定のアルゴリズムをインテリジェントに決定する方法を知りたいのですが?たとえば、sortが巨大な入力ファイルを取得する場合、データサイズごとに異なるアルゴリズムを使用しますか?
grepは、さまざまなデータセットを検索しながらアルゴリズムをインテリジェントに切り替えますか?
sort、find、grep、diffなどのUnixユーティリティは、コードをまったく記述しなくても、すばやくタスクを実行するのに非常に便利です。
彼らが内部で使用しているアルゴリズムと、特定のタスクの特定のアルゴリズムをインテリジェントに決定する方法を知りたいのですが?たとえば、sortが巨大な入力ファイルを取得する場合、データサイズごとに異なるアルゴリズムを使用しますか?
grepは、さまざまなデータセットを検索しながらアルゴリズムをインテリジェントに切り替えますか?
回答:
Unixは単なる標準であり、実装が行うべきことを指定しますが、どのように行うべきかを指定しません。
したがって、grep / sort / findの実装は、異なるシステム(およびLinuxのような1つのシステムでも、同時実装があります)で異なるアプローチを使用する可能性があります。
Linuxの場合、いつでもソースコードを調べることができます。
GNU grep最適化のいくつかを説明している、元のGNU grep作者によるこのメーリングリストの投稿に興味があるかもしれません。ridiculous_fish(Hex Fiendの作者)によるもう1つの楽しい探索
UNIX標準では、本当にまれなケースを除いて、標準システムツールの実装の詳細を指定していません。最新のシングルUnix仕様のバージョンはここにあります(警告:登録が必要です)。
そのことを念頭に置いて、すべてのUNIX(System VおよびBSD、Solaris、Mac OS Xなどの直接の子孫)またはUNIXベースのオペレーティングシステム(遠い子孫など:Linux、Minix)には、 UNIX仕様。たとえば FreeBSDとLinux / GNU Coreutilsを見てください。一部のツールは、GNU diffやGNU grepのように、それ自体が独立したプロジェクト全体であることに注意してください。また、これらのツールの一部の実装は、他のUNIXのようなシステムに標準として組み込まれている可能性があります。たとえば、freebsdまたはGCCの一部のgnu coreutilsなどです。
おまけ:UNIXファミリーツリーに頭を抱えるには、このグラフを見てください。
彼らが内部で使用しているアルゴリズムと、特定のタスクの特定のアルゴリズムをインテリジェントに決定する方法を知りたいのですが?たとえば、sortが巨大な入力ファイルを取得する場合、データサイズごとに異なるアルゴリズムを使用しますか?
それは興味深い質問です(そのための+1)。私は答えが何であるかについての手がかりはありませんが、もし私があなただったら、典型的なGNUユーティリティのソースコードを見て、それらのアルゴリズムのアイデアを取得します。
grepは、さまざまなデータセットを検索しながらアルゴリズムをインテリジェントに切り替えますか?
私はそうは思いません。100%確実にあなたに言うことができないので私を引用しないでください、しかし私は本当にそうは思いません。UNIXの考え方は、1つのことは1つのことと1つのことだけを行うということです。我々はgrepの複数のバージョンを持っている理由です(grep
、egrep
、fgrep
)。
また、アイデアは実行時に1つのことだけを行うことです。異なる動作とアルゴリズムをコマンドライン引数として構成できるため、同じプログラムが実行間でわずかに異なる(場合によっては、より最適化された)動作をすることができます。良い例はwc
and diff
コマンドです。
ただし、動作の適応は構成ベースです(コマンドライン引数を使用)。実行時に動作を変更/適応しません。これは通常、UNIXツールが目指すアーティファクトのタイプにとっては不必要な複雑さです。
このような複雑さは、より複雑で汎用性の低いツールIMOに適しています。
grep
、egrep
またはfgrep
。