English/日本語
← このコーナーの入口へ戻る 第3章:核心の概念

第3章 命令セット(ISA)という見えない契約

前章で、“頭脳”の種類が爆発したことを見ました。ここからは、いまの地殻変動のいちばん深いところへ降りていきます。主役は、ふだん誰の目にも触れないのに、世界中のソフトとハードを静かに支配しているあるもの――命令セット(ISA)です。聞き慣れない言葉だと思います。でも大丈夫、身近な「あれ?」から、ゆっくりほどいていきます。

3.1 「同じソフトが、別の機械で動かない」のはなぜ?

こんな経験、ありませんか。スマホ用のアプリは、そのままではパソコンで動かない。iPhone向けのアプリは、Android(アンドロイド)のスマホには入らない。ゲーム専用機のソフトを、パソコンにそのまま挿しても遊べない。――不思議だと思いませんか。同じ「計算する機械」なのに、なぜソフトに“相性”があるのでしょう。

その答えのいちばん奥に、ISAがいます。じつはチップ(CPU)は、あらかじめ決められた、限られた種類の“命令”しか理解できません。そして、その「理解できる命令の種類」が、チップによって違うのです。だから、あるチップ向けに書かれたソフトは、命令の通じない別のチップでは、文字どおり「言葉が通じず」動かない。これが相性の正体です。

3.2 チップは「決まった命令」しか分からない

第1章で、チップはスイッチの大群だとお話ししました。そのスイッチたちに「いま足し算をしろ」「この値を覚えろ」「あっちの番地を読め」と指示を出すのが、命令です。チップは、「自分が反応できる命令の一覧」を生まれつき持っていて、その一覧にある命令だけを実行できます。一覧にない命令を渡されても、ぽかんとするだけ。

この「このチップが理解できる、命令の一覧と、その決まりごと」のことを、命令セット(Instruction Set Architecture、略してISA)と呼びます。日本語にすると「命令セット・アーキテクチャ」。長いので、本コーナーでは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の命令に人間が読める短い名札(ADDMOV など)を一対一で付けただけのもの。裏(機械語)が違えば、表(アセンブリ)も違うのは当然なのです。

では「共通」なのはどこか。それは、もっと上の層――C言語やPythonといった高級言語です。人間はISAを意識しない高級言語で書き、それをコンパイラ(翻訳機)が、狙ったISA向けのアセンブリ/機械語へ翻訳し分けます。

   どこまでが「共通」で、どこから「ISAごと」か
 ───────────────────────────────────────────────────────────────
   人間が書く:高級言語(C言語・Python など)   ← ISAに依存しない(共通になりうる)
        │   コンパイラが ISA ごとに翻訳し分ける
        ▼
   各ISA専用:アセンブリ/機械語              ← ISAごとに別物(x86用・ARM用・RISC-V用…)
        ▼
   チップが実行                              ← 自分のISAの命令しか食べられない
 ───────────────────────────────────────────────────────────────

たとえるなら、高級言語は「日本語で書いた料理のレシピ」。アセンブリ/機械語は、それを各国の厨房の符牒に訳した作業指示書です。レシピ(高級言語)は共通でも、厨房(ISA)ごとに符牒が違うので、訳した指示書は、その厨房でしか通じない。コンパイラは、その翻訳係というわけです。

では、ISAが違うと具体的に何が変わるのか。むずかしく考えず、次の4点だけ押さえれば十分です。

店ごとに、メニューも、調理台の数も、注文の言い回しも、伝票の書式も違う。だから同じ“注文書(アセンブリ)”は、よその店では通らない――そう腑に落ちれば、十分です。

※ところで「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という二つの帝国の話に進みます。なぜ「言葉が無償で開かれる」ことが、これほどの転機になるのか。その下ごしらえができました。