機械語とは?
皆さんが組んだプログラムはコンパイラ(compiler)、もしくはインタプリタ(interpreter)によって機械語にコンパイル(翻訳)され、その機械語がコンピュータを動かします。機械語はコンピュータ自身が命令を直接理解し、実行することができる言語のことです。
機械語は数字の0と1の二進法から成り立っており、コンピュータ内では機械語がそれらをパルスとして回路内で伝送し、演算処理しています。また記憶装置では記憶素子の状態が0と1に対応し、データを記録します。
機械語は人間が使う言葉や記述とは全く異なり、人間が機械語を理解するのは至難の技です。そのためプログラミングで機械語を直接使うことはほとんどありません。稀に、マイクロプロセッサーに組み込まれたプログラムを保守するケースなどでは直接機械語で修正することがある程度です。
数あるプログラミング言語の中で、機械語に最も近いのはアセンブリ言語(assembly language)で、機械語の命令と対応しています。アセンブリ言語でプログラミング作業を行うには、機械語の機能を理解しておく必要があります。
この記事では、機械語と機械語に対応するプログラミング言語のアセンブリ言語について分かりやすく解説をしていきますので、ぜひ最後まで読んでみてください。
機械語とアセンブリ言語
皆さんが学習しているプログラミング言語は、人間が覚えやすいように作られており、コンピュータが直接それらを理解することはできません。コンピュータは数字の並びである機械語しか理解できませんが、かといって人間が機械語を覚えるのは無理があり、また効率もよくありません。
そこで、機械語を人間でも分かるように、英単語や記号に一対一で対応させたものがアセンブリ言語です。つまり、アセンブリ言語でプログラミングすることは、機械語でプログラミングすることとほぼ同じなのです。
またアセンブリ言語はコンピュータのコンピュータの機械語に近いことから「低水準言語」と呼ばれます。一方、人間の言語に近いC言語、C++、Java、C#など、皆さんが学んでいるプログラミング言語を「高水準言語」と言います。
アセンブリ言語でプログラミングする理由
コンピュータの性能が劣っていた時代には、できるだけコンピュータのリソースを使わず、効率的に動かすためにアセンブリ言語を利用していました。プログラマーはコンピュータの立場に立って、無駄のないプログラミングに努めました。
今では高水準言語のプログラミング言語を使うのが当たり前になり、そうした配慮をする人は減りました。アセンブリ言語を覚えると、コンピュータのハード資源に対する意識が高まり、コンピュータに寄り添った効率的なプログラミングができるようになります。
アセンブリ言語はコンピュータにとって無駄のないエコ(ecology)な言語と言えます。
アセンブリ言語の特徴
今ではコンピュータの性能が格段に上がり、出来の悪いプログラムでもバグさえなければそこそこ動いてくれます。最近はリソースを意識したプログラミングの必要性を説く人は減りましたが、プログラマーはできれば効率の良いスマートなプログラミングを心掛けたいものです。
そんなスマートなプログラミングのお手本となるのがアセンブリ言語です。ここではアセンブリ言語について、もう少し詳しく見てみましょう。
アセンブリ言語とは
アセンブリ言語は、コンピュータが理解できる数字の「0」と「1」の羅列で書かれた機械語を、ほぼ一対一で英語や記号に変えただけの言語です。それでも「プログラミング言語」の1種です。
アセンブリ言語では、「LAD」(アドレスを読み込む)、「SLL」(論理左シフト)、RET(リターン)といった命令文を使用しますが、これら命令文は「ニーモニック」と呼ばれ、明確な意味を基にして命名されています。
例えば、先ほどのニーモニック、「LAD」は(Load ADress)の略です。「RET」は(RETurn)の略で、覚えやすく作られています。ちなみに「LAD」は機械語では'00010010 00010000'、「RET」は'10000001 00000000'となりますが、機械語で覚えるのは容易ではありません。
アセンブリ言語とアセンブル・アセンブラの違いは?
アセンブリ言語を学ぶと、紛らわしい言葉と出会います。アセンブリ言語以外に「アセンブル」や「アセンブラ」などの言葉があり、混同しがちですので、違いを確認しておきましょう。
▪アセンブリ言語のアセンブリ(assembly)は「組み立て」という意味です。
▪アセンブル(assemble)は「組み立てる」という意味で、アセンブリ言語を機械語に翻訳することです。
▪アセンブラは(assembler)は機械語への翻訳プログラムを指しますが、アセンブリ言語そのものをアセンブラと呼ぶこともあります。
アセンブリ言語は他の言語と何が違う?
アセンブリ言語と他のプログラミング言語との大きな違いについて2点再確認しておきます。
▪アセンブリ言語は機械語と一対一で対応し、文字や記号で表されたプログラミング言語です。
▪自然言語に近く理解しやすい「高水準言語」に対し、アセンブリ言語は機械語と同じ「低水準言語」に属します。
「高水準言語」では普通に備わっているプログラム制御文、たとえば「if」文、「for」文などの便利な処理がアセンブリ言語にはないため、操作を1つずつ記述しなければなりません。
以上が皆さんが普段使っている「高水準言語」と「低水準言語」であるアセンブリ言語との大きな違いです。
アセンブリ言語を学ぶ際に意識したいこと
アセンブリ言語を学ぶ上で、前提知識があると有利です。特に以下の2つは意識して学んでおきましょう。
▪コンピュータ(CPU)の構造
アセンブリ言語自体が機械語に一対一で対応していることから、直接コンピュータ(CPU)を操作する必要があり、ハードウェアの知識が必要です。アセンブリ言語ではコンピュータに命令を与える際に、CPU内部の汎用レジスタ(CPU内部の高速記憶域)を利用します。
たとえば、’LAD GR1, 10’ という命令は、「汎用レジスタ1に10を記憶する」という意味ですが、このようにレジスタ操作が欠かせません。こうしたコンピュータの動作原理を理解しておくことが求められます。
▪2進数と16進数
コンピュータは2進数しか理解しませんが、2進数と相互変換可能な16進数も内部で2進数に変換できるため、アセンブリ言語では2進数と16進数を目にすることが多くなります。そのため、2進数、16進数について知っておくと学習がしやすくなります。
アセンブリ言語のメリットとデメリット
ここまでアセンブリ言語の概要について解説をしてきましたが、より理解を深めるために、アセンブリ言語のメリットとデメリットについて見ておきましょう。アセンブリ言語のデメリットも理解した上で学ぶようにしましょう。
プログラミング言語全般の理解に役立つ
アセンブリ言語では、機械語に対応した命令文しかありませんので、それらを組み合わせて計算を行います。そのため、「掛け算」や「割り算」などがCPU内部でどのように処理されているのかが理解できます。
他にメモリー領域の使い方、プログラミングによって計算速度にどう影響するのかなどが自ずと分かってくるため、プログラミングの基礎が身に付きます。
メモリー管理の必要性が分かる
JavaやC#を学んでいる人はメモリーの扱いについて気にする必要性はありませんが、CやC++では、プログラムでメモリーを管理する必要があります。プログラムで確保したメモリーは処理が終わったら解放するという処理を怠ると、CやC++ではメモリー不足が発生し、障害の原因になります。
アセンブリ言語ではメモリー管理が不可欠であるため、こうしたプログラミングの基本的な作法が自然に身に付きます。
最高のパフォーマンスを得られる
アセンブリ言語は無駄な動きがなく、コンピュータの性能を最大限引き出すことが可能です。チューニングを行うことで処理のパフォーマンスを上げる事ができるため、実行速度にこだわりたいエンジニアにとっては魅力的な言語です。
移植性が低い
アセンブリ言語は機械に寄り添った言語のため、コンピュータ環境が変わるとコンピュータに合わせたカスタマイズが必要になります。またコードが煩雑でメンテナンス性が低く、扱いにくい点がデメリットです。
生産性が低い
他の言語では1行で済む処理が、アセンブリ言語では数行程度の記述が必要です。またコーディングが複雑で、コーディングミスが起きやすく、バグの多発、バグ発見の難しさもあり、プログラミングの生産性という面では高水準言語より大きく劣ります。
アセンブリ言語に関するおすすめの参考書
アセンブリ言語を学ぶには、参考書で学びながら簡単なプログラムを組んでみるところから始めるのが良いでしょう。これからアセンブリ言語の初心者向けにおすすめの参考書をご紹介します。
マンガでわかるCPU
アセンブリ言語はまずCPU構成する回路に関する理解が必要です。本書ではCPUを理解する上で必要な、計算や論理演算を、マンガを用いて分かりやすく解説しています。アセンブリ言語以外のプログラミングを学ぶ方にもおすすめしたい1冊です。
▪著者:渋谷 道雄 著、十凪 高志 作画、オフィスsawa 制作
▪ページ数:260ページ
▪出版社:オーム社
▪発売日:2014/11/28
【参考】:マンガでわかるCPU
大熱血! アセンブラ入門(単行本)
次々と人にやさしい高水準言語が登場して、機械寄りのプログラミングが軽視されている今だからこそ、他のエンジニアとの差別化にアセンブリ言語の学習は役立ちます。本書はC言語と比較しながらアセンブリ言語を学べますので、特にC言語エンジニアにはおすすめしたい参考書です。
▪著者:坂井弘亮
▪ページ数:1164ページ
▪出版社:秀和システム
▪発売日:2017/09/15
【参考】:大熱血! アセンブラ入門(単行本)
アセンブリ言語を学ぶ意義
ここまで機械語とアセンブリ言語の基本について解説をしました。プログラマーの需要という視点だけで見ると、アセンブリ言語よりもC言語やC++を学ぶ方が良いかもしれません。
しかし、CやC++を学んだうえでアセンブリ言語を学ぶと、メモリやレジスタの仕組みを深く知ることができ、確実にプログラムの質が変わります。1人でも多くのエンジニアの方に、一度はアセンブリ言語を学んでみることをおすすめします。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから