趣味は「架空世界創作」 スタンフォード大学に通うhsjoihs氏

hsjoihs氏(以下、hsjoihs):よろしくお願いいたします。こういうタイトルでやっていきたいと思います。「long version」と書いてあることからもわかるように、2022年9月17日にセキュリティキャンプのアフターイベントで発表した5分の「short version」を長くしたものとなっています。あらかじめご了承ください。

自己紹介です。hsjoihs(はすじょい)と申します。スタンフォード大学の学生をしていて(※登壇当時)、数学科と物理学科と応用・工学物理学科を並行でこなしています。セキュリティキャンプのCコンパイラゼミに長く関わっています。2023年4月から日本で働く予定です。TwitterとGitHubはアカウントが2つずつあって、こんな感じです。よろしくお願いします。

好きなことですが、言語と言語史が大好きです。言語と言語史が大好きで、コードを書くのもわりと好きです。あと、人に教えるのも好きですが……書き忘れたな。まあいいや、次にいきます。

私が6年間やっている趣味に「架空世界創作」というものがございまして。これはどういうことかというと、(スライドを示して)こんな感じで架空世界の言語とか伝統遊戯といった形態の創作となっております。

架空世界創作をやる上で気になるのは、世界がどうなっているか。人類はどういうことをするのか。このサンプルデータは多いほうがいいと。まぁそういう気持ちになるわけですね。

ということで、架空世界創作をやる上でぜひとも欲しいスキルは全知全能ということになるわけですが、全知全能になるのは難しいということが知られていて、全知全能になるのを妨げるさまざまな物理学的制約があるのですね。困りますね。そういう学科にいるので、そういう物理学的制約に詳しいです。

話を戻します。ちなみに、Fadisさんのプレゼンにもあったように、Unicodeの仕様書には全世界の文字の闇が収容されているので、「人類ってそんなことをするの!?」というのをお手軽に体験するのに便利です。読むと全知全能に近づくということで、1,000ページぐらいあった気がしますが、このUnicode15.0.0の仕様書をお暇な方はぜひ読んでみてはいかがでしょうか。

架空伝統ゲーム「机戦(セッカイク)」を創作

hsjoihs:Unicodeコンソーシアムの回し者みたいなことをしたところで、さて、架空世界創作。具体的にどういうことをやっているのかという話をしていきたいと思います。私はどういうことをやっているのか。その中の1つをちょっとピックアップして、架空伝統ゲーム「机戦(セッカイク)」について述べていきたいと思います。

架空伝統ゲーム「机戦(セッカイク)」。架空伝統ゲームという名前が1行矛盾していますが、架空世界の人間が慣れ親しんでいるという設定のゲームなわけです。当然、すべてが架空世界の文字・言語で書かれています。

なので(スライドを示して)こんな感じの箱に、こんな感じの駒とかが入っていて、公式ルールブックが当然異世界言語で書いてあります。

そしてこれが向こうの世界でのドキュメンタリーとなっております。

そのオンライン対戦を実装しました。オンラインで遊ぶことができます。やったね!

点数が入るとこんな感じで自動で計算されて、点数がちゃんと表示されて、この点数を受け入れるか、それとも受け入れずにさらにシーズンを続行してレートの倍率を倍に上げるかどうかを選ぶボタンが出るというUIを組んでおります。実演は時間が読めないので全部最後に回します。

「架空世界の言語を話す架空世界の人間のためのOSのモックを作ろう」

さて、2022年7月末、オンライン対戦のUIの異世界文字化を8時間かけてほぼ完遂した段階で、次に何をしようかと私は考えました。

当時の状況を見てみますと、その後の1週間の8月7日から13日、セキュリティキャンプというところで講師をやる。秋学期は9月25日に始まる。その間、6週間暇がある。ということで、暇が6週間あるんだから、「そうだ、架空世界の言語を話す架空世界の人間のためのOSのモックを作ろう」という発想に至ったわけです。

実は5年前から立案しておりまして、低レイヤー側から掘っていました。アセンブリ言語を定めたり、呼び出し規約を定めたり、文字コードを定めるべく架空言語の文字を収集・整理したりと、そういうのを細々とやっていたのですが、やはり抽象的なことだけをやってもね。やっている本人が楽しくても、あまり他の人間の興味を引けないんですよね。あと人生が忙しかったこともあって、それなりに停滞していました。

