Cybozu Labs

サイボウズ・ラボユース 開発コース

2024 年度も開講します。応募をお待ちしております。このコースは募集期間が通年ではありませんのでご注意ください(詳細は後述)。

低レイヤ開発(担当:内田 公太

低レイヤ開発コースでは CPU、コンパイラ、OS など、コンピュータの原理を探求するような開発プロジェクトを募集します。メンターの内田が持つ次のような経験を元に、皆さんの研究開発をサポートします。

CPU 開発

CPU 開発については、CPU の開発自体が目標となるようなテーマでも、何か他の開発プロジェクトの一部として CPU を開発するのでもかまいません。独自の CPU と並行して専用のコンパイラやアセンブラ、リンカなどを作るようなテーマも歓迎します。

CPU の開発に際しては興味深い要素がたくさんあります。命令セット、レジスタ構成、信号線と命令デコーダなどです。また、CPU の枠を飛び越えて周辺機能を充実させ、MCU(マイコン)として完成度を高めていくような方向性もあるでしょう。メンターの内田は、ComProc CPU に周辺機能を追加し、最終的には自走ロボットの制御をしてみたいと思っています。

命令セットは CPU を特徴づける主要な要素です。応募に際しては独自の命令セットを持ったものでも、既存の命令セットを採用したものでもかまいませんが、いずれにせよ独自色がある開発テーマで応募してください(詳しくは後述)。

既存の命令セットを採用することで独自性を出す例を考えてみます。実機が手に入らないような珍しい CPU の命令セットを模倣するなんてどうでしょう。「その命令セット向けのプログラムが無改造で動く CPU を作ります」というテーマの場合、既存の命令セットであるからこそ独自性が出ると思います。手に入らない理由は様々だと思います。当時は流行っていたけど古すぎて入手困難になったり、そもそも実機生産数が少なくて入手困難だったり。

コンパイラ開発

コンパイラ開発に関しては、コンパイラだけを開発するテーマは想定していません(だからといって採用されないとも限りませんが)。独自の CPU 向けのコンパイラを作りますとか、CPU とコンパイラを同時並行で作りますとか、そういった「コンパイラと何かの組み合わせ」のようなテーマだと良いかなと思います。

リンカの自作も興味深い領域です。アセンブラよりリンカの方が先に作られた[^linker]とのことですが、今の時代はなかなか「リンカ自作」をしている人に出会いません。コンパイラは自作しても、最終的に実行可能ファイルにするために使うリンカは既製品という場合が多いのではないでしょうか。

[^linker]: 低レイヤを知りたい人のためのCコンパイラ作成入門 によれば、「アセンブラがまだ使われておらず、機械語で直接コードを書いていた時代」にリンカを説明した書籍が出版されたのだそうです。

メンターの内田は ComProc プロジェクトで CPU とコンパイラを作っています。まだリンカを作っていないため、1 つの .c ファイルに必要なすべての関数を詰め込まないといけない状態です。複数のプログラムで共通に使う関数がコピペされまくっていて、早いところリンカが欲しいです。

OS 開発

私は「OS」を広い意味で捉えています。OS=カーネルに限定せず、デバイスドライバやアプリケーションも OS の重要な構成要素だと思います。人間が便利にコンピュータを利用するには、タスク切り替えやメモリ管理を担当するカーネルはもちろんですが、ドライバやアプリケーションを含めたシステム全体が重要です。本開発コースで扱う OS の対象ハードウェアはパソコンに限らず、マイコンなども歓迎します。自作 CPU(MCU)向けの OS なんて作れたら、非常に面白そうですね。

「OS を作る」と聞くと、メモリ管理プログラムやタスクスケジューラを書くのかと思うかもしれません。それらは OS の大切な側面ですが、他にも、アプリケーションを作る土台としての側面や人間とのインターフェースとしての側面もあるのです。例えば、アプリケーション作りを支援するためには、システムコールや各種ライブラリの整備、分かりやすいドキュメントの充実が必要でしょう。人間にとって分かりやすいインターフェースを提供するためには、どのアプリケーションでも同じ操作ができるように OS が支援したり、目的のファイルを見つけやすくする機能があるといいかもしれません。

自作 CPU に載せる OS を作ろうと思ったとき、OS を動かすためにはページングなどのメモリ管理機構[^memory-mcu]が必要なのでは? 自分の CPU にはまだそういう機能は無いぞ? と思うかもしれません。そういう人は、きっと高機能な OS を想定してしまっているのでしょう。確かに、複数のプロセスが同時並行で動いたり、プロセス同士が干渉できないように保護したり、仮想記憶を提供したり、などといった高度な機能を実装するにはメモリ管理機構が欲しくなります。

[^memory-mcu]: メモリ管理機構(Memory Control Unit)は略して MCU です。マイコン(Microcontroller Unit)も MCU なので、紛らわしいですね。

しかし、そればかりが OS ではないと思います。例えば、SD カード用ドライバを持ち、FAT32 ファイルシステムを認識し、アプリケーションを SD カードから読み出して実行できるソフトウェアを想像してみます。これは「OS」でしょうか? 内田にとって、これは立派な OS です。特に、このようなソフトウェアが自作 CPU で動いたら、とっても感動するのではないでしょうか。

開発テーマの独自性について

独自のアイデアが含まれる開発テーマをお待ちしております。「独自」といっても、世界初のアイデアを求めているわけではありません(もちろん世界初のアイデアも歓迎しますが!)。例えば、次のようなアイデアでも十分に独自性があると考えます。(採択を保証するものではありません)

逆に独自性がないと考えるのは、例えば、書籍などの資料をなぞるだけの開発テーマです。 「OS や CPU の勉強のために○○という本に沿って実装します」だけでは、残念ながら採択されない可能性が高いです。 プロジェクトの初期段階にそのような知識習得の期間がある分にはかまいませんが、メインテーマには独自アイデアを盛り込んでください。

メンターから期待できるサポート

応募要件

本コースへの応募に際しては、開発に用いるプログラミング言語などの基礎的技能をあらかじめ習得している必要があります。 可能であれば、能力を説明する資料(自作プログラムを載せた GitHub リポジトリや、これまでの活動が分かるブログ記事など)を応募用紙に書いてください。

C言語を例に、言語スキルの到達指標を載せます。 これらが絶対条件ではありませんが、レベル感の参考にしてください。

また、応募用紙には応募するテーマの現在の進捗を記載してください。応募時点ですでに何らかの成果物がある場合は、それを説明してください。まだ構想段階であれば、その構想について書いてください。開発のざっくりしたスケジュールがあれば教えてください(ラボユース期間内に限定してもいいし、ラボユース期間前後を含めていただいても構いません)。

募集期間

本コースは募集期間が通年ではありません。以下のスケジュールを確認してください。

ラボユース活動の進め方

本コースに採択された場合、典型的には週に 20~30 分ほどの定期ミーティングを設定します(個別の調整あり)。 普段は個人で開発を進めてもらい、定期ミーティングで進捗を確認したり質疑応答を行ったり、コードレビューを実施したりします。 ラボユース活動を効果的なものとするためには、定期ミーティングに臨む前に、話したいことを整理しておくと良いです。

必要に応じて別途時間を取り、何らかのトピックについて講義したり議論やコードレビューの延長戦をしたりすることもあります。 これら追加の活動は、ラボユース(研究)生からの求めがあり、メンター(内田)の都合がつく場合に実施されます。