第4章 CISCとRISC ― 複雑な命令か、単純な命令の積み重ねか
4.1 二つの設計思想 ― 命令ひとつに、どこまで詰め込むか
分かれ道は、たった一点です。命令ひとつに、どこまで仕事を詰め込むか。たくさん詰め込む流儀を CISC(シスク)、少なく単純に保つ流儀を RISC(リスク)と呼びます。同じ計算をさせるのでも、契約(命令セット)の書き方が、ここで大きく分かれます。
4.2 CISC ― 一個の命令で、たくさんの仕事を
先に、詰め込むほうから。CISC(Complex Instruction Set Computer)は、「一個の命令で、なるべく多くの仕事を片づけよう」という考え方です。たとえば「メモリにある A と B を取ってきて、掛け算し、結果をメモリへ戻す」――この一連を、たった一つの命令でまかなえたりします。
利点は分かりやすい。プログラムを短く書けて、必要な命令の数も少なくて済みます。メモリが高価だった時代には、これは大きな美点でした。
代償もあります。一個の命令が中で何手も動くため、それを読み解くデコーダが複雑になり、命令の長さもまちまちになります。第3章で見た流れ作業(パイプライン)の目で見ると、手順ごとの仕事量が揃わず、ベルトがなめらかに流れません。契約を“リッチ”に書いた分だけ、それを履行する機械が重くなるのです。代表は、パソコンでおなじみの x86 系です。
4.3 RISC ― 単純な命令を、たくさん、速く
もう一方が、命令を単純に保つ流儀。RISC(Reduced Instruction Set Computer)は、「一個の命令には、ごく単純な仕事だけをさせよう」という考え方です。さきほどの「A と B を掛けてメモリへ戻す」なら、RISC はこれを「A を取ってくる/B を取ってくる/掛ける/戻す」という四つの小さな命令に分けます。
命令の数は増えます。けれど、一個ずつが単純で、長さも揃う。だからデコーダは軽く、パイプラインはなめらかに流れます。第1章で見た「載せて・計算して・戻す」のリズム――メモリに触れるのはロードとストアだけ、計算はレジスタの上だけ、という割り切り――は、まさにこの RISC の作法でした。
いまいちばん身近な RISC は、スマートフォンやタブレット、組み込み機器で広く使われている ARM 系――そして、本シリーズで扱う RISC-V です。手のひらの機器の多くは、この RISC の血を引いています。さきほどの x86 が CISC の代表なら、ARM と RISC-V は RISC の代表格――そう地図に置いておくと、この先の話が見通しよくなります。(両者の出自と、契約の“持ち主”をめぐる違いは、次の第5章でたどります。)
4.4 ひとつ裏話 ― いまのCISCも、内側ではRISC流に砕いている
「では CISC は時代遅れなのか」というと、そう単純でもありません。いまの x86 系のチップは、外から受け取る複雑な命令(CISC の契約)を、内部でいったん RISC のような単純で小さな操作へ砕いてから実行している、と言われます。つまり、外向きの契約は CISC のまま互換性を守りつつ、内側の機械は RISC 流の利点を取り込んでいるわけです。
ここでも、序章の話が効いてきます。契約(外から見える姿)と、機械(中の作り)は別もの。同じ契約を、まるで違う機械で履行できる――その自由が、こんなところにも現れています。
4.5 まとめ ― 契約の書き方が、機械の作りを決める
- CISC:一個の命令に多くを詰め込む。 コードは短いが、デコーダは複雑で、パイプラインは流れにくい。
- RISC:命令を単純に保つ。 コードは長めだが、機械は軽く、流れ作業に向く。
- いまの CISC も、内側では RISC 流に砕いて動いているとされる。 やはり、契約と機械は別もの。
どちらが正しい、という話ではありません。何を優先するかという、設計思想の違いです。そして大事なのは――契約の書き方(命令セットの設計)が、それを履行する機械の作りを、かなりの部分まで決めてしまう、ということ。次の第5章では、この RISC の考え方を最初に教科書の形にまとめ、いまの RISC-V の祖先となった MIPS を訪ねます。