はじめに
例によって当事者でもない人間が感想を書く素人考察ポエムです。
先日 こんな 記事を書き、その中で 「 このあたりで1命令で出来ること自体を複雑にするかシンプルにするかでCISC/RISC論争とかがあった気もしますが、今となってはあまり本質ではないのでおいておきます」と、バッサリと話をスキップしたので少しだけ回収しておきたいと思います。
なぜ本質ではないと言ったかというと、先日の記事の趣旨は「演算器の並列稼働率」にフォーカスしたものであり、CISC/RISC という「命令デコーダの効率」に関わる問題はそこで取り上げるべきではないと考えたからです。
事実、RISC の成功例だったはずの ARM は Thumb2 命令以降も複雑化を続けて十分 CISC っぽさを持っていますし、CISC の代表格の x86 もいつの間にやらRISC風の 内部 μ-OPs に変換して実行するようになっていきましたし、 Transmeta社が Crusoe というチップでVLIWに変換して実行してみたりもありましたし、ついにはAPX命令 のようなものまで飛び出しており、その境界はとても曖昧になってきています。
結局のところ、デコーダ設計者が血の涙を流しながら設計しないといけないほど複雑になった 点に目をつぶれば、どちらも如何様にも変換可能であり、「大量の演算器を並列に稼働させる」というターゲットに限定して語れば、技術的にはどちらも同水準に持ち込める ということになってるんじゃないかと思います。
ですので、命令密度であったり、デコーダの規模(コスト)や電力が問題になったりする小規模用途以外では、あまり関係なくなっている面はある気がしています。
幸い、普及期の携帯電話が上記が致命的に重要であったため、当時まだシンプルなRISCであった ARM がその分野の強いシェアを持つことになったわけですが、ご存じの通り、今のスマホはパソコン並みの性能を持っていますので、ARMももはや RISC であることのメリット よりも、スマホ市場などで育った膨大なARM命令セットでのエコシステム こそが最大の強みになっていると思われ、ここに 命令セットの権利 とか バイナリ互換性 という、重要な話を作っていくわけです。
CISC/RISC の爪痕としての命令セット
CISC/RISC の論争は、結果として様々な命令セットアーキテクチャのCPUを生み出し、そこからさらに生き残り競争の結果 x86 と ARM の2大勢力の構図を生み出しました。 述べてきた通り、守備範囲の違いはあれど、レンジの被る領域では、正直 ARM も x86 もそこまで大きな差はなくなってきています。 一方で、x86 は依然スマホ市場やタブレット市場への参入は苦戦していますし、パソコン分野は相変わらず x86 ですし、データセンターやHPCでは両者が争ってるイメージです。 どうしてこのようなことになっているかと言うと、結局、互換性の無い2種類の命令セットが、それぞれの得意分野でソフトウェアエコシステムの牙城を築いているからに他ならないと思うわけです。
先日の Kernel/VM にて、自作OSを動かすのに「UEFIなどの環境の揃ったARMデバイスがなかなか無い」という話をされていた方おられましたが、まさにそういう話です。 そしてその 命令セットこそが飯のタネ と言うのは両陣営よくわかっているんので、知的財産としてしっかり保護しているわけです。
うっかり、FPGA などで互換プロセッサを作って、GitHub に公開なんかすると、後悔することになるので誰もやらないわけです。
で、そんな中にダークホースとして出てきているのが「命令セット自由に利用していいよ」というオープンアーキテクチャの RISC-V でして、学術機関や個人含めて、お布施を払ってどちらかの陣営に入れない 勢の救世主としてひそかに盛り上がってるわけです。
とはいえ、これらの話は、JS、Java 、Python、Go など はもちろん C++ や Rust などでさえ、ある程度上流でプログラミングしている人々にはあまり関係のない話だったりします。最近の抽象度の高い プログラミング言語や仮想マシンは、命令セットアーキテクチャの違いなんて綺麗に隠してくれます。
一方で、低レイヤー側の話として、OSだったり、仮想マシンだったり、コンパイラやJITだったり、ブートローダーやデバイスドライバなりを作ってる人には大問題だったりして、これらのエコシステムを作っている領域の、歴史だったり人口だったり資金力だったりで、いろいろな勢力にそれぞれ得手不得手を生み出していたりするのだと思います。
そもそも CISC/RISC論争とは何だったのか?
話を戻すと、今でこそ大量の演算器をアウトオブオーダー実行によるスーパースカラで1サイクルに10命令とか実行したりしてるわけですが、この論争当時のマイコンは命令を入れるメモリも貴重でしたし、演算側もハードウェア乗算器が一個あれば「すげー」と言ってた時代であり、加算器を複数サイクル回して乗算命令を実現していたCPUも沢山あった時代です。
そうなってくると、少ないメモリに置いた1つの命令でより沢山の演算ができることも重要でしたし、命令デコーダが占めるLSI全体でのトランジスタ比率も重要でした、そして1つしかない ALU (Arithmetic Logic Unit) を如何に効率的に使うかもまた重要だったわけです。
どれもこれも重要だと並べてしまいましたが、結局これらのどこにウェイトを置いて考えるか重要になってきます。
「少ないメモリ、少ないトランジスタ数で、なんとか実用的な計算ができるプロセッサを作りたい」と考えたとき、確かに CISC は合理的だったのだと思います。
一方で、より「ALUを休みなく高いクロックで稼働させたい」となったとき、ここに演算指令とデータを次々送り込むのに RISC は優れていたと思います。
従ってまあ、どちらがいいのかの論争は起こったのだと思いますが、ここでもまた過去のソフトウェア資産(エコシステム)の話で、バイナリ互換性が重視され、x86 が生き残り、携帯電話/スマホと言う新しい市場で ARMというRISC が成功をおさめ、そしてまた命令セットライセンスと言う柵に対抗して RISC-V がじわじわ流行っているというのが今に繋がる流れではないかと思います。
おわりに
AIに聞いてみると CISC/RISC論争は概ね1980年代が盛り上がっていたようです。RISC自体はもっと前から開発が始まっていたようですが、表舞台でいわゆる論争と言うか議論が盛り上がったのがそのあたりのようです。
えっと私が丁度、中学生~大学生を過ごした時期ですね(笑)。
今は FPGA でCPU 作って遊べる時代になりましたので、過去を振り返って楽しめるいい歳のおじさんになってしまったわけですが、血の涙を流さなくても遊べる RISC-V の命令セットは本当によくできているなと思います(もちろんRISC-Vも本格的にやるとちゃんと血の涙が出てくるらしいですが)。
現代においてソフトウェアを学ぶ人からすると言葉だけ残ってる不思議なものかもしれませんが、CISCやRISCのワードで検索していただくと、「今の計算機がなんでこんな仕組みなんだ?」という理解の一助にはなるかもしれません。
初期の CISCはマイクロコード方式でどうだこうだ、RISC が出てきてハードウェアパイプラインデコーダでどうだこうだといった話も、大変興味深いものです。実際今の x86 などは、ハードウェアデコードしつつもRISC化困難な複雑な命令の為にはマイクロコードもますます活用されてていますしね。
この駄文が誰かの役に立てば幸いです。





















 (トランジスタ技術SPECIAL) KiCad×LTspiceで始める本格プリント基板設計[DVD付き](TRSP No.142) (トランジスタ技術SPECIAL)](https://m.media-amazon.com/images/I/51ut8h-2iOL._SL500_.jpg)








