🗣️

PowerShell と bash ~オブジェクト指向とテキスト指向?~

2023/06/03に公開

PowerShellはオブジェクト指向である

コマンドレットは従来のコマンドのようにテキストデータを出力するのではなく、.Net Frameworkの「オブジェクト」を出力します。
---『Windows PowerShell ポケットリファレンス』Part 1「PowerShellの基礎」

PowerShellはオブジェクトを出力します。一方で「従来のコマンド」と言っているのは、おおむね、UNIXのシェルと考えて良いでしょう。さしあたり、bashをイメージすれば十分です。

たしかに、UNIXのシェルが入出力するのはテキストです。

UNIXシェルはテキスト指向(?)である

ASCIIテキストは、最良の形式ではないまでも、間違いなく最も一般的な形式だ。
---『UNIXという考え方』「ASCIIテキストは共通の交換形式だ」

ASCIIテキストファイルの真の力を実感できるのは、UNIX上でパイプを使ったプログラムを開発するときだ。パイプとは、一時的なファイルを使わずに、あるプログラムの出力を直接別のプログラムへの入力として使うメカニズムのことを言う。
---『UNIXという考え方』「ASCIIテキストは簡単に読めて編集できる」

『UNIXという考え方』にある通り、UNIXのシェルはあえてテキストにこだわります。UNIXのシェルに用意された小さなコマンドたちは、テキストを入力する。そして、テキストを出力する。ここに特別な形式を与えないことであらゆる組み合わせを可能にしているわけです。

コマンドとコマンドをパイプで連絡するという考え方は、PowerShellも同様です。違うのは、オブジェクトテキストか、というところです。

UNIXシェルとPowerShellのユーザーインターフェース

Apple社のMacOSは、高度に視覚に訴えるオブジェクト指向ユーザーインターフェースを持ち、「ほら、あなたのすぐ目の前に」というキャッチフレーズと共に登場した。〔…〕UNIXの創造者たちは、ある極端なコンセプトから始めた。ユーザーは初めからコンピュータを使えるとみなしたのだ。UNIXは「ユーザーは、自分が何をしているかを分かっている」との前提に立っている。他のオペレーティングシステムの設計者が、初心者から専門家まで幅広いユーザーを受け入れようとしているとき、UNIXの設計者たちは「何をしているのか分からないなら、ここにいるべきではない」という不親切きわまりないアプローチを選んだ。
『UNIXという考え方』「イントロダクション」

オブジェクトとテキストの違いはユーザーインターフェースにおいて現れます。UNIXのシェルは入出力がテキストですので、しばしば暗号的なものになります。たとえば、『UNIXという考え方』には、次のようなコマンドが例にあります。

echo `who | awk "{print $1}" | sort | uniq` | sed "s/ /,/g"

ここで注目してほしいのはawksedです。このコマンドはテキストのある特定の一部分を抽出したり、置換したりするコマンドです。

もし、PowerShellであれば出力されるのはオブジェクトですので、オブジェクトの一部分を抽出したいときはプロパティを指定することになります。たとえば、

Get-Item -Path .\* | Where-Object {$_.LastWriteTime.Date.Year -eq 2023} | Select-Object Name, LastWriteTime

というコマンドの組み合わせが考えられます。Get-ItemSystem.IO.FileInfoオブジェクトを出力します。このオブジェクトにはプロパティNameLastWriteTimeがあります。

まるでSQLのようにWhere-Objectで出力したいオブジェクトを絞り込み、Select-Objectで出力したいプロパティを限定できます。

オブジェクト指向とユーザーインターフェース

オブジェクト指向デザインへの移行は、真の視点の変化――パラダイムの転換を意味し、表現能力の大いなる増大をもたらす
---アラン・ケイ「コンピュータ・ソフトウェア」

