機械語

機械語

(コンピュータ)
きかいご

マシン語。
コンピュータが実際に処理するプログラム。
人がプログラミングするには不便で初期は機械語を単に人が読みやすいアルファベット表記(ニモニック)に置き換えたことから始まり、今では多数の高級言語があり機械語とは対応しなくなっている。
機械語は2進数であるがコンピュータの処理基本単位(主はバイト)から16進数で表すことが多い。
#主流から外れるがワードマシーンの某機種は36Bitが基本処理単位であったため8進数表記だった
処理速度の面で機械語(≒アセンブラ)が優位と言われているが、可読性、メンテナンス負荷、プログラムする人の技量によってパフォーマンスに如実に差があるなど問題点も多く、今では
主流から外れている。

解説

コンピュータのCPUで直接処理されるプログラムの形式。代表的な8ビットCPU であるZ80を例にとれば、十六進数で表した00からFFまでの256種類の数字それぞれがCPUに特定の動作をさせる命令となっていて、メモリに格納されているこの数字の羅列を順番に実行していくことでCPUに特定の計算をさせることができる。この00〜FFまでの一連の命令の組を命令セットと呼ぶ。
高級プログラミング言語と異なる点はCPUのハードウェア構成を理解していなければならない点で、少数のレジスタ(CPUから直接アクセスできる一時領域)とメモリ(メモリコントローラを介した低速なアクセス)との間でデータを転送しつつ処理する点。
たとえば x=y+z という命令はZ80の場合以下のような機械語プログラムになる。

  • LD HL ADRS_Y: HLレジスタに変数yの値が格納されているメモリのアドレスを代入
  • LD A (HL): AレジスタにHLレジスタが指すアドレスのメモリに記憶されている値を代入
  • LD HL ADRS_Z:HLレジスタに変数zの値が格納されているメモリのアドレスを代入
  • ADD A (HL): AレジスタにHLレジスタが指すアドレスのメモリに記憶されている値を足す
  • LD HL ADRS_X: HLレジスタに変数xの値が格納されているメモリのアドレスを代入
  • LD (HL) A: HLレジスタが指すアドレスのメモリにレジスタAの値を記憶する

高級言語で書かれたプログラムはコンパイラによって機械語(オブジェクトコード)に変換されリンクにより実際に実行可能なプログラムとなり(ウィンドウズなら *.exe)保存される。
CPUがこれを実行する時はファイルの内容をメモリにロードし、頭から一つずつCPUが順次実行していく。この際に頭から何番目を実行しているかを「プログラムカウンタ」という特殊なレジスタを使って覚えているがIF命令等は(アセンブラではC:コンペア)状態を調べ強制的に別の場所に飛ぶ(プログラムカウンタに異なる値が代入される)。
この場合パイプライン制御による先読みキャッシュは無効となりメモリアクセスが発生するため処理速度的に不利となる。
なおメモリはレジスタに比較し低速、かつノイマン型コンピュータ(今のほとんどのコンピュータ)はメモリにプログラムを格納しているためこの現象をノイマンボトルネック(ノイマンズ・ボトルネック)などと呼ぶ。

余談:
上記プログラムをPowerPCアセンブラで書くとこうなる。

  • lwz r0,0(r1) *レジスタ1のメモリアドレスに格納された値をレジスタ0にロード:r0 = y
  • lwz r3,0(r2) *r3 = z
  • add r4,r0,r3 *レジスタ0とレジスタ3を加算した値をレジスタ4に格納:y + z
  • lwz r3,0(r5) *r3 = x
  • stw r4,0(r3) *レジスタ4の値をレジスタ3のアドレスにストア

PowerPCでの算術演算は3つのオペランドを取れる。

ネットの話題: 機械語

人気

新着

新着ブログ: 機械語