概要
こちらの記事のPhase0-②です。
コンピュータはなぜ動くのか(第2版)を読んでいくことによって、これから学習することの全体感を掴む。
適宜まとめや、疑問に感じた箇所、その疑問が解消された場合はそのことについて書くこととする。
2026/3/29より開始。まだ読み終わってないよん。
目次
はじめに
第1章 コンピュータの3大原則とは
第2章 コンピュータを作ってみよう
第3章 一度は体験してほしいアセンブラ
第4章 川の流れのようにプログラムは流れる
第5章 アルゴリズムと仲良くなる7つの方法
第6章 データ構造と仲良くなる7つのポイント
第7章
第8章
第9章
第10章
第11章
第12章
はじめに
以下、引用
往年の技術者たちは、最新の複雑な技術であっても、あまり時間をかけずに理解できます。その理由は、初期のマイコンやパソコンが一般に入手できるようになった時代から幸運にもコンピュータに触れることができ、数少ない技術の中で、ゆっくりと時間をかけてコンピュータの基礎知識を学ぶことができたからです。この基礎知識は、実は現在でもほとんど変わっていません。したがって、最新の複雑な技術であっても、コンピュータの基礎知識に当てはめて考えることで、すんなりと理解できます。
(中略)
本書の目的は、コンピュータ技術の、知識の範囲、絶対的な基礎、ゴールを、皆さんに身に付けていただくことです。
出典:コンピュータはなぜ動くのか 第2版 知っておきたいハードウエア&ソフトウエアの基礎知識 はじめに より
前書きから早速、自分の求めるものが手に入ると書いてある。最高だ。
第1章 コンピュータの3大原則とは
疑問
- そもそも何故16進数使われがち?コンピュータ関係の数字って2の階乗ばっかり?なんで?10進数じゃだめなん?
→根っこは2進数で、桁を1つ増やすと表現できる数が倍々に増えていくから(チャットGPTより)なるほど〜! - コンポーネント・ベース・プログラミングとは 説明読んでもわからんp24
用語整理
- CUI
- Character User Interfaceの略。Unixみたいなやつ GUIの対比
- メモリ:命令とデータを記憶するp26
- クロック信号:水晶を内蔵したクロック・ジェネレータと呼ばれる部品によって発生されるカチカチという電気信号。現在主流のCPUなら3〜4GHz p26 Hzは周波数を表す単位で、1秒間に1回のクロック信号が1Hz p28
第2章 コンピュータを作ってみよう
疑問
- レジスタとはなんぞ?
CPUの中にある箱で、汎用レジスタはGRから始まるアドレスで任意の演算に使う。それ以外のレジスタは3章解説 p32
→チャットGPTに聞いてみる。要するにメモリより速く作業できるCPU内のメモリみたいなイメージ?
メモリにあるデータをレジスタにロードしてきて、そこで加工(計算)とかして、それをメモリに返す、であってるかな? - メモリ目線で見ると、I/OのIから入ってきた16bitのデータをメモリに記憶させなきゃいけないから、そのままメモリに送る。そのときメモリのどのアドレスに記憶させるのかも一緒に指示する。って感じかなあ。入ってきたデータをどうやって計算してんのかは次の章のアセンブラでやるのか
あれ、でもCPUが動くのってクロックジェネレータからのカチカチじゃなかったっけ?混乱😵💫 - 何が分からないのか整理。まずこの図のDがデータでAがアドレスって書いてあるけど、やりとりしたデータとアドレスはどこに保管されるの?その情報のやり取りはクロックジェネレータからどういう風に指示が出されてどうやってどうなって行われるの?レジスタは16bitって言ってたけどこれ全部で1つのレジスタと思っていいの?それとも?
用語解説
第3章 一度は体験してほしいアセンブラ
- 4周くらい読んでやっと何が分からないのか言語化できた、くらいには何書いてあるかわからない
- Windows持ってないよ〜ん。・゚(゚⊃ω⊂゚)゚・。エーン
ブラウザで動くシミュレータ見つけたけど、サンプルと同じ表示にならない。iOSだとまた違うのかしら。TAB押せないし - p56より
たとえば、プログラムが#1000番地にロードされた場合には、プログラムの先頭に付けた
SAMPLEというラベルが#1000というアドレスに置き換わります。それによってAというラベルを付けた箱の位置が#1007番地になるなら、ブログラムの中にあるAというラベルが#1007に置き換わります。
「それによってAというラベルをつけた箱の位置が#1007番地になるなら」
なるなら、ということは、その部分をどこがどうやってどういうふうに決めてるの?→苦Cでたまたまこれに対する答えっぽいものを見つけた。
指定された変数をどの番号のメモリに割り当てるのかは、
コンパイラ(正確にはリンカ)が自動的に決めてしまい、
出典:苦C 第1部15章2節より
いずれにしてもどうやって「自動的に」決めてるのかは分からない。
- そもそも0と1だけで書かれている命令をコンピュータはどのように解釈・実行しているの?その辺は論理回路やれば分かるのかなあ
- アセンブリ言語から機械語への変換はどうなってるんだろう
- p69以降でPRに次の命令がセットされていく様子が書かれているが、そもそもメモリにはどこから情報や命令がやってきているのか?それがどのようにしてレジスタにいくのか?
- CPUとメモリがどんなことをしているのかなんとな〜く分かって、だからこそ余計に分からない部分が増えて、とても面白い!
第4章 川の流れのようにプログラムは流れる
- Pythonの文初めて見たけど、なんとなく意味が分かる!すげえ!C言語やっておくと他の言語習得が容易になるかもって、そういうことだったんだな〜ありがたや。C言語のモチベもアップ⤴︎
- p84より
筆者の経験では、フローチャートを書くのに1ヶ月もかかったのに、プログラムの打ち込みが2日で済んだことがあります。
はえ〜
これから何か作ろうとするときはフローチャートで考えてみよう。面白そう!
- p87〜 繰り返しと分岐はメモリ上だとジャンプしている様子が描かれている。なるほどそういうことだったのか〜この辺は先にC言語とかアセンブラとか軽く触っておいた方が理解深まりそうだね
第5章 アルゴリズムと仲良くなる7つの方法
- p107〜108 プログラマのたしなみとして最低限知っておくべき定番アルゴリズム
| 名称 | 用途 |
|---|---|
| ユークリッドの互助法 | 最大公約数を求める |
| エラトステネスのふるい | 素数を求める |
| 線形探索 | データを探索する |
| 2分探索 | データを探索する |
| ハッシュ法探索法 | データを探索する |
| バブル・ソート | データを整列する |
| クイック・ソート | データを整列する |
何かを作るとき参考になりそう!
- p111数学要復習
- 番兵(p112~)、じゃんけん勝敗判定のアルゴリズム(p117)、天才か〜!
第6章 データ構造と仲良くなる7つのポイント
- p120より
変数は、データの入れ物であり、その中に格納した値を変更することができます。変数の実体は、変数のサイズで確保されたメモリー領域です。
んあああ゛あ゛ぁ゛この説明で色々腑に落ちたあああ!C言語勉強中でモヤモヤしていた部分が少し晴れた。やっぱりこの本、前提知識あった方がいいね?ハード寄りのところ勉強したらもう一度1〜3章読み直そう。新たな気付きがありそう。
- p127 バブル・ソートで昇順並び替え
まとめ
この章では、主なデータ構造(スタック、キュー、リスト、2分木)を、Cの配列と構造体を使って説明していた。