号外 機械語は低レベル言語で激ムズ
今回はお盆休みですので、やわらか目の手頃なネタがないかな、と考えていましたところ、家族から「前回出てきたキカイゴって何なの?」と言われました。
確かに前回のオープンソースの話の中で「機械語」というコトバをほぼ説明なしに使っていましたので、今回は「機械語」とはナニモノか?ということをお話ししたいと思います。
果たして、機械語などというマニアックな用語解説が「やわらか目のネタ」になるのかは甚だ疑問ですが、悩まずにいきましょう。
(この記事は2022年8月に送付したものです)
機械語とは
機械語というのは、コンピュータ自身が直接理解できる(実行できる)プログラム言語のことを言います。
機械語はコンピュータ内のCPU(Central Processing Unit:中央制御装置)によって実行されます。
どんなパソコン(PC)にも必ずCPUが入っています。
機械語を理解できるパーツはCPUだけですから、CPUがなくては誰もプログラムが実行できません。どんなプログラムであっても実行するのはCPUなのです。
ところが、この機械語というのは、ものすごく人間に優しくないのです。
もう強烈に優しくありません。
機械語のプログラムというのは全てが数値(通常は16進数)で表記されます。
そのため、見ただけではどれが命令(オペコード)でどれがデータ(オペランド)かすらサッパリわかりません。いつものように実例でいきましょう。
以下はZ-80(40年程前によく使われていた8ビットCPU。筆者が若かりし頃に愛用していた)で、3+4を実行するプログラム(数値は16進数表記)です。
例1: 3E 03 C6 04
これがプログラムだ!なんて言われても意味わかりませんよね。
この値の羅列は何を意味するのか?これがプログラム?こんなのどうやって動かすの?
何がなにやらサッパリです。
ですが、これはテキトーな値ではもちろんなく、大昔の本を引っぱり出して書いた3+4を実行してくれるプログラム(正しくはプログラムの断片)なのです。
実際、当時ですら値を見ただけで意味がわかる人はかなり少なく、たいていの人は「アセンプラ」と呼ばれる変換プログラムを使ってプログラムを書いていました。
例えば上記の数字はアセンブリ言語で書くとこうなります。
例2:
LD A, 3
ADD A, 4
ワケがわからない点は同様ですが、それでも最初の例1よりはマシでしょう。
ADDとか書いてあって足し算っぽいですし、3とか4の数字もありますから、3+4に見えなくもありません。
アセンブラというのは機械語があまりにもわかりづらいため、表記を多少なりともわかりやすく書き換えたもので、最初の機械語(例1)に一対一で対応しています。
実際に、例1と例2を 並べて対応させるとこうなります。
3E 03 = LD A,3
C6 04 = ADD A,4
こう見ると、無意味に見えた機械語の羅列に3や4が出ていて単純に置き換えを行っているだけというのが何となくわかりますよね。
2022年現在、こういった機械語のプログラミングをする機会は職業プログラマでもまずありません。筆者の感覚としては、世のプログラマの1000人に1人くらい(いやもっと少ないかも)しか、業務で機械語やアセンブリ言語を使うことはありません。
筆者が入社した昭和の時代にはアセンブリでの開発業務が残っていましたが、その当時ですら数年後にはなくなってしまったくらいレアな業務です。
機械語というのは恐ろしく非人間的で生産性が低いため、よほどの理由がない限り実務ではほとんど使われていないのが現状です。
機械語は低レベル言語
------------
機械語というのは、CPUというハードウェアに密接につながっています。
全く新しいアーキテクチャ(設計思想)のCPUを設計する時には同時に機械語の設計も行う必要があります。
CPUのアーキテクチャ毎に機械語の内容はまるで違います。
上述のようにZ-80というCPUでは3Eという命令は Aという場所(レジスタ)に値をセットする命令ですが、これがi8086(現在のパソコンに搭載されているCPUのご先祖様)になるとセグメントオーバライトという特殊命令ですし、スマホに載っているARM系なら特定のレジスタ内容を別レジスタにコピーする命令、といった具合です。
よく、プログラマやハードウェア設計者は「低レベル」「高レベル」という表記を使います。これは一般的な用語とは全く違った使われ方をする業界用語です。
ここでのレベルは「抽象度(ヒトにとっての理解しやすさ)」が基準です。
機能が豊かで抽象度が高い(わかりやすい)プログラム言語を使うと「高レベル」、機械語など抽象度の低い言語だと「低レベル」となるわけですね。
ハードウェア寄りで制約が強いほど「低レベル」なのです。
そのため、「低レベルなプログラミング」ができるのはハードもソフトもわかっているすごいプログラマ、「高レベルなプログラミング」ができるのはむしろフツーの人、ということになります。
機械語が低レベル言語と呼ばれる所似です。
一般的な使い方とは全く逆なのです。
余談
ダンナ「オレは低レベルなアプリも書けるんだぜ!」と自慢。
奥さん「え、アンタってめっちゃダメプログラマ!?」
てなジョークがあったりします。
なんでこんなにわかりにくいままなの?
さて、この難しい機械語ですが、なんでここまで非人間的なシロモノなのでしょうか?
この理由は様々でしょうが、最大の理由は互換性を失わないためと筆者は考えています。
上述のような機械語の内容は、メーカと製品によってそれぞれバラバラです。
例えば、多くのスマホ(Android)で使われているARMというCPUの機械語と現在のパソコン(PC)で使われているIntel社のCPUの機械語には全く互換性がありません。
CPUの根幹の設計思想がまるで違うのですから、むしろ互換性などないのが当然です。
ですが、同じIntel社のCPUであれば、CeleronもPentiumもCore i7も同じ機械語のプログラムが動作するように設計されています。
ARMも同様で、スマホの機種によって搭載しているCPUに差異はあってもGoogle Playで配信されているソフトは(原則として)動作します。
既に動作するソフトウェアが大量に存在しているCPUの場合、おいそれと機械語の構造を変えられません。
ソフトウェア資産があるからこそ、IntelやARMのCPUの採用に価値があるのですから。
なんだか、ちっとも軽い話ではなくなってしまいましたが、少しでもハードウェアに近い領域のイメージをお持ちいただけましたら、幸いです。
次回もお楽しみに。
(本稿は 2022年8月に作成しました)
この記事が気に入ったらサポートをしてみませんか?