Langsmith OpeLa handmade self-hosted OS and LPS

>100 Views

October 25, 20

スライド概要

OpeLa はセルフホストな OS と言語処理系を自作するプロジェクトです。この発表は2020/10/09 の「自作プログラミング言語の集い」 https://opt.connpass.com/event/188521/ で発表した資料です。

profile-image

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

シェア

またはPlayer版

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

関連スライド

各ページのテキスト
1.

OpeLa:セルフホストな OSと言語処理系の自作 @uchan_nos 自作プログラミング言語の集い 2020/10/09

2.

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

3.

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

4.

OpeLaの目的:低レイヤ技術の普及 • Webアプリ界隈は盛り上がっている • ブラウザを立ち上げF12を押すだけで,簡単に入門 • 一方低レイヤ技術は,重要性が高まっているが触れにくい • クラウド環境の台頭 • 性能ボトルネックの把握が重要に • 基盤を作る人と利用する人の乖離 • 情報セキュリティ技術の高度化 • Spectre & Meltdown ? ? ?

5.

世間の低レイヤ技術への関心 osdev-jpの立ち上げ • 2016年3月の第5期ラボユース成果 報告会でosdev-jp結成 • livaさん,hikaliumさん,uchan • 2016年5月1日,記念すべき第1回 「自作OSもくもく会」 • 2日前の時点で30名の申し込みがあった らしい • 2020年9月6日に第22回

6.

世間の低レイヤ技術への関心 TCFM創設からCコンパイラゼミ開講まで • Ruiさんが2016年夏にTuring Complete FMを始める • 自作OS,自作コンパイラ等,低レイヤな話題専門のPodcast • 多くの人を魅了 • 「低レイヤの話めっちゃ面白いな」 • https://dekotech.dekokun.info/entry/2019/05/22/135330 • セキュリティ・キャンプ全国大会2018で 「Cコンパイラを自作してみよう!」が開講される • 講師はRuiさんとhikaliumさん

7.

OSとコンパイラを合わせたら面白い!? • プログラマ3大やりたいこと CPU OS コンパイラ • それぞれ単体は割とある • でも,組み合わせてセルフホストを目指す例は少ない

8.

OpeLaで一石を投じる • OpeLaはOSと言語処理系を 合わせたセルフホストの小 さな実装 • xv6は教育用OS 6629行なので全部読める • Linuxの全部は読めない • 小さいは正義! OS名 行数 SLOC Linux 3.9.4 15564694 11071422 FreeBSD 9.1 5436430 3826934 DragonFly BSD 3.4.1 2930195 1995729 NetBSD 6.1 5325381 3497216 OpenBSD 5.3 2973206 2104883 xnu 2050.22.13 1261297 798157 UNIX v6 12274 8883 RetroBSD 44914 29536 xv6 6629 5237 http://syuu1228.hatenablog.com/entry/20130528/1369765273

9.

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

10.

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

11.

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

12.

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

13.

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

14.

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

15.

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

16.

自作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でコンパイル

17.

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

18.

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

19.

後方宣言に対応したい func main() { foo := 0; // int bar := baz; // ? f(); // func or func ptr } var ( baz int = 42; ) func f() int { 3; } • グローバルな識別子の後方宣言に 対応したい • importの実現等にも必要な気がする • 前方宣言必須→ヘッダファイルみた いな仕組みが必要になる気がする • 構文解析時に型付けする方法だと うまくいかない • 構文解析→意味解析→コード生成

20.

後方宣言と型の決定 var a b c ) ( = b; = c; = 42; • 左記の例では,後ろから型が決定していく • c=int,b=int,a=int • 依存グラフ(DAGになる?)を構築するか, • 型がこれ以上付かなくなるまで繰り返すか • とりあえず後者で実装

21.

OpeLaプロジェクトの履歴 1/2 2020/08/26 心が決まる 2020/08/28 名前が決まる

22.

OpeLaプロジェクトの履歴 2/2 2020/09/04 ポインタが実装される 2020/09/25 型決定の処理を実装中

23.

OpeLaプロジェクトの未来 • 年内をめどに,コンパイラのセルフホストを目指す • 2021年上期:OSの簡易実装,アセンブラやリンカの作成 • 2021年下期:ビルドツール作成,OSの本格実装 • 2022年上期:完全セルフホスト達成! • 短期間に詰め込み過ぎると若者を巻き込む前に終わってしまう • 時間をかけすぎても「盛り上がってる感」が出ない