🔨

やってよかったbuild own x系(自作OSとか自作DBみたいな自作~)を紹介してみる

2023/03/03に公開

はじめに

build own xってなに?という方がいらっしゃると思います。
下記ページにあるような自作~みたいなやつのことを指しています。
https://github.com/codecrafters-io/build-your-own-x

自作OSとかDBとかとにかく様々な種類があるんですが、僕がやってみて良かったなぁと感じたものだけ紹介します。(一部やってないけど良さそうなのも紹介します。)

難易度を星5を最高として書いていきます。
言語は日本語 or 英語です。


コンパイラ

writing interpreter in go

形態:本
言語: 日本語、英語

https://www.amazon.co.jp/Go言語でつくるインタプリタ-Thorsten-Ball/dp/4873118220

コンパイラ系なら一番初めにおすすめなのは間違いなくこれ。
日本語版では「Go言語でつくるインタプリタ」という題で出版されています。
外部に依存するライブラリを一切使わないのが特徴でスクラッチで書きます。
語り口調も平易でわかりやすく、コンパイラ?インタープリタ?という方にもおすすめ。

Monkeyという言語を実装するのですが、既存の言語だとpythonみたいな動的言語に近いです。
ただClassみたいな難しい機能は実装されてはいないです。

Go言語を使っているのですがGo言語があまり難しくないのもありコードも読みやすいかなとおもいます。
とにかくおすすめ!

言語作成の中で出てくるASTという概念はちょくちょくほかの分野でも出てくるので結構役立ってます。

難易度: ☆☆

writing compier in go

形態:本
言語:英語のみ

https://www.amazon.co.jp/Writing-Compiler-English-Thorsten-Ball-ebook/dp/B07FZWWVQT

writing interpreter in goの続編にあたる本。
残念ながらまだ日本語訳は出ていませんが、英語も平易で読みやすいです。(最悪コードが読めれば多分何とかなる...かも)

難易度は前作よりは少し上がったかなという感じですが、作者の力量もあり引き続きわかりやすいです。
内容としては前作で作成したMonkey言語をインタープリタではなくコンパイラで実装しようという本です。

インタープリタはASTから一気にevaluatorに入るのに対して、コンパイラはASTを一度アセンブリに変換して、そのアセンブリをgcc等で実行しアセンブリを解釈といった形になります。

writing compier in goではアセンブリではなく疑似アセンブリみたいな形にして読者にやさしくなるように努めています。
その疑似アセンブリはgccでは解釈できないので自作VMを作り疑似アセンブリを実行する形です。

疑似ではなく本当のアセンブリが出力されるようにしたい!という方は下記で紹介する「低レイヤを知りたい人のためのCコンパイラ作成入門」が助けになります。

難易度: ☆☆☆

低レイヤを知りたい人のためのCコンパイラ作成入門

形態:webページ
言語:日本語

https://www.sigbus.info/compilerbook#機械語とアセンブラ

C言語のコンパイラを作るページです。

丁寧でわかりやすく書いてくださっています。
ポインタがどう実装されているか、型はどう表現するか、アセンブリにどう変換するかがわかります。

アセンブリが出てきたりそもそもC言語自体がむずかしくポインタ自体??となってしまう危険もあり難易度は相当高めです。

さらにwebページの解説は途中までなので最後までやりたい場合githubにstepごとに分割してcommitしてくださっているものの解説なしで自分でやっていかなくてはいけません。

github
https://github.com/rui314/9cc

C言語のポインタがわかる!、writing compier in goは終わった!、コンパイラについてもっと深くまで知りたい!という方はチャレンジしてみると面白いと思います。(挫折危険性も高いので、挫折しそうなときは先人の解説を探してみるのも良いです。)

難易度: ☆☆☆☆ ~ ☆☆☆☆☆

Cool: The Classroom Object-Oriented Language

形態:ソースコード
言語:英語のみ

スタンフォードのコンパイラの授業で作られている授業用Object指向言語です。
https://online.stanford.edu/courses/soe-ycscs1-compilers

このとき低レイヤ~でポインタとかアセンブリはやったけどクラスってどうなってるんだ?と思ったのでちょうどよい学習対象でした...が対象は良くても難易度が難しすぎた思い出です。

なにしろ解説が(多分)ないのでコードを見ながら進めるしかないところが辛すぎました...
幸いlexer,parser含めgoで書き直してくださってる方がいて途中までは完了することができ、クラスについては理解が進んだのですが、
ガベージコレクタはどうしてもコースで用意されているスクリプトを使わなくてはいけず、組み合わせる方法がわからず断念してしまいました。

途中で断念しておいておすすめかよ!となると思いますがクラスについて理解できそうなものが他に見つからないのでおすすめとさせてください。

参考にさせて頂いたGoによるgocool
https://github.com/zellyn/gocool

難易度: ☆☆☆☆☆以上


OS

Developing a Multithreaded Kernel From Scratch!

形態:動画
言語:英語のみ

Udemyのコースで有料です。
https://www.udemy.com/course/developing-a-multithreaded-kernel-from-scratch/

まだ途中までしかやっていないのですが、解説がとにかく丁寧でわかりやすい。
前にもOS本とかやってみたのですが、やっていることが何となくしか理解できず悲しい気持ちになった思い出です。

このコースではヒープを簡易版とはいえ実装しているのですが説明がわかりすくC言語とは言えコードの理解にもそれほど苦労しません。
まだ到達していませんがマルチスレッドも実装するらしいです。

