プログラムについて知ろう

プログラムとは何か(2)~コンピューターの積極活用へ~

  • このエントリーをはてなブックマークに追加
アドレス指定でインプット

本記事は、プログラムとは何か(1)~コンピューターの原理から~ の続編です。

プログラミングを楽にしよう

ニーモニック

進化した集積回路は、複雑で長いプログラムを簡単に処理できるようになりました。しかし、複雑で長いマシンコードプログラムは、人間にとっては作成するのも解読するのも、より困難になります。これを解決するために、再びオペランドとオペコードを分けて考えることにします。

マシンコード
マシンコードプログラムの一部分の例

まず、データのマシンコード(オペランド)は2進数の数値です。10進数のデータを2進数にしたり、逆に2進数のデータを10進数にしたりは、人間にとってはややこしい作業ですが、機械的にできる作業ですので、自動変換機を作って解決できます。

<変換例>
2進数の01001101 ←(変換機)→ 10進数の77

しかし、論理回路を組み替えるためのマシンコード(オペコード) は、プロセッサの作りによって決まるものなので、 プロセッサの設計者が作成したマシンコード表と照らし合わせなけば、どのコードにどの計算回路が対応しているのか、わかりません。

そこで、論理回路を組み替えるためのマシンコードを、よりわかりやすい人間の言葉(英語)に置き換える試みがされました(1950年代~)。その言葉をニーモニック( mnemonic )と言います。mnemonic はギリシャ語で、“思い出させるもの”という意味です。

ニーモニックの例: 

  • データ入出力: mov移動, push積込, pop取出 など
  • 演算: add加算, sub減算, xor排他和 など
  • ジャンプ: jmp参照 など
  • コール/リターン: call呼出, ret戻す

オペコードとニーモニックは、1対1の対応関係で、相互に変換できるようになっています。

アセンブリ

ニーモニックとオペコードとを変換するプログラムも作られました。ただ個々のニーモニックをオペコードに変換するだけよりも、同じ目的のためのニーモニックとデータ を数珠つなぎにし、ひとまとまりのマシンコードプログラムとしてメモリに入れるところまで、自動的にしてくれる変換プログラムにした方が実用的です。

アセンブリコード
アセンブリ言語によるソースコードの例

このようにひとまとまりのマシンコードプログラムを作る処理のことをアセンブリ([名詞]assembly)と言い、アセンブリを自動処理([動詞]assemble)するプログラムアセンブラ(assembler)と言います。

また、マシンコードの元となるプログラムソースコード(source code)と言います。アセンブリのソースコードは、ニーモニックとデータのセットを順序通りにリスト化したものになりますが、その独特の書き方を一つの言語としてとらえて表現したのがアセンブリ言語(assembly language)という呼び名です。

ソースコードに対して、アセンブリされた後のマシンコードプログラムネイティブコード(native code)とも言います。

コンピューターをもっと使おう

アセンブリ言語によって、複雑なプログラムが作れるようになりました。それによってコンピューターに処理をさせる機会も増えました。

すると今度は、実行完了のプログラムと、順番待ちのプログラムとの切替をスムーズに行う必要が出てきました。1960年頃までのプログラムの切替は、コンピューターのオペレーター(operator : コンピューターにつきっきりで操作(operate)する人)がしていた仕事でした。

オペレーション
オペレーターの仕事

オペレーティングシステム(OS)

しかし、プログラム切替専用の新たなプログラムが作られて、プログラム切替の仕事もコンピューターが自動で行えるようになりました。その切替プログラムはオペレーティングシステム(略してOS)と呼ばれるようになりました。

OSは、メモリに記録した複数のプログラムを管理して、それらを指定した順番に自動的に実行するだけが当初の目的でした。しかし1960年代以降、様々な追加機能が急速に発展して、コンピューターやそれにつながった機器を含め、全体を効率よく動かすシステムとして、進化していきました。

現在のOSの例:Windows、Unix/Linux系(Mac OS, Ubuntu, iOS, Android, Raspbian, …) 等

カーネル

それでもなお、カーネル(kernel)と言われるOSの核となる機能は、プログラムやデータの保管および利用に関わる処理です。実際には、そこに様々な処理が含まれるのですが、以下にその一部を見ていきましょう。

英語のkernelの元の意味は「大きな果実の核心部にある種」の意味です。

 fruits
果実の核心(仁)に例えられるカーネル

プログラムやデータの保管

メモリからストレージへ

メモリへ記録されたプログラムやデータは、メモリ上では単なる電気のON/OFFパターンです。このON/OFFパターンは、メモリへ安定的に電流を流し続けている間はずっと保持されます。しかし、停電や異常電流、電力コストのことを考えると、大量のON/OFFパターンを長期に保存しておくには、もっと電力に頼らない物に記録した方が安心です。そこで、パンチカードや磁気テープ、磁気ディスクや光ディスクなどへの長期記録専用の機器が、コンピューターに接続されました。これらの機器を「ストレージ」または「補助記憶装置」あるいは「メディア・ドライブ」とも言います。

strage
ストレージの例

ファイル

ただ、プログラムやデータを長期保存する際、利用に適した単位で分けておかないと、後で大変なことになります。使う時に、先頭から順に中身を見ていって、ここからここまで。…なんて使う時ほど、早く結果が欲しいのに、そんな余裕はきっとないでしょう。

