SlideShare a Scribd company logo
1 of 23
OpeLa:セルフホストな
OSと言語処理系の自作
@uchan_nos
自作プログラミング言語の集い
2020/10/09
自己紹介
• Twitter @uchan_nos
• サイボウズ・ラボ株式会社
• 東京工業大学 特任助教
• osdev-jpコアメンバー
• 『30日でできる! OS自作入門』の校正担当
• 『自作エミュレータで学ぶ
x86アーキテクチャ』の著者
OpeLa
• OpeLa: Operating and Language processing system
• OSと言語処理系を全部自作するプロジェクト
• OS,アセンブラ,コンパイラ,リンカ,ライブラリ
• 特徴:完全なセルフホスト
OpeLaの目的:低レイヤ技術の普及
• Webアプリ界隈は盛り上がっている
• ブラウザを立ち上げF12を押すだけで,簡単に入門
• 一方低レイヤ技術は,重要性が高まっているが触れにくい
• クラウド環境の台頭
• 性能ボトルネックの把握が重要に
• 基盤を作る人と利用する人の乖離
• 情報セキュリティ技術の高度化
• Spectre & Meltdown
?
?
?
世間の低レイヤ技術への関心
osdev-jpの立ち上げ
• 2016年3月の第5期ラボユース成果
報告会でosdev-jp結成
• livaさん,hikaliumさん,uchan
• 2016年5月1日,記念すべき第1回
「自作OSもくもく会」
• 2日前の時点で30名の申し込みがあった
らしい
• 2020年9月6日に第22回
世間の低レイヤ技術への関心
TCFM創設からCコンパイラゼミ開講まで
• Ruiさんが2016年夏にTuring Complete FMを始める
• 自作OS,自作コンパイラ等,低レイヤな話題専門のPodcast
• 多くの人を魅了
• 「低レイヤの話めっちゃ面白いな」
• https://dekotech.dekokun.info/entry/2019/05/22/135330
• セキュリティ・キャンプ全国大会2018で
「Cコンパイラを自作してみよう!」が開講される
• 講師はRuiさんとhikaliumさん
OSとコンパイラを合わせたら面白い!?
• プログラマ3大やりたいこと
• それぞれ単体は割とある
• でも,組み合わせてセルフホストを目指す例は少ない
CPU OS コンパイラ
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
セルフホストとは(コンパイラ編)
• 自分自身をコンパイルすること
• GCCやClangはそうなっている
• GCCをビルドするのに他のコンパイラの
助けは不要
• 自作言語およびOSでこれをやりたい!
自作コンパイラ
ソースコード
第1世代
自作コンパイラ
入力
第2世代
自作コンパイラ
コンパイル
自作言語をセルフホストする道のり
第1世代
自作コンパイラ
opelac.cpp
clang++
入力
第1世代
自作コンパイラ
コンパイル
第2世代
自作コンパイラ
opelac.opl
書き直し
コンパイル
入力
第2世代
自作コンパイラ
コンパイル
第3世代
自作コンパイラ
入力
ここまでくれば
ぐるぐる回せる
(はず)
なぜ自作言語?
• uchanは「既存言語でいいじゃん」派だった
• なぜ「言語仕様」から自作しようとしたのか?
• 答え:OSだけが独自仕様なのはバランスが悪いと思った
• 加えて,あらゆるソースコードを自分で(自分たちで)書くこ
とを保証したかった
• 既存言語を使っちゃうと,コピペがあっても気づけない
• 独自言語なら世界に存在しないのでズルは不可能
OpeLaで目指す「完全セルフホスト」
自作OSの上で動く自作言語処理系で
自作OSと自作言語処理系をビルドすること
自作OS
自作言語処理系
自作OS
ソースコード
自作言語処理系
ソースコード
Linux
GCC,binutils
LinuxとGCCの
ソースコード
Linuxでいえば
なぜ完全セルフホスト?
• 目標地点がはっきりする
• 言語の観点: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
Opelacのデモ
2020/10/09までの実装の進捗
Opelac開発での気づき
• セミコロンがある方がパースが楽
• セミコロンが無いと,行途中の改行がトリッキー
• foo := a + b +
c + d // OK
• foo := a + b
+ c + d // Error
• (弱い)型推論が割と初期に必要になってしまった
• foo := 42; の形式をサポートするため
• 奥が深い型の表現
• int, *int: 比較的単純な型
• func(func(int, int), int): 木構造をなす型
後方宣言に対応したい
• グローバルな識別子の後方宣言に
対応したい
• importの実現等にも必要な気がする
• 前方宣言必須→ヘッダファイルみた
いな仕組みが必要になる気がする
• 構文解析時に型付けする方法だと
うまくいかない
• 構文解析→意味解析→コード生成
func main() {
foo := 0; // int
bar := baz; // ?
f(); // func or func ptr
}
var (
baz int = 42;
)
func f() int {
3;
}
後方宣言と型の決定
• 左記の例では,後ろから型が決定していく
• c=int,b=int,a=int
• 依存グラフ(DAGになる?)を構築するか,
• 型がこれ以上付かなくなるまで繰り返すか
• とりあえず後者で実装
var (
a = b;
b = c;
c = 42;
)
OpeLaプロジェクトの履歴 1/2
2020/08/26
心が決まる
2020/08/28
名前が決まる
OpeLaプロジェクトの履歴 2/2
2020/09/04
ポインタが実装される
2020/09/25
型決定の処理を実装中
OpeLaプロジェクトの未来
• 年内をめどに,コンパイラのセルフホストを目指す
• 2021年上期:OSの簡易実装,アセンブラやリンカの作成
• 2021年下期:ビルドツール作成,OSの本格実装
• 2022年上期:完全セルフホスト達成!
• 短期間に詰め込み過ぎると若者を巻き込む前に終わってしまう
• 時間をかけすぎても「盛り上がってる感」が出ない

