UNIXユーティリティはどの程度インテリジェントですか?


8

sort、find、grep、diffなどのUnixユーティリティは、コードをまったく記述しなくても、すばやくタスクを実行するのに非常に便利です。

彼らが内部で使用しているアルゴリズムと、特定のタスクの特定のアルゴリズムをインテリジェントに決定する方法を知りたいのですが?たとえば、sortが巨大な入力ファイルを取得する場合、データサイズごとに異なるアルゴリズムを使用しますか?

grepは、さまざまなデータセットを検索しながらアルゴリズムをインテリジェントに切り替えますか?


4
彼らはとても賢く、いつか地球を占領するでしょう。しかし、今のところ次のような、あなたが使用しようとしているものを決定する必要がありgrepegrepまたはfgrep
キース

1
しかし、egrepを定期的に使用していて、突然fgrepに切り替えた場合、不誠実であるために眠っているときにあなたを殺そうとするかもしれません。
Shadur 2011年

1
彼らはそれらを振るう手と同じくらいインテリジェントです。
luis.espinal 2011年

回答:


7

Unixは単なる標準であり、実装が行うべきことを指定しますが、どのように行うべきかを指定しません。

したがって、grep / sort / findの実装は、異なるシステム(およびLinuxのような1つのシステムでも、同時実装があります)で異なるアプローチを使用する可能性があります。

Linuxの場合、いつでもソースコードを調べることができます。


2
回答を完了するには:gnu.org/software/coreutils
sahid

なぜソースコードを見る必要があるのですか?grepsアルゴリズムはよく知られており、文書化されています。それはgrepのWikipediaページにもあります。リンク
削除されたアカウント

@削除あなたは実装の原則を誤解していると思います。
サイモン・トス

@Let_Me_Be:アルゴリズムと実装さえもよく知られ、文書化されています。link link
削除されたアカウント

@削除たぶん私はあなたが言っていることを理解していないかもしれませんが、coreutilsからのLinux grepが特定のアルゴリズムを使用しているということは、すべての実装がこのアルゴリズムを使用しているという意味ではありません。そして、はい、あなたはアルゴリズムがよく知られている傾向があるという点で正しいです(それがアルゴリズムを設計するポイントだからです)。
サイモン・トス


1

UNIX標準では、本当にまれなケースを除いて、標準システムツールの実装の詳細を指定していません。最新のシングルUnix仕様のバージョンはここにあります(警告:登録が必要です)。

そのことを念頭に置いて、すべてのUNIX(System VおよびBSD、Solaris、Mac OS Xなどの直接の子孫)またはUNIXベースのオペレーティングシステム(遠い子孫など:Linux、Minix)には、 UNIX仕様。たとえば FreeBSDLinux / GNU Coreutilsを見てください。一部のツールは、GNU diffGNU grepのように、それ自体が独立したプロジェクト全体であることに注意してください。また、これらのツールの一部の実装は、他のUNIXのようなシステムに標準として組み込まれている可能性があります。たとえば、freebsdまたはGCCの一部のgnu coreutilsなどです。

おまけ:UNIXファミリーツリーに頭を抱えるには、このグラフを見てください。


0

彼らが内部で使用しているアルゴリズムと、特定のタスクの特定のアルゴリズムをインテリジェントに決定する方法を知りたいのですが?たとえば、sortが巨大な入力ファイルを取得する場合、データサイズごとに異なるアルゴリズムを使用しますか?

それは興味深い質問です(そのための+1)。私は答えが何であるかについての手がかりはありませんが、もし私があなただったら、典型的なGNUユーティリティのソースコードを見て、それらのアルゴリズムのアイデアを取得します。

grepは、さまざまなデータセットを検索しながらアルゴリズムをインテリジェントに切り替えますか?

私はそうは思いません。100%確実にあなたに言うことができないので私を引用しないでください、しかし私は本当にそうは思いません。UNIXの考え方は、1つのことは1つのことと1つのことだけを行うということです。我々はgrepの複数のバージョンを持っている理由です(grepegrepfgrep)。

また、アイデアは実行時に1つのことだけを行うことです。異なる動作とアルゴリズムをコマンドライン引数として構成できるため、同じプログラムが実行間でわずかに異なる(場合によっては、より最適化された)動作をすることができます。良い例はwcand diffコマンドです。

ただし、動作の適応は構成ベースです(コマンドライン引数を使用)。実行時に動作を変更/適応しません。これは通常、UNIXツールが目指すアーティファクトのタイプにとっては不必要な複雑さです。

このような複雑さは、より複雑で汎用性の低いツールIMOに適しています。


2
ここのテーマは、いや、いや、彼らは実際にはばかげています!。あなたは彼らがしなければならないことを正確に彼らに伝えなければなりません。とにかく、私たちがあなたが知っている私たちにあまりにもスマートになりたくないのです。
tshepang 2011年

0

grepは、さまざまなデータセットを検索しながらアルゴリズムをインテリジェントに切り替えますか?

私はそうは思いませんが、-fフラグが指定された場合(またはfgrepとして呼び出された場合)は、「高速な」非REアルゴリズムに切り替わります。


つまり、それほどインテリジェントではありません:)
tshepang
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.