プログラミング言語とはなにか

Revised: Apr./27th/2008; Since: Mar./16th/2002

最初にプログラミングとはなにを目的とするものなのかを概説する。興味が無ければ飛ばしても構わない。但し、後続の章で分からないことがあれば、戻ってくるように勧める。

コンピュータ・プログラム

日常利用している PC では、キーボードやマウス、マイクで入力し、ディスプレイやプリンタ、スピーカーに出力している。データはハードディスク、フロッピーディスク、MO 、CD に保存している。また、 メモリの大きさや CPU のクロックやコアの数で処理の速さが変わることを実感できる。

このような構成は PC に限らず、殆どのコンピュータで共通している。現在利用されているコンピュータは本質的には共通の思想(アーキテクチャ)に基づいて設計されている。そして、このようなコンピュータに仕事をさせるために作るのがプログラムである。

Word/Excel, InternetExplorer, Mozilla Firefoxなどの アプリケーション・ソフトウェアは全てプログラムであり、 Windows や UNIX, Linux, MVS などのオペレーティング・システム (OS: Operating Systems) もプログラムだ。このようなプログラムは、プログラミング言語と呼ばれる約束で書かれた文書(ソースコード)を加工して作られる。

プログラミング言語には沢山の種類があるが、 Java もプログラミング言語であり、本稿は Java でアプリケーションを開発する為の基本的な知識を紹介している。

コンピュータの仕組み

現在のコンピュータはノイマン型と呼ばれる。そのハードウェアの主たる構成要素は、入力装置/出力装置/処理装置/記憶装置の四つになる。

命令の実行と言う観点からもう少し細かく見ると、次の三つの部品が重要な役割を果たす:

処理装置 (processor, processing unit)
CPU の部品。演算/制御をつかさどる
レジスタ (register)
CPU の部品。処理装置が処理する命令/データを保持する
主記憶装置 (main memory, primary storage)
メモリ、ストレージ。レジスタで読み込む命令/データを保持する

主記憶装置内の命令やデータを、処理装置がレジスタに読み込んで処理をして、結果をメモリに書き戻す。メモリ上に、連続する命令/データを読み込んでおけば、処理装置は続けて処理してくれるので、全体としてひとまとまりの仕事が実行できることになる。この連続する命令/データのまとまりが、プログラムに他ならない。プログラムとは、処理装置の動作を指定するものである。

処理装置は制御装置 (control unit) と演算装置 (ALU: arithmetic-logic unit) に分けられるが、処理装置とレジスタは CPU (central proceccing unit) と呼ばれる装置にまとめられている。また、現在のコンピュータは、主記憶装置(メモリ)に読み込むデータを保存しておくハードディスクなどの補助記憶装置 (secondary storage device) も内蔵されている。

処理装置、レジスタ、記憶装置はトランジスタ (transistor) 、ダイオード (diode) と呼ばれる部品を集積して作られている。トランジスタ/ダイオードはシリコン (Si) を主成分とする半導体 (semiconductor) と呼ばれる化合物を組み合わせて構成されている。ここでは、電流(電子の流れ)を制御して電圧の高低をつくる。これを 1/0 に対応させて、演算/記憶を実現している。電圧は波形状のアナログな変化しかしないので、1/0を明確に区別する事が困難な場合もあるが、閾値よりも高い/低いで1/0を判断することで高い信頼性を確保できる。

1/0 を使って記憶/演算する仕組みは、トランジスタ/ダイオードをケーブルでつなげて、 AND 回路、 OR 回路を作る事で理解できるのだが、ここでは割愛する。また、半導体の仕組みを強結合近似/フェルミ面の観点から説明できる(物性物理学、固体物理学の分野である)。現在主流のコンピュータは 1/0 (ビットのON/OFF)しか解釈できないと覚えてもらいたい。

記憶階層

補助記憶装置にはハードディスク、フロッピーディスク、 MO などが使われる。主記憶装置はストレージ (main storage, main memory) と呼ばれることもある。レジスタは処理装置が直接アクセスするもの/キャッシュに分けられ、キャッシュは CPU の内部/外部で L1 キャッシュ/L2 キャッシュなどと呼ばれて区別される。

一般に、処理装置の動作速度よりも記憶装置の動作速度は遅い。

主記憶(メモリ、ストレージ)は、RAM (Random Access Memory) と呼ばれ、動作の仕組みによって、SRAM (Static Random Access Memory、静的RAM) と DRAM (Dynamic Random Access Memory、動的RAM) に分けられる。SRAMは、内部でフリップフロップ回路を利用しており、高価で複雑で高速。DRAMは、トランジスタに付随したキャパシタに蓄えた電荷で 1/0 を記憶しており、安価で単純で低速。

