252
166

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unixの歴史の起源を伝説のゲーム「スペース・トラベル」で遊んで学ぼう!

Last updated at Posted at 2024-09-18

伝説って?

Space Travel はケン・トンプソンが Unix の開発を始める前に作った伝説のゲームです。トンプソンは Space Travel 作ることでミニコンピュータ PDP-7 での開発手法を確立させ、それから Unix の開発を始めることになります。

補足: ゲームをしたいがために Unix を作ったという話ではなく『元々研究者の仕事として別の OS (Multics) の研究開発プロジェクトに参加していたが成果が見えず撤退することになり、それをきっかけに自分独自の OS の開発を始めたベル研究所のトンプソン』が空き時間に作ったゲーム・・・を作るために必要になった技術が、初期の Unix 開発の技術として役に立ったという話です。常識で考えてゲームで遊びたいと思っただけで Unix が出来上がるわけがないでしょう?

Space Travel: Exploring the solar system and the PDP-7 (Dennis M. Ritchie)

ST came before Unix, but doing ST led him to a place in which he could write the first version of Unix.

ST (Space Travel) は Unix の前に登場しましたが、ST をやったことで Unix の最初のバージョンを書ける場所にたどり着きました。

Space Travel は星の動きをシミュレートしており、目的は地球を出発して宇宙空間を移動し、目的の星に衝突しないようにうまく着陸することです。星には重力があり太陽の周りを回っています。1969年に作られたこのゲームはとてもリアルで、星以外なにもない真っ黒な景色を眺めるだけの宇宙旅行を楽しむことができます。

PDP-7 の性能についてメモリはわずか 18bit で 8K ワード(16Kバイト相当)しかなかったということを覚えておいてください。また、ミニコンピュータのミニとは大型冷蔵庫サイズという意味です。Space Travel はアセンブリ言語で記述され、元は PDP-7 上で直接動作する(Unix は不要)ものでしたが、後に PDP-7 Unix 上で動くように修正されました。PDP-7 Unix は長らくソースコードが不明な状態でしたが 2016 年と 2019 年に紙のソースコードが発見され、スキャンされて復元されました(参照1参照2)。現在は pdp7-unix で公開されており、古いコンピュータのシミュレータ SimH で動作させることもできるようです。そして PDP-7 Unix から Space Travel のソースコードが取り出され、2023 年にアセンブリ言語から C 言語に移植されました(なのでこの記事で紹介するのはトンプソンが書いた元のコードそのものではありません)。

