ちょっと前に購入していた「コンピュータシステムの理論と実装」ですが、他にもいろいろとやりたいことの収拾がつかず、放置しておりました。
どこから手を着けようか迷ってもいたのですが、この本の構成が整っていることから、今後の他の取り組みに対しての構成の参考になるかな。といった観点からモチベーションが高まってきたのでここから着手することにいたしました。
今回の参考資料は、
コンピュータシステムの理論と実装―モダンなコンピュータの作り方(https://www.oreilly.co.jp/books/9784873117126/)
公式のサポートサイトはこちら:
From Nand to Tetris(https://www.nand2tetris.org)
実装する際に必要となるソフトウェアはこちら:
nand2tetris software suite(https://www.nand2tetris.org/software)
モチベーション
- コンピュータシステムの全体像を理解したい。
- 知識があやふやなまま必用なところだけ使っていると不安になってくる。
- 調べる時に常にわからない概念が含まれている気持ち悪さ。
- 調べる時にどこが要所なのか、どこを調べればいいのか勘がつかめる。
- コンピュータシステムを構築したい。
- 大きくて統合されたシステムを構築することで、自分が長期的な作品・システムを作るときの参考になる。
- 標準的な考え方を学ぶことで、自分がやっていることへの自信を身に付ける。
テキストの内容
まえがき、イントロを読んで現時点でいい言葉だなと思ったところ、今後の指針となるところを抜粋し自分なりにまとめておきます。
本書の目的
- ”森全体”をの美しさを立ち止まって味わう時間
- 実際に作ることを経験しないと理解できないことがあるのだ
- コンピュータ全体を構成する主要な要素を実際につくること、それによりコンピュータ全体の仕組みをじっくりと堪能すること。それが本書のテーマである。それが、本書の魅力であり、おもしろさである。
- 発見の旅とは、新しい景色を探すことではない。新しい目を持つことである。――マルセル・プルースト
- 人に重要な影響を与える唯一の学びは、自己発見・自己本位による学び、つまり、経験によって理解された真実のみである ――カール・ロジャース
- 巨大なプロジェクトをいかに効率良く計画し、管理するか
- 数える程度の単純なビルディングブロックだけから、信じられないくらい複雑で実用なシステムを作ることができる
- 読者は次の3つのことを学ぶことになる。それは「コンピュータの動く仕組み」「複雑な問題を扱いやすいモジュールに分割する方法」そして「ハードウェアとソフトウェアからなる巨大なシステムを開発する方法」である。
- 我々はこの複雑性に対して、プロジェクトをモジュールに分割することで対処する。
- モジュールによる計画がうまく機能するのは、物事を抽象化して考える能力に他ならない。
- 抽象化はレイヤ構造を取ることが多く、レイヤが重なるほどシステムの能力も増していくことになる。
- 複雑なシステムをモジュール化された重要的なシステムとして把握する方法。
- 「抽象化」の意味
一般:ある物事の本質的な要素を簡潔な方法で捉え、それを抜き出し、分離して考えること。
コンピュータサイエンス:要素が何をするのか(what)のみを考え、どのように行うのか(how)という詳細を無視すること。インターフェイスともいう。
- 本書が目的とすることは、ハードウェアとソフトウェアの構築という作業を通じてコンピュータサイエンスにおける重要なテーマを学ぶことである。
本書で扱う範囲
本書で扱う範囲は次のもの。
- ハードウェア
- アーキテクチャ
- オペレーティングシステム
- プログラミング言語
- コンパイラ
- データ構造とアルゴリズム
- ソフトウェアエンジニアリング
一方本書で取り扱わない範囲。
最適化と例外処理。これらは本当の実装では重要なテーマであるが、今回の全体を構築し把握するという目的から取り扱わない。
本書の構成
本書の構成は、抽象と実装のパラダイムに従っています。
各章の構成は、
- 背景:関連する概念や一般的なシステムについて説明する。
- 仕様:システムの抽象化された要素を明確に論じる。
- 実装:What(何をするか?)を説明したあと、How(どのように実装するか?)を解説し、実装する。
- 展望:その章でまだ述べられていない重要な問題について説明を加える。
- プロジェクト:作成の手順、テスト材料や作成の為のツールを説明する。


QCD
モチベーションを踏まえて、今回目指す成果を定義します。
初めての計画ということで今回はQCD(Quality,Cost,Delivery)という枠組みをそのまま利用して成果を定義しようかと思います。
Quality
クオリティは一章を終えるための必要条件のことです。質は上を見るときりがないのでこれらを満たしたら終えて良いという判断基準です。
まず、テキストを読んだり演習をこなす時に、
- なるほど!
- おもしろい!
- ありがたい!
- すごい!
この四つの気付きを得ること。
もう一つは、一つの章を終えるまでに、ブログ記事を2つ作ること。
一つ目の記事は、学習した内容をトレースすること。
二つ目の記事は、問題の演習にトライすること。
Cost
これは読解する時間、演習を解く時間、記事を書く時間をコストとして管理したいと思います。
コスト意識がまだあまりないので、まずは作業にかかっている時間から意識していきたいなと。
Delivery
いつまでにこの計画を終わらせるか決めておかないといつまでも終わらないです。
一週間で一章と考えて、納期は7月1日に設定します。
実行計画
単元 | 内容 | 記事(trace) | 記事(try) | 作業時間 | 完了日 | 備考 |
1 | ブール論理 | – | ||||
2 | ブール算術 | – | ||||
3 | 順序回路 | – | ||||
4 | 機械語 | – | ||||
5 | コンピュータアーキテクチャ | – | ||||
6 | アセンブラ | – | ||||
7 | バーチャルマシン:スタック操作 | – | ||||
8 | バーチャルマシン:プログラム制御 | – | ||||
9 | 高水準言語 | – | ||||
10 | コンパイラ:構文解析 | – | ||||
11 | コンパイラ:コード生成 | – | ||||
12 | オペレーティングシステム | – | ||||
13 | さらに先へ | – |

コメントを残す