無限多世界解釈

前から思ってたことを言語化しておこうと。

 

ゲームとかアニメとか小説とか漫画とかで、パラレルワールドが出てくることがある。過去のある時点で、何かしらの選択や結果が異なる、別の世界だ。歴史のIFルート。何かしらの作品のファンなら誰でも考えてしまうそれが、もしあったら、という世界観。まあ面白いのだけども、そういうのを見かけるたびに俺は思うのだ。世界が分岐するというのはどういうことなのか、と。

 

物語的には、誰かが何かをした/しなかった、何かを成し遂げた/成し遂げられなかった、運がよかった/悪かった、のような感じで分岐させるのがわかりやすい。しかしだ。人間の行動だけが、行動の結果だけが、世界を分岐させる条件であるというのは、いくらなんでも都合が良すぎる。わかりやすすぎる、というか。俺がここで今、6面体のサイコロを振ったら、世界は6個に分岐するのか?冷静に考えておかしくないか?

もっとこう、例えば量子力学的な感じで、ミクロの確率があっちに倒れるかこっちに倒れるかで世界は莫大な分岐をし続けている、とか言われたほうが納得がいく。しかしこれだと今この瞬間にも数えきれないほどの分岐をしていることになる。でもそうかもしれない。事実上、世界は、宇宙の始まり時から(もっと前からかもしれないが)、何かしらの確率により、無限の分岐をし続けている。と言える。のかもしれない。

 

パラレルワールドが無限にあると考えると、この世は楽しくなる。

無限にあるということは、あらゆる世界が実在するということだ。例えばハリウッドの有名な映画の世界も、売れてないマイナーな漫画の世界も、こっそり気に入っているエロゲの世界も、無限のパラレルワールドの中には実在する。そう、実在しているのだ。貴方が日頃妄想して、誰にも話したことのない、公開すれば大ヒット間違いなしの物語も、無限にあるパラレルワールドの中には実在する。

そして、世界は無限にあるので、例えば今現在これを読んでいる時点の貴方が異世界に突然飛ばされて大活躍する世界も実在する。

ん?何かおかしい?いや、そんなことはない。世界は無限に存在するのだ。だからどんなことでもありえた世界が存在する。

 

この無限多世界解釈(と名付けよう)に基づいて考えると、例えば時間移動についても説明ができる。

例えば主人公が過去に行ったとする。主人公の主観的には確かに過去に移動したように感じる。しかし、実際には、「元の世界と全く同じだが別の世界の、歴史のある時点に、未来に生きた記憶を持った人間が突然現れた世界」の物語に移っただけ、と考えられる。従ってそこで何をしようが、別の世界なので元の世界に影響はしないし、そもそも世界移動してないし、どうでもいいということになる。また、元の世界に戻るような行動をしても、それは元の世界に戻ったのではなく、「元の世界と全く同じだが別の世界で、突然人が消えて、過去で活動した記憶を持った人が突然現れた世界」の物語に移るだけである。もちろん、体を構成する物質や記憶その他もろもろ、怪しいところは一切ない状態であるからして、本当に過去に行ったのか、実は無限多世界解釈が正しいのかは、証明できない。主人公の主観的には時間を移動したと信じることができる、ということだけは言える。

 

無限の世界があるということは、今いるこの世界とまったく寸分違わず同じ世界も、また無限に存在していると言える。ちょっとだけ違う世界も無限にある。突然魔法が使えるようになっちゃう世界もあるだろうし、ゾンビが沸いちゃう世界もあるだろう。なんせ無限にあるのだから、想像する限りはあるし、想像できない世界も無限にあるわけだ。妄想がはかどる。素晴らしい。

ただ一つ不満があるとするなら、常に何か不思議なことが起こってもおかしくない状況だと言うのに、これを書いている俺の身の回りには何も起こらないということだ。なぜよりによってこんな世界に俺はいるのか。納得いかない。

 

RISC-Vを目指す(6)

やってみたいことが無いわけではないのだけども、なかなか具体的なやり方がイメージできないので、とりあえずRV32Iの命令を一気に実装してしまおう。と言ってもCSR系の制御命令は今のところサッパリわからないので保留。なので残りの命令はlui、auipc、条件分岐、演算である。
lui/auipcは即値20bitを指定レジスタの上位20bitに設定(下位12bitは0固定)するもので、oriと組み合わせて32bit値を作ることができる。luiは指定値そのまま、auipcはPCの値を加算する。PCの値をレジスタに持ってくる命令はauipcだけだと思うが、jalrとセットにすれば遠いアドレスに相対ジャンプすることができる。これら2つの命令は即値には12bitシフトした値を指定することになるので非常に使いづらいが、実際にはアセンブラの擬似命令li/callとして他の命令との組み合わせで使われるので大きな問題は無い。
条件分岐命令はbeq/bne/blt/bge/bltu/bgeuの6種類。それぞれ、=、!=、<(符号付)、>=(符号付)、<(符号無)、>=(符号無)となる。>と<=が無いがオペランドを入れ替えればいいだけなので問題は無い。
演算命令はadd/addiは既にあるので、sub/and/or/xor/sll/srl/sra/slt/sltuとsub以外のi付きが残っている。算術演算、論理演算、シフトで、最後の2つは比較命令である。<だったら1がレジスタに書き込まれる。
では作る。

