UNIX哲学のプログラミングは、関数型プログラミングと同じですか?


30

UNIXプログラミング環境(古典的なテキスト)は、プログラミングに対するUNIXのアプローチは、より複雑な問題を解決するために組み合わせることができる、小さく明確に定義されたツールを構築することであると述べています。CとBashシェルを学習する中で、これは広範なプログラミングの問題に対処するために使用できる強力な概念であることがわかりました。

Linuxプラットフォームを使用するだけで、コンセプトは非常に明確であり、常に使用されています。I / Oをリダイレクトし、ls、grepなどのシステムツールをリンクするコマンドラインで形成される式は、この概念がいかに強力かを示しています。

私を混乱させているのは、これらのプログラムの多くが命令型/手続き型プログラミングスタイルを使用してCで書かれていることですが、コマンドラインでの使用方法と結合方法は、各プログラムが機能的なプログラミングに似ているようです結合される可能性のある他のプログラムの状態に依存しない孤立した関数。

これは正確であり、UNIXプログラミングの哲学を理解することは、基本的に命令型プログラミングスタイルを使用して構築されたツールを使用した機能プログラミングです。


5
その類推が正確であるかどうかは重要ではないと思います。問題は、それはあなたにとって有用な類似物ですか?それらの用語でそれを考えることは、プログラムを書いて仕事を終わらせるのに役立ちますか?

回答:


19

私はあなたがそこにポイントを持っていると思うが、cprmcd彼らは本当に機能していないので、他のロットは、状態を変更します。UNIXの哲学は、1つのことだけを行うことですが、それをうまく行うことです。多くの場合、それをうまく行うことは、機能的な使用を許可することを意味しますが、常にではありません。


9

答えは、Oleg Kiselyovによる「モナディックI / OおよびUNIXシェルプログラミング」です。

これは、フィリップワドラーの論文「命令を宣言する方法」[ Wadler97 ]に触発されたエッセイです。HaskellのモナドI / Oと、パイプとリダイレクトに基づいたUNIXフィルター構成との不思議な類似性を示します。UNIXパイプ(一時ファイルへの書き込みとして意味的に処理される)は、モナドに非常に似ています。さらに、UNIXプログラミングのレベルでは、すべてのI / Oはモナドと見なすことができます...


6

副作用の問題をすべて無視すれば、そのように見ることができると思います。Unixコマンドは、同じ入力で同じデータセットを常に返すという点で、機能しないことがよくあります。ただし、あなたが述べたように、パイピングの側面は、関数型プログラミングの実行方法に似ています。


1
あなたは本当に飛行機を持っていますか?;)(オフトピックのコメントでごめんなさい)
BlackBear

@BlackBear私の個人的なものではありません。私は約50人が4機の飛行機を所有しているクラブにいます。そのほうがもう少し手頃です。:-)
ブライアンノブラウチ

@Brian Knoblauch:私は将来的に飛行機を持っているしたいのですが...お金が許せ:Pを
BlackBear

5
関数型プログラミングは「副作用なし」を意味するものではありません。同じ関数が常に同じ結果を生成する概念は「べき等性」と呼ばれ、プログラムが機能するための必要条件ではありません。これは「純粋な機能」とも呼ばれます。

2

ある程度まであなたはそれを言うことができます。しかし、それは必ずしも真実ではありません。単純な設計アプローチで「もっと達成する能力」としてそれを読むべきだと思います。そして、シンプルにするためには、タスクを理解しやすく組み立てやすい部品に分割する必要があります。率直に言うUNIXの哲学は、次の例で説明できます。

すべてのプログラミングは、何らかのデータ操作です!また、場合によっては、プログラミングはプログラム操作そのもの(メタプログラミング)でもあります。UNIXの哲学は、テキストを処理することを想像してください。テキストとは何ですか?結局のところ、テキストは何らかのデータです。組織化された定義にアセンブルすると、テキストはXMLおよびJSONにもなります。テキストは数字のリストにすることもできます。テキストはcsv、tsv、その他にもできます。他のテキストまたは文字列は、コンテキストがねじれ、私たちが望むものに変わる可能性があるという理由だけで、プログラミングデータの本当に巨大な領域を表すことができます!

すべてのプログラミングには、何らかのデータ編成が必要です。整理するには検索が必要です...

a。そこには、「grep」、「fgrep」、およびそのファミリーがあります。

検索したら、いくつかのソートを行う必要があります。

b。これを行うための「ソート」コマンドがあります。

2つのファイルを並べ替えたので、それらを比較します。

c。これで、「diff」、「cmp」などができました。

ファイル間に違いがないことがわかりました。より多くの整理されたデータが必要になりました。

d。ファイルに書き込むための「cat」、パイプ、およびリダイレクト演算子があります。

より具体的な解析が必要です。

e。あなたはそれを行うために、頭、尾、より多く、より少ない、カットなどを持っています...

このすべては、「|」を使用して縫い合わせます コードをまったく作成せずに、いつか本当の強力なものを生成します。より多くの検索と縫製については、..

f。awk、shell、sed。

awk、shell、sedを使用すると、切り取りよりもテキストをより詳細に制御できます。diffなどを使用すると便利です。あなたは今までそのcommand1 | command2 | command3 ...シリーズは、一種のワークフローメカニズムです。Ifと組み合わせると、これはより強力になります。

今、もっと楽しくなります。

「Perl」と呼ばれるユーティリティを聞いたことがありますか?このことは非常に強力で、想像できるほどの少ない作業で、手元のタスクを事実上実行できます。DBMのようなユーティリティと一緒に縫製することで、ご使用のアプリケーションにわずかな時間の持続要求を行うことができます。私たちはテキストの世界から一歩も下がっていませんが、プログラミング環境のほとんどの側面をカバーできていることを忘れないでください。

したがって、UNIXはオペレーティングシステム以上のものだと思います。最も簡単な方法で問題を解決するために設計されたツールと環境のコレクション。単純な方法は、必ずしもソリューションの実装の単純さを意味するものではありません。しかし、シンプルさ自体はそれほど大きなものではありません。

私はこれをredditのどこかで読みました。

「あなたの唯一の設計目標がシンプルである場合、Plan9と同じ数のユーザーを獲得できます」


1

コマンドラインでそれらを結合し、相互にやり取りする方法は非常に機能的です。ただし、これはシェルの設計に関係するものであり、それらの基礎となるプログラムが命令的または機能的に書かれているかどうかには関係ないと思います。優れた関数型言語のほとんどは、全体的な設計が関数型プログラミングに適しているにもかかわらず、命令型/手続き型の概念をサポートしています。はい、多くのUNIXシェル機能は機能的な概念を採用していますが、これもまた、基礎となるプログラムの特定の実装よりもシェルの設計によるものです。

お役に立てれば、

-tjw

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.