More Related Content

Similar to Langsmith OpeLa handmade self-hosted OS and LPS

OpenDocument interoperability test workshop after story
OpenDocument interoperability test workshop after storyOpenDocument interoperability test workshop after story
OpenDocument interoperability test workshop after storyMakoto Takizawa
 
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクトOpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクトuchan_nos
 
できる!スマホアプリ:Webからはじまるアプリ for CMU16
できる!スマホアプリ:Webからはじまるアプリ for CMU16できる!スマホアプリ:Webからはじまるアプリ for CMU16
できる!スマホアプリ:Webからはじまるアプリ for CMU16Masami Yabushita
 
HoloLens RS4でWindowsML入門+Research mode実装
HoloLens RS4でWindowsML入門+Research mode実装HoloLens RS4でWindowsML入門+Research mode実装
HoloLens RS4でWindowsML入門+Research mode実装Akihiro Ueyama
 
TOPPERS as an IoT OS(kernel)
TOPPERS as an IoT OS(kernel)TOPPERS as an IoT OS(kernel)
TOPPERS as an IoT OS(kernel)Kiyoshi Ogawa
 
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドYAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドkeroyonn
 
excelファイルをプログラムで出力しよう
excelファイルをプログラムで出力しようexcelファイルをプログラムで出力しよう
excelファイルをプログラムで出力しようyuji0602
 
【OSC2011広島】共有アプリで遊ぼう!(日本Red5ユーザー会)
【OSC2011広島】共有アプリで遊ぼう!(日本Red5ユーザー会)【OSC2011広島】共有アプリで遊ぼう!(日本Red5ユーザー会)
【OSC2011広島】共有アプリで遊ぼう!(日本Red5ユーザー会)Shinichiro Yoshida
 
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)Takashi Sogabe
 
Session2:「グローバル化する情報処理」/伊藤敬彦
Session2:「グローバル化する情報処理」/伊藤敬彦Session2:「グローバル化する情報処理」/伊藤敬彦
Session2:「グローバル化する情報処理」/伊藤敬彦Preferred Networks
 
Cat tool overview for CEDEC2011 Draft
Cat tool overview for CEDEC2011 DraftCat tool overview for CEDEC2011 Draft
Cat tool overview for CEDEC2011 DraftSelf Employed
 
Ocs2012 tokyo/spring plone
Ocs2012 tokyo/spring plone Ocs2012 tokyo/spring plone
Ocs2012 tokyo/spring plone Manabu Terada
 
Portacle : Common Lispのオールインワン開発環境
Portacle : Common Lispのオールインワン開発環境Portacle : Common Lispのオールインワン開発環境
Portacle : Common Lispのオールインワン開発環境Satoshi imai
 
The current problems and future of the desktop Linux printing
The current problems and future of the desktop Linux printingThe current problems and future of the desktop Linux printing
The current problems and future of the desktop Linux printingNaruhiko Ogasawara
 
いま OS X アプリがアツい
いま OS X アプリがアツいいま OS X アプリがアツい
いま OS X アプリがアツいTetsuya Kaneuchi
 
たぶん45分くらいでわかる、オープンソースの世界
たぶん45分くらいでわかる、オープンソースの世界たぶん45分くらいでわかる、オープンソースの世界
たぶん45分くらいでわかる、オープンソースの世界Yutaka Kachi
 