ということで、今回は高レイヤー側から掘ろうという方針でやっていくことに決めました。『ゼロからのOS自作入門』のMikanOSを改造して、高レイヤー側からどんどん異世界化していく方針で攻めていく、というのを今回はやってみることにしました。

ゆえに、厳密には異世界のグラフィカルシェルを実装していることになります。資源を管理してアプリ間を調停するのがOSだというスタンスからすると、これはOS自作ではないということになります。

一方で、『ゼロからのOS自作入門』にも「OSを作るにはコツがあります。それは最初から完璧に作ろうとしないことです。最初から完璧を目指すと手が止まってしまってぜんぜん前に進まなくなります」と書いてあるので、高レイヤー側から異世界化させるという方針でいいんじゃないかなということで、今回それでやっていくことに決めた次第です。

そもそもですが、OS自作というのはみなさんやっているわけですね。要出典・要検証、大言壮語かもしれませんが、それは置いておいて。私もリソース管理の処理を再実装することに関する情熱がどうしても少し薄くてですね、興味はあるのですが、情熱は正直そんなにありません。

一方で、先ほどからご覧になっていただいているように、言語というものを再実装することに関しては、大いに情熱を持っていることがおわかりいただけたと思います。時間は有限なので、情熱のある分野に集中砲火すべきという発想に至りました。

なので位置付けとしては、向こうの世界のOSの上にかぶさっているグラフィカルシェルをMikanOSというフレームワークの上に移植したもの、というスタンスのものを作っていこうと考えています。

フレームワークがMikanOSなのでx86-64をターゲットにすることになりますし、アプリケーション自体もx86-64で動かすことになるので、5年前に考えていた自作アセンブリ言語はいったんお預け。一方でグラフィカルな部分は、すべて異世界人の好みに合わせてやろうじゃないかと、そういう目論見でスタートしたわけです。

ツールチェーンを図で説明

具体的にどんな感じか、まずツールチェーンを見てみましょう。アプリケーションを書くための高級言語はリパライン語……向こうの言語ですね。ベースで設計をして、コンパイラは自分で書く。リンクされるべきライブラリも自分で書いて、テキストファイルのエンコーディングはASCIIと互換のないものを設計して、コンパイラはそれを読んでASCIIで書いたx86-84アセンブリを吐く。と言ってもわかりにくいので図示します。

現世では英語ベースの高級言語があって、それがコンパイラに入ることによって英語ベースのx64ニーモニックが発生する。それがアセンブラに入ってx64用object fileになって、英語関数名の標準ライブラリとリンクされて実行形式ができて、それが現世CPUで実行されて現世言語での入出力が発生する。

異世界では同様にリパライン語ベースの高級言語があって、それがコンパイラを通ってリパライン語ベースの2003lkニーモニック、アセンブラを通って2003'd ferlesylを通ってobject fileになる。それがリパライン語関数名の標準ライブラリとリンクされて実行形式ができて、向こうのマシンで実行されると異世界言語で入出力が発生する。まぁこういう構造になっているわけですね。

今回はこのx64にまつわるところはそのまま残して、それ以外のところを英語ベースではなくしていく。そういう感じを目指していくことになっているので、今回はこのマゼンダの枠で囲んだものを自作する必要があります。コンパイラを自作する必要がありますね。それはがんばっていきましょう。

デスクトップ環境の説明

次にデスクトップ環境ですが、アスペクト比を1:√2にしてみたいとか、せっかくなのでタスクバーでないような仕組みを模索したいとか、初期3Dゲームみたいに本棚から本としてメタファーされるアプリケーションを取り出して視点を下ろして横に広げて、机自体をスクロールするとか、そういうUIを作ってみるのもおもしろいのかなと思っていますが、完全に未着手でアスペクト比以外はまだMikanOSのままです。

画像やフォントの形式。色空間、sRGBというのは、「西暦1996年に流行っていたモニタ」の特性らしいので、向こうではちょっと違う色空間がはやっていてもおかしくないなぁと思っています。

圧縮アルゴリズムなぁ、まぁランレングス圧縮はさすがに向こうにもあると思います。実はフォントデータ自体はすでに何種類か作ってありますし、今現在他の知り合いにももう1種類作っていただいているので、そこらへんを使うことでフォントデータ自体はあります。なのでそれのフォーマットさえ定めればいいというわけですね。

(次回へつづく)