SRAM は、トランジスタによるスイッチ回路で全てを構成されており、複雑/高速/高価だ。DRAM同様、電力供給がなくなると記憶が失われる揮発性メモリ(volatile memory)であるが、DRAMと異なり、一定周期でのリフレッシュは不要である。一般的には、レジスタやキャッシュ・メモリとして使われている。SRAM にも、同期と非同期があり、同期の Syncronous SRAM は高価で、非同期の ASynchronous SRAM は比較的安価だ。

DRAM については、安価で集積度を上げ易い為に、パソコンの主記憶(メイン・メモリ)として広く使われている。一方で、動作速度としては、構造が単純なためにread/write方式が複雑となり、キャパシタからの放電を充電するために、記憶を維持するためにリフレッシュと呼ばれる、一定周期での電荷の再充電が必要になるために、SRAM に比べると格段に低速となる。DRAM には、SDRAM (Synchronus DRAM) と RDRAM (Rambus DRAM, or Direct Rambus DRAM - DRDRAM) という方向の進化がある。

SDRAMには、既存の SDR SDRAM (Single Data Rate SDRAM) と、後継の DDR SDRAM (Double Data Rate SDRAM) という規格があり、現在の主流は、CPU の外部クロックの二倍で動作する DDR SDRAM だ。別系統の進化である、Rambus 社の規格を使った RDRAMは、一時期は SDRAM の後継と目されていたが、諸般の事情が禍して、現状では主流を DDR SDRAM に明け渡した格好だ。

読み取りのみ可能で、記憶された命令を変更できないものを ROM (Read Only Memory) と呼ぶ。特定のハードウェアの初期化など、変更する必要のない命令を保持するのに使われている。尚、インターネットで、コミュニティに貢献しない "take and take" な人のことを "Read Only Member" と呼ぶ。活動の幅を広げるには、そういう人が裾野を拡げていることを忘れちゃ駄目だよね。更に因みに、ダウンロードするばっかりでアップロードしない人を "Download Only Member" と呼ぶのはまた別の話。

ハードディスクは鉄板に磁性体の粉を塗布したものであり、その磁化方向を1/0に対応して記憶する。動作速度では SRAM > DRAM > ハードディスクとなり、動作速度が速いほうが値段も高く、大容量化しづらい。処理装置の動作に追いつくために、メイン・メモリやレジスタなどの処理装置に近い部品は高価/高速な材料が使われる。

プログラム実行の流れ

前項で説明した、補助記憶/主記憶/レジスタ/制御装置/演算装置を使って、プログラムは次のように実行される:

  1. 補助記憶装置にプログラムとデータを読み込むための領域を確保する (getmain)
  2. 補助記憶装置のプログラムを主記憶装置に読み込む (load)
  3. 主記憶装置上のプログラムのアドレスをレジスタに読み込む
  4. レジスタが指し示すアドレスの命令/データを別のレジスタに読み込む
  5. 演算装置が演算する
  6. 演算結果をレジスタに書き戻す
  7. さらに主記憶装置にも書き戻す
  8. 必要があれば補助記憶装置にも書き戻す
  9. 2-7 を繰り返す
  10. 終了して、プログラムが占有していた主記憶装置を解放する (freemain)

このようなデータの流れは制御装置が制御しており、データはバスと呼ばれる通り道を通ってやり取りされる。CPU 内のレジスタは複数用意されており、それぞれ、メモリ上のアドレスの保持、データの計算、汎用などの目的が決まっている。演算装置の演算対象はレジスタのデータ/命令である。 CPU からのバスは主記憶にしかつながっていないので、レジスタには主記憶装置からしか読み込めない。しかし、主記憶は電源を落とすとデータを保持できない(揮発性)ので、持続させたいデータは補助記憶装置に保存しておくことが必要となる。

コンピュータは主記憶装置のデータ/命令しか処理できないと言ってよく、入出力装置、補助記憶装置上のデータは、必ず主記憶装置に読み込み、それをレジスタに読み込むことではじめて処理装置の処理対象になる。

ちなみに、主記憶(メモリ)にデータ/プログラムを読み込むことをロード(展開)と呼び、読み込んだデータ/プログラムをインスタンスと呼ぶ。

ノイマン型

以上の特徴は、次の三つに要約することが出来る:

プログラム内蔵方式 (stored program concept)
コンピュータが実行する命令は主記憶に保持しておく
逐次制御方式 (sequential system of implementation)
主記憶からレジスタに命令/データを移して、一つずつ実行する
2 進数処理 (binary number system)
半導体による電子の流れを制御して、電流の有無を 1/0 と解釈する。

これらの特徴を備えたコンピュータをノイマン型と呼ぶ。

ノイマン型コンピュータ (Neumann type computer)
以上の三つの特徴をもつコンピュータ。 John von Neumann, Konrad Zuse, Claude Shannon らが貢献。

このようなハードウェアの動作を管理しておくことは、ユーザには煩雑なことである。昔は演算ごとに配線を繋ぎ変える (wired logic) ことで実現していたものを、ソフトウェア(制御モニタ)が自動的に行ってくれるようになり、これが発展して OS (Operating System) が出現した。現在の OS は他にも多くの機能を担っており、ハードウェア/マシンリソースの管理を行う部分のことを特にカーネル (kernel) と呼ぶことがある。

