自作言語を自作コンパイラでコンパイルして自作CPUで自作OSを動かしてみたい
はい。タイトルオチです。
とっても長い時間がかかりそうな、長期的な目標のお話です。
その前に、ざっくりとコンピュータの解説をしていきます。
計算機についての知識がある方は後半まで読み飛ばしてね。
パソコンはどうやって動いているか
まず、CPUあたりのお話から。パソコンの内部にはCPUという部品があります。CPUはよくパソコンにとっての脳と言われています。
しかし、CPUは人間の脳のように思考しているわけではありません。
パソコンは機械の一つですね。機械ということは電気で動いている。
コンセントを挿せば電子レンジが動き、電池があれば電卓が動くのと同じようなことです。
つまり、CPUもとより機械は電気しか扱うことができません。
具体的に言うと、CPUにとってわかるのは電気があるかないか(電圧が高いか低いか)。0か1かということだけです。
この0か1を伝えていくことで足し算、引き算などを行っているのがCPUです。
(0や1を伝えていく回路を論理回路といいます)
CPUに0と1が並んだものを渡せば、CPUが計算をしてくれるということですね。
ということは、「0と1が並んだもの」はCPUに対する命令と捉えることができます。
じゃあ、パソコンを動かしたいのならたくさんの命令(プログラム)をCPUに伝えていけばいいということになります。
ここで発生するのが、非常にプログラムが書きにくいという問題です。
コンパイラの必要性
プログラムを書くときに毎回0と1を並べなければならない。とても面倒で生産性が低いですよね。
ここで人類が思いついた手法が、「人間にとってより読みやすいようにプログラムを変換する」ということです。
0と1の羅列は、CPUが何をするかという命令を英語で記述した言語に変換されます。この言語をアセンブリ言語といい、アセンブリ言語から0と1に変換するソフトをアセンブラといいます。
その変換された言語は、さらに人間にとって読みやすい言語になるように変換されていきます。このように変換されたものを高級言語といいます。
このように人間が読みやすいものに変換するソフトをコンパイラといいます。
プログラムを書く準備はできた。これでたくさんソフトをつくることができます。
しかしソフトがたくさんあるとまた問題が起きます。
パソコンは情報を記憶することができます。とあるソフトが動くために情報を記憶した部分を他のソフトが勝手に書き替えたらどうなるでしょう。
勝手に情報が変わっていると、動くはずのソフトも動かない。
それぞれがやりたいことを好き勝手しているとろくに動かないのです。
これらのソフトをまとめて管理するものが必要になってきます。
OSの役割
OSはたくさんのソフトをまとめて管理するソフトです。
OSは情報を記憶する部分(メモリ)のどこが空いているかを常に把握しています。
また、OSはソフトの同時起動を可能にしています。例えばブラウザでネットサーフィンをしながらワードで文章を書けるようなこともOSが可能にしています。
ソフトを大量に扱うにはOSは欠かせないんです。
ざっくりで抜け落ちているところもありますが、これで0と1の世界からみなさんが使っている環境の話まで戻ってくることができました。
ここでやっと本題。
僕の目標は以上のことをすべて自分で作り上げることです。
やりたいこと
最初のCPUからOSまで、すべて自分で作ってみたいというロマンが僕にはある。
今のところの展望は、
自作CPU(自作アーキテクチャ)はFPGAという、論理回路を自分でつくることができる機器を使う。
コンパイラについては
自作アセンブラを作成する。
自作コンパイラを使って自作高級言語からアセンブリ言語まで変換できるようにする。
という流れになりそう。
とても長い時間がかかりそうだけど、のんびり取り組んでいきます。