サイボウズ・ラボへ転籍
して1年を振り返る
2020年12月26日
忘れないゼミ@Discord
サイボウズ・ラボ 内田公太
自己紹介
名前:内田公太
Twitter:@uchan_nos
2018年~東京工業大学 情報工学系 特任助教(週2)
2020年~サイボウズ・ラボ株式会社(週3)
2008年にロ技研入部
2012年6月~2013年3月:サイボウズ・ラボユース第2期生
2014年4月~2020年1月:サイボウズ株式会社
2020年1月~現在:サイボウズ・ラボ株式会社
みなさん、この本知ってますか?
• 2006年に出版された
• 30日かけてOSを手作りする
• 内田はこの本でOSを学んだ
• 中学2年頃に川合さんから原稿を
渡されて読んでた
• 内田のバイブル的存在
低レイヤ技術者育成
内田のラボでの活動テーマは「低レイヤ技術者育成」
2020年のラボカツ
現代のPCで動く教育用OSの開発
『30日でできる!OS自作入門』の「はりぼてOS」はもう起動しない
セキュリティ・キャンプ全国大会 2020 オンライン
低レイヤ技術に明るい若者の発掘・育成をするよ
OSと言語処理系を全部自作するOpeLaプロジェクト
セルフホストなOS+言語処理系を自作するという夢を追い求めるよ
ラボカツ1:教育用OSの開発
MikanOS
未完、蜜柑
 https://github.com/uchan-nos/mikanos
MikanOSの特徴
UEFIで起動
64ビットモードで動作
USBマウス・キーボードが使える
ページングによるメモリ管理
MikanOSの見た目
東工大での自作OSの授業
システム開発プロジェクト応用第二
シラバス
http://www.ocw.titech.ac.jp/index.php?module=General&action=T0300&GakubuCD=4&GakkaCD=342323&KeiCD=23&course=23&KougiCD=202004868&Nendo=2020&vid=03
今年限りの講義
200分×7回で自作OSの全体像を舐めていく
オペレーティングシステム / UEFIと64ビット環境
画面描画とフォント / PS/2とUSBマウス
APICと割り込み / メモリ管理
タイマー / マルチタスク
ファイルシステム / アプリケーション
アドレス変換 / システムコール
アプリによるファイル読み書き / アプリのメモリ管理
ラボカツ2:セキュリティ・キャンプ
「システムソフトウェア自作トラック」のプロデュースを担当
今年も多数の低レイヤ人材を輩出!
システムソフトウェア自作トラック:
コンピュータシステムの基盤となるシステムソフトウェアを実際
に手を動かして作ることで理解を深める
OS
データベース
Cコンパイラ
ラボカツ3:OpeLaプロジェクト
セルフホストなOSと言語処理系を自作
OpeLa OS
OpeLa言語仕様とコンパイラ
x86-64/AArch64アセンブラ
リンカ、ライブラリ、ビルドツール
OpeLaを道具として、低レイヤに興味
ある若い人を発掘・育成したい
ドキュメント
https://github.com/osdev-jp/osdev-jp.github.io/wiki/uchan-OpeLa
自作コンパイラ
ソースコード
第1世代
自作コンパイラ
入力
第2世代
自作コンパイラ
コンパイル
セルフホスト:
自分自身をコンパイルすること
自作言語をセルフホストする道のり
第1世代
自作コンパイラ
opelac.cpp
clang++
入力
第1世代
自作コンパイラ
コンパイル
第2世代
自作コンパイラ
opelac.opl
書き直し
コンパイル
入力
第2世代
自作コンパイラ
コンパイル
第3世代
自作コンパイラ
入力
ここまでくれば
ぐるぐる回せる
(はず)
OpeLaの進捗
OpeLaコンパイラに基礎的な文法を実装した
四則演算、大小比較
ローカル、グローバル変数
if、for
関数定義と呼び出し
ポインタ、配列、文字列
x86-64とAArch64のアセンブラを出力するようにした
x86-64のLinuxと、M1 Macで実験可能
lewing@isc.tamu.edu Larry Ewing and The GIMP https://www.apple.com/jp/mac/m1/
OpeLa言語によるRPN
func main() {
var stk [128]int;
stk_i := 0;
var a int;
var b int;
var buf [128]char;
bytes := read(0, &buf[0], 128);
p := &buf[0];
for i := 0; i < bytes; i += 1 {
if p[i] == ' ' || p[i] == 'n' {
} else if p[i] == '+' {
b = stk[stk_i];
a = stk[stk_i - 1];
stk[stk_i - 1] = a + b;
stk_i -= 1;
} else if p[i] == '-' {
b = stk[stk_i];
a = stk[stk_i - 1];
stk[stk_i - 1] = a - b;
stk_i -= 1;
} else if p[i] == '*' {
b = stk[stk_i];
a = stk[stk_i - 1];
stk[stk_i - 1] = a * b;
stk_i -= 1;
} else if p[i] == '/' {
b = stk[stk_i];
a = stk[stk_i - 1];
stk[stk_i - 1] = a / b;
stk_i -= 1;
} else { // digit
stk_i += 1;
stk[stk_i] = p[i] - '0';
}
}
var s [2]char;
s[0] = stk[stk_i] + '0';
s[1] = 'n';
write(1, &s[0], 2);
}
extern "C" read func(fd int, s *char, n int) int;
extern "C" write func(fd int, s *char, n int) int;
【完全版】自作セルフホストの道のり
第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
まとめ
内田のラボでの活動テーマは「低レイヤ技術者育成」
MikanOSを作ったよ
セキュリティ・キャンプのプロデューサをやったよ
OpeLaコンパイラを実装してるよ
【宣伝】サイボウズ・ラボユース
世界に通用する日本の若手エンジニアの発掘と育成が目的
学生の若手クリエイターに研究開発の機会を提供する場
https://labs.cybozu.co.jp/youth.html
「サイボウズ・ラボユース生」
アルバイト代が出る(上限:年間103万円)
サイボウズ・ラボ社員からのアドバイスがある
成果物の権利はラボユース生に帰属
成果物を卒論や修論にしてもいいし、売ったりしてもいい
原則としてOSSにする、以外の制約がない

サイボウズ・ラボへ転籍して1年を振り返る