OpeLa:セルフホストな
OSと言語処理系の自作
@uchan_nos
第22回自作OSもくもく会
2020/09/06
自己紹介
• Twitter @uchan_nos
• サイボウズ・ラボ株式会社
• 東京工業大学 特任助教
• 自作OSもくもく会コアメンバー
• 『30日でできる! OS自作入門』の校正担当
• 『自作エミュレータで学ぶ
x86アーキテクチャ』の著者
OpeLa
• OpeLa: Operating and Language processing system
• OSと言語処理系を全部自作するプロジェクト
• OS,アセンブラ,コンパイラ,リンカ,ライブラリ
• 特徴:完全なセルフホスト
セルフホストとは(コンパイラ編)
• 自分自身をコンパイルすること
• GCCやClangはそうなっている
• GCCをビルドするのに他のコンパイラの
助けは不要
• 自作言語およびOSでこれをやりたい!
自作コンパイラ
ソースコード
第1世代
自作コンパイラ
入力
第2世代
自作コンパイラ
コンパイル
自作言語をセルフホストする道のり
第1世代
自作コンパイラ
opelac.cpp
clang++
入力
第1世代
自作コンパイラ
コンパイル
第2世代
自作コンパイラ
opelac.opl
書き直し
コンパイル
入力
第2世代
自作コンパイラ
コンパイル
第3世代
自作コンパイラ
入力
ここまでくれば
ぐるぐる回せる
(はず)
なぜ自作言語?
• uchanは「既存言語でいいじゃん」派だった
• なぜ「言語仕様」から自作しようとしたのか?
• 答え:OSだけが独自仕様なのはバランスが悪いと思った
• 加えて,あらゆるソースコードを自分で(自分たちで)書くこ
とを保証したかった
• 既存言語を使っちゃうと,コピペがあっても気づけない
• 独自言語なら世界に存在しないのでズルは不可能
OpeLaで目指す「完全セルフホスト」
自作OSの上で動く自作言語処理系で
自作OSと自作言語処理系をビルドすること
自作OS
自作言語処理系
自作OS
ソースコード
自作言語処理系
ソースコード
なぜ完全セルフホスト?
• 目標地点がはっきりする
• 言語の観点:OSが記述できる程度の機能
• アドレス参照,in/out命令の発行,各種レジスタの読み書き
• OSの観点:言語処理系が動く程度の機能
• プロセス,ファイル入出力
• 発展としては,テキスト編集
余分な機能は足さない
• 総時間が最小になるようにしたい
• 機能Xを作る時間 < Xによって節約できる開発工数
が見込めるならXを作る
• for文が無くてもOSは書けるが,あった方が効率的だろう
• セルフホストにとって効果が薄い開発を防ぐため
• 余分な言語機能の例:例外,動的型検査,GC,etc.
• 余分なOS機能の例:高度なグラフィック,音楽再生,etc.
【完全版】自作セルフホストの道のり
第1世代
opelac.cpp
clang++
第1世代
opelac
第2世代
opelac.opl
第2世代
opelac
第3世代
opelac
自作OS用
opelac.opl
自作OS向
けに修正
自作OS用
opelacこれらはLinux用opelac
自作OSのセルフホストを目指して
1. 自作OSをLinux用opelacでク
ロスコンパイル
2. 自作OS向けに調整した自作
言語処理系をLinux用opelac
でクロスコンパイル
3. 自作OSを自作OS用opelacで
コンパイル
4. 自作OS向けに調整した自作
言語処理系を自作OS用
opelacでコンパイル
自作OS
my_os.opl
Linux用
opelac
Linux 自作OS
自作OS用
opelac.opl
自作OS用
opelac
1
2 3
4
作成の順序(1/2)
• セルフホスト可能なコンパイラを自作する
• 独自言語のソースコード → x86-64 アセンブリコード
• 自作言語でブートローダー と OS を簡易実装する
• 自作言語で OS が実装できることの実証を早期に行うのが目的
• 自作言語でライブラリを自作する
• 言語処理系や OS の開発に使える汎用的なライブラリとする
• 自作言語でアセンブラを自作する
• 自作言語でリンカを自作する
• この時点で言語処理系と呼べるものがすべて自作に置き換わる
作成の順序(2/2)
• 自作言語処理系でビルドツール(≒make)を自作
• のちに自作 OS 上で自作言語処理系のビルドをするときに備え,自作
OS 上で動くビルドツールが欲しいのでこの時点で作る
• 自作言語処理系で本格的な OS を自作
• 自作言語処理系に自作OS向けアプリ生成オプションを追加
• 自作言語処理系とビルドツールを自作 OS 上で動かす
• 自作言語処理系とビルドツールを自作 OS 上でビルド
• 完全なセルフホストが実現される
Opelacのデモ
2020/09/06までの実装の進捗
Opelac開発での気づき
• セミコロンがある方がパースが楽
• セミコロンが無いと,行途中の改行がトリッキー
• foo := a + b +
c + d // OK
• foo := a + b
+ c + d // Error
• 型推論が割と初期に必要になってしまった
• foo := 42; の形式をサポートするため
• 型の表現が再帰構造になって大変
• int, *int: 比較的単純な型
• func(func(int, int), int): 再帰してる型

OpeLa セルフホストなOSと言語処理系の自作