マイクロソフトのOSは,MS-DOS 2.x以来,UNIXの影響が強いと言われるが,コマンド体系についてはDEC(デジタルイクイップメント社)の影響の方が強いように思う。今回は,コマンド体系の歴史についてトリビア的に触れてみたい。なお,VMS以前のOSについては私も直接触ったわけではないので,間違いがあれば指摘してほしい。

 MS-DOSが登場したとき,当時広く使われていたCP/Mとは全く異なるコマンド体系が採用された。CP/Mは,DECのRT-11(同社の16ビット・コンピュータPDP-11専用OS)の影響を強く受けていた。例えばファイル・コピーが「PIP 送り先=送り元」と代入文風になるのはRT-11と同じである。一方,MS-DOSは「copy 送り元 送り先」となり,こちらは同じDECのVMS(同じく32ビット・コンピュータVAX専用OS,後にAlphaやItaniumに移植される)のフォーマットである。オプション指定がスラッシュ(/)で始まることや,@が修飾詞ファイルを表すことも似ている(一般にはあまり使われていないが,コンパイラのスイッチに使用されている他,Windows NTのバックアップオプション指定にも使われた)。

 VMSのコマンド体系はDCL(Digital Command Language)と呼ばれ,洗練された構文を持つとされている。DCLにコマンドを追加する場合は,実行ファイルとは別に専用の形式言語(コマンド定義言語:CLD)でコマンドと修飾詞を記述し,OSに「インストール」する必要がある。この制約により,コマンド体系が崩れることはない。すべてのコマンドは最大4文字で区別され,他と区別できる限り任意の長さに短縮できる。例えば,Directoryコマンドはdirでもdireでも構わないが,differenceというコマンドがあるためdiに短縮することはできない。このような利便性の反面,CLDは複雑な上,システム特権がないとインストールできないという不便さもあった。さらに,コマンド本体は,現在のWindows Scripting Hostの引数解析のように,専用の関数を呼び出す必要があった。UNIXのシェルではargv[n]という簡単な方法が使えるがDCLでは使えない。

 CLDに準拠せず,単に実行ファイルを実行するだけなら「フォーリンコマンド」と呼ばれる外部コマンドを使うこともできた。これはユーザー権利で設定でき,主としてUNIX由来のコマンドを実行するために利用された。こちらはargv[n]形式が使えたが,DCLの持つ体系からは外れてしまう。

 DCLには,最近流行のオートコンプリーション(タブキーなどによる補完)もなかったので,多くのDEC OBが懐かしむほどには使いやすかったわけではない(私もDEC OBであるが)。ちなみに,タブキーによる補完は,やはりDECのコンピュータ用OSに由来するらしい(ただし,本当の発明はDECではない。詳細はWikipediaにあるTOPS-20の記述などを参照して欲しい)。

 MS-DOSのコマンド体系はWindows NTになっても基本的には変わっていない。ただし,意外なところに拡張機能が追加されていて驚くことはある。例えば,ファイル名の補完機能はWindows NTで追加され,Windows 2000から標準となった。また,Windows NTからfor文が大幅に拡張され,繰り返しやファイル内容の読み込みと加工ができるようになった。バッククォート構文はLisp言語の影響であろう。

 しかし,いくら高機能になっても,制御構造が貧弱なため,数行以上の長いプログラムを作成するには適さない。UNIXのshellは,対話的にも使えるほか,スクリプト言語としても十分実用になる。それに引き替え,Windowsのコマンド・プロンプトはいかにも貧弱である。

 そこで,過去のしがらみを断ち切り,全く新しいコマンドインタプリタが提案された。これがWindows PowerShellで,昨年11月に正式公開された。開発者によると,DCLも参考にしたということである。もっとも,これはIT業界に大量にいるDEC出身者へのリップサービスも含まれるように思う。UNIXを担当していたわずかなエンジニアを除き,1990年代以降のDEC出身者はVMSが大好きである(VAXは一時期あれほどUNIX界を席巻したのにDEC社内,特に日本ではUNIXは冷遇されていた)。

 PowerShellのコマンドは,「Get-Location」(CDコマンドに相当)のように「動詞-名詞」の形を取る。長いコマンドは別名(alias)を付けることもできる。こうした点がDCLと似ているというのだが,DCLで動詞-名詞の組み合わせで実行できるのは,SETとSHOWなど,わずかなコマンドだけである(例えばDCLでは現在の時刻表示はSHOW TIME,時刻設定はSET TIME,ファイル属性の変更はSET FILEで,カレントディレクトリの変更はSET DEFAULTである)。別名を付ける機能はDCLにもあるが,他の多くのOSにもあり,それほど珍しい機能ではない。なお,PowerSHellは,DCLと違いタブキーによる補完機能がファイルだけではなくコマンドにも有効である。全体としてみると,DCLを「真似た」というより,「体系的なコマンドインタプリタを作りたい」という思想を借りてきたという程度に思った方が良いだろう。

 さて,今回は歴史的な流れを紹介したが,PowerShellが,強力な対話型コマンド兼スクリプトコマンドであることは確かだ。そのため,Exchange Server 2007の標準的な管理ツールとなった。C#やVisual Basic.NETで作成されたプログラムを使って簡単に拡張することもできる。Windows Server 2008には標準搭載されるようなので,今から学ぶ価値はある。機会があれば使ってみてほしい。