-
Notifications
You must be signed in to change notification settings - Fork 5
uchan OpeLa
OS と言語処理系(アセンブラ,コンパイラ,リンカ,ライブラリ)を自作するために必要なことを考えてみます。
OS と言語処理系の総称を OpeLa(Operating and Language processing system)と名付けます。
何を作ってみたいかを明確にします。
- x86-64/AArch64 用の OS
- x86-64/AArch64 用のアセンブラ
- 独自言語コンパイラ(言語仕様から自作する)
- リンカ
- ライブラリ(言語処理系および OS を作る際に使う)
- デバッガ
独自言語なのはそっちの方が楽しいかなと思ったからです。 「全部自作」と銘打つからには,OS も言語も独自仕様にしてみたいです。
CPU アーキテクチャや,ソースコードの文字体系なども独自仕様にする余地はありますが,そこまでは流石にやりません。
小さい OS だけ作ってもあまり面白くありませんし,かといって作り込むのは際限がありません。 それぞれをどこまで作るかの目標を立てます。 目標を満たす最小限のものを作ります。
- 最終的に自作 OS 上で自作の言語処理系を動かし,言語処理系自身はもちろん,OS をもビルドできること。
- 要するにセルフホスト。OS は最低限,プロセスやファイルシステムをサポートする必要があるだろう。
- 開発途上では既存の OS や言語処理系,テキストエディタ等を使ってよい。
- 最終的に自分で書いたコードのみですべてが構成されること。
- OSS なライブラリ等も一切使わず,必要なら自作する。
- 将来 ARM アーキテクチャに移植することを念頭に OS ならびに言語処理系を構築すること。
作るものはセルフホストができる最小限の機能とします。 といっても,がちがちに小さくすることは目指さず,不要な機能は入れないという程度です。
例えば,プログラミング言語に構造体が無くても OS は書けますし,if 文と goto 文さえあれば for や while は無くてもチューリング完全は満たせます。 ただ,それらが無いとプログラミングがとても辛いですから,言語仕様に組み込みます。
一方,C++ の例外機能や Scala のパターンマッチのような機能は OS を書く分には無くてもそれほど困りませんので実装しません。
言語仕様以外の部分でも同様の判断を行い,どの機能を入れるかを選択します。
作ったものはなるべく活用していく,という方針です。
スタート地点はコンパイラとします。コンパイラがあれば他の部品をそのコンパイラを使って作れるからです。
仮に最初に OS を作ると,その OS 上でコードを書いてコンパイルして,などをやりたくなりますが,これは難しいことです。 なぜなら OS がある程度出来上がった時点ではその OS 上で動くコンパイラもエディタも存在しないからです。
- セルフホスト可能なコンパイラを自作する
- 独自言語のソースコード → x86-64 アセンブリコード
- 最初にコンパイラを作るのは,コンパイラがあれば他の部品を作れるから
- コンパイラと並行して少しずつ OS を書いていくと,OS を書くのに必要な機能を漏れなく盛り込めるだろう
- 自作言語でブートローダー と OS を簡易実装する
- 自作言語で OS が実装できることの実証を早期に行うのが目的
- シリアル通信と割り込み処理を実装できれば,OS 開発に必要とされるコア機能はほぼ網羅できていると言えそう
- 自作言語でライブラリを自作する
- 言語処理系や OS の開発に使える汎用的なライブラリとする
- 文字列の操作などのライブラリがあると今後の開発を加速できるから
- ライブラリの開発と,それを用いた自作コンパイラのリファクタリングを並行する
- 自作言語でアセンブラを自作する
- x86-64 アセンブリコード → x86-64 ELF オブジェクトファイル
- アセンブラを早めに作ることで,完全自作バイナリの動作実験が早期にでき,モチベーション維持がしやすそう
- 自作言語でリンカを自作する
- この時点で言語処理系と呼べるものがすべて自作したものに置き換わる
- 自作言語処理系でビルドツール(make のようなもの)を自作する
- のちに自作 OS 上で自作言語処理系のビルドをするときに備え,自作 OS 上で動くビルドツールが欲しいのでこの時点で作る
- ビルドツールを作りつつ,自作言語処理系のビルドを置き換えていく
- 自作言語処理系で本格的な OS を自作する
- 自作言語処理系に自作 OS 向けアプリを生成するオプションを追加する
- OS に依存する処理(システムコールの発行方法など)を切り替えるオプション
- 自作言語処理系とビルドツールを自作 OS 上で動かす
- 自作言語処理系とビルドツールを自作 OS 向けにクロスコンパイルすることで実現できるはず
- 自作言語処理系とビルドツールを自作 OS 上でビルドする
- 完全なセルフホストが実現される
自作 OS のセルフホストが達成できても実はあまり面白くありません。 自作 OS 上に言語処理系があるなら,アプリ開発をしたくなりますよね! ということで,その後はテキストエディタやデバッガを作っていきたいです。今のところ,遠い未来の願望にすぎませんけど。
OS や言語処理系を一緒に作ってくれる仲間を募集します。協力して設計や実装をしていきませんか? (ただ,プロジェクトの意思決定に関する一切の決定権は uchan にありますから,それに同意できない方はご遠慮ください…)
進捗したらここに追記していきます。
- 行き当たりばったりに作るといい言語にならなさそうなので,まずはある程度,言語仕様を考えます。 OpeLa 言語仕様
- OpeLa コンパイラの内部設計など OpeLa 内部設計
- 開発途中の状態をここで公開しています https://github.com/uchan-nos/opela
- 2020/09/04 時点でのコンパイラを用いて性能計測をやってみました。OpeLa コンパイラの性能計測
- 2020/09/30 時点でのコンパイラを用いてRPN(逆ポーランド記法電卓)を実装してみました。
- 2020/12/25 OpeLa コンパイラを AArch64 に対応させ、M1 Mac で動作するようになりました。
./opelac -target-arch aarch64
とすれば M1 Mac 用のアセンブラを出力できます。 マルチアーキテクチャ対応の詳細