先日のMeltdownとSpectre問題とかの関連でCPUについてもう少し深く知りたいな〜という気持ちがあったのとちょうど正月にCS基礎教養をまとめてて読もうと思ってたところだったのでちょうどよかった。パタヘネ本は結構内容が濃いと聞いていたので隅から隅まで本気で読むと絶対続かないな〜と思ってたから、今回はCPUの全体的なアーキテクチャの話とかCとかの普段使う言語がプロセッサでどう実行されるのかとかその辺の基礎的な部分の理解にしぼってさくさく読んでみた。一通り読んでみて、入門レベルの書籍だとプログラムが実行されるにはメモリにロードされてプロセッサで実行されますくらいにしか説明されないが、パタヘネでは具体的にどのようにCPUで実行されるのかみたいな話をソフトウェアレベルからハードウェアのレベルにまだへりくだって解説してくれるのが良いなと思った。高水準言語>コンパイル>アセンブリ言語>アセンブラ>機械語の流れから、メモリにストアされた機械語の命令がレジスタにロードされてフィールドの値からどの命令なのか解釈されALUで処理してうんぬんみたいな話とかこういうの大学でやっておくべきだよなーとかとか思ったりした。アセンブリ言語も今回初めて学んだけど、(MIPSだからなのかもしれんが)割と理解しやすくてこんなもんなのかーと拍子抜けした。たしかに32ビットに命令が収まらない場合とか浮動小数点の計算とかでルーチン実行でスタック積んだりとか難所はある気はしたけど。この本ではアセンブリを「人間の読める言語」と呼んでいたのだけど、"人間が読める"ってなんだろうみたいなことを考えたりした。機械語は読めなくて、アセンブリは読めるの違いはどこにあるのだろうか。たしかにアセンブリは機械語に比べたら自然言語に近いけど。無味乾燥な0と1の組み合わせの機械語でもフィールドごとに意味があって、どのフィールドがこの値ならadd命令であるとかわかるのなら機械語も"読める"言語なのでは?みたいな、よくわからん哲学に突入してしまい疲れた。パイプライン処理の章では話題の投機実行についての話にも触れてたけどOOハザートのあたりとか詳細はよくわからんかった。実際にCPUの設計をして実装をする人とかはちゃんと理解しないとだめそうだけど。なんか素人考えだとコンパイラである程度変数同士の依存関係とかわかるからそこで最適化したらプロセッサがその辺の予測処理しなくてもいいんじゃねとか思ったりもしたのだがそういうもんではないっぽい。命令の並列処理とか分岐予測とかプロセッサの最適化は複雑で奥深ぇな〜みたいな雑な感想。東大の計算機システムの授業だとこの辺のCPUに関する話に加えてプロセス・ファイル・ネットワーク系のOSの話も対象になってるらしい。パタヘネとふつうのLinuxプログラミングを読めばだいたいカバーできるのかなという感じ。これは2年生のカリキュラムということなので彼らは20歳とかそこらでこの辺のコンピュータの基礎的な話題を身につけていくのか、たまらんな...。今回は上巻のみ読んだけど、結構後半飽きてきたりしたので下巻は読まない気がする。欲しかった情報とか読みたいトピックは一応手に入ったと思うし。見る最後に、株式会社GIFMAGAZINEではパタヘネ本くらい余裕で読んでるぜというエンジニアも募集しています。@razokuloverあとはいつもの雑なScrapboxの読書メモです。(絶縁体のスクリーン)に電気的な導体(人の指)が触れることで界に歪みが生じタッチを検知させる。ダイ(チップ)ダイを小さくすればウエーハからきりだせる数が増えるのでコストを下げられるダイが大きいとウエーハからきりだせる数が減るので全体における欠陥率が上がる。よって歩止まり(良品率)が下がりコストが上がる。性能比較はプログラムの実行時間がすべて。RISC)の命令セットアーキテクチャレジスタCPUの演算結果やメモリからロードした語を格納しておく一時記憶装置。MIPSアーキテクチャでは32ビット。MIPSではアドレスが4の倍数(整列化制約)符号つきとか符号無しビットの話、基本情報思い出す。最上位ビットが0で正、1で負になる。(MIPSの命令フィールド)メモリからレジスタへのデータ読み/書きは後半16bitをアドレス表現用に利用してる。add/subと同じフィールドの利用法ではない。bneとか手続き呼び出し引数4つ以上or戻り値が2つ以上のときはレジスタをスタックでメモリにスピルアウトする必要あるらしいMIPSのレジスタ規約に0~31番の各レジスタの役割が書いてるので便利アドレッシング方式アドレスの表し方の方法http://dragon.s151.xrea.com/65816/658164.htmlマシン語の復元2.2.10に16進数表記のマシン語をアセンブリに復元する例が書いてある。楽しい感じになってきた。命令の各フィールドの意味とか対応するレジスタの値とかがわかると意外と理解できる気がする。浮動小数点の算術演算プロセッサにとって加算と減算は比較的楽だけど乗算と除算は計算複雑なことがわかる前者はオーバーフローとか気にしなければ単純なビットシフトで求められるけど後者はそうではないアルゴリズムの宝箱とかueyamaruiさんのnoteでも読んだ内容だったから全体的に飛ばし目に読んだプログラム内蔵方式のプロセッサでは数値も命令もアドレスもすべて32ビットの数。同じ32ビット表現でいろんな意味を表現する。結果をレジスタに書き込むマルチプレクサ(MUX)いくつかの入力から一つに絞って制御する。複数ある命令において1サイクル1命令で処理するのではなく、各命令をステージごとに並行に実行させることで命令全体のスループットをあげる処理方法。»プロフィールid:razokulover本業はwebエンジニアでGIFMAGAZINEの共同創業者。趣味はハロプロ/声優/将棋/美術/読書など。浅く広く思ったことを書きます。仕事依頼は@razokuloverのDMでどうぞ。#openchat料理が上手い人RSSRSS講読のfeedbanner月別アーカイブ検索はてなブログをはじめよう!razokuloverさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。