OS と言語処理系をすべて自作する
OS と言語処理系(アセンブラ,コンパイラ,リンカ,ライブラリ)を自作するプロジェクトです。
OS と言語処理系の総称を OpeLa(Operating and Language processing system)と名付けます。
作るもの
- x86-64/AArch64 用の OS
- x86-64/AArch64 用のアセンブラ
- 独自言語コンパイラ(言語仕様から自作する)
- リンカ
- ビルドツール
- ライブラリ(言語処理系および OS を作る際に使う)
- デバッガ
独自言語なのは、C/C++ では若干、OS を書くのに適さない仕様があるからです。OpeLa 言語は OS を書くのに適した仕様にします。
「全部自作」と銘打つからには、OS も言語も独自仕様にしてみたい、という理由もあります。
CPU アーキテクチャ、ソースコードの文字体系なども独自仕様にする余地はありますが、そこまでは流石にやりません。
目標
小さい OS だけ作ってもあまり面白くありませんし、かといって作り込むのは際限がありません。
それぞれをどこまで作るかの目標を立てます。
目標は「OpeLa 言語で再実装した MikanOS 上で、OpeLa 言語処理系と MikanOS をビルドできるようになること」とします。
要するに、言語処理系と OS のセルフホストです。
この目標を実現する際の制約事項(レギュレーション)は次の通りです。
- OS は MikanOS を OpeLa 言語で再実装することで実現する。
- MikanOS は教科書があるので、OpeLa プロジェクトへの参入者に対する障壁が低い。
- 開発途上では既存の OS や言語処理系、テキストエディタ等を使ってよい。
- 最終的に自分で書いたコードのみですべてが構成されること。
- OSS なライブラリ等も一切使わず、必要なら自作する。
- x86-64/AArch64 のマシンで動作する OS と言語処理系を構築する。
作るものは、上記の目標を満たす最小限のものを目指します。
といっても、理論的な最小限を求めるのは難しいので、実装コストと有用性のバランスを取ります、くらいのニュアンスです。
例えば、プログラミング言語に構造体が無くても OS は書けるでしょうし、if 文と goto 文さえあれば for や while は無くてもチューリング完全になり、任意の計算が可能です。
ただ、for や while が無いとプログラミングがとても辛いですから、言語仕様に組み込みます。
一方、C++ の例外機能や Scala のパターンマッチのような機能は OS を書く分には無くてもそれほど困りませんので実装しません。
言語仕様以外の部分でも同様の判断を行い、どの機能を入れるかを選択します。
作る順序
作ったものはなるべく活用する方針で作る順序を考えてみました。
スタート地点はコンパイラとします。コンパイラがあれば他の部品をそのコンパイラを使って作れるからです。
仮に最初に OS を作ると、「作ったものを活用する」という方針により、その OS 上で残りのプログラムを開発したくなりますが、これは難しいことです。
なぜなら OS だけがあっても、その OS 上で動くコンパイラやエディタが存在しないからです。
その OS で動くコンパイラらエディタが完成しない限り、OS を活用できません。
- セルフホスト可能なコンパイラを自作する
- OpeLa 言語のソースコード → x86-64 アセンブリコード
- 最初にコンパイラを作るのは、コンパイラがあれば他の部品を作れるから
- MikanOS の実装に必要な言語機能を考えながら作る
- OpeLa 言語でブートローダー と OS を簡易実装する
- 自作言語で OS が実装できることの実証を早期に行うのが目的
- とりあえず、シリアル通信と割り込み処理をやってみたい。それらが実装できれば、OS 開発に必要とされるコア機能はほぼ網羅できていると言えそうだから。
- OpeLa 言語でライブラリを整備する
- 言語処理系や OS の開発に使える汎用的なライブラリとする
- 文字列の操作などのライブラリがあると今後の開発を加速できるから
- ライブラリの開発と、それを用いた自作コンパイラのリファクタリングを並行する
- OpeLa 言語でアセンブラを自作する
- x86-64 アセンブリコード → x86-64 ELF オブジェクトファイル
- アセンブラを早めに作ることで、完全自作バイナリの動作実験が早期にでき,モチベーション維持がしやすそう
- OpeLa 言語でリンカを自作する
- この時点で言語処理系と呼べるものがすべて自作したものに置き換わる
- OpeLa 言語でビルドツール(make のようなもの)を自作する
- ビルドツールを作りつつ、自作言語処理系のビルドを置き換えていく
- のちに MikanOS 上で OpeLa 言語処理系のビルドをするときにも活用できる
- OpeLa 言語で MikanOS を再実装する
- OpeLa 言語処理系に MikanOS 向けアプリを生成するオプションを追加する
- OS に依存する処理(システムコールの発行方法など)を切り替えるオプションを追加するなど
- OpeLa 言語処理系とビルドツールを MikanOS 上で動かす
- 言語処理系とビルドツールを自作 OS 向けにクロスコンパイルすることで実現できるはず
- OpeLa 言語処理系とビルドツールを自作 OS 上でビルドする
発展課題
自作 OS のセルフホストが達成できても実はあまり面白くありません。
自作 OS 上に言語処理系があるなら、当然、アプリ開発をしたくなりますよね!
ということで、その後はテキストエディタやデバッガを作っていきたいです。今のところ、遠い未来の願望にすぎませんが。
協力者募集
OpeLa の開発に関する議論を osdev-jp Slack の #opela チャンネルでやっています。
興味のある方は気軽に覗いてみてください。
OpeLa プロジェクトでは OS や言語処理系を一緒に作ってくれる仲間を募集しています。協力して設計や実装をしていきませんか?
(プロジェクトの意思決定に関する最終決定権は uchan にありますが、良い意見は積極的に取り入れます!)
募集しているのは次のような協力をしてくれる方々です。
- OpeLa プロジェクトのロゴを作ってくれる人。
- OpeLa 言語の設計に関する議論の話し相手。例えば「a == b で両辺の型が違うとき、どこまで暗黙的な型変換を許すか」とか。
- OpeLa 言語を使ったアプリ開発者。example ディレクトリ以下にサンプルプログラムが増えると嬉しい。
- OpeLa 言語のコンパイラ開発者。
- OpeLa 言語でテスト用の小さい OS を作る人。
- コンパイラを AArch64 マシン(Raspberry Pi とか)へ移植してくれる人。
- アセンブラ、リンカ、ライブラリ、ビルドツール開発者。(コンパイラがある程度完成してから)
- OpeLa 言語への MikanOS 移植をする人。(言語処理系全体がある程度完成してから)
進捗メモ
進捗したらここに追記していきます。
1. セルフホスト可能なコンパイラを自作する
- 行き当たりばったりに作るといい言語にならなさそうなので,まずはある程度,言語仕様を考えます。
OpeLa 言語仕様
- OpeLa コンパイラの内部設計など(随時更新) OpeLa 内部設計
- 開発途中の状態をここで公開しています https://github.com/uchan-nos/opela
以下、時々進捗を記事にします