低レイヤーを学ぶための技術書をまとめてみる

半年前から低レイヤーに関する勉強をしている。
その中で読んだ技術書の感想、そしておすすめの読む順番をここにまとめてみる。

## OS
### [30日でできる! OS自作入門](https://www.amazon.co.jp/dp/4839919844)
おすすめ度：80（満点100）
一言：自作OSの初心者向け

自作OSでまず初めに候補に挙がるのがこの本。2006年に出版された本ではあるが、OSの根幹を理解するにはとても良い。最初からアセンブリでメモリ操作をがっつり書くため、アセンブリの経験やレジスタ周りの知識が無いと挫折してしまうかも知れない。そこを乗り越えれば楽しくOSを実装していける。

### [コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方](https://www.amazon.co.jp/dp/4873117127)
おすすめ度：95
一言：一からOSを作って学べる本格的な指南書

論理回路と呼ばれるレベルからメモリやCPUを作っていき、アセンブリ言語やアセンブラの開発、そして独自言語とそのコンパイラ、OSまで開発する。CPUなど各要点の考え方や理論を紹介し、そして自分で考えて実装するという内容になっている。本の題材は[nand2tetris](https://www.nand2tetris.org/)という海外の授業でも使われているものであり、解答のコードはGitHubで探せばいくらでもある。つまづいた時は誰かのを参考にしてもいいし、自分で悩みに悩み抜いて解決するのもいい。コンピューターの全体像を把握するには相当良い本だと思う。エンジニアが低レイヤーを勉強するときの一冊。

### [CPUの創りかた](https://www.amazon.co.jp/dp/4839909865)
おすすめ度：65
一言：物理的にCPUを創りたいのなら良い本

この本では、実際にパーツを用いながらCPUを構築していく。「[コンピュータシステムの理論と実装](https://www.amazon.co.jp/dp/4873117127)」ではハードウェア記述言語を使ってハードウェアをコードとして表現するため、実際のハードウェアについては全く触れていない。そのためハードウェアに興味が湧いているならこの本が適している。ただ先の本が優秀すぎたため、これを読んでもさらにCPUを理解できる、というわけではない。ハードウェアについて理解を深めたいならいいが、ソフトウェアエンジニアの自分としては「飛ばしてもいい」という本。またパーツは別途自分で用意する必要があるので注意。

### [はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ](https://www.amazon.co.jp/dp/4774154644)
おすすめ度：85
一言：Linuxの元であるUnixを丁寧に解説した技術書

Linux（v4.1）は2100万行ものコードがあり、いきなり理解するにはあまりにもハードルが高い。ということで、Unix V6という1万行にも満たないOSを丁寧に解説しているこの本が役に立つ。Unixは最新のOSのほとんどの起源となっているOSのこと。Linuxのようにスレッドやマルチコア機能はないが、プロセスの基本的な管理方法などはほとんど同じである。そのためLinux理解への一歩として非常に参考になる。自分もまだ読んでいる最中だが、かなり良い技術書。

### [詳解UNIXプログラミング 第3版](https://www.amazon.co.jp//dp/B00KRB9U8K)
おすすめ度：65
一言：Unixをさらに追っていきたい人向け

上記の「[はじめてのOSコードリーディング](https://www.amazon.co.jp/dp/4774154644)」をもう少し詳しく追っていきたいという時の本。ただ先の本を読まず、いきなりこの本を読んでもあまり理解できない。あくまで補助的に、もう少し深くといったユースケースになる。

### [[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識](https://www.amazon.co.jp/dp/477419607X)
おすすめ度：95
一言：Linuxのおいしい所を分かりやすく解説している技術書

正直この本を一番最初に読んでもいいかも知れない。コードをほとんど使わず、図を使って解説しているため、非エンジニアでも理解できるほど丁寧に解説している。それでいてLinuxに関する知識を浅すぎず、深すぎずで解説しているので非常にためになる。「低レイヤーはあまり興味ないけど、Linuxの重要な部分だけ把握しておきたい」という人にも最適である。

### [詳解 Linuxカーネル 第3版](https://www.amazon.co.jp/dp/487311313X)
おすすめ度：55
一言：Linuxをある程度理解している人向けのリファレンス本

2005年頃にリリースされたLinux v2.6について解説した超分厚い技術書。上で紹介した本を全て読んでから挑んでも、ほぼ挫折してしまうレベルの本。Linuxをある程度理解している人がリファレンス的に読む用だと思う。10年以上前にリリースされたバージョンなので所々今とは違う解説がされているのは注意が必要。ただ55点という点数はあくまでこの記事における点数であり、技術の結晶が詰まった良書であることは間違いない。個人的には第4版を待望中。

## コンパイラ/トランスパイラ
### [低レイヤを知りたい人のためのCコンパイラ作成入門](https://www.sigbus.info/compilerbook)
おすすめ度：95
一言：コンパイラの仕組みに加えてCPUにも詳しくなれる無料の良書

無料でCコンパイラの作り方を1から学べるオンラインブック。2020年10月時点ではまだ執筆が途中ではあるが、C言語のアセンブリへの変換を通して、コンパイラやCPUの仕組みをとても効率よく学べる。これは個人の経験だが、Cコンパイラづくりの経験があると、OSを自作する際にCPU周りの知識のつながりを感じてとても楽しく進められた。無料で公開してくれることに感謝。

### [Go言語でつくるインタプリタ](https://www.oreilly.co.jp/books/9784873118222/)
おすすめ度：70
一言：Goでインタプリタ言語を作る技術書

GolangでTDD（テスト駆動開発）をしながらインタプリタ言語を開発する本。インタプリタ言語とは、JavaScriptやPHPのようなコードを実行時に解析して実行する言語のことである。自分はGoの勉強がてらにと買ったが、Goの学習用途としては向いていない。あくまで言語開発のための字句解析・構文解析器などについて学ぶ本である。理論自体は「[コンピュータシステムの理論と実装](https://www.amazon.co.jp/dp/4873117127)」と変わりないため、こちらもまたさらに理解を深めるといった用途としては少し微妙になる。Golangを使って何か開発したい人、GolangでTDDを実践したい人、もう一度言語を開発したい人向けの本になる。

## その他（OS以外）
ここではOSに関する本ではないが、低レイヤーとして挙げられるものを紹介する。

### [マスタリングTCP/IP 入門編 第5版](https://www.amazon.co.jp/dp/4274068765)
おすすめ度：95
一言：ネットワークについて体系的に学べる良技術書

ネットワークについて学びたいならこれ一択、というレベルでおすすめできる。ネットワークとは何かというレベルから、TCP/IP周辺の知識を体系的にまとめている。例えば、Dockerのネットワーク周りがよく分からないという課題を持っている人も、これを読めば難なく理解できるようになる。新しいプロトコルが出た時や、サーバーのミドルウェアに関わる時など、そういった時にも役立つ知識が詰まっている。

### [プログラマのための文字コード技術入門](https://www.amazon.co.jp/gp/product/B07M98R3S5)
おすすめ度：90
一言：文字コードについて体系的に学べる良技術書

この本は文字コードを歴史とともに分かりやすく解説している。Unicodeとは何か？UTF-8,UTF-16の違いは何か？といった知識を体系的に把握しておくほど、問題に当たった時にスムーズに解決できる。例えばPython2と3の文字の扱いなど、低レイヤーに関わらずともアプリケーションエンジニアにとって非常に役立つ知識になる。2018年12月に新改訂版が出版。

### [プロフェッショナルSSL/TLS](https://www.lambdanote.com/products/tls)
おすすめ度：80
一言：SSL/TLSの基礎やセキュリティを学ぶための技術書

SSL/TLSの基礎や、攻撃方法とその対策をまとめている本。基礎的な説明の他にも、OpenSSL、Apacheなどの各サーバーの設定方法などを説明している。特にセキュリティ周りはかなり専門的な箇所までまとめられており、相当な読み応えがあるが、セキュリティエンジニアを目指していない人には少々オーバーに感じるかもしれない。しかしエンジニアとしては、基礎的な部分（ハンドシェイクや暗号化の種類）だけでも最低限知っておきたい。

### [プログラミングコンテスト攻略のためのアルゴリズムとデータ構造](https://www.amazon.co.jp/dp/4839952957)
おすすめ度：80
一言：アルゴリズムの基礎から応用まで実装することができる技術書

普段から高級言語を使用している場合はあまり意識しないが、低レイヤーでは時として自分が数学操作などを実装しなければならない。そういった時に計算量を意識して実装するにはアルゴリズムが必要になる。この本ではC++をサンプルコードとして、[AIZU ONLINE JUDGE](http://judge.u-aizu.ac.jp/onlinejudge/)の問題を解説している。基礎的なソートアルゴリズム、データ構造、探索アルゴリズムは全てこの本で学べる。

### [世界でもっとも強力な9のアルゴリズム](https://www.amazon.co.jp/dp/B00FR78X64)
おすすめ度：85
一言：アルゴリズムの実用例を楽しく学べる本

こちらは低レイヤーとは少し離れてしまうかも知れないが、非常に面白い本だったので紹介する。この本は検索エンジンの基本的な仕組み、公開鍵暗号、誤り訂正符号、データ圧縮など、身近にあるもののアルゴリズムを解説している。これらのアルゴリズム知識を知っておくと、身近にある課題を解決するための手がかりになるかも知れない。読み物としても非常に推せる本。