そしてついにブラウザ上で遊べるようになりました (https://akr.am/st) 🎉🎉🎉

image.png
(これは 3D ではなく初期位置 = 地球を中心に周りに星を配置した図です)

この記事の内容は十分に調べて書いていますが、間違いがないという保証はありません。この記事のコメント、もしくは Twitter、はてなブックマーク、その他の外部サービスの公開コメントへの私の返信の方針についてはこちらを参照してください。

Space Travel で遊んでみよう!

Space Travel (wikipedia) は Unix 開発技術の基礎(PDP-7 の学習と開発ワークフローの確立)となったことでよく知られています。しかし詳細を調べても以下のようなよくわからない画像が見つかるだけで、どのようなゲームなのか(私には)よくわかっていませんでした。今でもこの画像が何なのかわかっていません。

Slightly-edited image of gameplay from ''Space Travel''
補足: 右の画像は wikipedia の画像のリンク先にある画像。右上がカットされているが画像を重ねたところ完全に一致、「UNIXの1/4世紀」(PDF P133)にも同様の画像があり右上の数値が一致し傾き具合から同じ画像と推測。同書には「Space Travel Orbit、PDP-7 の写真より(Kirk McKusick提供)」とある。もしや「Space Travel」と「Space Travel Orbit」は別物?

Space Travel のソースコードは失われており遊ぶことはできないとばかり思っていたのですが、どうやら最初の Unix に PDP-7 Unix 版のアセンブリ言語のソースコードが含まれていたようで、それを元に C 言語に移植 (https://github.com/mohd-akram/st) されていました。さらにそれを go に移植した https://github.com/gophun/st もあります。どうやら 2023 年 2 月頃に移植されたようで、前に私が調べた時にはなかったのでしょう。改めて調べてみると YouTube に Space Travel のプレイ動画が見つかりました。こちらは SimH を使って元の Unix の Space Travel を動かしているようです。この動画は 2021 年 12 月 29 日に公開されているので私が見つけられなかったか前に探したときはそれよりも前だったのかもしれません。

C 言語移植版の Space Travel は、注意が必要なのは SDL2 を使っているということぐらいで macOS で簡単にビルドできたので、最初はここに手順をまとめようかと思ったのですが、この記事を書いているうちに、Linux や Windows で動作させる方法も書きたいと思ったけど面倒だし、それやるぐらいなら WebAssembly にしてブラウザで動くようにすればいいんじゃね?と気づいたので Emscripten でビルドできるように修正して GitHub Actions 経由で GitHub Pages に自動で公開するよう変更にしてマージしてもらったというのが事の顛末です。

ちなみに WebAssembly も Emscripten も SDL2 も使うのは初めてでしたが、修正はいわゆる「メインループ」を emscripten_set_main_loop() を使って動くように書き換えるという、どうやらお決まりとされている作業を行うだけですみました。興味がある人は修正内容を見ればすぐに分かると思いますが、私がやったことはメインループを関数の形に切り出して、元のループ構造による処理を、ループと処理に分離しただけです。

キー操作はリンク先に書かれていますが、補足してここにも書いておきます。どうやら元のバージョンは(おそらく)ファンクションキーでの操作であり、矢印キーでの操作は移植版での追加機能のようです。ゲームのコツはぐるぐる回すゲームや目的地に移動するゲームと考えるのではなく、ゆっくり移動するのを眺めるゲームと考えることです。その他の私が考えたゲームの攻略のヒントはこの記事の中程にまとめています。

Key Action 補足
1 Quit プログラム終了
2 New game 墜落後にその場から再開
3 Thrust down 推力ダウン
4 Thrust up 推力アップ
5 Yaw right 右旋回(右矢印キー)
6 Yaw left 左旋回(左矢印キー)
7 Scale up スケールアップ(下矢印キー)
8 Scale down スケールダウン(上矢印キー)

ちなみに Space Travel にスコア機能やゲームのなにかを記録する機能はありません。描画は点と線だけで画像ファイルの読み込みなどは行いません。オリジナルの Space Travel は紙テープから起動してオンメモリで動くはずです。何が言いたいかというと Space Travel を動かすためにファイルシステムを作る理由はないということです。紙テープからの起動なんて時間がかかるのでは? と思ったあなたは鋭い。1980 年頃の音楽用のカセットテープをコンピュータの記憶媒体として使っていた時代では、実際にゲームを始める前のロード時間に何分も待っていました。

初期の Unix 開発の技術は Space Travel から学んだ

さて、この記事は Space Travel を通して Unix 開発の初期の歴史や、なぜケン・トンプソンは Unix を開発するに至ったのかを知ろうというのが趣旨の記事です。Space Travel で遊ぶ話は実際にはおまけです。

Space Travel は Unix を開発したトンプソンが、Unix の開発を始める前に作ったゲームです。トンプソンは Space Travel の開発を通してミニコンピュータ PDP-7 での開発手法を確立しました。初期の Unix の開発ではこのときに確立した開発手法が大いに役に立ちました。Space Travel は初期のコンピュータゲームですが、最初のコンピュータゲームではありません。最初のコンピュータゲームがなにかは定義によりけりですが、例えば 1960 年発売の最初のミニコンピュータと言われている PDP-1 で動作する Spacewar! が 1962 年に MIT の学生によって開発されています。Space Travel の開発は 1969 年です。トンプソンは Spacewar! の忠実なコピーも作成(PDP-1 版のソースコード片手に移植したのだと思うが不明)しているようですが、それは PDP-7 Unix 上で動作するもので、PDP-7 Unix を作るための技術を確立させたのは Space Travel です。トンプソンは PDP-7 Unix で他にも色んなゲームを作っているようです。ちなみに最初の家庭用ゲーム機と言われている Magnavox Odyssey の発売は 1972 年(ファミコンの発売日は 1983 年)であり、ビデオゲームはまだ一般的ではなかった時代の出来事です。この頃の「コンピュータゲームで遊ぶ」とは、ソースコードを書いて動かし、ゲームをプレイし、そしてソースコードをいじくり回すことです。Space Travel はコンピュータゲームの歴史に影響を与えることはありませんでした。それは当然です。なぜならトンプソン関係者以外に公開されておらず誰も遊べなかったからです。すでに書いたように現在公開されている Space Travel は 2016/2019 年に発掘されたものです。

Unix が誕生するより 5 年前、1964 年に当時の最先端のタイムシェアリングシステム用 OS「Multics」の開発プロジェクトが始まりました。Multics の開発は MIT、GE、AT&T ベル研究所による共同プロジェクトで、ベル研究所が参加した目的はベル研究所の技術者が使用できるタイムシェアリングシステムを獲得することでした。トンプソンはベル研究所から参加した研究開発チームの一人でした。トンプソンは大学を出たあとベル研究所に Multics プロジェクトのために雇われました。トンプソン自身はあまり働く気はなかったようですが、ベル研究所の人に気に入られ面接を受けてみないかとしつこく頼まれます。トンプソンは「仕事には興味がないが、旅費が無料というのなら、旅行として友達に会いに行きます」と言い、その流れで面接を受けることになります。トンプソンはベル研究所を大学のように仕事を楽しんでやってる場所だったと語っており、おそらくその環境が気に入って働くことにしたのでしょう。Multics は個人用のコンピュータで動かすための OS ではなく、多数のユーザー(CPU あたり数十人程度?)が同時に使用できる現在で言えばサーバーシステム用の OS です。Multics はそれまでのタイムシェアリングシステムの研究から生み出された最高のシステムでしたが、それと同時にシステムも巨大で開発は難航しました。成果を感じられなかったベル研究所は 1969 年 4 月に Multics プロジェクトから撤退することを決定しました。ベル研究所の決定は研究開発チームのメンバーにとってはショッキングな出来事で、誰もがやる気を失っていました。

ベル研究所が Multics 開発のプロジェクトから撤退したあとも、トンプソンはクビになるかもしれないと覚悟の上で OS の開発を続けていました(使命感による覚悟ではなく「もうどうにでもな~れ」の方だと思います)。Multics プロジェクトの開発で手に入れつつあった快適で対話的なプログラミング環境を手放したくなかったからです。当時のその他の OS は現在のような対話的に使用できるものではなく、プログラムをセットして実行するバッチシステムが主流でした。このようなシステムではプログラミングで試行錯誤などできません。Unixはプログラマによるプログラマのためのプログラミングプラットフォームとして作られたのです。ベル研究所は Multics 開発のプロジェクトから撤退しましたが、Multics の開発で使用していた大型コンピュータ GE-645(GE-635 ベースに Multics 用に設計したもの)は 1 年程度のあいだ残されており、トンプソンはほぼ独占して使うことができたようです。GE-645上で簡単なカーネルが動くところまではできましたが、ベル研究所が GE-645 を撤去すると決めたことを知り、GE-645 上での OS の開発を打ち切りました。その OS はもちろん Unix ではありませんが、(ゲームとは関係なしに)この時点でトンプソンは自分独自の OS の開発を始めていたというのがポイントです。ちなみにベル研究所が GE-645 を撤去した理由はレンタルコストです。ベル研究所は二台の GE-645 をレンタルしていましたが、GE-645 を送り返して、代わりに GE-635 を設置したようです。GE-635 と GE-645 が違うコンピュータだということはこの記事の重要なポイントです。

  • GE-635: GECOS (GCOS) が搭載された大型コンピュータ
  • GE-645: Multics プロジェクトのために設計された大型コンピュータ

トンプソンは Multics を開発している時に余暇に独自のゲームを開発しました。それが Space Travel です。Multics 版の Space Travel がどの言語で実装されていたのかは不明ですが、Multics は高水準言語の PL/I で開発されていたので PL/I で実装されていたのかもしれません。トンプソンは GE-645 が撤去されるため Multics 版の Space Travel を GE-635 の本来の OS である GECOS で動くように Fortran で書き直しました。GECOS はタイムシェアリングシステムではありませんでしたが、インタラクティブバッチという仕組みが搭載されており実行されているジョブに対してコマンド入力を行うことができました。GE-635 版の Space Travel には2つの問題点がありました。一つはインタラクティブバッチでのコマンド入力による宇宙船の制御は操作が困難だったこと、もう一つはプレイにかかった CPU 時間から計算すると 50 ドルから 75 ドル(当時の 1 ドル 360 円計算で 1万8000 円から 2万7000 円)もコストがかかってしまったことです。このコストは会社の内部的に管理しているコスト (funny money) なので実際に支払いが生じたわけではありませんが高額なことは言うまでもありません。当然このコストは経営陣にはほとんど好まれませんでした。ちなみに大型コンピュータは時間貸しするのが当たり前なので、どれくらいコンピュータリソースを使ったかを計測する機能は標準搭載されていたはずです。

トンプソンたちは 1969 年の間、新しい OS を開発するためのコンピュータを調達すべく上層部と交渉していました。しかしそのころ要求していた大型コンピュータの PDP-10 は高額で、OS 開発の興味を失っていたベル研究所は何度にも渡る要求を受け入れることはありませんでした。そのころトンプソンは別の部署(Joseph Henry Condon の第 13 部門)が所有していたが、(使用者だった音響学部門の Bill Ninke の異動により)使われていなかった古いミニコンピュータを見つけてきます。これが後に Unix が開発されることとなる PDP-7 です。1965 年に発売された PDP-7 は当時としても性能的にはかなり低いものでしたが、グラフィックシステムとして使用していたため Space Travel を動かすのに適した丸い画面のディスプレイ (DEC 340 display) がたまたま接続されていました。ディスプレイは PDP-7 の標準装備でないことに注意してください。このころディスプレイはないのが普通で、出力はテレタイプ端末のプリンタで印字です。そして DEC 340 display は線や点を描くことに特化していたベクターディスプレイで、ビデオ表示端末ではなく端末の代わりとして使うことはできないはずです。つまり端末とは別に接続する追加のディスプレイ装置(ライトペンによる入力もできたようだ)ということです。大型コンピュータとは違い、ミニコンピュータは CPU 時間のコストを気にせず使うことができました。そこでトンプソンは PDP-7 用に Space Travel を書き直すことにしました。ちなみに PDP-7 は最後まで借り物だったようです。所有していた部署は捨てようとしていましたがそれを引き止め、しかしトンプソンの部署のマネージャーはスペースのコストを嫌がって(無料ですら)引き取らず、彼らのスペース(クローゼット?)で使用し故障した時は彼らがメンテナンスしていたようです(参照1参照2)。ミニコンピュータと言えどまだまだ大きく場所を取り、当時のコンピュータは壊れやすくメンテナンスが必要なものです。

トンプソンが PDP-7 版の Space Travel の実装を開始した頃(おそらく 1969 年の第1四半期頃)、OS を開発しようという考えは持っていませんでした。PDP-7 版の Space Travel は移植性の低いアセンブリ言語で記述され、(Unix なしに)PDP-7 上で直接動作するものです。Space Travel だけが動作するのでプロセス管理やメモリ管理やリソース管理やファイルシステムなど、OS として必要な機能を実装する必要はありません。PDP-7 版の Space Travel の開発は GE-635 上で動作する PDP-7 用のクロスアセンブラを使って行なわれました。このクロスアセンブラはトンプソンが開発したものです。GE-635 から PDP-7 へのプログラムの転送は紙テープ(穴で情報を記録している)によって行なわれました。当時は紙テープ入出力装置は一般的な入出力機器です。システムは紙テープから起動していました。PDP-7 には浮動小数点数を扱う機能がなかったため、それをシミュレートするライブラリも開発しています。後に Space Travel は PDP-7 Unix 上で動くように修正されましたが実装言語はアセンブリ言語のままです。

1969 年の 4 月から 6 月ごろ、トンプソンは黒板上に以前(Multics 撤退後の GE-645 用に)設計されていた「チョーク・ファイルシステム」の名前で知られるファイルシステムについて考えていました。バッチシステムとは異なり、タイムシェアリングシステムでは同時に複数のユーザーでディスクを共有するため、適切にファイルを管理する必要があります。そしてファイルシステムは同年夏に PDP-7 上に実装されました。PDP-7 上に実装した理由はトンプソンが Space Travel を作っていたことで PDP-7 での開発に慣れていたからです。ファイルシステムを実装しテストが必要となり、トンプソンはテストを対話的に行えるようにしたいと考えていました。ディスクのスループットを最大にするためのディスクスケジューリングアルゴリズムを書いた時、テストのために大量のデータをディスクに置くプログラムが必要だと考えました。ファイルシステムのテストを行うためのユーティリティや環境を作っているうちにトンプソンは自分が作っているものに、いくつかの機能を追加すれば OS になることに気づきます。そして 1969 年の夏、妻が子供を連れて帰省したとき、これでプログラミングに集中できるぞと、1 ヶ月(文献によっては 3 週間)で OS、シェル、エディタ、アセンブラを作りました。信じられない開発速度ですが、当時は何もかも小さく移植性などなかったから(PDP-7 専用)というのは私の負け惜しみなどではなく理由として妥当だと思います。まだ Unix という名前はありませんでしたが、これが Unix の誕生の瞬間です。Unix は(ゲームではなく)ファイルシステムのテスト環境を作ろうとして誕生したのです。Unix は Multics から多くの影響を受けています。Unix は Multics のアンチテーゼではなく、Multics の素晴らしいと思った機能やアイデアを採用し、トンプソン流に小さく作り直されたものです。PDP-7 Unix 開発の初期段階は Space Travel と同じように GE-635 上のクロスアセンブラを使って行なわれました。ここからわかるように Space Travel が直接 Unix につながったわけではなく、Space Travel の開発が初期の Unix 開発の技術習得としての役目を果たしていたということです。そして OS としての形が出来上がる頃には GE-635 とのつながりを断ち切って PDP-7 単独で OS の開発ができるようになりました。

1970 年の前半にようやく新しい OS を開発するためのコンピュータの調達に成功します。要求が通った理由の一つは、以前は新しい OS の開発という漠然とした理由で要求していたのに対して、文書編集システムの開発という具体的な理由で要求したことです。つまり文書編集システムの開発を隠れ蓑にして、その基盤である OS の開発を行うことにしたのです。この妙案はトンプソンによるものではなく、Joe Ossanna によるもので、他にも Lee McMahon の尽力や、音響部門の Max Mathews が(こちらには心理学研究部門と書いてある?誰なのかは不明)自分たちの予算からシステムの初期資金を提供するという上層部を困惑させる提案によって新しいコンピュータの調達は実現しました。Unix の価値が認められたことが前提にありますが、トンプソン一人の力で Unix が成長できたわけではありません。そしてもう一つの理由は、コンピュータの価格が 1 桁小さかった(65,000ドル、1ドル360円計算で2340万円)ことです。調達したコンピュータは発売されたばかりの PDP-11 ですが、以前要求していた大型コンピュータの PDP-10 の後継機ではなく、別シリーズのミニコンピュータで価格も安かったのです。当時の Unix の機能は小さいとは言え性能の低い PDP-7 上でさえ OS を作ることができたわけですから、ミニコンピュータでも十分 OS の開発はできると気づいたのでしょう。PDP-7 よりは高性能の PDP-11 用に Unix の開発が始まりました。開発の初期段階、今度は PDP-7 に実装した PDP-11 用のクロスアセンブラによって開発が行われました。ちなみに PDP-11 にディスプレイはなく、ゲームはテキストによるつまらないものばかりでした。もしかしたらこれが Space Travel が PDP-11 用の Version 1 Unix に移植されていない理由かもしれません。

当初 Unix は移植性に重点を置いていませんでした。PDP-7 の性能では OS をアセンブリ言語で作るしか選択肢になかったはずです。ただし一般的なプログラムを高水準言語で書きたいという考えは持っていました。PDP-7 で Unix が動き始めたあとから PDP-7 で動く高水準言語の開発は始まりました。1969 年に Doug McIlroy によって TMG が移植され、それに触発されたトンプソンは Unix にはシステムプログラミング言語が必要だと考えました。最初は Fortran を使うことを考えていましたが、すぐに断念し BCPL をベースにした B 言語を開発しました。B 言語は中間コードを生成するインタプリタで遅かったので B 言語はあまり使われませんでした。1971 年に Version 1 と呼ばれる Unix が完成します。そして 1972 年に B 言語を元に開発された C 言語によって、1973 年に Version 4 と呼ばれる Unix が C 言語で書き直されました。ただしまだ PDP-11 依存のコードが多く含まれており Unix に移植性はありませんでした。この頃より Unix を他のシステムに移植するという実験が始まり、Unix と C 言語は移植性を実現できるように共に改良が行われました。そして 1977 年に Version 6 と呼ばれる Unix が PDP 以外のハードウェアに移植されました。Unix の誕生から 8 年後のこの瞬間に、移植性がある Unix と C 言語が誕生しました。

Space Travel 攻略のヒント

さて話をゲームに戻して私がしばらく遊んで考えた攻略のヒントです。

出発地点は地球で画面の中心です。地球の次に近くにある星が月ですが、まずは地球から離陸してすぐに地球に着陸する練習をするとよいでしょう。実際の宇宙船と同じように、着陸スピードが速すぎると地球に激突してしまいます。うまく着陸できれば画面右下に L (Landed)、激突すれば CL (Crash Landed) が表示されて停止します。

宇宙船の推進力の調整はスケールに依存します。初期のスケールではスピードが速すぎてうまく着陸することはできないでしょう。まず上キーを押して拡大します。そうすると地球を示す輪が大きくなっていきます。画面下中央にある数字が -12 ぐらいであれば着陸は簡単です。3 キーで離陸しすぐにちょんと 4 キーを押せばおそらくうまく着陸できるでしょう。最初のうちは旋回(左右キー)を押す必要はありません。少しずつ地球との距離を離して着陸の練習をします。地球に激突してしまったら2キーを押せば、そこから再開できます。

地球への激突に飽きたら次は月を目指すとよいでしょう。地球から一定の距離はなれると地球の重力圏から脱出します。そうなると他の星の引力に引っ張られ、目的地にたどり着くには左右キーによる旋回が必要になります。星同士の相互作用は計算されておらず、現在最も大きな引力の星に引っ張られるようです。地球の引力に囚われている場合は左下に earth と表示されます。宇宙空間の大半は無重力です。無重力と言っても一番大きな引力に引っ張られています。つまり宇宙空間の大半は太陽の引力に囚われており、大抵の場合左下には sun と表示されます。太陽に引っ張られている間はなかなか思い通りに動かせません。

特定の星に近づきその星の重力圏内に入るとその星の名前が左下に表示されます。当然ですが宇宙空間を移動してきたスピードでは星に墜落してしまいます。速度を緩めながら旋回しゆっくりと星に近づきます。その星の重力圏内に入ったらさらに画面を拡大しながら速度を徐々に落として着陸しましょう。私は月にはスケールを -16 にまでしてから着陸することができました。

他の星への着陸は遠くの星ほど「流されやすい」ようなので真っ直ぐ向かうというより、近づいていく方角をうまく見つけたら、あせらずゆっくりと近づくのを待ったほうが良いです。拡大して星の輪が見えだしたらあとは月への着陸と同じようにすればうまくいくはずです。私は海王星までたどり着きましたがスピードの調整がうまくいかず墜落してしまいました。海王星の近くには衛星らしきものが見えました。によるとどうやらフォボスへの着陸は難しそうです。もちろんフォボスとはカラスではなく火星の衛星です。どれがどの星かわからないので色を付けたくなりますね。

けしからん!Unixはゲームで遊ぶために作られた?

ゲーム「Space Travel」は、Unix 開発の技術の習得という点で大きな役割を果たしました。しかしトンプソンはゲームで遊ぶために Unix を作ったわけではありません。ゲームで遊んでいたのがバレてコンピュータが撤去されたり、撤去されそうになったこともありません。1プレイ(1時間?)50 ドルだか 75 ドルだか払わないと遊べないからゲームを作ったわけでもありません。

Space Travel は Unix を作る前に作られたことからわかるように、ゲームで遊びたいだけなら Unix を作る必要はありません。OS がなくてもファミコンでゲームができるように、プログラムが記録された紙テープさえあればゲームは動きます。初期のファミコンゲームにセーブ機能がなかったように、スコアやゲームの進行を記録する必要がなければファイルシステムも必要ありません。それらは後から作られました。Space Travel の開発で役に立ったのは PDP-7 の使い方の習得と、GE-635 の GECOS で動く PDP-7 用のクロスアセンブラの開発です。ようするにトンプソンはゲームで遊んだあとに Unix を作ったのです。Unix は最初アセンブリ言語で実装され移植性はありませんでした。C 言語も最初は移植性がありませんでした。移植性は後から実現されました。

さて「けしからん」というのは「IPA 独立行政法人 情報処理推進機構」のこの PDF(世界に普及可能な日本発のサイバー技術の生産手段の確立)の話です。(念の為に言っておくとこのページ以外は読んでいません。このページ以外の内容は知らないので肯定も否定もしません。)

ここまでこの記事の内容を読んだ人なら、このスライドの内容がおかしいことに気づくでしょう。訂正しなければなりません。

ケン・トンプソン氏等のいんちき社員達は、AT&T 電話会社の社内の GE コンピュータで、勝手に「スペース・トラベル」という惑星間宇宙飛行ゲームを自作して遊んでいたところ、会社によって、コンピュータゲームが撤去されそうになった。

会社でゲームができなるなるとイヤなので、ゲームを他の小型コンピュータに移植しようとした。これがきっかけとなり、「移植性のある OS とプログラミング言語」を一からいんちき開発してしまった。これが「UNIX」と「C 言語」である。

まず前提として、ケン・トンプソン氏等の天才達は、元は Multics という OS を開発しており、仕事の内容は基礎研究を行うことです。だから「社員」「AT&T電話会社」ではなく「研究者」「ベル研究所」と書いて、研究開発してるとわかるように書くとよいでしょう(その書き方だと電話会社で働いているただの社員がゲームで遊んでサボっているようにように思えるでしょ?)。ベル研究所は当時は AT&T の研究開発部門で子会社です。AT&T の分割などいろいろな経緯があって現在はノキアの子会社のようです。詳細は wikipedia(ベル研究所)などを参照してください。ケン・トンプソンはたまたま会社の中にいたおもしろ社員というわけではなく、高い技術力を買われて研究者として雇われたプログラマです。ベル研究所は高い技術力を持った人たちをたくさん雇い、自由に研究できる環境を与えました。そういう環境を作り多くの人を集めたことが前提にあっての話であり、保守的な会社の中に面白い考えを持った面白いことをする人がいて、思いがけず世界を変えることになったという話ではありません。ゲーム自体は仕事(研究)と直接関係はないとは言えるでしょうが、余暇 (spare time) に開発したと書かれています。プログラミング大好きなら自分の時間でプログラムするのはよくある話でしょう。「勝手に遊ぶ」というほどのことではありませんよね? 単に仕事で使っているコンピュータを空き時間に少し私的な目的に使っていたという程度の話です。

明らかな間違いは「ゲームを自作して遊んでいたところ、会社によって、コンピュータが撤去されそうになった」という点です。時代背景として当時はまだ家庭用ゲーム機が発売されておらず、ゲームはゲームを作ることができる専門家の高度な遊びというのも忘れてはいけないことですが、ゲームを自作して遊んでいたことはコンピュータの撤去の話と関係ありません。コンピュータが撤去されそうになった(実際に撤去された)のは AT&T が Multics の開発から撤退し、レンタルしていた Multics 用の GE-645 が不要になったからです。不要になったコンピュータをいつまでもレンタルしておいてもコストがかかるだけですから撤去するのは当たり前でしょう。そして代わりに GE-635 に入れ替えました。トンプソンは最初に Multics (GE-645) 用にゲームを開発しましたが撤去されることが判明し、GE-635 でも動くように Fortran に移植しました。1 プレイで 75 ドルかかった(内部的なコスト)話は入れ替えられた GE-635 での話です。ゲームをするのにそんなにかかれば誰でもありえないと思うのは当然ですが、それを理由に GE-635 は撤去されそうにはなっていません。だってゲームするのを禁止すればよいだけなのだから撤去する理由はないでしょう? 「ゲームで遊んでいたらコンピュータを撤去する」こともあるかもしれないと思ってしまうのは現代人の感覚です。だって GE-635 ってこれですよ?


https://multicians.org/ge635.html より


https://www.starringthecomputer.com/computer.html?c=427 より

こちらは Multics 用の GE-645、Space Travel が最初に実装されたコンピュータです。

大型コンピュータの「大型」を舐めてもらっては困ります。部屋に数人ずかずか入ってきて「はい、撤去~」なんて持ち出せるレベルではありません。数億〜数十億円もする値段のことを考えれば、移動先の部屋を確保して業者を手配して、何ヶ月も前から計画をたてなければいけないでしょう。だから撤去された GE-645 は「数カ月後に」撤去されると知ったわけです。不要になった GE-645 は撤去しますが、わざわざ入れ替えた GE-635 をたかがゲームに使っている社員がいたからって撤去しようとするわけがありません。この頃のコンピュータは複数人で共有するものであることをお忘れなく。ちなみに wikipedia - Space Travel (video game) には他の端末のジョブを実行している間ゲームは停止した (resulting in long pauses in the game while the GE 645 worked on jobs for other terminals) と書かれています。一つのゲーム(ジョブ)で長時間コンピュータを専有すると他の人に迷惑がかかるので、コマンド入力を含む任意のタイミング(ただしマルチタスクのような短い時間間隔ではない)でジョブの切り替えが行われるのだろうと思っていますが、信頼できるソースを見つけられていません。

話を戻して「会社でゲームができなくなるとイヤなので」ってどこまでゲームにこだわるんですか?って話なわけですが、ケン・トンプソンがやりたかったのはゲームで遊ぶことではなくゲーム作りです。ゲームを作るのも遊びの一環と考えることもできますが、現在のように既存のゲームを買ってきて「遊ぶ」のとはわけが違います。家庭用ゲーム市場が誕生していないこの時代、ゲームとはプログラミングして遊ぶものです。時代背景を知っている人なら常識かもしれませんが、最近の人がそのことに気づいているとは思えないので誤解を招きます。元々ケン・トンプソンの仕事は基礎研究で、ベル研究所の雰囲気からある程度の自由があったわけですが、ゲームが作れなければ作れないで別の方法で OS の開発を続けていたでしょう。結局のところトンプソンは「自分たちが快適にプログラミングできる環境が欲しかったからUNIXとC言語を一から開発してしまった」のです。その一環としてたまたまゲーム作りがあったのは事実ですが、本当の目的を間違えてはいけません。

ケン・トンプソンは Space Travel を PDP-7 に移植しました。しかし当初の開発(Unixも含む)では移植性のことなんて考えていませんでした。その証拠に PDP-7 版の Space Travel も PDP-7 Unix もアセンブリ言語で実装され移植性はありません。PDP-7 の性能では高水準言語を動かすことすらメモリ制限との戦いで実装できた事自体が偉業と言われるほどでした。Space Travel を作った時点ではではアセンブリ言語で作るのが当たり前だったのです。Unix と C 言語の移植性はあとから実現されたことです。遠因にすぎないゲームが、移植性のある OS とプログラミング言語を生み出したきっかけというのであれば、Multics の開発者として雇われたこともきっかけだとも言えますし、Multics の失敗(当初の約束を提供できなかった)や、ベル研究所が Multics の開発から撤退したことや、高性能な PDP-10 を買ってくれなかったことや、トンプソンの妻が 1 ヶ月の間帰省したことでさえきっかけと言えるでしょう。実際の所、ベル研究所に雇われて Multics プロジェクトに参加したのが Unix を生み出した一番のきっかけだと思います。これがなければプログラマとしては有名になってたとしても OS の開発者にはなっていなかったのではないかと思います。

あと細かいツッコミなんですが、参考文献(?)、なんでこれを選んだんでしょうか? もっといい参考文献があるでしょうに。

こちらも同じ「未踏会議2022」での話のようです。

AT&Tという、日本でいうNTTのような会社があります。保守的な会社ですが、その中におもしろ社員が数名いらっしゃいました。「スペース・トラベル」という惑星間宇宙飛行ゲームを自作して遊んでいたら、会社にコンピュータを撤去されそうになったそうであります。

別のワークステーションに移植しようとしましたが、いちいちプログラムを移植するのは面倒だから、一旦書いたら他でも動くOSレイヤーを作ってしまおう。さらに他のCPUでも動かせるコンパイラーも作ろうと考えました。この瞬間にUNIXとC言語が生まれた、といろいろな文献に載っているんです。

AT&T って保守的な会社なんですかね?(当時は)親会社である AT&T 電話会社は保守的かもしれませんが、ベル研究所は別の会社で文化も違いますよね? 少なくとも 1969 年時点のベル研究所は保守的とは思えないのですが。保守的な会社の中のおもしろ社員数名が世界を動かしたという話と、面白い考え方を持つ研究所の中でも世界を動かした人はわずか数名しかいないという話では全然意味合いが違ってきます。前者だと数名のおもしろ人物がいれば十分ですが、後者だと何人ものおもしろ人物を集めろという話です。撤去についての話は同じなので省略。「この瞬間にUNIXとC言語が生まれた」というこの瞬間とはいつのことでしょうか? ゲームを移植しようとした瞬間ではありません。Unix と C 言語の移植性は何年も掛けてようやく実現したものです。面倒だからと思いつきで簡単に生まれるようなものではありません。失礼を承知でいうと「いろんな文献に載っている」ということを知っているだけで、文献を読んでいるようには思えません。当初の Unix と C 言語に移植性がなかったことは The Development of the C Language などのいろいろな文献に載っているんです。

C came into being in the years 1969-1973, in parallel with the early development of the Unix operating system; the most creative period occurred during 1972. Another spate of changes peaked between 1977 and 1979, when portability of the Unix system was being demonstrated.

抜粋 C と Unix は 1969年から1973年にかけて誕生した。Unix の移植性は 1977 年から 1979 年に実証された。

At the time we did not put much weight on portability; interest in this arose later.

当時は私達は移植性をあまり重視してはいませんでした。これに対する関心は後になって生じました。

Although C was not originally designed with portability as a prime goal,

C はもともと移植性を主な目標として設計されていませんでしたが、

Space Travel を作ったのは 1969 年の僅かな期間の出来事にすぎません。C 言語ができたのは 1972 年、Unix が移植性あるものとなったのは 1978 年でまだまだ先の出来事です。最初は高水準言語でプログラミングをしたいという欲求から始まり、移植性の実現はその後です。高水準言語で書いたのだから、コンピュータへの依存を減らしていけば、移植性を高められるはずだと考え、何年も掛けて Unix と C 言語を改良し続けて実現したことです。最初の Unix と C 言語に移植性がなかったという基本的なことを知っていれば、先程の以下の文章すべてがでたらめであることがわかります。知識って大事ですね。

別のワークステーションに移植しようとしましたが、いちいちプログラムを移植するのは面倒だから、一旦書いたら他でも動くOSレイヤーを作ってしまおう。さらに他のCPUでも動かせるコンパイラーも作ろうと考えました。この瞬間にUNIXとC言語が生まれた、といろいろな文献に載っているんです。

探してみると、同様の内容をあちこちで話しているようです。

他にはこのようなことも言っているようです。

ただITエンジニアのアウトプットについては、一言申し上げるべきことがあると思っています。
ジャンクフードのような情報を吸収し、それに少し手を加えた程度の情報をアウトプットと呼ぶとしたら、そこに価値はないということです。

表面をなぞっただけの情報や正しさが担保されていない情報をどこからか拾ってきて、都合よくアレンジしてつくったコンテンツは総じてジャンクフード的と言えます。

・・・

正しい情報を拾ってきて、書きましょうね?

自作のソースコードを公開するにせよ、テックブログを書くにせよ、人の役に立つレベルのものを出そうと思ったら多大な労力が不可欠です。

一番は優秀な人が書いたソースコードを読むこと、二番目は歴史の風雪に耐えた名著を読むことですね。

外に向けて自分の考えやアイデアを発信するにしても、こうした勉強をしてからでも遅くはないのではないでしょうか。

そのとおりです。「言っていることには」同意します。私がこの記事を書くにあたって調べた多大な労力、読んだ名著、勉強したこと、つまり参考文献は後述しています。

大学院教育改革 フォーラム2023 12月

こちらでも言っていることは同じですが、どうやら比較的最近の話でも内容は変わっていないようです。

この C 言語というのはどうやって生まれたかという事実を見ますと、これは 1969 年に AT&T のコンピューターが置いてある部屋で社員たちがスペーストラベルという宇宙飛行ゲームを作って遊んでいたんですけど、Ken Thompson、Dennis Richie さんだと思うんですが、この二人が遊んでたら会社がそのコンピュー ターを撤去しようとしまして、それは嫌だから別のワークステーションにそれをコピーするんだといっても CPU が違いますし、OS も違うと動きません。

そりゃいかん、じゃこのスペーストラベルは他のコンピューターでも動くように OS ごとを移植しよう、そんな OS はありません、じゃ一から移植可能な OS を作ろうということで、UNIX を作ったんです。ところが、UNIX を作るときに当時のアセンブラでは大変ですし、COBOL とか FORTRAN というプログラミングではこれはプログラミング言語で OS は作れないんです。で B 言語ってやつがあったんですけども、これでも作れないので、彼らはなんと UNIX を作る専門の強い C 言語という言語をこの瞬間に発明しました。

つまり、スペーストラベルっていうので遊んでなければ、今ごろ我々は UNIX も C 言語もなく、手元にある Android とか MacOS とか iPhone や Windows のようなものもまともに動いてないんじゃないかと思います。

内容が同じなので私が言いたいことも同じですが、遊んでいたから撤去しようとしたわけではありません。GE-645 は実際に撤去されました。GE-635 は撤去しようとしていません。ゲーム体験の悪さと高額なプレイコストが嫌だからPDP-7 版を作りました。OS ごと移植しようとしていません。Space Travel のために OS の移植はしませんでした。Unix は当初移植可能ではありませんでした。Space Travel と Unix は当時の大変なアセンブラで作りました。ゲームなら COBOL や Fortran でも作れます。GE-635 版の Space Travel は Fortran 実装なのだからゲームをしたいだけなら Fortran の実装があれば十分です。B 言語はあったのではなくトンプソンが作りました。B 言語が作られた時すでに PDP-7 Unix はありました。C 言語を発明したのはこの瞬間ではなく 3 年後です。初期の C 言語は移植性を考慮していませんでした。Space Travel で遊んでを作っていなくても、プログラミング大好きなトンプソンなら Unix を作ったでしょう。本当に論文などを読んで話をしているのか、それとも話を大幅に端折りすぎた結果ツッコミどころだらけになってしまっているのか。なんで彼のような立場の人がでたらめな話してるんです? こんな話を広められては日本が心配になりますよ。

登大遊さんの話、えーと、一言で言えば、もっと自由になんでもやっていい会社を作ろう?会社の中にバンバンお金を使える研究所を作ろう?ですかね(知らんけど)、は(現実的かどうかは別として)別に良いと思いますが(というか、私は Unix に関する話のみを論点としており全体の話はざっと見ただけで知りません)、その中に「ゲームで遊んでいたら会社が撤去しようとした」みたいな、けしからんインチキ話を混ぜないで欲しいですね。Unix は快適なプログラミング環境を作るために自分のために作ったという話を、ゲームで遊ぶために作ったという「面白エピソード」にしてしまうと、もっと重要な本質が見えなくなってしまいます。結局にところ日本に昔かある「好きこそ物の上手なれ」が重要なことであり、加えて好きなものを持っている人を見つけて学校や会社や多くの人たちがサポートすることによって世の中を変えるものが生み出されるということなのではないでしょうか(知らんけど)。まあ、自身の「けしからんインチキ芸1」の話に結びつけるためにゲームで遊んだという話にしているのでしょう。ようするに「ゲーム作りは勉強になる」や「日本企業は研究開発にもっと投資しろ!」じゃ話題にならないから面白エピソードで釣ろうっていうコトですよね? まあ私もよくやりますよ。この記事もね。

最後に、Unix はなんのために作られたのかについて、ケン・トンプソンからブライアン・カーニハンへのメールで言っているかを紹介をしてこの話を終わります。

"The early days of Unix at Bell Labs" - Brian Kernighan (LCA 2022 Online)
https://youtu.be/ECCr_KFl41E?t=690
(「UNIX: A History and a Memoir」にも同じメールが記載されいている)

unix was a file system implementation to test thruput and the like. once implemented, it was hard to get data to it to load it up. i could put read/write calls in loops, but anything more sophisticated was near impossible. that was the state when bonnie went to visit my parents in san diego.

i decided that it was close to a time sharing system, just lacking an exec call, a shell, an editor, and an assembler. (no compilers) the exec call was trivial and the other 3 were done in 1-week each - exactly bonnie's stay.

the machine was 8k x 18bits. 4k was kernel and 4k was swapped user.

ken

Unix はスループットなどのテストをするためのファイルシステムの実装でした。

(まあ、理由の一つだと思いますが。誤字は原文ママ)

参考文献

この記事を書くにあたって目を通した書籍や記事や動画(全部詳しく読み込んでいるとは言わない)。順番はランダム。

以下、読むのに注意

さいごに

ということで、Unix 開発の基礎となった Space Travel の紹介と、なぜトンプソンは Unix を開発したのか?という話でした。論文などを見れば明らかなように Space Travel は Unix を開発する前に作られており、Space Travel をするために Unix を開発したわけではありません。Space Travel の開発経験が Unix 開発の役に立ったということです。Unix が開発される一番のきっかけは、あまりにも複雑だった Multics の開発に参加したことでしょう。Multics の開発に参加していなければ OS の開発に興味を持たなかった可能性が高いですし、Multics の開発が順調であれば AT&T が撤退することもなく Unix が作られることもなかったでしょう。ですが自分の OS を開発したいと思ったトンプソンさえいれば、Space Travel がなくても Unix は開発されたはずです。

トンプソンは、自分の楽しみのために Unix を開発しました。その楽しみの中にゲームも含まれますが、遊ぶというよりも作るといったほうが正確で、ゲーム「も」作っていたというだけなんです。面白いエピソードを聞いたからといってそれが全てだと思ってはいけません。トンプソンの本当の楽しみとは自分が理想とする OS の開発を行い、そのための快適なプログラミング環境を作ることです。

つまり「Unix は快適なプログラミング環境を作るために作られた」ということなんです。

登 大遊さんの例のスライドなんですが、なんと記事公開の本日、デブサミ2024関西の「コンピュータ技術とサイバーセキュリティにおける日本の課題、人材育成法および将来展望」でどうやら同じものが発表されているようです。このタイミングは完全に偶然です。知りませんでした(笑) 記事をぶつけるような形になってしまいましたが、ついでなんでキッチリとぶつけときましょうかね(← 反省してない)。いつまでもこんな話を広められても困るからねしょうがないね。

あと今回の話と直接関係はないのですが、Unix のような革新的なものを生み出すためには自由な環境が必要だとは思うのですが、技術に関してはある程度の制限があったほうが革新的なものが生まやすいのではないかというのは前から考えています。低い性能のコンピュータを使って作れという話ではなく、低い性能のコンピュータでも動くように作れみたいな意味ですね。実際トンプソンも高性能な PDP-10 を買ってもらえなかったことが結果として経済的で優雅な設計につながったと語っています。これをトンプソンは「salvation through suffering」(苦しみを通じての救済)という難解な言葉で説明しています。まあ、あとはやっぱり環境ですよね。人材を育てるのももちろん重要ですが、結局のところすごい人が数名いたところでできることは少ないので、組織を育てることが重要です。組織自体はすごい人材で構成する必要はないんですよ。人に投資して人を育てるという考え方を持った組織。すごい人を支える多くの普通の人々で構成された組織。そのアイデア良いね、微力ながら協力するよ。という人が集まらなければ、すごい人も雑務に追われて革新を生み出す時間が無くなってしまうでしょう。

さて、ゲーム「Space Travel」なんですが最初は宇宙船の動きがまったく制御しきれずに、これちゃんとオリジナルの操作感で移植できてるんか?って思ってしまったのですが、わかってしまえば十分ゲームとして成り立っています。なので例えば全惑星制覇 RTA とかやったら楽しいのではないでしょうか? 55 年前の伝説のゲームで盛り上がるとか最高の展開だと思います。方角を合わせてゆっくり近づくと良いと書きましたが、RTA だと逆に高速というか光速を超える速度で移動することになるのでしょうね。いかに着陸時の減速操作を素早く行うか。誰が一番最初に 100 秒を切るか、そこからどこまで時間を縮められるか、そういう戦いになりそうです。Spacewar! の方が古いですが対戦ゲームなので RTA には不向きそうです。

あと最後に一言、なまかじりの知識でトンプソンはゲームで遊びたいというけしからん動機で Unix を作ったなどと言うのは失礼だからやめろ

  1. 私は一般的な用語に一般的ではない意味を与えて、聴者に「言いたいことわかるよね?」と必要もないのに文脈に応じて意味を考えさせる「理解に無駄に負荷をかける手法」を良しとしません。

252
166
14

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
252
166

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?