本の23ページにアセンブラという言葉が出てきます。 これは一般のプログラマーが使うものではなく、 コンピューターシステムをコントロールするようなシステムの中心部分の開発に使われるコンピューター言語です。
これを説明するには多少コンピューターの動作原理を理解しなければならないのですが、 ここではコンピューターの動作原理をなるべく分かりやすく説明してみようと思います。

  コンピューターは電気信号で計算をするということはよく知られていますが、 実際にどうやって電気で計算するのかを知っている人は意外と少ないものです。
これを説明するには一昔前ならソロバンに例えるのが一番わかりやすいのですが、 最近はソロバンで計算をやる人もほとんどいません。
もしまだ家のどこかに古いソロバンでもあったら取り出してみてください。 また、技術者だったお爺さんがいる人はどこかに古い計算尺も残っているかもしれません。

ソロバン(算盤)

[no files]

計算尺

[no files]

  昔の計算器具にはソロバンと計算尺の2つがあって、主にソロバンは商人、計算尺は科学者や技術者がそのユーザーでした。
その理由は商人が行う計算はお金に関することで、 ほとんどの計算は加算と減算だが結果の金額は1円単位まで正確に把握する必要があるので 玉の位置で正確な金額を表すソロバンが最適なのに対して、 科学者や技術者は複雑な算式を計算するためスピードが要求されソロバンでは間に合わない(ソロバンの割り算などは非常に時間がかかる)が、 結果に対しては誤差を許容するので瞬時に結果が出る計算尺のほうが便利だからです。
そのソロバンの玉を電気信号に置き換えたのがデジタルコンピューターであり、 計算尺のカーソルを電気信号に置き換えたのがアナログコンピューターなのです。

  ソロバンの玉の位置は上げるか下げるかの2通りしかなく、中間で玉を止めるようなことはしませんが、 デジタルコンピューターも電圧の有無で1と0を表し、中間の状態はありません。
計算尺は現在では使える人は少ないですが、対数目盛が振られたスケール上のカーソルを動かして乗算除算を行う器具で、 目盛を読むので中間値を得ることもできます。
動作原理がこれと似たアナログコンピューターは電圧の有無だけでなくその電圧の大きさ(ボルト数)まで使って計算し、 瞬時に答えが得られる反面、結果はある程度の誤差を生じます。
最近ではデジタルコンピューターの計算速度が大幅に向上したため、アナログコンピューターが使われることはほとんどありません。 従って以後コンピューターといったらすべてデジタルコンピューターのこととします。

  現在のコンピューターと同様の動きをする最初のコンピューターであるENIACが米国ペンシルバニア大学で完成したのは1946年です。
それ以後コンピューターの計算速度や記憶装置の大きさは桁違いに上昇しましたが (現在のスマートフォンの計算速度やメモリー容量は1970年代に数億円した大型コンピューターの1000倍~10000倍くらいあります)、 コンピューターそのものの動作原理はほとんど変わっていないのです。(量子コンピュータは話がわかりにくくなるので除外します)
(コンピュータ機器の進化については
ハードウエア を参照してください)
その動作とはメモリー上のある番地の機械語命令(実際には1と0の組み合わせの2進数が命令を表します)を読み、 それを解釈して指定された番地のデータ(これも1と0の組み合わせです)を使って加減乗除や論理和、論理積などの計算を行い、 結果をメモリー上の指定した番地に書き込むというものです。
この動作を組み合わせることでコンピューターはあらゆる処理ができるのですが、 この命令の集合体がプログラムといわれるものです。

  大昔のコンピューターにプログラムを入れるときにはマシンのパネルにあるたくさんのスイッチを使って メモリーに1または0を直接書き込んでいましたが、これでは効率がわるいので紙テープに穴をあけて それをコンピューターに読ませてプログラムを入力するようになりました。
この場合、穴の有無で1と0を現したのです。 つぎに1と0の組み合わせである2進法が人間には分かりにくいので、2進法の表記を英語に対応させるようになりました。

例えば仮に11110000という2進数が加算命令(足し算)を表す場合はこれにADDという文字を対応させるのです。これがアセンブリー言語です。 1番地から加算命令がはいっていて、その内容が10番地のデータに11番地のデータを加えて12番地に入れるという処理を行う場合のアセンブリー言語表記は

ADD 10, 11,12

となります。

この文字列をアセンブラというプログラムで処理するとADD命令が変換されてメモリーの1番地~4番地のデータは次のようになります。

1番地=11110000 (加算命令を表す2進法データ)

2番地=00001010 (加算をするデータの番地指定:2進法で10番地を表す)

3番地=00001011 (加算をするデータの番地指定:2進法で11番地を表す)

4番地=00001100 (加算の結果を入れる番地の指定:2進法で12番地を表す)

ここで10番地と11番地にそれぞれ1がデータとして入っていると

10番地=00000001 11番地=00000001

この機械語命令をコンピューターが実行すると

1+1=2ですから、結果は 00000010(2進法の10は10進法では2となります) となり12番地に00000010が入るのです。

  命令には加減乗除以外に論理和(AND)、論理積(OR)、排他論理積(EXOR)など計算に必要な命令はすべてそろっているので、 これらを組み合わせればどんなプログラムでも書くことができます。
すなわちアセンブラとは人間の理解しやすいアセンブリー言語で書かれたプログラムを2進数の機械語命令に変換するプログラムなのです。
通常はアセンブリー言語も含めてアセンブラと呼ばれています。

上記のアセンブリー言語の例は説明のために単純な命令を持つコンピューターを想定しましたが、 実際のコンピューターの機械語命令はメモリー番地の指定などももっと複雑でわかりにくく、 しかも機械語命令はコンピューターの機種ごとに違っているので、 当然アセンブリー言語も同じだけ存在し、人間が憶えるには複雑で具合がわるいのです。
そのうえプログラムを開発するにはそのマシンの命令体系に精通していなくてはならず、 アセンブラ(アセンブリー言語)によるプログラムはマシンの専門家でないかぎり無理なのです。

  そこで考えられたのがコンパイラーといわれるものです。 事務処理でよく使われるCOBOLもコンパイラーのひとつです。
コンパイラーは人間の言葉に近い表記で書かれた命令を複数の機械語命令の組み合わせに置き換えるプログラムで、 アセンブラと違いすべての機種用に同じプログラムを書くことができます。
例えばCOBOL言語の表記は英語に近いのでコンピューターの専門家でなくてもプログラムを作ることができます。
しかしCOBOL言語のプログラムは専門家でなくても書ける半面、処理効率が悪く速度が遅いという欠点があります。
このためよく使われる処理やオペレーションシステムなどシステムの制御に関わる部分は アセンブラなどの効率の良い言語で作らないとシステム全体の処理速度が遅くなってしまいます。

ここでCOBOLを使った例を考えてみます。 Aという名前の変数にある数字が入っているとします。
この数字が負の場合にはAをゼロにするという処理を行う場合 COBOLであれば使用するコンピューターの機種にかかわらず

IF A < 0
  COMPUTE A = 0.

というCOBOL言語を書けばよいのです。
これがCOBOLコンパイラーにより複数の機械語に変換されるのですが、 このとき使用するコンピューターの機種別に変換される機械語は違ったものになります。
機械語が違うのですから、もしアセンブラで同じことをやる場合は 当然最初から機種ごとに書く命令(アセンブリー言語)は異なったものとなります。
このようにアセンブラは機械語と1対1の対応があるので、 書くのは難しいかわりにそのマシンの性能を最大限発揮できるプログラムを書くことができるのです。

  コンパイラーはプログラム全体を一括して機械語に変換しますが、部分的に変換しながら実行するインタープリターというのもあります。
インタープリターは1命令づつ翻訳しながら実行するので、プログラムのテストなどでは非常に便利です。
システム開発用プログラムの場合、開発中はインタープリターとして動作し、 本番稼動用の機械語作成ではコンパイラーとして動作するものもあります。
コンピューター言語には非常に多くの種類があり事務計算用にはCOBOLやPL/I、数値計算用にはFORTRAN、BASIC、PASCAL、 システム開発用ではCやアセンブラ、さらにデータベース操作用のXbaseやSQL、 インターネットのサーバーやブラウザのためのHTML、Perl、JAVA、PHPなどもコンピューター言語と呼ばれます。