第3章 命令セット(ISA)という見えない契約
前章で、“頭脳”の種類が爆発したことを見ました。ここからは、いまの地殻変動のいちばん深いところへ降りていきます。主役は、ふだん誰の目にも触れないのに、世界中のソフトとハードを静かに支配しているあるもの――命令セット(ISA)です。聞き慣れない言葉だと思います。でも大丈夫、身近な「あれ?」から、ゆっくりほどいていきます。
3.1 「同じソフトが、別の機械で動かない」のはなぜ?
こんな経験、ありませんか。スマホ用のアプリは、そのままではパソコンで動かない。iPhone向けのアプリは、Android(アンドロイド)のスマホには入らない。ゲーム専用機のソフトを、パソコンにそのまま挿しても遊べない。――不思議だと思いませんか。同じ「計算する機械」なのに、なぜソフトに“相性”があるのでしょう。
その答えのいちばん奥に、ISAがいます。じつはチップ(CPU)は、あらかじめ決められた、限られた種類の“命令”しか理解できません。そして、その「理解できる命令の種類」が、チップによって違うのです。だから、あるチップ向けに書かれたソフトは、命令の通じない別のチップでは、文字どおり「言葉が通じず」動かない。これが相性の正体です。
3.2 チップは「決まった命令」しか分からない
第1章で、チップはスイッチの大群だとお話ししました。そのスイッチたちに「いま足し算をしろ」「この値を覚えろ」「あっちの番地を読め」と指示を出すのが、命令です。チップは、「自分が反応できる命令の一覧」を生まれつき持っていて、その一覧にある命令だけを実行できます。一覧にない命令を渡されても、ぽかんとするだけ。
この「このチップが理解できる、命令の一覧と、その決まりごと」のことを、命令セット(Instruction Set Architecture、略してISA)と呼びます。日本語にすると「命令セット・アーキテクチャ」。長いので、本コーナーではISAと呼ぶことにします。
3.3 ISAは、ハードとソフトの「共通の言葉」であり「契約書」
ここがいちばん大事なところです。ISAは、ハード(チップを作る人)とソフト(プログラムを書く人)のあいだで交わされた、共通の取り決めです。両者が同じISAを守ると約束しているからこそ、ばらばらに作っても、ちゃんとかみ合う。
チップを作る人(ハード側)
「このメニューの命令には、ぜんぶ正しく反応する“体”を作ります」と約束する。中の作り方(どんなスイッチの並べ方にするか)は自由。
ソフトを書く人(ソフト側)
「このメニューにある命令だけで、プログラムを組み立てます」と約束する。相手のチップの中身を知らなくても書ける。
たとえるなら、国際空港の“管制の言葉”。 世界中の航空管制は、どの国のパイロットでも通じるよう、決まった言い回し(フレーズ)を共通の取り決めにしています。話し手と聞き手が同じ取り決めを守るから、初対面でも、誤解なく意思が通る。ISAも同じで、チップとソフトという“初対面どうし”を、確実にかみ合わせる共通語なのです。だからこそ、これは単なる技術仕様ではなく、みんなが従う“契約”と呼ぶのがふさわしい。
3.4 もう少し正確に ― 「ソフト」って、何のこと?
ここまで「ソフト」とひとくくりにしてきましたが、正確にしておきましょう。ソフトには層があります。ざっくり、OS(基本ソフト)と、その上で動くアプリ。ですが、ISAと直接“握手”しているのは、その種類ではありません。最終的に、そのチップの機械語(1と0の命令の並び)に翻訳された状態のプログラムです。アプリだろうがOSだろうが、実行される瞬間には、必ずそのISAの命令に変換されている。ISAが縛っているのは、この「機械語のレベル」なのです。
では「OSとISAの関係」は? OSもプログラムですから、当然そのISAに合わせて作られています。だからISAが変われば、OSも作り直し(または翻訳し直し)が要る。でもOSには、もう一つ大事な役目があります。OSは“緩衝材(通訳)”でもある。OSとそのISA向けの土台がいったん整えば、アプリを書く人は、ISAを直接意識せずに済む。生々しいISAとのやり取りは、OSや翻訳ツールが引き受けてくれるのです。
つまり「同じアプリ」の正体。 ふだん私たちが“同じアプリ”と思っているものは、配布のときに各ISA向けの機械語へ翻訳し分けられています。翻訳済みのものを、別のISAのチップに持っていくと通じない――これが3.1の「相性」の、より正確な姿です。
3.5 「アセンブラは共通でしょ?」 ― いいえ、ISAごとに別物
ここで、鋭い人ほど引っかかる疑問に答えます。「機械語がISAごとに違うのは分かった。でもアセンブリ言語(アセンブラ)は共通では?」――いいえ。アセンブリも、ISAごとに違います。 理由はシンプルで、機械語とアセンブリは“同じものの表と裏”だから。アセンブリとは、1と0の命令に人間が読める短い名札(ADD・MOV など)を一対一で付けただけのもの。裏(機械語)が違えば、表(アセンブリ)も違うのは当然なのです。
では「共通」なのはどこか。それは、もっと上の層――C言語やPythonといった高級言語です。人間はISAを意識しない高級言語で書き、それをコンパイラ(翻訳機)が、狙ったISA向けのアセンブリ/機械語へ翻訳し分けます。
どこまでが「共通」で、どこから「ISAごと」か
───────────────────────────────────────────────────────────────
人間が書く:高級言語(C言語・Python など) ← ISAに依存しない(共通になりうる)
│ コンパイラが ISA ごとに翻訳し分ける
▼
各ISA専用:アセンブリ/機械語 ← ISAごとに別物(x86用・ARM用・RISC-V用…)
▼
チップが実行 ← 自分のISAの命令しか食べられない
───────────────────────────────────────────────────────────────
たとえるなら、高級言語は「日本語で書いた料理のレシピ」。アセンブリ/機械語は、それを各国の厨房の符牒に訳した作業指示書です。レシピ(高級言語)は共通でも、厨房(ISA)ごとに符牒が違うので、訳した指示書は、その厨房でしか通じない。コンパイラは、その翻訳係というわけです。
では、ISAが違うと具体的に何が変わるのか。むずかしく考えず、次の4点だけ押さえれば十分です。
- 命令の名前と種類(メニュー)。 同じ「メモリから読む」でも、x86は
MOV、ARMはLDR、RISC-Vはlw。呼び名も品揃えも違う。 - レジスタ(手元の作業台)の数と名前。 値を一時的に置く小さな置き場。x86は
EAX等、RISC-Vはx0,x1…。数も呼び名も違う。 - 命令のかたち(書き方の流儀)。 「種類が多くて1命令が高機能」な系統(CISC=x86)と、「命令を絞ってシンプルに数で勝負」な系統(RISC=ARM・RISC-V)。
- 1と0への翻訳ルール(符号化)。 同じ
ADDでも、それをどんなビット列で表すかの取り決めがISAごとに固有。
店ごとに、メニューも、調理台の数も、注文の言い回しも、伝票の書式も違う。だから同じ“注文書(アセンブリ)”は、よその店では通らない――そう腑に落ちれば、十分です。
※ところで「RISC-VのISAに、アナログやセンサの命令はあるの?」 ――答えは「それはISAの担当範囲ではありません」。ISAが面倒を見るのは、こうしたデジタルの計算だけです。第1章で触れたアナログ回路・パワー半導体・センサは「命令で動かす」対象ではなく、ISAの外側の世界。実際のチップでは、ISAに従うデジタルなCPUの周りに、それらを別途くっつけて(混載して)作ります。
3.6 なぜ、この「契約」がそれほど重みを持つのか
ISAがただの技術用語でない理由は、その“縛りの強さ”にあります。世の中のソフトは、特定のISA(契約)に合わせて書かれています。OS(基本ソフト)も、アプリも、その膨大な蓄積が、ある一つのISAの上に積み上がっている。すると、こうなります――いったん広まったISAは、簡単には乗り換えられない。
もし新しいチップが「うちは別のISAです」と名乗れば、その上で動かすソフトは原則すべて作り直し。世界中に積み上がった膨大なソフト資産が、そのままでは使えなくなる。だから、たとえ技術的に優れた新顔が現れても、「でも今までのソフトが動かないなら…」と、なかなか普及しない。この“引っ越しの大変さ”こそが、ISAを持つ者に絶大な力を与えます。
3.7 見えないのに、世界を支配している
不思議なのは、このISAを、ふつうの人は一生、目にしないことです。スマホを買うとき、ISAの名前を気にする人はいません。それでもISAは、「どのソフトが、どの機械で動くか」を静かに決め続けている。あなたがどのスマホを選べるか、どのアプリが使えるか――その背後で、見えない契約が効いているのです。
「見えないのに、世界の動きを縛っている」。こういうものは、たいてい大きな力と、大きなお金が集まる場所になります。そして実際、このISAという“共通の言葉”は、長いあいだ特定の企業の持ち物でした。次の第4章では、その「言葉の持ち主」たち――x86とARMという二つの帝国の話に進みます。なぜ「言葉が無償で開かれる」ことが、これほどの転機になるのか。その下ごしらえができました。