はじめに
本記事は前回の記事の続きとなります。
私は現在非エンジニアであり、コンピュータシステムの理論と実装の2章を読み終えて、初見ではスッキリしない部分がありました。一方で同じところまで読み進めたエンジニアさんはいたく感動していました。
この記事では「2章の何が感動ポイントなのか」ということを書いていきます。
実装については前記事と同様、私が詰まった部分をヒントとして残していきます。
2章を読み終えた私の疑問
2.2仕様を読み進めると、半加算器、全加算器、加算器、インクリメンタと来て、突然"ALU"が現れたように感じました。
「ここまで2進数の加算について論じてきて、なぜよくわからない複雑な機能がついたALUを作るのか?」と思ったのです。
一方で、一緒に勉強しているエンジニアさんはALUの登場に「なるほどー!」ととても感動している様子でした。
エンジニアさんはなぜ感動したのか?
「今までの回路を使えば、ALUという画期的な回路を実装できてしまうから」だったようです。
では、そもそもALUとは?
今までの回路は、1つの機能に特化した回路でした。下記はAnd回路です。
x y | out
0 0 | 0
0 1 | 0
1 0 | 0
1 1 | 1
一方で(厳密さに欠けますが)ALUのイメージとしては1章のマルチプレクサのセレクタのような入力によって、Andを含む18種類の関数を選択してこなせる回路だと考えられそうです。(※機能について正確には図2-5が参考になると思います)
それの何がすごいのか?
例えば、今までAnd演算をしたければ、私たち自身でAnd回路を設置しなければならなかったのに、ALUを置いておけば入力を変えるだけでAnd演算ができるんです!
これって結構すごい進化だと思いませんか?
今は仮想的にチップを組み立てているから「回路の設置なんて楽ちんじゃん」と思うかもしれませんが、現実だったら、以前使っていた回路を基盤から取り除いてAnd回路を設置し直さなければいけない。その手間がALU回路一個で省けるようになった、ということですよね。
そういう超便利アイテムが、1章で作った回路と2章の加算器を使えば、すでに我々は実装できる、(そしてこれを発明した人は天才だ!)というのが感動ポイントだったようです。
私も"ALUが今までの回路とどう違うのか"、そして"それが今までの回路で実装できる"ということを聞いて、「なるほど〜〜!」と感動させてもらえました。
(追記:ただ、これを使うのは5章のようです)
2章実装のヒント
作成順序
HalfAdder
FullAdder
Add16
Inc16
ALU
私がつまずいたものだけですが、考え方のヒントを残しておきます。
Inc16
下のbの部分に注目してください。このような書き方があります。
Or16(a=in, b[0..7]=true, b[8..15]=false, out=out)
ALU
まず図2-6の理解が重要です。
ヒント1:zx,nxの意味は?
nxとはnegative x(xを反転する)
これをxだけでなく、yにもoutにも適用して実装しました。 nは正準表現から実装しました。
ヒント2:「fの真偽によってAndかAddか選択する」方法?
最終的に私は、fによらずAndもAddも計算しておいて、fの真偽によって出力する方を選ぶ方法にしました。