「Batch Programming Considered Harmful」てな記事があればいいのに

前から探してるんだけどねー。

近いことをはっきりと書くのは二度目だ。細かくは何度も小さく書いている。最近無駄に DOS にお世話になってしまったのでなんか火が付いてしまった。

ずーっと感じてるのが、「DOS はきわめて難しい」ということを説明する、いい文書がどうも見つからない、ってことなのね。ないことはないんだけど、物足りないんだよねー。あたしゃ「bash が優れてるから DOS を使わない」んではのーて、「DOS が難し過ぎるから DOS を使わん」のぢゃ。


先に前置き。話がややこしいので以下では「DOS」と言う(し、これまでもずっとそれで通してきた)が、無論「本物の MS DOS が今でも現存している」わけではなく、あるバージョン以降の Windows ではこの「ワタシが DOS と呼んでいるもの」は OS ではなくコマンドインタプリタに降格しており、一般にも「Windows command interpreter」と呼ばれている。そしてそれを司るのは CMD.EXE (今は)である。だからワタシが DOS と呼ぶものは実際には CMD.EXE である、今は。


見出しにしたのは非常に有名な文書「Csh Programming Considered Harmful」に倣ったもの。

正直わかっている人には自明過ぎるがゆえに「書かれない」のかなと思う反面、「書かれない」がゆえに、コンピュータに不慣れなユーザほど「DOS は簡単だ」と思い込んでしまっているという実感ははっきりとこれは拭えない。

現実にはどうやら「おりゃぁ Windows 3.1 からのユーザなんだ、新しいもんイチイチ憶えてられっか」というスタンスで DOS 以外を学習してこなかったツワモノも一定数いるようなんだけれど、ワタシが身の回りで感じたのは全然そうじゃなかった。若者が DOS に「しがみつく」。

本当のところは Microsoft 自身が DOS が大嫌いで、なくしたくてなくしたくてこれまで色々画策してきた歴史がある。それが最初は Windows Scripting Host であったし、現在では Windows PowerShell だ。いまひとつこれらが浸透しないのはやはり不幸だとしか言いようがないのだが、PowerShell については早い段階から OS に標準添付する決断を出来なかったことが敗因なのだと思う。(標準添付は Vista からだっけか? 7 か? 忘れた。XP には添付されてない。PowerShell そのものはその頃からあったけど。)

ワタシが最も嫌いな仕様を、こともあろうか全然思い出せず、だからなんか説得力を持った説明を長らく出来なかったんだけど、さっきやっと思い出した。滅茶苦茶シンプルな「バカ」仕様について。

まず、「コマンドラインから FOR ループを書く」:

1 c:\>@FOR %B IN (1, 2, 3) DO @ECHO %B
2 1
3 2
4 3
5 
6 c:\>

きゃーすてき。なんだ簡単じゃないか。「@」をつけないとコマンド表示しちゃうんだもんね、そんくらい憶えられるさ。

ノーーーーー!! これを「BATCH ファイル内に写経出来ない」。つまり:

hoge.bat
1 @FOR %%B IN (1, 2, 3) DO @ECHO %%B

パーセントを二つ重ねないといけない。逆もまた然りであり、BATCH ファイルに書かれたものを真似してコマンドラインに打ち込めない。

これは「記憶できる/できない」という問題ではないの。そもそも「ジョブコントロール言語」的なものというものは、「コマンドラインの羅列」で構成できなきゃ価値がない。つまり最もシンプルには cmd1、cmd2、cmd3 をコマンドラインから連続で打ち込むのと、「脚本」に3つ書き込んでおくのが等価でなけりゃ、疲弊する

もともと「脚本言語」は文字通り「定常ルーチンワーク」を「予め書き下しておく」ことのためにある。だからコマンドラインから使うのと「脚本言語」で記法が異なるのは、ひっじょーに迷惑だ。

