コンピュータはなぜ動くのか
https://images-na.ssl-images-amazon.com/images/I/51W5%2Bjv%2BJyL._SX350_BO1,204,203,200_.jpg
著者:矢沢 久雄
要約
コンピュータが動く仕組みを、ハードウェア→プログラム→アルゴリズム→データ構造→アプリケーションプログラムの構造→通信プロトコル、とハードなどの低レイヤーからアプリケーション層まで幅広く網羅している。なんらかの言語を触ったことがあるがコンピュータの仕組みそのものに触れたことがない人向け。
感想
コンピュータとプログラムの原則、ハードウェアの話から始まり、実際に回路図を作るなど可視化しながら仕組みを追いかけることができた。プログラムをマシン語に自分で翻訳してみるというのも、考えてみたら単純な話ではあるがやってみるとより腹落ちした感じ。プログラムの中身はアドレスと処理の羅列であることなど。
意識せずに受け止めていたこと(プログラムの流れなど)も改めてコンピュータ側の都合にまで立ち返って考えることができたのがよかった。
面白かった章
回路図はあんまり分からなかったが、分からないなりに視覚化されてへえーとなった。詳細を追い出すと一気に細かくなってしまうので大体の流れだけ解説を読みながら追いかけてみたが、よかったと思う。
後日談:回路図について分からないなりに視覚的に捉えていたので、自作PC組むときにやっててよかった、となった。
---
回路図を使って回路をつなげてマイコンを作る
模擬的にマイコンを作る
よく分からないけど主役がCPUとメモリとI / Oであることがよく分かる
しかもそれぞれ電源やデータのやりとり用の回路をつなげているので物理的に繋がりがイメージしやすい
図を書いてみることでそれぞれの回路で電気信号がオンとオフになっているところが想像しやすい
https://gyazo.com/b2709a4164bab57aaae483dfc2e4c5a5
それぞれなんとなーくイメージできた
アセンブリ言語をマシン語に書き換える
対応表を見ながら、0と1だけのマシン語に書き換える
アドレスと指示を書き換えていく過程を手を動かしながらやれたことはよかった
コンパイルというのはこういうことか、という実感
https://gyazo.com/008edecd91531522de5c59b7a762ad19
手動でコンパイルしてみた
Basic の一種であるVBScriptは残念ながらMacでは動作せず。。。
でも一通り書いてみてほとんどjsとかと同じだった
簡単なプログラムだったら言語の差がほとんどないのが面白い
プログラミング言語の種類の違いは、方言のようなものです。
https://gyazo.com/390e478b9ed206d4f6c37904dc804a91
これ覚えておくと良さそう。汎用的に使えるフローチャートの図記号
構造化プログラミングとジャンプ文の違い
https://gyazo.com/a2b524aaa18c6acf5aa4d895e29bf809
割り込み処理=インタラプト
皆さんがお使いのパソコンでは、周辺装置に接続されたI/Oが割り込み要求信号を発生します。たとえば、キーボード用のI/Oは、キーが押されるたびに割り込み要求信号をCPUに送ります。それによってCPUは、キーが押されたことがわかり、I/Oからデータを入力します(図4.14)。常にキーボードを監視しているわけではないのです。
キーボードの入力を常に監視しているわけではなく、入力があったらその都度割り込み処理をしている
割り込み処理はハードウエアから要求があったという条件でプログラムの流れが分岐する特殊な条件分岐
ソフトウェア開発においては割り込み処理は記述しないと考えて良い
インフラとかでサーバー(ハードウェア)を考える時に出てきそう
アルゴリズム
お決まりのアルゴリズムを知っておくこと
自分で考えてみること
連立方程式や素数の判定は結局泥臭くやることになる
つい人間が計算するイメージでやってしまうが少し異なるということを念頭においたほうがいいかもしれない
番兵
目的の値が見つかった時に、それが番兵かどうか確認するだけで本当に目的の値が見つかったか判定できる
この仕組み知らなかった、面白い
ジャンケンのアルゴリズムのように、数値で置き換えて規則性を見つける
これが慣れてないとなかなか思いつかない
この辺が競プロの手法なんだと思う
紙に書いて考える
これば実際やったことがある
事象を書き並べて整理すると、そこで規則性を見つけることができる
データ構造
メモリと変数の関係を知る
変数の実体は変数のサイズで確保されたメモリ領域
配列の実体は特定のサイズのメモリ領域を連続的に確保したもの
プログラマは、変数aが何番地のメモリー領域になるのかを意識する必要がありません。プログラムの実行時にOSが、それまで未使用だったメモリー領域の一部を変数aのために割り当ててくれるからです。このように、たった1個の変数がプログラムにおけるデータの最小単位であり、それが物理的なメモリー領域に対応します
プログラムを支える技術とかでも出てきたところ。この感覚がやっとしっくりくるようになった
https://gyazo.com/5927667030f513f54e6c6451183a783a
pushとpopの違い、分かりやすい
https://gyazo.com/ff988caf893fb9ae729e09bb5a1e4078