PHPプログラミングのIPv6対応の実際
PHPプログラミングのIPv6対応の実際PHPプログラミングのIPv6対応の実際
PHPプログラミングのIPv6対応の実際Tetsuji Koyama
 

Similar to Langsmith OpeLa handmade self-hosted OS and LPS (20)

Fn project爆誕
Fn project爆誕Fn project爆誕
Fn project爆誕
 
TOPPERSプロジェクトの紹介 OSC2017 Tokyo Fall
TOPPERSプロジェクトの紹介 OSC2017 Tokyo FallTOPPERSプロジェクトの紹介 OSC2017 Tokyo Fall
TOPPERSプロジェクトの紹介 OSC2017 Tokyo Fall
 
Tizen & Crosswalk
Tizen & CrosswalkTizen & Crosswalk
Tizen & Crosswalk
 
OpenDocument interoperability test workshop after story
OpenDocument interoperability test workshop after storyOpenDocument interoperability test workshop after story
OpenDocument interoperability test workshop after story
 
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクトOpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
 
できる!スマホアプリ:Webからはじまるアプリ for CMU16
できる!スマホアプリ:Webからはじまるアプリ for CMU16できる!スマホアプリ:Webからはじまるアプリ for CMU16
できる!スマホアプリ:Webからはじまるアプリ for CMU16
 
HoloLens RS4でWindowsML入門+Research mode実装
HoloLens RS4でWindowsML入門+Research mode実装HoloLens RS4でWindowsML入門+Research mode実装
HoloLens RS4でWindowsML入門+Research mode実装
 
TOPPERS as an IoT OS(kernel)
TOPPERS as an IoT OS(kernel)TOPPERS as an IoT OS(kernel)
TOPPERS as an IoT OS(kernel)
 
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドYAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
 
excelファイルをプログラムで出力しよう
excelファイルをプログラムで出力しようexcelファイルをプログラムで出力しよう
excelファイルをプログラムで出力しよう
 
【OSC2011広島】共有アプリで遊ぼう!(日本Red5ユーザー会)
【OSC2011広島】共有アプリで遊ぼう!(日本Red5ユーザー会)【OSC2011広島】共有アプリで遊ぼう!(日本Red5ユーザー会)
【OSC2011広島】共有アプリで遊ぼう!(日本Red5ユーザー会)
 
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
 
Session2:「グローバル化する情報処理」/伊藤敬彦
Session2:「グローバル化する情報処理」/伊藤敬彦Session2:「グローバル化する情報処理」/伊藤敬彦
Session2:「グローバル化する情報処理」/伊藤敬彦
 
Cat tool overview for CEDEC2011 Draft
Cat tool overview for CEDEC2011 DraftCat tool overview for CEDEC2011 Draft
Cat tool overview for CEDEC2011 Draft
 
Ocs2012 tokyo/spring plone
Ocs2012 tokyo/spring plone Ocs2012 tokyo/spring plone
Ocs2012 tokyo/spring plone
 
Portacle : Common Lispのオールインワン開発環境
Portacle : Common Lispのオールインワン開発環境Portacle : Common Lispのオールインワン開発環境
Portacle : Common Lispのオールインワン開発環境
 
The current problems and future of the desktop Linux printing
The current problems and future of the desktop Linux printingThe current problems and future of the desktop Linux printing
The current problems and future of the desktop Linux printing
 
いま OS X アプリがアツい
いま OS X アプリがアツいいま OS X アプリがアツい
いま OS X アプリがアツい
 
たぶん45分くらいでわかる、オープンソースの世界
たぶん45分くらいでわかる、オープンソースの世界たぶん45分くらいでわかる、オープンソースの世界
たぶん45分くらいでわかる、オープンソースの世界
 
PHPプログラミングのIPv6対応の実際
PHPプログラミングのIPv6対応の実際PHPプログラミングのIPv6対応の実際
PHPプログラミングのIPv6対応の実際
 

More from uchan_nos

MikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続するMikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続するuchan_nos
 
OSを手作りするという趣味と仕事
OSを手作りするという趣味と仕事OSを手作りするという趣味と仕事
OSを手作りするという趣味と仕事uchan_nos
 
小型安価なFPGAボードの紹介と任意波形発生器
小型安価なFPGAボードの紹介と任意波形発生器小型安価なFPGAボードの紹介と任意波形発生器
小型安価なFPGAボードの紹介と任意波形発生器uchan_nos
 