「ユーザー・インターフェース」を通して、私たちはコンピュータの「粘土」に触ることができる。〔…〕何らかの方法でこのイメージを操作すると、(ユーザーがイメージするにしたがって)システムの状態に、何か予想可能な変更が加えられることになる。近年流行のイリュージョンに「ウィンドウ」「メニュー」「アイコン」「ポインティング・デバイス」と呼ばれるものがある。〔…〕こうしたことすべてが、ユーザーのイリュージョンを利用する新世代の対話型ソフトウェアの台頭をうながすことになった
---同前

オブジェクト指向は「イメージ」あるいは「イリュージョン」と結びつきます。まるで「粘土」を触るようにコンピューターを操作する。オブジェクト指向にはこのような理念があります。

スモール・イズ・ビューティフル

とはいえ、あくまで「イリュージョン」です。そこには巨大な舞台装置が必要になります。文字通りの粘土ではなく、粘土のイリュージョンを与える。

しばしば、オブジェクト指向と結びつくプログラムは巨大になります。たとえば、スプレッドシート。

スプレッドシートは、同時に活動しているオブジェクトの集まりで、通常は、会計士が使う罫線紙と同様の、四角形のセルを配列した形式になっている。〔…〕スプレッドシートではユーザーのイリュージョンは、単純にして直接的かつ強力なものだ。
---アラン・ケイ「コンピュータ・ソフトウェア」

私たちはテキストファイルに比べてスプレッドシートが巨大になりがちなことを知っていると思います。ましてやパイプでコマンドと連絡しやすいような交換形式ではない。しかし、まさに「イリュージョン」を与えている。つまり、多くの人たちに広がっています。

しかし、『UNIXという考え方』とは違う考え方です。

伝統的なプログラマは、巨大なアメリカンプログラムを書きたいという欲求をうちに秘めていることが多い。このようなプログラマがプロジェクトに携わると、数週間、数か月、あるいは数年かけても、世界中のすべての問題を一つのプログラムで解決しようとする。コスト的にビジネスに見合わないだけではなく、何よりも彼らは現実を無視している。
---『UNIXという考え方』「定理1:スモール・イズ・ビューティフル」

PowerShellのコマンドレット

素朴に見れば、対立する二つの考え方ですが、PowerShellはこの両者の中間的なものです。PowerShellは「粘土」ほど直観的ではありません。しかし、テキストほど「不親切」でもない。

UNIXのシェルには、しばしばそれを好むように暗号解読的です。

アルファベットの小文字を使うのがUNIXの伝統だ。〔…〕UNIXユーザーが暗号のような小文字のコマンド名を好むのは、誰かに強制されているわけではなく、自分がそうしたいからだ
---『UNIXという考え方』「小文字を使い、短く」

UNIXシェルの特徴的なコマンド(「小文字を使い、短く」)は歴史的ないきさつがあるとはいえ、カルチャーとして定着をしています。しかし、PowerShellはこのカルチャーには従いません。

「動詞-名詞」という統一された命名規則、統一された実行方法を持っているのが特徴で、何個か使い方を覚えておくと他に応用が利き、同種のコマンドの存在を予測しやすいといった効用があります」
---『Windows PowerShell ポケットリファレンス』Part 1「PowerShellの基礎」

たとえば、Where-ObjectSelect-Object のように、必ず「動詞-名詞」という形式になります。UNIXユーザーにとっては、カルチャー的な理由からこのような命名に抵抗がある場合もあるでしょう。そのため、PowerShellが用意するエイリアスを好んで利用するPowerShellユーザーも多いともいます。

PowerShellのエイリアスにcdpwdがあります。これらはSet-LocationGet-Locationの別名です。たしかに、前者の方が後者よりも暗号です。

参考

Qiitaでは「なぜPowerShellはテキストではなくオブジェクトを出力するのか」という記事を書きました。

こちらでは、PowerShellとUNIXシェル(bash)で実行例を比較もしています。合わせて読んでいただければと思います。

また、引用元はこちらの文献になります。

  • 『UNIXという考え方』(amazon
  • 『Windows PowerShell ポケットリファレンス』(amazon
  • 『アラン・ケイ』amazon
GitHubで編集を提案

Discussion