続きを読む

RISC-Vを目指す(5)

ぼっちの引きこもりはお正月ヒマなので。っていうか年末に大阪行く予定だったのが食あたりでダウンしていたのでそのままって感じ。
ともあれ、今回は今までに作ったロード/ストア系命令を揃えることにしてみる。ちなみに前回のlb命令は符号拡張するべきだったがゼロ拡張してしまっていたのでバグということになる。ゼロ拡張する命令はlbu。

続きを読む

RISC-Vを目指す(4)

新年明けましておめでとうございます。
さて、去年に引き続きRISC-Vの命令セットを実装してみる試練。前回でっちあげたRAMは書き込みしかできなかったので、lb命令を実装してRAMからの読み込みを作ってみよう。書き込みができたのだから読み込みも簡単かと思いそうだが、実際のところちょっとだけ読み込みのほうがめんどい。

続きを読む

1年まとめ

今年は特に何もやってないな〜と思いつつ、1年まとめ(2年連続2回目)。記事自体少なかったし、真ん中9ヶ月ぐらいあいてたしね。今年は仕事で忙しいプロジェクトの応援が5つ(炎上しすぎ)あったのと、なろう小説読み漁ってたりしたのもゲフンゲフン
・ベクタグラフィックスで遊んだ
・DXRubyに3D機能を実装してみた
・WebAssemblyを勉強してみた
・Rust勉強してみたが難しかった(記事なし)
・Crystal勉強してみたがWindowsで動かなかった(記事なし)
WebGLで遊んでみた(記事なし)
RISC-VのCPUを作ろうとしてみた
あー、特に成果は無いな、うん。
この記事を書いている時点ではRubyも2.5が出て、デフォルトでTrace命令が出力されなくなってかなり高速化したっぽいのだが、それはそれとしてDXRubyは2.3対応で止まっている。あと1年したらRuby2.6が出て2.3のサポートが終わってしまうので、それまでに何とかしないと過去の遺物になってしまう。一応さぼってたわけではないのだが(いやさぼってたのだが)、RubyInstallerが作者が忙しいという都合でRuby2.4から別の人が作ったRubyInstaller2に変わっていて、それに対応できずに困っている状態なのだな。来年こそは何とかしよう。うむ、来年の目標だ。あれ、目標って正月に立てるんだっけ?
いまやっているのはRISC-Vなのだが、これはオープンソースアーキテクチャでライセンス料がかからない。世の中のSoCには独自命令セットのCPUコアが入っていたりするのだが、そういうのを作るとコンパイラその他ツールを作るのに労力がかかる。それをARMとかにすると労力の代わりにお金(ライセンス料)がかかるが、RISC-Vならどっちもかからずツール類が揃った環境が手に入る(予定)。という感じで一般ユーザの目に入らない部分だけで置き換わっていく可能性が高い。すぐにスマホのCPUがRISC-Vになる、ということは無いだろう。例えばWestarnDigitalがHDDなどの制御チップをRISC-Vにすると発表していたり、nVidiaGPU内蔵コントローラをRISC-Vにすると発表していたりするし、まあ、そっち方面。Esperantoが作ってる4000コアのやつの性能次第では注目を受けるかもしれない。
ともあれ、来年はどこかでDXRubyをどうにかしよう。Mingwでビルドするのも視野に入れつつ。うちのPCを新規調達するのも予定として。64bitもどうにかできるといいな。
まあ、そんな感じで、みなさま良いお年を。

RISC-Vを目指す(3)

いまのところ、プログラムは回路埋め込み状態つまりマイクロコードとなっているわけだが、いずれRAMに書き込んでそれを読んで実行できるようにしたい。とは言えそれができるようになるにはまだまだ先が長いので、とりあえずはRAMを外部に作って値を書き込むことができるようにしよう。RISC-Vでのメモリ書き込み命令はstoreシリーズで、まずはsb(1バイト書き込み)命令を作ってみる。

続きを読む

RISC-Vを目指す(2)

RISC-V命令セットにしてみたらハンドアセンブルで命令を並べるのが大変になってしまったので、非常に雑にアセンブラを作ってみた。これもずっと前に作ったx86アセンブラを持ってきて書き直したものである。RISC-Vアセンブラ · GitHub
このような感じにシミュレータのコードに埋め込んで使う。

# 8アドレスぶんの命令
rom.d = RISCVASM.asm do
  addi r1, r0, 0
  addi r2, r0, 0
  addi r3, r0, 1

label :fibonacci
  add  r1, r0, r2
  add  r2, r0, r3
  add  r3, r1, r2
  jal  r0, :fibonacci
  nop
end.map{|t|_to_pin(t, vcc, gnd)}.reverse
続きを読む