よって、プログラムやデータは必ず、利用に適した単位で分けて保存します。この分けた1個1個を、ファイルと言います。ファイルには中身を推測しやすく、別ファイルと区別がつくよう、個別にファイル名を付けておきます。ファイル名は、人間によって個別に付けられたり、プログラムによって自動で付けられたりします。

このようにOSは、プログラムやデータの管理をファイル単位で行います。

プログラムやデータの利用

プログラムやデータを、長期記録用の装置から読み出してメモリへ入れることをロード(load)と言います。loadは英語で「積荷(つみに)」のことです。OSは、ロードもファイル単位で行います。

各ストレージ内にも個別のアドレスがあり、通常、ストレージ先頭領域にあるファイル名とその先頭アドレスの対応表を見て、OSがファイル操作をできるようになっています

ファイル単位でロード

また、プログラムやデータを、メモリからプロセッサへマシンコードとして送る時は、正しく、より効率的な順番で送れるように、メモリアドレスを細かく指定して、バイト単位でメモリからの送信内容を制御します。

アドレス指定でインプット

切っても切れないプロセッサとの関係

アーキテクチャ

マシンコードの使われ方は、プロセッサの設計によって異なり、対応するアセンブリ言語もアセンブラの設計によって異なります。また、コンピューターを効率的に動かすためのOSも、そのプロセッサの設計に合わせて、最適な動作は大きく違ってきます。

このように、プログラミングにも大きく影響してくるプロセッサの設計をアーキテクチャ(architecture)と言います。architecture は「設計技術」のような意味の英語です。

アーキテクチャのイメージ
アーキテクチャのイメージ
どんなマシンコード(ニーモニック)入力で、どんな動作をするかというプロセッサのつくり

例えば、一度に処理できるオペランドのビット数から、32ビットアーキテクチャ、64ビットアーキテクチャなどという言い方があります。

なお、アーキテクチャという言葉は、プロセッサの設計に限らず、様々な設計技術を表す言葉として使われる場合もあります。

プラットフォーム

また、そのようなアーキテクチャを持つプロセッサとOSとを合わせて、プラットフォーム(platform)と言います。platformは「台」を意味する英語で、その台に合ったプログラムだけがその台に載れ、その台を活かすことができるのです。

高級プログラミング言語

より自然言語に近い言語へ

アセンブリ言語は、マシンコードよりは人間にわかりやすくなったものの、言ってみればマシンコードを人間の言葉(英単語)に直訳しただけのものであり、その文法(単語順序)は、ほぼマシンコードそのままでした。

人間がコンピューターにさせたいことを、アセンブリ言語として書き表すには、人間の脳内でプログラム設計(自然言語による設計)をして、そこからプロセッサに合わせてアセンブリ言語化(翻訳)をする必要がありました。

そこをもっと効率良くするために、高級プログラミング言語(high-level programming language)とコンパイラ(compiler)が作られました。

高級プログラミング言語(略して高級言語)は、人間の脳内でのプログラム設計を、人間の使う言葉(自然言語)=英語の文法 に近い形で書き表せるようにしたプログラミング言語です。

高級プログラミング言語に対して、マシンコードやアセンブリ言語を低級プログラミング言語(略して低級言語)とも言います。

自然言語・高級言語・低級言語
アセンブリ言語よりも自然言語に近い高級言語でプログラミングして、コンパイラで低級言語に翻訳

コンパイラ

そしてコンパイラは、高級言語で書かれたプログラムを、マシンコードまたはアセンブリ言語のプログラムに変換(翻訳)するプログラムです。

なお、コンパイラという言葉の元となったコンパイル(compile)という言葉は、プロセッサの動作につながらない高級言語から、プロセッサの動作につながるマシンコードへと、プログラムを機械的に【再編集】することを指した言葉です。

アセンブリ言語までの低級言語では、プログラマが、使用するアーキテクチャを意識してプログラミングをする必要がありました。しかし、高級言語では、プラットフォームに合わせたコンパイラさえ使用すれば、コンパイラがアーキテクチャに合わせてマシンコードへ変換してくれるため、高級言語でのプログラムは、アーキテクチャを意識してプログラミングする必要がなくなりました。(それでも、アーキテクチャを意識した方が、より良いプログラムになることに変わりはありません。)

まとめ

第二次世界大戦後、コンピューターを積極的に使っていく流れができ、コンピューターをより効率的に使っていくためにOSができました。

また、マシンコードを人間が扱いやすい言葉に置き換えたのが、アセンブリ言語です。(3代目プログラム)

アセンブリ言語よりもさらに自然言語に近づけたプログラミング言語を高級プログラミング言語と言います。(4代目プログラム)

アセンブリ言語をマシンコードに翻訳するプログラムをアセンブラと言い、高級プログラミング言語を低級プログラミング言語に翻訳するプログラムをコンパイラと言います。

アセンブラやコンパイラは、単なる翻訳プログラムにとどまらず、この後さらにプログラミングの生産性を高める役割を持つようになります。詳しくは、次の記事で説明していきます。

続きは、プログラムとは何か(3)~進化したプログラミング言語の翻訳処理~

  • このエントリーをはてなブックマークに追加

コメントを残す

*

CAPTCHA