トランジスタ回路:エミッタ接地増幅回路
トランジスタ回路:エミッタ接地増幅回路トランジスタ回路:エミッタ接地増幅回路
トランジスタ回路:エミッタ接地増幅回路uchan_nos
 
自作言語でお絵描き
自作言語でお絵描き自作言語でお絵描き
自作言語でお絵描きuchan_nos
 
OpeLa 進捗報告 at 第23回自作OSもくもく会
OpeLa 進捗報告 at 第23回自作OSもくもく会OpeLa 進捗報告 at 第23回自作OSもくもく会
OpeLa 進捗報告 at 第23回自作OSもくもく会uchan_nos
 
サイボウズ・ラボへ転籍して1年を振り返る
サイボウズ・ラボへ転籍して1年を振り返るサイボウズ・ラボへ転籍して1年を振り返る
サイボウズ・ラボへ転籍して1年を振り返るuchan_nos
 
USB3.0ドライバ開発の道
USB3.0ドライバ開発の道USB3.0ドライバ開発の道
USB3.0ドライバ開発の道uchan_nos
 
Security Nextcamp remote mob programming
Security Nextcamp remote mob programmingSecurity Nextcamp remote mob programming
Security Nextcamp remote mob programminguchan_nos
 
自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装uchan_nos
 
1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPGuchan_nos
 
レガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osレガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osuchan_nos
 
Building libc++ for toy OS
Building libc++ for toy OSBuilding libc++ for toy OS
Building libc++ for toy OSuchan_nos
 
プランクトンサミットの歴史2019
プランクトンサミットの歴史2019プランクトンサミットの歴史2019
プランクトンサミットの歴史2019uchan_nos
 
Introduction of security camp 2019
Introduction of security camp 2019Introduction of security camp 2019
Introduction of security camp 2019uchan_nos
 
30分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.230分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.2uchan_nos
 
USB3 host driver program structure
USB3 host driver program structureUSB3 host driver program structure
USB3 host driver program structureuchan_nos
 
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)uchan_nos
 
30分で分かる!OSの作り方
30分で分かる!OSの作り方30分で分かる!OSの作り方
30分で分かる!OSの作り方uchan_nos
 

More from uchan_nos (20)

MikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続するMikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続する
 
OSを手作りするという趣味と仕事
OSを手作りするという趣味と仕事OSを手作りするという趣味と仕事
OSを手作りするという趣味と仕事
 
小型安価なFPGAボードの紹介と任意波形発生器
小型安価なFPGAボードの紹介と任意波形発生器小型安価なFPGAボードの紹介と任意波形発生器
小型安価なFPGAボードの紹介と任意波形発生器
 
トランジスタ回路:エミッタ接地増幅回路
トランジスタ回路:エミッタ接地増幅回路トランジスタ回路:エミッタ接地増幅回路
トランジスタ回路:エミッタ接地増幅回路
 
自作言語でお絵描き
自作言語でお絵描き自作言語でお絵描き
自作言語でお絵描き
 
OpeLa 進捗報告 at 第23回自作OSもくもく会
OpeLa 進捗報告 at 第23回自作OSもくもく会OpeLa 進捗報告 at 第23回自作OSもくもく会
OpeLa 進捗報告 at 第23回自作OSもくもく会
 
サイボウズ・ラボへ転籍して1年を振り返る
サイボウズ・ラボへ転籍して1年を振り返るサイボウズ・ラボへ転籍して1年を振り返る
サイボウズ・ラボへ転籍して1年を振り返る
 
USB3.0ドライバ開発の道
USB3.0ドライバ開発の道USB3.0ドライバ開発の道
USB3.0ドライバ開発の道
 
Security Nextcamp remote mob programming
Security Nextcamp remote mob programmingSecurity Nextcamp remote mob programming
Security Nextcamp remote mob programming
 
自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装
 
1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG
 
レガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osレガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free os
 
Building libc++ for toy OS
Building libc++ for toy OSBuilding libc++ for toy OS
Building libc++ for toy OS
 
プランクトンサミットの歴史2019
プランクトンサミットの歴史2019プランクトンサミットの歴史2019
プランクトンサミットの歴史2019
 
Introduction of security camp 2019
Introduction of security camp 2019Introduction of security camp 2019
Introduction of security camp 2019
 
30分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.230分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.2
 
Timers
TimersTimers
Timers
 
USB3 host driver program structure
USB3 host driver program structureUSB3 host driver program structure
USB3 host driver program structure
 
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)
 
30分で分かる!OSの作り方
30分で分かる!OSの作り方30分で分かる!OSの作り方
30分で分かる!OSの作り方
 

Langsmith OpeLa handmade self-hosted OS and LPS