機械語
CPUの仕様が異なれば、機械語もそれぞれのCPUごとに異なる。上記類似点の範囲でのCPUごとの機械語の仕様の差異には、以下のようなものが挙げられる。
CPUが理解できる命令の種類や数が異なる(CISC、RISC、VLIW)
命令の長さが異なる(CISCとRISCとでは長さが異なることがある。また、同じアーキテクチャでも、命令のビット数の違いも影響する)
命令部の命令番号が一致しない
同じ処理を行う命令でも処理結果が異なる
演算方法が異なる(レジスタ - レジスタ間演算やメモリ - レジスタ間演算の違い。RISCでは後者の演算ができない)
データの記録方法が異なる(エンディアンやアラインメントの相違)
実行形式のバイナリファイルの記録形式が異なる(PE、COFF、ELFなど)
機械語を扱いたい場合でも機械語は0/1の組合せや16進表記であり扱いづらいので、代わりにアセンブリ言語を使うことが一般的である。アセンブリ言語は、プログラミング言語の中では機械語に一番近く、機械語とほぼ1対1に対応し、なおかつ人間に理解しやすいニーモニックで書ける。
アセンブリ言語で書かれたプログラムを機械語に変換すれば、その機械語でコンピュータは動く。アセンブラというソフトウェアを使えばアセンブリ言語から機械語への変換を自動的に行うことができる。
一方、逆アセンブラというものもあり、これはアセンブラと逆向きの作業、つまり機械語のプログラム(機械語コード)をアセンブリ言語に変換するソフトウェアである。アセンブラと逆アセンブラを使うことで、機械語←→アセンブリ言語 の間の変換を自在に行うことができる。
なお人が自分の眼と頭脳と手を使ってアセンブルの作業を行うことをハンドアセンブルという。コンピュータの黎明期にはしばしばハンドアセンブルが行われていたが、近年ではほぼ全く行われていない。
機械語に関数構文は存在しないが、関数に相当するパターンが存在する。
関数は引数を受け取り、ローカル変数を確保し、ボディの命令を実行し、戻り値を返すルーチンである。このルーチンを呼び出す場合、制御が戻るポイントを控え、引数を用意し、ルーチンへ制御を移して実行し、戻り値を記録し、戻りポイントへ制御を移す。
引数の準備
サブルーチン終了後の復帰ポイントメモ
ローカル変数の確保
サブルーチン冒頭への制御移行
これらの処理によりサブルーチンへ制御が移り、関数ボディの命令列が実行される。関数命令の最終行が実行されたのち、次の処理が必要となる。
ローカル変数の解放
引数の解放
戻り値の保存
復帰ポイントへの制御移行
これらの処理によりメインルーチンへ制御が復帰する。
このパターンは関数の処理内容に関わらず普遍的である。前半の関数呼び出しに相当するパターンを関数プロローグ(英: function prologue)という。後半の関数からの復帰に相当するパターンを関数エピローグ(英: function prologue)という。
関数プロローグ・エピローグは同じ結果が得られるいくつかのパターンが存在する(呼出規約)。例えば引数をスタックに積むパターンとレジスタに置くパターンがある。
機械語は0や1を並べた形、ビットの組み合わせパターン(ビット列)で表されるものであり、人間が日常使う言葉とはかけ離れていて読み書きしやすい形式ではない。 そのため、コンピュータのプログラムの開発に機械語が直接使われることはほとんどない。通常は人間が読みやすい形式(高級言語)でプログラムを書いてそれをコンパイラで機械語に翻訳してその機械語でコンピュータを動かしている。
機械語は中央処理装置(CPUやMPU)の動作をひとつひとつ指示するものであり、指示の内容はたとえば次のようなものである。
記憶装置と演算装置の間の情報のやりとり
演算装置内部での演算(論理演算や2進数と2進数の加法、減法、乗法、除法など)
入出力チャネルに対する指令
入出力チャネルとレジスタの間の情報のやりとり
各プロセッサは、その設計段階で命令セットアーキテクチャ(ISA:Instruction Set Architecture)が定められ、そのISAの中で各命令の識別番号(オペコード)を定められる。機械語のプログラムは、基本的には、その識別番号(と操作対象のデータ)を実行順に並べた形式になっている。
機械語の体系は、CPU(MPU)のアーキテクチャごとに大きく異なっている。あるアーキテクチャのCPUのための機械語は、別のアーキテクチャのCPUには全く使えない。→#機械語と互換性
現在ではコンピュータのプログラムは基本的には高級言語で書くということはすでに説明したが、ハードウェア寄りのエンジニアなどがあえて機械語レベルのプログラムを作成する場合でも、大抵は機械語そのものを直接書くのではなく、機械語と1対1で対応するアセンブリ言語を使っている。→#機械語とアセンブリ言語、エンジニアが機械語を使用する状況