機械語 機械語の概要

機械語

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/04 08:35 UTC 版)

ナビゲーションに移動 検索に移動
機械語モニタの出力表示例。逆アセンブルした機械語、プロセッサのレジスタとメモリダンプが表示されている。

概要

プロセッサは機械語で書かれたプログラムにしたがって処理を行っている。機械語でのプログラミングには、機械語とほぼ1対1に対応するニーモニックを用いたアセンブリ言語を使うのが一般的である。アセンブリ言語で書かれたプログラムを機械語に変換することをアセンブル(する)と言い、その処理系をアセンブラと言う。アセンブラによるアセンブルに対し、人力によるアセンブルをハンドアセンブルという。

直接、機械語を利用する理由は、以前は次のようなものであった。

  • アセンブラが存在しないか高価なため購入できない、クロスアセンブラであるため別のコンピュータが必要、など
  • コンピュータの性能が低いうえにBASICインタプリタしか備えていないなどで、必要な性能を得るため
  • コンパイラの研究が途上で高性能なコードが生成されないため

今日では、機械語を使わずとも十分なほどコンピュータは高性能になり、またコンパイラの研究も進んでよくできたコンパイラであれば場合によっては人より高性能なコードを生成するようになった。また、GNU Binutilsないし同様なライブラリがあることも多く、そういったユーティリティやライブラリを使うことで、アセンブラ・逆アセンブラを書いたりリバースエンジニアリングなども機械語に直接触れずできることも多い。そのため、機械語を直接扱うのは、そのようなユーティリティやライブラリが(まだ)無い新しいプロセッサの場合や対応していない新機能などを使う場合、プログラミング言語には馴染まない特殊な命令を扱う場合、trampoline[1]のようなテクニックが必要な場合、プロセッサのバグに当たった(等の可能性が疑われる)場合、何らかの理由でコアダンプを直接解析しなければならない場合、などに限られてきている。

機械語と互換性

機械語プログラムは命令セットその他の仕様が異なるプロセッサでは実行できない。同じ機械語プログラムを実行できることを互換性があるという。

たとえば、Pentium系列とPowerPC系列の双方で動くプログラムが存在しないのは、命令セットに互換性が無いからである。たとえ同じ系列だとしても、新しい世代のプロセッサのために作ったプログラムは古い世代のプロセッサでは動かないこともある。機械語プログラムがそのまま動くか否か、という互換性を「バイナリ互換性」といい、プロセッサの仕様だけでなく、コンピュータの他の部分の仕様やファームウェアオペレーティングシステムなども関わる。

ただし、注意深く機械語命令を使用することによって異なるアーキテクチャで動作するプログラムを書くことは不可能ではなく、Polyglotの極端な1ジャンルともいえる。PC-98とX68k両対応のブートセクタ[2]、記念すべき第1回IOCCCの入選作のひとつでmullenderによるPDP-11とVAX両対応プログラム[3]など。

機械語とアセンブリ言語

機械語を直接プログラミングに使うのは人間には負担が大きく、またコンパイラ等のコード生成でも(命令セットの設計にもよるが)見通しが良くないこともある。そういったこともあり、命令をオペコードではなくニモニックと呼ばれる英単語風のもので表現し、オペランドもレジスタ名などシンボリックに表現できる、アセンブリ言語を通じて扱うことが多く、C言語などの(処理系拡張による)インラインアセンブラ等でもアセンブリ言語の利用が一般的である。

基本的にはアセンブリ言語は機械語と1対1に対応するが、簡単なマクロなどを備えているものは多く、遅延スロットを利用するコードに自動的に変形するなどといった機能を持つものもある。また特殊な短縮形など(x86でAXがオペランドの場合など)について、機械語では違いがある場合をアセンブリ言語では明示的に指定できない場合もある。

アセンブリ言語で書いたコードを、手作業でアセンブルして機械語コードにする作業を「ハンドアセンブル」という。通常、メーカー等での新機種の開発などでは、旧機種の環境でクロス開発を行うわけで、わざわざ効率の悪い作業であるハンドアセンブル等を行うことは普通は無いが、1970年代のマイクロコンピュータや1980年代のパーソナルコンピュータでは、個人の場合、クロス開発のためのコンピュータ(当時はミニコンピュータなどが、メーカー等では使われていた)を別に持っているわけなどなく、またアセンブラも高額だったりすることも多く、ハンドアセンブルは一般的であった。




  1. ^ http://catb.org/jargon/html/T/trampoline.html
  2. ^ 電脳インストーラ2
  3. ^ http://www.ioccc.org/years.html#1984_mullender ソースコード参照。なお後の回ではコンテストのルールが変更されこのようなプログラムは禁止されている。
  4. ^ たいていはオクテット単位だが、CASLのCOMETが16ビット単位のように、そうでないものもある。
  5. ^ 「絶対にBASICプログラムという形態で載せる」という掟のあった、『マイコンBASICマガジン』(ベーマガ)を除く。このためベーマガでは、DATA文のデータから、BASICプログラムで機械語コードを書き込むようなプログラムを掲載していた。
  6. ^ データ実行防止
  7. ^ IPA ISEC セキュア・プログラミング講座:C/C++言語編 第10章 著名な脆弱性対策:バッファオーバーフロー: #5 運用環境における防御
  8. ^ 全て機械任せで良い結果を得ようとするよりも、人による補助をうまく取り入れられるようにするほうが良い場合もある。


「機械語」の続きの解説一覧




機械語と同じ種類の言葉


固有名詞の分類


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「機械語」の関連用語

機械語のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



機械語のページの著作権
Weblio 辞書情報提供元は参加元一覧にて確認できます。

  
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアの機械語 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2021 GRAS Group, Inc.RSS