osdev-jpでは、OS開発に有用な情報を収集し公開しています
OS と言語処理系(アセンブラ,コンパイラ,リンカ,ライブラリ)を自作するプロジェクトです。
OS と言語処理系の総称を OpeLa(Operating and Language processing system)と名付けます。
独自言語なのは、C/C++ では若干、OS を書くのに適さない仕様があるからです。OpeLa 言語は OS を書くのに適した仕様にします。 「全部自作」と銘打つからには、OS も言語も独自仕様にしてみたい、という理由もあります。
CPU アーキテクチャ、ソースコードの文字体系なども独自仕様にする余地はありますが、そこまでは流石にやりません。
小さい OS だけ作ってもあまり面白くありませんし、かといって作り込むのは際限がありません。 それぞれをどこまで作るかの目標を立てます。
目標は「OpeLa 言語で再実装した MikanOS 上で、OpeLa 言語処理系と MikanOS をビルドできるようになること」とします。 要するに、言語処理系と OS のセルフホストです。
この目標を実現する際の制約事項(レギュレーション)は次の通りです。
作るものは、上記の目標を満たす最小限のものを目指します。 といっても、理論的な最小限を求めるのは難しいので、実装コストと有用性のバランスを取ります、くらいのニュアンスです。
例えば、プログラミング言語に構造体が無くても OS は書けるでしょうし、if 文と goto 文さえあれば for や while は無くてもチューリング完全になり、任意の計算が可能です。 ただ、for や while が無いとプログラミングがとても辛いですから、言語仕様に組み込みます。
一方、C++ の例外機能や Scala のパターンマッチのような機能は OS を書く分には無くてもそれほど困りませんので実装しません。
言語仕様以外の部分でも同様の判断を行い、どの機能を入れるかを選択します。
作ったものはなるべく活用する方針で作る順序を考えてみました。
スタート地点はコンパイラとします。コンパイラがあれば他の部品をそのコンパイラを使って作れるからです。
仮に最初に OS を作ると、「作ったものを活用する」という方針により、その OS 上で残りのプログラムを開発したくなりますが、これは難しいことです。 なぜなら OS だけがあっても、その OS 上で動くコンパイラやエディタが存在しないからです。 その OS で動くコンパイラらエディタが完成しない限り、OS を活用できません。
自作 OS のセルフホストが達成できても実はあまり面白くありません。 自作 OS 上に言語処理系があるなら、当然、アプリ開発をしたくなりますよね! ということで、その後はテキストエディタやデバッガを作っていきたいです。今のところ、遠い未来の願望にすぎませんが。
OpeLa の開発に関する議論を osdev-jp Slack の #opela チャンネルでやっています。 興味のある方は気軽に覗いてみてください。
OpeLa プロジェクトでは OS や言語処理系を一緒に作ってくれる仲間を募集しています。協力して設計や実装をしていきませんか? (プロジェクトの意思決定に関する最終決定権は uchan にありますが、良い意見は積極的に取り入れます!)
募集しているのは次のような協力をしてくれる方々です。
進捗したらここに追記していきます。
以下、時々進捗を記事にします
./opelac -target-arch aarch64
とすれば M1 Mac 用のアセンブラを出力できます。 マルチアーキテクチャ対応の詳細