プログラミング+ ストッキングとコンピューター
『Halt and Catch Fire』の時代の最初のIBM PC互換ポータブルPC「Hyperion」。photo:Boardhead CC BY-SA 3.0
コンピューターがテーマのドラマが熱い!?
悪い奴に追われるドラマで、ありがちなのが観光地みたいなところで背広にサングラスの男がスムージーを飲みながらあたりを眺めているというシーンだ。
『ウォンテッド! ローラ&チェルシー』は、まさにそんなシーンの出てくるドラマである。たまたまバス停に居合わせて一緒に逃げることになった女性2人が、汚職警官やらマフィアやらからとにかく逃げる。スーパーの店員ローラと金持ちの娘チェルシーのそんなロードムービーになっているのだが、なぜか悪い奴らをバッタバッタと片付ける。
まだシーズン1を見終わったところだが、女性の友情がどうのといった湿った話はあまりない。オーストラリアのテレビ局の制作らしいのだが、空が広くて空気も乾いているので、どこか『マッドマックス』に通ずるような気もしてくる。
ネットフリックスは、こんな感じで世界中の現地制作のドラマを流しているのが特徴で、このコラムでも『ペーパーハウス』という造幣局でお札を印刷するスペインのテレビ局制作のドラマが楽しいと書いたことがあるし、『ラストプロテクター』というイスタンブールを守る超能力者をあつかったトルコ製のドラマも面白かった。
米国以外のドラマを見れるのがとても意味があるしコンテンツの世界地図をじわじわと変えるとも思うのだが、ネット配信によって、滅多に日本ではないコンピューターがテーマのドラマを見ることができるようになったのはありがたい。
第二次世界大戦中にドイツの暗号解読の拠点となったブレッチリー・パーク(アラン・チューリングもそのために勤務した=2007年にコンピューター博物館がオープンしたことでもそのスジでは有名)で働いていた女性たちが、戦後、自分たちの能力を生かして難事件を解決していく『ブレッチリー・サークル』(ネットフリックス)なんてドラマもある。
英国の暗号解読機「Bombe」photo:mendhak CC BY-SA 2.0
スタートアップの若者たちをあつかった『シリコンバレー』(こちらはHuluでやっていまはアマゾンで配信されている)が話題になったが、『ホルト・アンド・キャッチ・ファイア 制御不能な夢と野心』(Hulu)は、1980年代、IBMやAppleが市場をにぎったあとの時代の葛藤を描いたドラマだ。
完全なフィクションだが、登場人物は「誰それがモデルではないか?」といったことが、米国では話題になっていたらしい。なかなか当時の状況が伝わってきて、同じ時代にコンピューターの仕事をしていた人ならウンウンとうなりたくなる内容なのだが、『ホルト・アンド・キッチ・ファイア/制御不能な夢と野心』(Halt and Catch Fire)という題名が気になった。
どんな意味なのだろう? と思って第一話を見はじめたら冒頭に、次のように説明されていた。
HALT AND CATCH FIRE
“停止 そして 着火”とは
初期のコンピュータコマンドで
マシンを競合状態にして
すべての命令を一度に実行させるもの
これによりコンピュータは制御不能になる
これどういう意味なのか分かりますかね? オリジナルの英文は「Halt and Catch Fire(HCF): An early computer command that sent the machine into a race condition, forcing all instructions to compete for superiority at once. Control of the computer could not be regained.」となっているのだが、ひょっとしたらハードウェアの専門家は分かるのだろうか?
どうも、「HCF」というアルファベット3文字になっているのは、コンピューターを機械命令で動かす場合のアセンブリ言語の命令コード(ニーモニック)のようである。そして、Wikipediaの「Halt and Catch Fire」(ドラマ名ではなくコンピューター用語として)の説明を読んでいたら「IBM System/360の架空の命令コードからはじまった」と書いてあって、これは見たことがあると思った。
『近代プログラマの夕』(ホーテンス・S・エンドウ著、アスキー刊)の「人生の意味を計算する」(月刊アスキー連載時は1987年8月号掲載)で紹介したある人物が集めた架空のニーモニックのコレクションの中に、この「HCF」は出てきていたのだ。もっとも、200個以上あるコレクションの中から紹介したのは一部で、肝心の「HCF」には触れていないのだが。それなのに、なぜ「HCF」を覚えていたかは後で触れることにしよう。
そのコラムというのは、次の内容だった(単行本のTexのファイルが残っていた)。
【人生の意味を計算する】
ニーモニックについて
アセンブリ言語…、多くのプログラマは、この言葉に懐かしさかそれとも何か貴いものとに対するようなニュアンスを持っているのではないかと思う。
“アセンブル”(=組み立てる)という言葉そのものの意味からすれば、何か機械的なイメージを抱くかもしれない。そのとおり、1つ1つの命令が機械語と1対1で対応する。つまり、コンピュータの一挙手一投足を1行1行、1つ1つの命令で指示するようになっているのだ。その機械語における1命令を、人間に分かりやすいようにアルファベットのニックネームを付けたのが、アセンブリ言語で使う命令ニーモニックである。
たとえば、コンピュータの記憶装置の中のあるところにあるデータをどこかに移すには、“MOV”という命令ニーモニックの命令を実行したりすればよい。この命令ニーモニックは、CPUあるいはマシンによってそれぞれ異なっている(同じこともある)。そして、たかだか3文字やそこらのアルファベットの組み合わせが、そのコンピュータの世界に確実に何かを起こさせることを意味している。それは、シンプルで、素朴で、暗号のように秘密めいている。そのマシンでプログラムを書く人たちだけの了解事項である。ひそかな連帯意識を生じせしめるようなところがある。
もっとも、こうしたことはアセンブリ言語に限るわけではなく、C言語やLISPでもあるわけだが、高水準言語の場合にはその言語が持つプログラム空間に対するものであり、アセンブリ言語のそれとはいくぶん異なる。アセンブリ言語は、紋切り型だが、他のどのような文学的なアプローチにも見られない、静かだが深長なイマジネーションを含んでいると思う。
ところで、CompuServeのProgrammer's Forumで、このアセンブリ言語の命令ニーモニックに対するオマージュともいうべきものを見つけた。
これは、Jeff Diewaldという人が、ミシガン大学に在学中から集めたという250 個におよぶ命令セットである。そのほんの一部だけだが、ちょっと目についたものだけ拾い出してみた。
BCIL(Branch Creating Infinite Loop)
:無限ループせよ
BH(Branch and Hang)
:分岐してハング
JTZ(Jump to Twilight Zone)
:トワイライト・ゾーンへ
この命令セットでは、分岐命令がやたらと多いのだが、シンプルなものを3つだけピックアップしてみた。分岐命令には“Branch”と“Jump”という大きく分けて2つの流儀というか表現方法があるのだが、それが混在している。3つ目の“JTZ”などが、疾走したプログラム(あるいはプログラマ)の最後に実行された命令だったりするのだろうか? すぐそこにあったりするのがトワイライト・ゾーンだそうだから注意が必要だ。
AFVC(Add Finagle's Variable Constant)
:怪しい定数を加えろ
DBZ(Divide By Zero)
:ゼロで割り算する
CML(Compute Meaning of Life)
:人生の意味を計算する
「ゼロで割り算する」というのは、なかなかシンプルでよいのではないかと思う。ゼロで割るということは、少し質のよいプログラマは1度くらいは素朴な疑問をいだいたことがあるはずだ。「ゼロで割り算しました」というメッセージほど、摩訶不思議なものはない。「割ってくれよ」と叫んでも代数の神様がどうしてくれるものでもない。3つ目の「人生の意味を…」は、単純な四則演算ではなく、なかなか複雑な命令のようである。
もちろん、ロードやストア、比較の命令もある。
LCC(Load and Clear Core)
:ロードしてメモリを初期化
CMD(Compare Meaningless Data)
:意味のないデータを比較する
STA(STore Anywhere)
:どこかに格納する
虚無感の漂うシニカルな命令ばかり3つだ。シニカルっぽいといえば、実際のマシンにある命令では、ZAP(Zero Add:ゼロ加算)というのがIBMの汎用機にあった。ある番地の内容をパック形式のゼロにして、それから足し算せよという命令だ。値をゼロにしてから足し算するから、結果は必ず足された値と同じになる。それならば、わざわざゼロにしてから足さなくても足される値をその番地に放り込むだけでいいような気もする。初心者には存在理由が理解できない命令の1つだが、そういう人ほどあとで頻繁に使うようになったりする。いわゆるアメコミ独特の擬音語のZAPを連想させるわけで、なんとなく有無を言わせず強引な行動に出るようで、いかにもぴったりのニーモニックである。
FLI(Flash Lights Impressively)
:印象的にライトを点灯せよ
LAP(Laugh At Programmer)
:プログラマを笑え
BOD(Beat On the Disk)
:ディスクを壊せ
入出力命令というのもいろいろあるが、この辺はかなり変わっている。「印象的にライトを…」は、コンピュータが人前でコンピュータの役割を演じる場合には便利かもしれない(いまどきシロートでもこういうことで関心する人は少ないか…)。「プログラマを笑え」もなかなかシンプルでいい。最後の「ディスクを壊せ」は少し物騒だが、もっと強力なのがいくつもある。
COLB(Crash for Operator's Lunch Break)
:オペレーターの昼休みのためにクラッシュせよ
OML(Obey Murphy's Laws)
:マーフィの法則に従え
DW(Destroy World)
:世界を破壊せよ
EP(Execute Programmer)
:プログラマを処刑せよ
EPI(Execute Programmer Immediately)
:ただちにプログラマを処刑せよ
1命令で「世界を破壊」されては困る。「プログラマを…」と「ただちに…」は、Execute(実行)やImmediate(即値)という単語が使われることに対する素朴な反応というわけだが、コンピュータの世界では、Kill(殺す)などという言葉も平気で使われたりする(日本語でそのまま「殺す」という表現をする人も少なくない)。
SAI(Skip All Instructions)
:すべての命令を読み飛ばす
これでは、プログラムはなにも動かない。
WF(Wait Forever)
:永久に待つ
これも、なにも動かない。
LPA(Lead Programmer Astray)
:プログラマを惑わせろ
TPDH(Tell Programmer to Do it Him/Herself)
:プログラマに自分のことは自分でしろと言え
UP(Understand Program)
:プログラムを理解する
2つめの長いニーモニックは、いかにもマイクロプログラミングされた命令ふうではないかと思う。「プログラムを理解する」は、禅問答のような命令である。
DLN(Don't Look Now ...)
:いやん見ないで!
これはどうすればよいのだろう。しかし、ニーモニックとしては秀逸だ。
最初のほうにも書いたように、アセンブラの命令ニーモニックは、そのマシンを使っている人たちだけの了解事項である。私は、IBMの汎用機とVAX-11と国産のかなりマイナーなマシン何機種かと、そして8086の命令セットくらいしか知らない。完全に市民権を獲得したRISCについては仕事上じっくり調べたことはあるが、1度もプログラムを書いていない。世の中にはやたらと多くのアセンブラを書いた経験のある人もいると思うが、マシンのアーキテクチャの数もまた数知れず、それらがパラレルワールドのように棲息しているわけなのである。
※『近代プログラマの夕』(ホーテンス・S・エンドウ著、アスキー刊)より
とまあひたすら架空の命令ニーモニックは楽しいという調子で書かれていて、これとは別の回では「LOL」(大笑い)、「<g>」(ニヤリ)など、やはり、米国のパソコン通信CompuServeで見つけた略語なんてのも紹介していたりする。
本当にコンピューターは発火したのだろうか?
ところで、「Halt and Catch Fire」のWikipediaでの説明は、そのあたりの説明をたぶん半分冗談でわざとぼやかして書いてある感じなのだが、「HCF」というのは完全に架空のニーモニックだったのである。
私が、この原稿で紹介したその命令リストは、Wikipadiaでも参照されていて、注釈欄に“Kevin Korb's Jokes: Assembler Opcodes that should exist”. Retrieved December 13, 2016.として掲載されている。
これはまさに、1987年に私がCompuServeのProgrammer's Forumで見つけたリストそのものである。Wikipediaのリンクではクレジットが省略されているのでこのページの持ち主であるKevin Korb氏のコレクションと誤解してしまいそうになるが、Jeff Diewaldという人物が集めて発表したものである。
HCF(Halt and Catch Fire)
:停止して発火させる
この命令について原稿で触れなかったのは、たぶんあらめてコラムで書きたいと思っていたからだ。そして、その部分がWikipediaの説明ではどうも欠落してしまっているように思う。
私が、プログラマをはじめた1980年頃には、会社の中にパラメトロン計算機(1950年代に日本にだけ存在した論理素子を使ったコンピューター)を売っていたなんて部長がいた。当時は、大型コンピューターなどは、夏なら肌寒くて震えるくらいギンギンに冷房の効いたコンピューター専用ルームに鎮座ましましているものだった。要するに、コンピューターはとても高価であると同時に動作が不安定なので、最適な環境のもとで使うものとされていたのである。
そのような中で聞いた話には、「女性オペレーターがナイロンストッキングで出勤してくるとコンピューターが停止する」なんてのがあった。私は、「本当?」と思ったが、パラメトロン時代の人たちからすると「なるほどそうでしたかぁ」なんて懐かしい感じの会話になっている(説明する必要もないと思うが静電気がわるさをしていたわけである)。
HCFに相当する話は、そうしたふるい話の中で出てきたある現象に関係していると思う。それは、「メモリ上の同じアドレスに分岐する命令を書いたらコンピューターの回路が焦げてしまった」という話である。コンピューターは、本体メモリの中に並んだ命令を1つずつ順番に実行していくものなので、同じアドレスに分岐し続けるということは外側から見ると“停止”(Halt)しているように見える。
ところが、コンピューターは電子回路なので、同じ場所だけ繰り返して使われると関係する回路が熱をもって発火したというのだ。
こんなふうにして回路に火がつくなんて、矛盾する問題を与えたらロボットが目を回して“ボカン!”といって煙をあげるSF映画のシーンみたいではないか! 映画『禁断の惑星』(1956年)のロビーがまさにそんな感じだったけわけだが、人間の知能を超えるようなコンピューターにも弱点があるみたいな感じを連想させて楽しいエピソードだと思った。
実は、ハッカー用語で有名なジャーゴンファイルには、そのようにしてチップが焼けるという説明もあるのだが、チップの時代よもずっと前の1950年代の話ではないかといのが私の意見である。米国の質問サイトであるQuoraには、まさに初期のコンピューターは保護機構がなかったのでプログラムによってとても簡単に部品が過熱して壊れてしまうといったことが起きたと解説している人もいる。私の先輩たちはそれを実際に経験したのかどうかはあやしい気もするが、そんなの当たり前という話なのかもしれない(ご存じの方お知らせあれ)。
ところで、コンピューターの命令コードは、それ自体は単なる数値データである。かの時代の代表的なコンピューターであるIBM System/360もそうで、命令は1バイトが割り当てられているので256個の命令が用意できる計算になる(ちなみに頭の2ビットは命令語全体の長さを表している)。ところが、実際に必要な命令はそんなにはないから使わない命令コードが存在することになる。
通常、そのような命令コードの割り当てられていないデータを実行しようとすると「演算例外」というエラーを返す(System/360の場合は、たしか“0C1”というエラーコードだった=40年も経過して覚えているなんてプログラマって業がふかい)。ところが、その後のマイコンの世界でアセンブリ言語でニーモニックの割り当てられていない命令コードに、いわば隠し命令として特定の動作をさせるものがでてきたそうだ。
MC6800は、そうした命令コードとして“0x9D”と“0xDD”が割り当てられていて、同じアドレスに分岐するわけではないが、メモリを順番にすべて読みだすことをひたすらやるために操作不能になる。しかし、これは同時にハードウェアのテスト的な意味合いを持っていたようにも見える。正式な資料にはのっておらず、当然のことながらニーモニックも割り当てられていない。それを、勝手にHCFと呼んでしまっている(Wikipediaでは『BYTE』誌の記事へのリンクが張られている)。
『BYTE』誌の1977年2月号の46~47ページに「Undocumented M6800 Instructions」という記事がある。BYTE誌の表紙はサイコー。
ともあれ、『ホルト・アンド・キャッチ・ファイア』の第一話に出てくるHCFのたぶんコンピューターの専門家でも分からない説明にはこんな背景があるわけだ。案外、日本語の題名としてついている「制御不能な夢と野心」というのが、その現象と同時にあの時代の空気をもうまく一致させて表しているようなところもあるのだが。
遠藤諭(えんどうさとし)
株式会社角川アスキー総合研究所 主席研究員。月刊アスキー編集長などを経て、2013年より現職。雑誌編集のかたわらミリオンセラーとなった『マーフィーの法則』など書籍の企画も手掛ける。アスキー入社前には80年代を代表するサブカル誌の1つ『東京おとなクラブ』を主宰。『カレー語辞典』(誠文堂新光社)に名前で項目が立っているカレー好き。著書に、『近代プログラマの夕』(ホーテンス・S・エンドウ名義、アスキー)、『計算機屋かく戦えり』など。趣味は、文房具作りで2018年1月、Kickstarterのプロジェクトで195%を達成して成功させた。
Twitter:@hortense667Mastodon:https://mstdn.jp/@hortense667