---
title: Langsmith OpeLa handmade self-hosted OS and LPS
tags:  #compiler #operating system #programming language  
author: [内田公太](https://convert.docswell.com/user/uchan_nos)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/PJR2GPDZE9.jpg?width=480
description: OpeLa はセルフホストな OS と言語処理系を自作するプロジェクトです。この発表は2020/10/09 の「自作プログラミング言語の集い」 https://opt.connpass.com/event/188521/ で発表した資料です。
published: October 25, 20
canonical: https://convert.docswell.com/s/uchan_nos/598MLL-langsmith-opela-handmade-selfhosted-os-and-lps
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/PJR2GPDZE9.jpg)

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


# Page. 2

![Page Image](https://bcdn.docswell.com/page/PEXDX3117X.jpg)

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


# Page. 3

![Page Image](https://bcdn.docswell.com/page/3EKXWY2M7D.jpg)

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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/L7351942E5.jpg)

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


# Page. 5

![Page Image](https://bcdn.docswell.com/page/87DDXGQ67G.jpg)

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


# Page. 6

![Page Image](https://bcdn.docswell.com/page/VJPXP3GZ78.jpg)

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


# Page. 7

![Page Image](https://bcdn.docswell.com/page/2EVL246MJQ.jpg)

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


# Page. 8

![Page Image](https://bcdn.docswell.com/page/57GXR1NXEL.jpg)

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


# Page. 9

![Page Image](https://bcdn.docswell.com/page/4EQ8VDQ5JP.jpg)

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


# Page. 10

![Page Image](https://bcdn.docswell.com/page/KJ42MZNVE1.jpg)

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


# Page. 11

![Page Image](https://bcdn.docswell.com/page/LE1M8R547G.jpg)

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


# Page. 12

![Page Image](https://bcdn.docswell.com/page/GEW3Z15ZE2.jpg)

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


# Page. 13

![Page Image](https://bcdn.docswell.com/page/47ZV1PNLE3.jpg)

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


# Page. 14

![Page Image](https://bcdn.docswell.com/page/YJ65LM8M7V.jpg)

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


# Page. 15

![Page Image](https://bcdn.docswell.com/page/GJ5Y1Z9QJ4.jpg)

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


# Page. 16

![Page Image](https://bcdn.docswell.com/page/LE3519YZJ5.jpg)

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


# Page. 17

![Page Image](https://bcdn.docswell.com/page/8EDDXG54EG.jpg)

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


# Page. 18

![Page Image](https://bcdn.docswell.com/page/V7PXP3GVE8.jpg)

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


# Page. 19

![Page Image](https://bcdn.docswell.com/page/2JVL246R7Q.jpg)

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


# Page. 20

![Page Image](https://bcdn.docswell.com/page/5EGXR1N6JL.jpg)

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


# Page. 21

![Page Image](https://bcdn.docswell.com/page/4JQ8VDQ27P.jpg)

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


# Page. 22

![Page Image](https://bcdn.docswell.com/page/K742MZNPJ1.jpg)

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


# Page. 23

![Page Image](https://bcdn.docswell.com/page/LJ1M8R5XEG.jpg)

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


