西暦3000年、地球外生命体はlinux kernelをコンパイルできるのか？

#この問いかけにまじめに考えてみる。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ほぼ全てのソースコードってランタイムなりコンパイラとして何かしら別のものに依存しているはずだけど、最終的に行き着くだろうOSとかってそもそもGitHub上に存在するのかな<a href="https://t.co/KNME92Qcz8">https://t.co/KNME92Qcz8</a></p>&mdash; yuta (@yuta0381) <a href="https://twitter.com/yuta0381/status/1284365296761856000?ref_src=twsrc%5Etfw">July 18, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# TL;DR(要約)

- RISC-VだったらCPUから作れそう。エミュレータのコード見て自作もできそう。
- RISC-Vだったら、多分linux動かすところまで行けるよ！
- x86とかだったら、動かそうとするけどライブラリ古くて苦しむよ！
- Linux Kernelだけ見ても、GitHub上にすべての依存する「最新の」コードは存在していない。若干古かったりするので、そこらへんは地球外生命体の人に頑張ってもらうしかない。


# 前提条件

西暦2500年、地球人類は滅亡した（唐突）。北極には、かつてGitHubが残したオープンソースコードが深い眠りについていた……。

西暦2900年、地球外生命体は地球人類が滅んだあとの地球に降り立った。だが、かろうじて石碑などに残された文字から基本的な構文は読み取れたものの、本や電子データの多くは失われた。

西暦3000年、偶然、北極海に眠るGitHubのスナップショットを見つけた！！地球外生命体は、このスナップショットを偶然解読することに成功した！

https://japan.zdnet.com/article/35145444/

さて、このGitHubのスナップショット"だけ"を使って、無事に２０２０年のアプリケーションを動かせるだろうか？

（ここでデータがあっても破損しているとかあったらもうどうしようもないので…）

# まずCPUがないと話にならない

と、その前にCPU！地球外生命体がx86 CPUを持っているとは限らない。現在であっても、Z80やV30といった1980年代のCPUは存在し続けている。とはいえ、人類滅亡後500年経過したら、現行CPUは動いていないだろう……。

## QEmu

まず、最初の可能性はQemuでのエミュレーションコードからの解析である。

https://github.com/qemu/qemu

例えば、下記ファイルなどを丁寧に読むことで、システムコールというものがあったのか、などが分かるかもしれない。

https://github.com/qemu/qemu/blob/master/linux-user/x86_64/syscall_64.tbl


## RISC-V

また、RISC-VのレポジトリにはISAそのものの仕様書もある。となれば、こちらを基に、地球外生命体がRISC-Vもどきを作り上げることができる可能性は高いとみてよいだろう！

https://github.com/riscv

え？英語が解析できるかって？多分できるという前提で…


※というか、必要になるライブラリ全部ほぼほぼここにそろってる……

https://github.com/riscv/riscv-gnu-toolchain

binutils/dejagnu/gcc/gdb/glibc/newlib ....

気を取り直そう……

# Linux Kernelをコンパイルしてみよう

## カーネル本体（ある）

よし、Linux Kernelそのものは、githubにある！

https://github.com/torvalds/linux

では、これをコンパイルするのに何が必要なのか？

https://www.kernel.org/doc/html/latest/process/changes.html

## GCC（ある）

https://github.com/gcc-mirror/gcc

## Gnu Make（ある）

https://github.com/mirror/make

あ、Makeのドキュメントもあった。なるほどなるほど・・・。

https://github.com/jr4qpv/GNU_Make_3rd_jp

## Binutils (ない）

https://www.gnu.org/software/binutils/

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git

# pkg-config（ない）

https://www.freedesktop.org/wiki/Software/pkg-config/

個人forkならばあったが…

## Flex（ある）

https://github.com/westes/flex

## bison（ある）

https://www.gnu.org/software/bison/

https://git.savannah.gnu.org/cgit/bison.git

MaintainerのAkim Demailleさんのレポジトリがあるから、安心ですね！

https://github.com/akimd/bison

## Perl（ある）

https://github.com/Perl/perl5

## BC（ない）

https://www.gnu.org/software/bc/


## OpenSSL（ある）

https://github.com/openssl/openssl

## ただし……

じゃあこのライブラリを使っているライブラリはどうなの？と検討し始めると、多分終わらない……

あとは、個人がforkしたレポジトリがあればそれが保存されている可能性もある…

# まとめた感想

- 一部プロジェクトは、github上にないので、せっかくのチャレンジの効果が十全ではない。
- Linux Kernelだけ見ても、GitHub上にすべての依存する「最新の」コードは存在していない。若干古かったりするので、そこらへんは地球外生命体の人に頑張ってもらうしかない。

# そのあとは？

Linuxが動き始めたら、あとはSelf Compilieでライブラリ作れるようになるはず。

「未知なる地球外生命体のコンピュータ上で動く、地球人類のコンピュータのためのクロスコンパイラ」づくりが大変かなあ…

なにせ我々とは違うので、もしかすると「レジスタ？何それ美味しいの？」というぐらいアーキテクチャ違うかもしれない。

#まとめ

- RISC-Vだったら、多分linux動かすところまで行けるよ！
- x86とかだったら、動かそうとするけどライブラリ古くて苦しむよ！
- Linux Kernelだけ見ても、GitHub上にすべての依存する「最新の」コードは存在していない。若干古かったりするので、そこらへんは地球外生命体の人に頑張ってもらうしかない。