前提条件としてC言語とアセンブリの理解...というのが敷居が高いかもしれませんが自作OSな以上やはり理解しなくてはいけません。
僕はあまり理解していないのでわからなくなるたびリファレンスを見ながらやってます;;

難易度:☆☆☆☆


分散システム

raft

形態:論文と解説ページ
言語:英語のみ

特に解説の本やページがあるわけではなく論文やちょっとした解説ページを見て実装しました。
他にも様々な方が実装されています。
kubernetesに使われているetcdにも使われており、勉強しておいて損はないと思います。
なにより分散システムの中では取っつきやすいと思うので分散システム入門にも。

自分の記事で恐縮なのですが、raft作ってみたの記事です。
https://zenn.dev/cube/articles/7d2666276e939d

難易度: ☆☆☆


DB

自作DB

形態:解説ページ、動画
言語:日本語、英語

元ネタは下記の記事で面白そうと思ってやってみました。
https://buildersbox.corp-sansan.com/entry/2019/10/24/110000

DBといえば正直ブラックボックスなイメージがあると思います。
コンパイラを先にやった方はSQLに対するパーサーを書いてファイル、メモリへの入出力をするイメージは割と楽につかめるのではないかと思います。

indexはどう表現されるか?においてB-Treeだったり、トランザクションってどうなってるの?といった疑問が学べます。

optimazerは取り扱っていません。
一回optimazerがどうなっているか参考にしようとpostgresを参考にしようとしましたが即挫折しました。
誰かoptimazerまで取り扱った記事やコースお願いします。(他力本願)

難易度: ☆☆☆

ネットワーク

TLSと証明書

形態:解説ページ
言語:日本語

TLSや証明書についてよくわかっていなかったので証明書のパーサーやTLSを再実装してみました。
TCPの上に自作TLS+自作証明書パーサーでTLS通信にしている感じです。

自記事にて詳しく作り方を書いています。
解説(自記事)
https://zenn.dev/cube/articles/2b4a225176a3bd

難易度: ☆☆☆


コンテナ

build-a-container-golang

形態:動画、記事
言語:英語のみ

https://www.youtube.com/watch?v=_TsSmSu57Zo
https://www.infoq.com/articles/build-a-container-golang/

dockerみたいなコンテナはlinuxのどの機能を使って成り立ってるかをおもちゃコンテナを作って学ぶことができます。
20分くらいの動画なのでさくっとみれておすすめ。

ここからはやったことがないのですが下記も参考になるかと思うので貼っておきます。
container runtimeの実装
https://iximiuz.com/en/posts/conman-the-container-manager-inception/

難易度: ☆☆

コンテナ監視

形態:ソースコード、解説ページ
言語:日本語

cAdvisorのようなコンテナ監視ツールが何をやっているかを学びます。
コンテナ監視といってもコンテナのどこを監視すればいいのかまるで分らなかったので調べたのがきっかけで自作のおもちゃレベルの監視ツールを作りました。

下記の自記事で解説しています。

自記事
https://zenn.dev/cube/articles/44a192733262f2

難易度: ☆☆


その他

レイトレーシング

レイトレーシングって?

簡単に言えば、Unityみたいな3Dモデルを作るプログラムのことです。
3Dモデルを作る手法を学ぶのではなく、どう3Dモデルを出力するソフトを作るか?を学びます。

The Ray Tracer Challenge

形態:本
言語:英語のみ

https://pragprog.com/titles/jbtracer/the-ray-tracer-challenge/

詳しい紹介は省略しますが、どう3Dモデルを作るソフトを作るかを学べる本です。
Unity等の3D作成ソフトの裏側を知りたい方には是非おすすめ。

詳しい紹介(自記事)
https://zenn.dev/articles/a02cb19ea29000

難易度: ☆☆☆

Git

Building Git

形態:本
言語:英語のみ
https://shop.jcoglan.com/building-git/

このリストの中で1,2を争うほどお勧めしたい本。
writing interpreter in goかこれかと迷うレベルで面白かった。
内容としてはrubyでgitを再発明していく本ですが、めちゃくちゃ丁寧に書かれていてかつgitの内部を深くまで書かれていて面白いです。

日本語でもぽつぽつとgitの中身について書かれている記事はありますが、blob、tree、commitオブジェクトの解説までくらいだと思います。(見逃してたらごめんなさい。)

この本ではmerge,revert,rebase,diff,cherrypickなど大体日常で使うようなコマンドは一通りやります。

丁寧に書かれているとはいえ、ブランチをマージする仕組みの理解だったり苦労するところはあるものの仕組みがそもそも難しいのでしょうがないかなぁと思います。

rubyで書かれているのですが、僕はrubyが使えないのでgoで書きました。
rubyを知らなくても読めるくらいには解説が丁寧です。
何度も言いますがおすすめです。是非やってほしいです。

Goでのソースコード(自ソースコード)
https://github.com/stone-like/MyGit

下記のpythonでの解説もよさそう。
https://www.leshenko.net/p/ugit/#

難易度: ☆☆☆

おわりに

ここまでおすすめのコースや記事を上げてきました。
どれか一つでも琴線に触れて頂けたら嬉しい限りです。

みなさんのおすすめも教えてくれると僕がとても嬉しいです。
コメント欄にでも書いてくださると泣いて喜びます。

おまけ

次やりたいやつ
https://build-your-own.org/redis/

Discussion