ほかは以下同文と言いたいところではあるけれど、基本的には大きく2つの要因で「ダメ」だ。一つは「まともな構文解析を行わない」ことに起因するもの。FOR が「言語のシンタクス」ではなく「FOR コマンド」なのだ、ということで、察しがいい人ならわかるかもしれない。もう一つが「キーワード過多」なことだ。これほどミニマルなのに「過多とはなんぞ?」。

後者は DOS が「ファイルシステム」を「ちゃんと」扱おうとしないことによる。DOS からみると「ドライブ」以外のデバイスは全て「キーワード」で扱われる。nul という「キーワード」は「ヌルファイル」を意味するので、nul という名前のファイル名は絶対に作れない、DOS からは。同じく prn はプリンタをあらわすキーワードなので、con は…etc. これはもともと Unix の /dev を「形だけ真似た」インチキである。Unix の根本思想は「あらゆるものがファイルである」であることから、あらゆるデバイスが「ファイル」(のようなもの)として扱われる:

1 me@host: ~$ cat myfavoritemusic.au > /dev/audio

みたいな。この表層だけなぞったのが DOS 構文だ:

1 c:\>TYPE HOGE.TXT > nul

「まともな構文解析を行わない」は、「場当たり的」と言ったほうが伝わりやすいか。引用符の扱いを正しく理解出来るあなたは天才である。誇っていい。けど「まともなシェル」を知ってから誇った方が身のため。他を知ればどれほどバカらしいのか良くわかる。(簡単に言ってしまえば引用符に関しては「プログラムに渡したい引用符とそうでないものを隔てる仕様が不自然で難解で奇妙で奇特」、てこと。)

一般的な DOS/BATCH 嫌いが怒り心頭なのはどうやら「まともな制御構文がない」ということのようだ:

Unlike csh and sh, the Windows command-line interpreter does not have a wide range of control structures. There are only four control structures available: for, goto, call, and if.

が、そういうこっちゃねーんだよ。実際「それがまともなら」、「for, goto, call, and if」だけでかなりのことが出来る。まともじゃないからまともなことが書けない。

あるいは「コマンドが少な過ぎる」ことに不満を持つ者も多いが、それも本質とはちゃう。だって「オリジナルの Unix の初期の初期」はやっぱりコマンドは少なかったのに、追加追加で便利に進化していったのは、これは「良く使うルーチンをどんどんシェルスクリプト(か C で書いたツール)として整備していったから」。これが DOS で起こらなかったのは、当然この「バカなデザイン」に起因している。

ジョブコントロールもまともに出来ないのも当然苦痛。ジョブコントロールとは…、まぁいいか、これは。変数のスコープについてもね。Unix シェルを知ってると奇異だが…、まぁこれも枝葉ちゃぁ枝葉かな。


うーん、誰かまとめて書いてくれんかなぁ、「初心者が正しくビビれるいい脅し文書」。いい加減こういうのがないと、いつまで経っても「若者のくせに DOS/BATCH にしがみつく」のが後を絶たない。簡単に言えば「落とし穴だらけで出来ているもの、それが DOS」てのがワタシの言うところの「DOS は難し過ぎる」てことなんだけれど、どうにもきれいに説明出来なくて歯痒い。


一応念のため。

「どうしても DOS/BATCH と格闘する必要がある場合がある」ことがあるのは、これは事実です。このパターンなんかがそうね。こういう場合は「必要に迫られてやむなく」DOS に頼る必要がある。

あるいはPython スクリプトな shebang、またの名を「実行可能な Python スクリプト」 (一応)で触れたように、広く公に使ってもらいたいものを作る必要がある場合、「ユーザの環境がミニマルである」ことを前提とせざるを得ない、という理由で BATCH が使われる。

だから「DOS についての基礎」を知れるサイトがあることはいいことだし、それを否定するもんではない。だからといって「飛びつくなよ」というのが、ワタシが言いたいこと。必要に迫られもしないのにすすんで使うようなシロモノではないぞ、てことを言いたいだけなのです。わかるかなぁ?

OSS 開発者も無論「仕方なく」そうしているのであって、好き好んでそうしているわけではない、ということを知るべきだ。