機械語(きかいご)またはマシン語()とは、コンピュータのCPUで直接実行される一連の命令である。一つ一つの命令が行う仕事は極めて限定されており、CPUのレジスタやメモリ上のデータを、ワードなどの単位で転送するか、単純に転送するだけでなく演算装置を通すことで何らかの演算などの加工をするか、プログラム自身の実行順を制御する分岐命令などである。性能を上げるため「制御装置」「実行ユニット」といったように切り分けられていることもある。コンピュータを「腑分け」してゆくと最終的に辿り着く、CPUが直接実行しているプログラムは、そのような一連の命令である。バイナリの機械語(アセンブリ言語ではない)が、プログラミング言語の中で最も低水準な言語と言え、原始的でハードウェアに依存するプログラミング言語であるとされることもある。バイナリエディタなどで直接に機械語プログラムを書くことは可能だが、細かい制御ビットを確認して16進数表現にしたり、相対アドレスを管理しながらコードを書くのは非常に骨の折れる作業であり、ミスが生じる可能性も高い。それゆえ、今日では、特殊な場合(たとえばPentium F00F バグを起こさせるためのコードは、不正なコードとしてアセンブラには拒否されるかもしれない)を除き、機械語コードでも、アセンブラの定数機能などを使って「楽に」書くのが普通である。高水準言語やアセンブリ言語で書かれたプログラムは、コンパイラやアセンブラによって、機械語にコンパイル(あるいはアセンブル)されている。なお、インタプリタは内部で少しずつ機械語を生成しながら実行するもの、という誤解は、、が、誤りである。動的コンパイルと呼ばれる技術により、高速化のためにそのような動作をするインタプリタも一部にはあることは確かだが、インタプリタが全てそのようであるわけではない。プロセス仮想機械や抽象機械などの命令が機械語と呼ばれることもある。プロセッサは主記憶装置にある機械語で書かれたプログラムを読み取り、解析、実行、出力することで処理を行っている。すべてのプログラミング言語で書かれたプログラムは、最終的にこの機械語で実行される。機械語でのプログラミングには、機械語とほぼ1対1に対応するニーモニックを用いたアセンブリ言語を使うのが一般的である。アセンブリ言語で書かれたプログラムを機械語に変換することをアセンブル(する)と言い、その処理系をアセンブラと言う。アセンブラによるアセンブルに対し、人力によるアセンブルをハンドアセンブルという。機械語を利用する理由は、以前は次のようなものであった。では、機械語を使わずとも十分なほどコンピュータは高性能になり、またコンパイラの研究も進んでよくできたコンパイラであれば場合によっては人より高性能なコードを生成するようになった。このため、機械語を直接扱うのは、コンパイラがまだ対応していない新機能などを使う場合、アセンブラを作ったりする場合、プロセッサのバグに当たった場合、コアダンプを解析する場合、諸事情などで逆アセンブルなどリバースエンジニアリングをおこなう場合、などに限られてきている。一概に機械語と言ってもアセンブラの直接の出力である、リンクされていないオブジェクトファイルは、まだシステムが実行させることはできない。そこからさらに、静的リンカあるいは動的リンカによって外部参照された関数名などからライブラリのオブジェクト・コードを付加したりすることで、実行可能形式となる(正確には動的リンカの場合は、実行可能形式の生成時には情報の付加のみで、実際のコードとリンクされるのは実行可能形式のロード時と、実行中である)。また、命令セットその他の仕様が異なるプロセッサの機械語プログラムは実行できない。同じ機械語プログラムを実行できることを互換性があるという。たとえば、Pentium系列とPowerPC系列の双方で動くプログラムが存在しないのは、命令セットに互換性が無いからである。たとえ同じ系列だとしても、新しい世代のプロセッサのために作ったプログラムは古い世代のプロセッサでは動かないこともある。機械語プログラムがそのまま動くか否か、という互換性を「バイナリ互換性」といい、プロセッサの仕様だけでなく、コンピュータの他の部分の仕様やファームウェアやオペレーティングシステムなども関わる。ただし、注意深く機械語命令を使用することによって異なるアーキテクチャで動作するプログラムを書くことは不可能ではなく、の極端な1ジャンルともいえる。PC-98とX68k両対応のブートセクタ、記念すべき第1回IOCCCの入選作のひとつでmullenderによるPDP-11とVAX両対応プログラムなど。ファイルシステムが存在するコンピュータでは、機械語で書かれたプログラムは、実行ファイル(実行可能なバイナリファイル)として存在することが多い。現在、使用されているすべてのコンピュータは、実行すべき命令列を2進数データの組合せで論理的意味を持つ機械語のファイルとして読み込んで実行している。機械語で書かれたプログラムファイルを人が読めるようにするには、2進数を4ビットずつ16進数に変換して表示することが多く、この"0"から"F"までの文字が羅列された印刷出力は「ダンプリスト」と呼ばれる。。機械語を解読する場合には、オブジェクトファイルを読み込んで、対応するニーモニックとラベルを出力する逆アセンブラが利用され、この行為をディスアセンブルという。またアセンブリ言語を機械語に変換するアセンブラを用いずに、機械語とニーモニックの対応表を参考にニーモニックと番地・定数から機械語を表す16進数を手作業で作る行為をハンドアセンブルという。アセンブラが作られていないか、あっても高価だった時代には、ハンドアセンブルによりプログラムを開発・保守することが一般的であった。一般的な機械語プログラムは以下のような構成となっている。以上の各部分に具体的に何ビットずつ割り振って、どういう順番に並べるか、という形式(フォーマット)のことを機械語フォーマットなどと言う。アーキテクチャにより機械語フォーマットはまちまちだが、1命令を構成するデータ長が固定の「固定長」式と、命令やオペランドの種類により変化する「可変長」式に大別される。可変長の場合、機械語命令の種類によってアドレス部やデータ部、そして中には命令部までも長さが変わる。このため、読み込み位置が1バイトずれれば機械語の命令はそれ以降のすべての命令が正しく読み込まれず意味を失うため、そういった機械語フォーマットのバイナリを対象とする逆アセンブラは工夫を要する。またメモリが限られるシステムでは本来の命令の途中に飛び込み別の意味に使うというトリック的な手法もある。上記類似点の範囲でのCPUごとの機械語の仕様の差異には、以下のようなものが挙げられる。
出典:wikipedia
LINEスタンプ制作に興味がある場合は、
下記よりスタンプファクトリーのホームページをご覧ください。