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

>100 Views

September 06, 20

スライド概要

OpeLa is a project to make self-hosted OS and language processing system.

profile-image

サイボウズ・ラボ株式会社で教育向けのOSやCPU、コンパイラなどの研究開発をしています。

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

OpeLa:セルフホストな OSと言語処理系の自作 @uchan_nos 第22回自作OSもくもく会 2020/09/06

2.

自己紹介 • Twitter @uchan_nos • サイボウズ・ラボ株式会社 • 東京工業大学 特任助教 • 自作OSもくもく会コアメンバー • 『30日でできる! OS自作入門』の校正担当 • 『自作エミュレータで学ぶ x86アーキテクチャ』の著者

3.

OpeLa • OpeLa: Operating and Language processing system • OSと言語処理系を全部自作するプロジェクト • OS,アセンブラ,コンパイラ,リンカ,ライブラリ • 特徴:完全なセルフホスト

4.

セルフホストとは(コンパイラ編) 自作コンパイラ ソースコード 入力 第1世代 自作コンパイラ コンパイル 第2世代 自作コンパイラ • 自分自身をコンパイルすること • GCCやClangはそうなっている • GCCをビルドするのに他のコンパイラの 助けは不要 • 自作言語およびOSでこれをやりたい!

5.

自作言語をセルフホストする道のり 第1世代 自作コンパイラ opelac.cpp 書き直し 入力 入力 入力 コンパイル clang++ 第2世代 自作コンパイラ opelac.opl 第1世代 自作コンパイラ コンパイル 第2世代 自作コンパイラ コンパイル ここまでくれば ぐるぐる回せる (はず) 第3世代 自作コンパイラ

6.

なぜ自作言語? • uchanは「既存言語でいいじゃん」派だった • なぜ「言語仕様」から自作しようとしたのか? • 答え:OSだけが独自仕様なのはバランスが悪いと思った • 加えて,あらゆるソースコードを自分で(自分たちで)書くこ とを保証したかった • 既存言語を使っちゃうと,コピペがあっても気づけない • 独自言語なら世界に存在しないのでズルは不可能

7.

OpeLaで目指す「完全セルフホスト」 自作OSの上で動く自作言語処理系で 自作OSと自作言語処理系をビルドすること 自作OS ソースコード 自作言語処理系 ソースコード 自作言語処理系 自作OS

8.

なぜ完全セルフホスト? • 目標地点がはっきりする • 言語の観点:OSが記述できる程度の機能 • アドレス参照,in/out命令の発行,各種レジスタの読み書き • OSの観点:言語処理系が動く程度の機能 • プロセス,ファイル入出力 • 発展としては,テキスト編集

9.

余分な機能は足さない • 総時間が最小になるようにしたい • 機能Xを作る時間 < Xによって節約できる開発工数 が見込めるならXを作る • for文が無くてもOSは書けるが,あった方が効率的だろう • セルフホストにとって効果が薄い開発を防ぐため • 余分な言語機能の例:例外,動的型検査,GC,etc. • 余分なOS機能の例:高度なグラフィック,音楽再生,etc.

10.

【完全版】自作セルフホストの道のり 第1世代 opelac.cpp 第2世代 opelac.opl clang++ 第1世代 opelac 自作OS用 opelac.opl 第2世代 opelac これらはLinux用opelac 第3世代 opelac 自作OS用 opelac 自作OS向 けに修正

11.

自作OSのセルフホストを目指して 自作OS my_os.opl 1 自作OS用 opelac.opl 4 2 3 Linux用 opelac 自作OS用 opelac Linux 自作OS 1. 自作OSをLinux用opelacでク ロスコンパイル 2. 自作OS向けに調整した自作 言語処理系をLinux用opelac でクロスコンパイル 3. 自作OSを自作OS用opelacで コンパイル 4. 自作OS向けに調整した自作 言語処理系を自作OS用 opelacでコンパイル

12.

作成の順序(1/2) • セルフホスト可能なコンパイラを自作する • 独自言語のソースコード → x86-64 アセンブリコード • 自作言語でブートローダー と OS を簡易実装する • 自作言語で OS が実装できることの実証を早期に行うのが目的 • 自作言語でライブラリを自作する • 言語処理系や OS の開発に使える汎用的なライブラリとする • 自作言語でアセンブラを自作する • 自作言語でリンカを自作する • この時点で言語処理系と呼べるものがすべて自作に置き換わる

13.

作成の順序(2/2) • 自作言語処理系でビルドツール(≒make)を自作 • のちに自作 OS 上で自作言語処理系のビルドをするときに備え,自作 OS 上で動くビルドツールが欲しいのでこの時点で作る • 自作言語処理系で本格的な OS を自作 • 自作言語処理系に自作OS向けアプリ生成オプションを追加 • 自作言語処理系とビルドツールを自作 OS 上で動かす • 自作言語処理系とビルドツールを自作 OS 上でビルド • 完全なセルフホストが実現される

14.

Opelacのデモ 2020/09/06までの実装の進捗

15.

Opelac開発での気づき • セミコロンがある方がパースが楽 • セミコロンが無いと,行途中の改行がトリッキー • foo := a + b + c + d // OK • foo := a + b + c + d // Error • 型推論が割と初期に必要になってしまった • foo := 42; の形式をサポートするため • 型の表現が再帰構造になって大変 • int, *int: 比較的単純な型 • func(func(int, int), int): 再帰してる型