アセンブリ言語とは?特徴や学ぶメリットなどをわかりやすく解説!
こんにちは!
今井(@ima_maru)です。
大学でアセンブリ言語を学んだので、アウトプットがてら、
- アセンブリ言語とはどんな言語か
- アセンブリ言語を学ぶメリット
- 機械語やほかの言語との違い
をできるだけわかりやすく書いていこうと思います。
では解説に移ります!
アセンブリ言語とはなにか?
アセンブリ言語とは、コンピュータの理解できる「0」「1」のパターンで書かれた機械語をほぼ1対1で文字にしただけのものです。
もちろんプログラムを組むために用いられる「プログラミング言語」のひとつです。
そして、アセンブリ言語は、機械語にとっても近い存在です。
例えば、以下のような機械語 の「0」「1」パターンがあったとします。
00010010 00010000
00000000 00000001
01010010 00010000
00000000 00000010
10000001 00000000
たぶんこれを見て「なるほどな」と思う方は少ないでしょう。
ではこの機械語をCASL IIというアセンブリ言語に対応させましょう。
MAIN START
LAD GR1, 1
SLL GR1, 2
RET
END
このようになりました。
こうすると、全体的にすっきりとして、先ほどの機械語の「0」「1」の羅列よりは見やすくなったのではないでしょうか?
「なんとなく勉強すればわかりそう」と思う方もいるかと思います。
そう思うのは、文字が何らかの意味を持っていそうだからだと思います。
これらの「LAD」や「SLL」などの命令文は「ニーモニック」と呼ばれ、ちゃんとした意味をもとに命名されています。
実際このような頭文字をとっています。
- LAD : Load ADressの略(アドレスを読み込む)
- SLL : Shift Left Logisticの略(論理左シフト)
- RET : RETurnの略(リターン)
このようにちゃんと意味があり、案外覚えやすいです。
機械語の「0」「1」パターンを覚えなくても済むので、助かりますね。(昔の方はこの「0」「1」パターンを直接ポチポチしてたのだから本当に尊敬します。)
そしてもっと重要なのは、「ほぼ機械語とアセンブリ言語が一対一で対応している」ということです。
以下をご覧ください。
アセンブリ言語 機械語
MAIN START ;関係ない
LAD GR1, 1 00010010 00010000
00000000 00000001
SLL GR1, 2 01010010 00010000
00000000 00000010
RET 10000001 00000000
END ;関係ない
このように対応付けされます。
LAD命令とSLL命令は機械語2行に、RET命令は機械語1行に対応しています。
STARTやENDなどはアセンブリ言語特有の命令なので、機械語には翻訳されませんが、それ以外の命令は機械語で直接表すことができます。
つまり何が言いたいかというと、
- 機械語とアセンブリ言語には密接な(ほぼ一対一という)関係がある
- 機械語を人間がわかりやすいように文字に置き換えたのがアセンブリ言語
だということです。
ちなみにアセンブリというのは、組み立てという意味の「assembly」という英語です。
アセンブリ言語を学ぶ利点・メリットとは?
アセンブリ言語はプログラミング言語の深い理解や、コンピュータの処理を理解するのに大いに役立ちます。
例えば、
- 「掛け算」「割り算」が内部でどう処理されているのか
- コンピュータのメモリ領域はどうなっているのか
- プログラムの書き方で計算速度はどう変わるのか
など、アセンブリ言語を学ぶことでプログラミングにかかわる多くの基礎知識を学ぶことができます。
ただ、学ぶのをオススメするのは以下のような方だと思っています。
C言語/C++などのプログラミング言語を学ぶ方におすすめ
一定以上の人気を誇る言語のなかで珍しく、C言語/C++はメモリ管理が必要になるプログラミング言語です。
それゆえ、メモリの知識を学ぶことができるアセンブリ言語はとても相性がいいです。
ほかにも、学べるところは多くあるように感じました。
しっかり学べば、確実にプログラミングにおいての理解度が変わるはずです。
ハードウェアについて深く勉強したい方におすすめ
アセンブリ言語はハードウェアに関しての知識がなくては使い物にならないといってもいいでしょう。
CPUがどうなっているのか、メモリがどうなっているのか、これらを理解したうえでコーディングしていくことになるため、いやでもハードウェア側の知識がつくはずです。
組み込みなどをしたい方に良いと思います。
ゴリゴリに速度を出したい方におすすめ?
これは実際に実行速度を出したいときに使われます。
よくチューニングと言ったりもします。
ですが、もっともっと深い理解が必要になってきます。
ここまでくると私は何も助言できません。
ただ極めたものだけにしか得られないものがあるのだろう、とだけは言っておきます。
アセンブリ言語は機械語やほかの言語とどう違うの?
アセンブリ言語とプログラミング言語の違いは?
これは誤解が多いと思いますが、アセンブリ言語はプログラムを書く立派なプログラミング言語です。(もちろん機械語も)
なので、アセンブリ言語とプログラミング言語を比較するのは違います。
アセンブリ言語と機械語の違いは?
アセンブリ言語は、機械語を一対一で文字や記号に変換したプログラミング言語です。
ほかのコンパイラ言語やインタプリタ言語、スクリプト言語などといわれているプログラミング言語はどれも、一対一の変換ではありません。
もし一対一ならば、下で紹介するような長ーいプログラムを書かないといけないことになります。
アセンブリ言語は低水準言語、ほかの言語は高水準言語
今の主流となっているプログラミング言語は、for文やif文などの「プログラム制御文」をはじめとした、いろいろな便利な処理が用意されています。
こういう便利な処理は、俗に「高級な処理」などと呼ばれます。
この「高級」とは、難しいことすっ飛ばして簡単に書けるよみたいなイメージです。
アセンブリ言語にはそれらの「高級な処理」は用意されていません。
つまり、「自分で一から作れ」ということです。
例えば、アセンブリ言語「CASLⅡ」でfor文のような繰り返しの処理を行おうとすれば、以下のようになります。
MAIN START
LAD GR1, 100 ; 汎用レジスタ1に100を記憶
LAD GR2, 10 ; 汎用レジスタ2に10を記憶
LOOP SUBA GR2, =1 ; 汎用レジスタ2の値を1引く
JMI FIN ; 結果がマイナスの場合はFINラベルへ
SUBA GR1, =1 ; 汎用レジスタ1の値を1引く
JUMP LOOP ; LOOPラベルに飛ぶ
FIN RET ; リターン
END
これは、100から1を「10回」引くという繰り返しの処理になります。
見てわかる(?)とおり、相当めんどくさいです。
それに比べ、人気のプログラミング言語はどれもfor文やwhile文などの繰り返しの処理をサポートしています。
>>> GR1 = 100
>>> for i in range(10):
... GR1 -= 1
...
>>> GR1
90
プログラミング言語Pythonと比較すると、こんなにも違いがあることに気づきます。
こういう風に、短いコードでいろんなことができちゃうのが「高級言語」「高水準言語」などと言われます。
今人気のプログラミング言語はすべて、高級言語といっても大丈夫でしょう。
逆に、アセンブリのように機械語にとっても近い記述をするような言語を「低級言語」「低水準言語」などと言われます。
ほかにも変数を自分で作らなくてはいけないという点も面白いところです。
アセンブリ言語まとめ
私は最初、アセンブリ言語と聞いて自分とは無縁のものであると感じていました。
だって今の時代プログラミング言語が進化しているんだから、そんな機械語やアセンブリ言語などを使わなくてもいいと。
でも考えてみてください。
コンピュータが動くのは、機械語の01パターンのおかげなんですよ。
アセンブリ言語はエンジニアになるために非常に大切なことを学ばせてくれました。
以上、「アセンブリ言語とは?機械語やほかの言語との違いは?」でした!