2011-01-20

Old New Thing: なんでスペースシャトル使ってアポロ13号を助けなかったの?

Why didn't they use the Space Shuttle to rescue the Apollo 13 astronauts? - The Old New Thing - Site Home - MSDN Blogs

多くの出来事というのは、当時の時代背景を考えなければ成立しないものだ。

ゆとりの映画バカが、なんでNASAはスペースシャトル使ってアポロ13号の乗組員を助けなかったんだ、と疑問に思うごとく、今日のコンピューターユーザーは、昔の事情に対して、そもそも存在していなかった技術の存在を前提に考えようとする。

例えば、Windows 3.1にコンソールサブシステムがなかったということは、ipconfigをキャラクターモードのアプリケーションとして提供しない言い訳にはならないという意見だ。「ま、コンソールサブシステムがなかったとしてもだ、なんでDOSを使わないんだ

MS-DOSプロンプトというのは、MS-DOSを走らせる仮想マシンである。仮想マシンであるがゆえに、MS-DOSプロンプトは、あたかもMS-DOSそのものであるかのようにふるまう。現実には、もちろん、Windowsによってコントロールされているシミュレーターの中で走っているに過ぎない。しかし、シミュレーションの目的は、古いアプリケーションを、あたかもMS-DOS上で走っているものと信じさせて実行させることにあるのだ。

「Win 3.1にセキュリティなんて概念はなかったじゃないか。だったら、DOS上で動くプログラムがシステムにどんな影響を及ぼしたところで、別に構わないじゃないか」

MS-DOSプロンプトは、仮想マシン上で走っていたため、あらゆる挙動は、仮想マシンマネージャーの監視下にあった。もし、アクセス権限のないメモリーにアクセスしようとしたならば、例外が発生し、仮想マシンマネージャーによってハンドルされる。もし、特権命令を実行しようとしたならば、例外が発生し、仮想マシンマネージャーが、「いいや、限界だ。押すね」とばかりに、仮想マシンを停止させる。そういう意味では、MS-DOSプロンプト上で走るプログラムは、デスクトップ上で走るWindowsアプリケーションより、保護、隔離されていたということになる。何故ならば、Windowsは、各MS-DOSプロンプトごとに、別々の天地を作り出していたからだ。

仮想化における前提条件としては、MS-DOSプロンプト上で走るプログラムは、昔の普通のMS-DOSアプリケーションである。Windowsアプリケーションではない。MS-DOSには、Windows APIは存在しない。したがって、MS-DOSプロンプトにも、Windows APIは存在しない。WindowsをLinux上の仮想マシンで走らせておきながら、なんでWindowsプログラムがXCreateWindowを呼び出せないのかと疑問に思うようなものだ。XCreateWindowは、ホストシステムの関数だから呼び出せないのだ。仮想マシンには存在しない。

確かに、仮想マシンに穴をあけて、MS-DOSプログラムからWinSock APIを呼び出せるようにすることは可能である。

しかし、仮にそのようなはからいがあったとしても、やはり、MS-DOSプログラムのipconfigは欲しくないだろう。

思い出して欲しい。Windows 3.1には、二種類のモードがあったことを。スタンダードモードと、エンハンスドモードである。スタンダードモードは、80286プロセッサー向けの設計である。80286には、仮想メモリーや、仮想マシンのサポートなどといった機能はなかったのだ。MS-DOSプロンプトを実行したら、スタンダードモードのWindowsは、すべてのWindowsプログラムを休眠し、自分自身も休眠する。その後、MS-DOSプログラムを実行するのである。(もちろん、フルスクリーンである。なぜならば、ウインドウを表示させるべきWindowsは存在しないのだから)。しかる後に、MS-DOSプログラムが終了したら、Windowsは自分自身を復帰させ、MS-DOSプロンプトを開く前の状態に戻すのである。

単にコンピューターのIPアドレスを得るためだけに、一切の作業をやめ、Windowsを事実上シャットダウンし、ディスプレイをキャラクターモードに切り替える。その結果、たかだか16文字を画面に表示できるようになるというのは、実に馬鹿馬鹿しい次第である。

「んでも、スタンダードモードのWindowsなんてどうでもいーじゃん。エンハンスドモードだけで動くってことにしたらどうよ。エンハンスドモードなら、MS-DOSプロンプトをマルチタスクできて、Windows上で動かせるじゃん」

思い出して欲しい。Windows 3.1のエンハンスドモードにおける、最小メモリー要求は、1664KBであったことを。さらに、各DOS窓は、約1MBのメモリーを消費する。つまり、たかだか16文字を画面上に表示するために、コンピューターの半分以上ものメモリーが必要になるのである。

「えーと、サポセンは問題解決のために、俺のIPアドレスを聞いてきた。IPを調べるには、このプログラムを実行しないといけないな。そのためには、まず作業をセーブして、今開いているプログラムを全部閉じないと、プログラムを実行するだけのメモリーが空かない」

単にWindowsアプリケーションを使ったほうがいい。

ボーナスコメント:640kが、なんでwinipcfgはipconfigを呼ばないのかと質問してきた。

いいかね。「全く別物で互換性のないプログラムに、同じ名前をつけよう」。問題解決からますます遠ざかるだけだな。

64bitコードへ移行はすみやかに行われるのだろうか。

3 comments:

Anonymous said...

> なんでwinipcfgはipconfigを呼ばないのか
後の文と意味がつながらなかったので原文を確認しましたが、
なんでwinipcfgipconfig呼ばなかったのか
→なんでwinipcfgをipconfigという名前にしなかったのか
じゃないですか?

Anonymous said...

> なんでwinipcfgはipconfigを呼ばないのか
後の文と意味がつながらなかったので原文を確認してみましたが、
なんでwinipcfgはipconfigと呼ばれなかったのか
→なんでwinipcfgをipconfigという名前にしなかったのか
ではありませんか。

Anonymous said...

なぜかポストが消える…