量子コンピュータ

現在は、1/0 で状態を保持するアーキテクチャのコンピュータしか実用になっていないが、量子コンピュータと呼ばれるものが開発途上だ。量子コンピュータは、素粒子の一つである電子の量子的重ね合わせの原理 (Principle of superposition) によって、1/0 の二つの状態だけではなく、複数の状態を要素として演算することが可能となり、現行のコンピュータの数乗倍の動作速度を、原理的には、実現するものだ。

量子コンピュータの概念は、既に 1960 年頃まで遡ることができるが、コンピュータ・サイエンスや物性物理学の分野で主流の研究対象となったのは 1980 年以降となる。2003 年には、NEC や理科学研、NTT などが実際に動作する原始的な量子コンピュータの開発に成功したと報じている。また、量子効果を使った暗号通信が、実験室の専用線で実現されている。

2005年頃から、量子暗号通信は、屋外での通信速度と伝達距離が日々塗り替えられている。NTTでは、2005年に「量子コンピュータに用いる量子ビットとして期待されている核スピンを、半導体ナノスケールデバイスでコヒーレントに制御することに成功し、デバイスの構成元素であるすべての核種で可能なすべての遷移に関してコヒーレントな振動を確認」し、2007年には「量子暗号鍵を200kmの長距離光ファイバー上で配送」したそうだ。

2008年現在、既存の暗号解読のデモ量子コンピュータや、量子暗号通信の商用サービスはまだ披露されていない。

プログラムの種類

上で紹介したとおり、コンピュータの動作を命令として主記憶に蓄えておける。この命令群をプログラムと呼んでおり、プログラムを記述することをプログラミング/コーディングと呼ぶ。

コーディングするのは、究極的には演算/制御装置(処理装置)の動作である。先に見たように、これら処理装置は2進数(ビットパターン)しか解釈できない。また、処理装置の種類によって可能な動作の種類とそれを表すビットパターンは異なる。

このビットパターンはマシン語(機械語)と呼ばれ、処理装置に依存した固有のものである。機械語のプログラムは、レジスタに読み込まれる命令を一行ずつ逐次羅列する。

機械語のビットパターンを一対一対応で自然言語の覚えやすい単語(ニーモニック mnemonic)に変換したものをアセンブリ言語と呼び、やはり1行ずつ処理装置の動作を記述したものになる。アセンブリ言語で書かれたプログラムはアセンブラと呼ばれるソフトウェアで機械語に変換してから実行される。

このように1行ずつ書いていたものを、 if や for などの構文を使って構造化し、自然言語に近づけたものを高級言語(高水準言語)と呼ぶ。高級言語で書かれたプログラムも、機械語に変換しないと実行できない。機械語に変換するソフトウェアは、コンパイラとインタープリタと呼ばれるものに分類されるが、何れも処理系と呼ばれる。

いずれにせよ、プログラムはコンピュータの動作/制御を記述したものであり、コンピュータはプログラムに記述された通りに動作/処理する。

Java は何に使えるか

Java は自然言語の単語を使い、制御に応じた構造を持った高級言語である。他の高級言語としては、 C/C++, FORTRAN, COBOL, PL/I, Perl, PHP, BASIC などが挙げられる。一般に、アセンブリ型言語/機械語でない言語は全て高級言語である。

プログラミング言語は、それぞれに開発された目的に応じて、得意分野が異なる。例えば、 C 言語は OS の開発の為に開発された言語であり、 Perl は文書を処理する為に開発された言語である。 Java の場合は、ネットワークでつながれた異なるマシン/OS を共通の実行コードで制御することを目的として開発された。

これは Java の大きな特徴であり、ネットワーク環境で使われることが多い。但し、 Java は先行言語を意識して作られた比較的新しい言語であり、使用目的を特に限定しない汎用的な言語でもある。従って、他の言語で出来ることは Java でもできる。

登場と注目のされ方に経緯があり、ウェブでのマルチメディアコンテンツを開発するための言語と思われていたこともあったが、実際は汎用の言語であり、高度に複雑なロジックも実装できる。そのように設計された言語であり、実際そのように使われているのであり、マルチメディアコンテンツ用途は少なくなっている。

2008年現在、Java が最も成功している分野は、サーバ・サイドと呼ばれる領域において、特にJ2EE/Java EEと呼ばれるアーキテクチャで実装されるWeb Applicationと呼ばれる形態が注目されている。携帯電話などへの組み込み系と呼ばれる形態も注目される。一方、クライアント・サイドのスタンド・アローンと呼ばれる形態では、Eclipseなどの製品が実装されているが、主流には至っていない。



Copyright © 2002-2008 SUGAI, Manabu. All Rights Reserved.
SEO [PR] !uO z[y[WJ Cu