図1:高水準言語のコードがコンパイラ・アセンブラを経てマシン語に変換され、CPUで実行されるまでの流れ
「マシン語」「機械語」という言葉は知っていても、それがプログラミング言語とどう違うのか、うまく説明できない方も多いのではないでしょうか。基本情報技術者試験の学習やエンジニア面接で急に聞かれ、答えに詰まった経験がある方もいるはずです。
マシン語(機械語)とは、CPUが直接実行できる0と1の命令列を指す言葉で、「マシン語」と「機械語」は同じ意味で使われます。私たちが普段書くPythonやJavaのようなコードも、最終的にはこのマシン語に変換されてからCPUで実行されます。
この記事では、マシン語の仕組みから、アセンブリ言語・高水準言語との違い、CPUアーキテクチャによる違いまで整理して解説します。WebAssemblyとの関係も含め、初学者にもわかりやすく解説します。
- マシン語とは、CPUが直接実行できる0と1の命令列で、機械語と同義の言葉
- マシン語の命令は、命令の種類を表すオペコードと対象データを指定するオペランドの組み合わせ
- 高水準言語のコードは、コンパイラとアセンブラを経て最終的にマシン語に変換されてから実行
- ArmはArmv9.7-A(2025年10月)、RISC-V InternationalはISA仕様v20260120(2026年1月)へとそれぞれ更新し、命令セットは現在も進化中(Arm A-Profile Architecture developments 2025)(RISC-V Ratified Specifications Library)
- WebAssemblyはマシン語そのものではなく、実行時にネイティブコードへ変換される中間表現(WebAssembly)
マシン語とは?
マシン語とは、CPUが直接実行できる唯一の言語で、0と1のビット列で表現された命令のことです。「機械語」という呼び方も同じ対象を指しており、記事内では両方の表記を同義として扱います。
CPUは電気信号のオン・オフしか区別できないため、命令もデータもすべて2進数(0と1)で表現する必要があります。CPUがどのように命令を処理しているかの全体像は、CPUとはで解説しています。
マシン語もプログラミング言語の一種であり、PythonやJavaのような高水準言語と対立する概念ではありません。高水準言語は「人間にとっての読みやすさ」を優先し、マシン語は「CPUにとっての直接実行のしやすさ」を優先している、という違いがあります。
マシン語はどんな仕組みで命令を表す?
図2:マシン語の命令は「オペコード」と「オペランド」の組み合わせで構成される(簡略化したイメージ図)
マシン語の命令は、命令の種類を表すオペコード(Operation Code)と、命令の対象を指定するオペランド(Operand)の組み合わせで構成されています。
オペコードは「何をするか」を、オペランドは「何に対して行うか」を表す部分です。イメージをつかむために、簡略化した例を示します(特定の実在CPUの命令セットを再現したものではありません)。
| ビット列(例) | オペコード部分 | オペランド部分 | 意味 |
|---|---|---|---|
| 0001 0011 | 0001(ADD=加算命令) | 0011(レジスタ3) | 加算命令で、対象がレジスタ3であることを表す |
| 0010 0101 | 0010(MOV=転送命令) | 0101(レジスタ5) | 転送命令で、対象がレジスタ5であることを表す |
この例のように、マシン語は「命令の種類」と「対象データの場所」をビット列に分けて表現します。実際のCPUではオペランドが指すデータの保持場所やビット幅の割り当てはアーキテクチャごとに異なり、命令セットの仕様書で細かく定義されています。
マシン語・アセンブリ言語・高水準言語はどう違う?
図3:マシン語・アセンブリ言語・高水準言語は、読みやすさと実行のしやすさのトレードオフで整理できる
マシン語・アセンブリ言語・高水準言語は、「人間にとっての読みやすさ」と「CPUによる実行のしやすさ」という2つの軸で違いを整理できます。
| 比較軸 | マシン語 | アセンブリ言語 | 高水準言語 |
|---|---|---|---|
| 記述形式 | 0と1のビット列 | ニーモニック(MOV・ADDなどの短い英語表記) | 自然言語に近い構文(Python・Javaなど) |
| CPUとの関係 | CPUが直接実行できる唯一の形式 | アセンブラでマシン語に変換されて実行 | コンパイラ・アセンブラを経てマシン語に変換されて実行 |
| 可読性 | 人間にはほとんど読めない | 専門知識があれば読める | 人間にとって読みやすい |
| 移植性 | CPUアーキテクチャに依存する | CPUアーキテクチャに依存する | ソースコードの段階では高い |
| 主な用途 | 通常は人間が直接書かず、変換の結果として生成される | 組み込み開発・OS開発・パフォーマンス最適化の一部で使用 | 一般的なアプリケーション開発全般 |
※高水準言語のうち、PythonやJavaScriptのようなインタプリタ型の言語は、事前にマシン語へ変換する工程を経ません。インタプリタがソースコードを1行ずつ読みながら、その場で解釈・実行します(逐次解釈)。
アセンブリ言語とは、マシン語の0と1を人間にわかりやすい略語(ニーモニック)に置き換えた言語です。マシン語とアセンブリ言語は、1つの命令が1対1で対応します。アセンブリ言語のMOVやADDといった1つの命令は、マシン語の1つの命令(特定のビット列)にそのまま置き換わるだけです。そのため両者は「同じ内容を違う表記で書いたもの」に近い関係にあります。
高水準言語のコードはどうやってマシン語に変換される?
高水準言語で書いたコードは、コンパイラによる変換とアセンブラによる変換という2段階の工程を経て、最終的にマシン語に変換されてから実行されます。
コンパイラ型の言語では、コンパイラがソースコードをアセンブリ言語相当の中間表現に変換し、続いてアセンブラがそれをマシン語(オブジェクトコード)に変換します。生成されたマシン語は、複数のオブジェクトコードを1つの実行ファイルにまとめるツール(リンカ)によって実行可能な形式にまとめられ、CPUが読み込んで実行します。
なお、PythonやJavaScriptのように実行時に1行ずつ解釈するインタプリタ型の言語もあります。その場合も、インタプリタ自身の内部処理は最終的にマシン語として実行されています。
マシン語にはどんなメリット・デメリットがある?
図5:マシン語の速度・省メモリというメリットと、可読性・保守性・移植性の低さというデメリットは表裏一体の関係にある
マシン語の最大のメリットは、変換の工程を挟まず実行できるため処理速度が速く、メモリ使用量も少なく済む点です。
一方でデメリットは、人間にとっての可読性・保守性が低く、CPUアーキテクチャが変わると同じコードがそのまま動作しない点です。この2つの特性は表裏一体の関係にあります。
メリット
- 速度面のメリット:変換工程を経ずCPUが直接実行できるため、実行速度が速くなります。
- メモリ面のメリット:無駄な中間表現を持たないため、メモリ使用量を抑えられます。
デメリット
- 可読性のデメリット:0と1の羅列であるため、人間が読んで意味を理解するのはほとんど不可能です。
- 保守性のデメリット:修正・デバッグに専門知識と時間がかかり、大規模な開発には向きません。
- 移植性のデメリット:CPUアーキテクチャに依存するため、別のアーキテクチャではそのまま動作しません。
CPUアーキテクチャが変わるとマシン語も変わる?
マシン語はCPUアーキテクチャ(命令セット)ごとに異なり、あるCPU向けに生成されたマシン語は別のアーキテクチャのCPUではそのまま動作しません。
CPUの命令セットは固定的なものではなく、現在も継続的に更新・拡張されています。
- Arm:2025年10月公開の公式ブログで「Armv9.7-A」を発表しました。AI処理向けのSVE/SME命令拡張(AIの計算処理を高速化するための拡張機能)を追加し、6ビットデータ型に対応しています(Arm A-Profile Architecture developments 2025)。
- RISC-V:特定の企業に権利が帰属しないロイヤリティフリーのオープン標準命令セットアーキテクチャとして、RISC-V Internationalによって定義されています(About RISC-V International)。ISA(命令セットアーキテクチャ)の仕様書は2026年1月時点でv20260120として更新されており、拡張は現在も続いています(RISC-V Ratified Specifications Library)。
一方で、命令セットが同じであっても、チップの世代が変わればハードウェアとしての性能は進化します。例えば、Appleが2025年10月に発表した「M5」チップは、同じArmアーキテクチャの系統でありながら、マルチスレッド性能をM4比で最大15%向上させました(Apple unleashes M5, the next big leap in AI performance for Apple silicon)。
マシン語がアーキテクチャごとに異なる一方で、近年はアーキテクチャに依存しない実行形式も注目されています。その代表がWebAssemblyです。
WebAssembly(Wasm)はマシン語なのか?
WebAssemblyはマシン語そのものではなく、実行時にネイティブコード(マシン語)へ変換される中間表現です。WebAssembly公式サイトでは、スタックベースの仮想マシン向けに設計されたバイナリ命令フォーマットであると定義されています(WebAssembly)。
つまりWebAssemblyは「ブラウザやサーバー上で高速に実行するための共通フォーマット」です。実行段階では、各環境のCPU向けのマシン語に変換されてから動作します。特定のCPUアーキテクチャに依存しない形で配布できる点が、マシン語そのものとの大きな違いです。
マシン語を学ぶ意味はある?
マシン語を学ぶ意義があるのは、システムプログラミング・パフォーマンス最適化・セキュリティ研究など、CPUの動作を直接理解する必要がある場面です。
- システムプログラミング:OS・デバイスドライバ・組み込みファームウェアの開発では、ハードウェアを直接制御するためにアセンブリ言語やマシン語レベルの知識が役立ちます。
- パフォーマンス最適化:処理速度がシビアに問われる領域では、コンパイラが生成したアセンブリ・マシン語を確認し、ループ内の不要なメモリアクセスなど無駄な処理を見つけることがあります。
- セキュリティ研究:マルウェア解析や脆弱性調査では、実行ファイルを逆アセンブルしてマシン語・アセンブリレベルで挙動を読み解くリバースエンジニアリングが必要になります。
一方で、一般的なWebアプリケーションや業務システムの開発では、高水準言語だけで開発が完結するケースが大半です。マシン語やアセンブリ言語を直接書く場面は限られるため、まずは高水準言語で開発の基礎を身につけたうえで、必要に応じてマシン語・アセンブリ言語の知識を補っていく進め方が現実的です。
まとめ
マシン語(機械語)は、CPUが直接実行できる0と1の命令列を指し、各命令はオペコードとオペランドの組み合わせで表現されています。
- マシン語・アセンブリ言語・高水準言語は、読みやすさと実行のしやすさという2つの軸で違いを整理できます。
- 高水準言語のコードは、コンパイラとアセンブラを経て最終的にマシン語に変換されてから実行されます。
- マシン語の速度・省メモリというメリットと、可読性・移植性の低さというデメリットは表裏一体です。
- CPUアーキテクチャ(Arm・RISC-Vなど)が変わるとマシン語も変わり、命令セットは現在も更新され続けています。
- WebAssemblyはマシン語そのものではなく、実行時にネイティブコードへ変換される中間表現です。
マシン語を直接書く機会は多くありませんが、その仕組みを理解しておくことは、CPUやアセンブリ言語、パフォーマンス最適化への理解を深める土台になります。基本情報技術者試験の学習や面接での説明にも、この整理がそのまま役立ちます。
出典一覧
- 「Arm A-Profile Architecture developments 2025」 — Arm(Arm公式デベロッパーブログ)(2025-10-02)
- 「About RISC-V International」 — RISC-V International
- 「RISC-V Ratified Specifications Library」(2026-01)
- 「Apple unleashes M5, the next big leap in AI performance for Apple silicon」 — Apple Inc.(Apple Newsroom)(2025-10-15)
- 「WebAssembly」 — WebAssembly Community Group / W3C
関連サイト
- Compiler Explorer — 高水準言語のコードをコンパイルした際のアセンブリ出力をブラウザ上で確認できるツール

執筆者:えだまめ
Elcamyでバックオフィスとブログ執筆を担当。AI未経験の状態からAI活用を学び、Claude CodeをはじめとするAIエージェントの実務活用法を発信している。
更新情報はElcamy公式Xでも発信中。