AOBA's Information Processing Education
1998/04/11
注意1:このページは、回線を切断した後でゆっくりご覧になってください(テキストを印刷する場合は、その取り扱いに注意してくださるようお願いします)。
注意2:背景が白地の画面を長時間見つめていると頭が痛くなってしまいますので、ここは背景をグレーにしています。
最初に断っちゃいますが、情報処理試験で出題されるソフトウエア関連の問題は、いまだに汎用コンピュータのソフトウェアについてなんですよ。
それはそれで当然で、社会一般の(大きな)システムにおいては、汎用コンピュータが最も利用されていますからね。(注)
すごく大雑把に言えば、パソコンやワークステーション(パソコンの高性能なやつ)よりもずっと高性能で価格が高いコンピュータが汎用コンピュータです。パソコンの中では最も大きいタワー型のパソコンでも、せいぜい60センチ位の高さですが、汎用コンピュータは2メートル位の高さがあるでしょうか。
見た事がないのは当然です。汎用コンピュータは専任のオペレータ以外は(直接は)操作しませんからね。たぶん我々が汎用コンピュータを利用する最も身近な例は、たぶん銀行のバンキングシステムでしょう。銀行でお金をおろす(預ける)時に使うあれです。
と言っても、我々が直接操作しているのは、キュッシュディスペンサーという別の機械ですが...。キャッシュディスペンサーは遠くの(近くの場合もある)汎用コンピュータに接続されていて、汎用コンピュータの指示に従ってキャッシュディスペンサーが動作しているのです(わざわざ説明するまでもないか?)。汎用コンピュータとパソコンでは多くの面で異なっています。だから、いきなり汎用コンピュータのソフトウェアについて説明しても、何のことやらさっぱりイメージできないかもしれません。
でもそこは割り切って、「そういうもんだ」と覚えてしまうのが賢明です。本当の意味で理解できるのは、もっと後(もし皆さんがコンピュータ関連の作業に従事したならば、その時)になってからでしょう。で、今週は「言語プロセッサ」について説明します。ここまで長々と前置き(言い訳?)をしてきましたが、実は今週のテーマについては、汎用コンピュータもパソコンも変わりはありません。
以上、前置き。
以前、「コンピュータが解釈して実行できる唯一の言語は機械語である」と説明した事を覚えていますか。
でも、先週までCASL言語の講座を行ってきましたが、そこの例題や問題のプログラムは機械語ではありませんでしたね。また、皆さんが趣味などでプログラムを作成する時、まさか機械語でプログラムを作らないでしょう。個人ならばBASIC言語か、C(C++)言語でプログラムを作成する機会が多いと思われます。そこで、言語プロセッサが必要になります。
言語プロセッサとは、人間が記述したプログラムを機械語に変換するプログラムの総称です。
(注)”人が記述したプログラム”のことを原始プログラム(ソースプログラム,ソースモジュール)と言います。また、機械語のプログラムを目的プログラム(オブジェクトプログラム,オブジェクトモジュール)と言います。以下の説明はこの用語に統一します。
たぶん皆さんがプログラムからイメージするのは、何らかのデータを読込んで(例えばキーボードからキーを入力して)データを出力する(例えばディスプレイに文字を出力する)命令の集まり、でしょう。ところが、言語プロセッサは、プログラムを読込んでプログラムを出力するプログラムなのです(ちょっとイメージするのが難しいかなー)。
とは言っても、言語プロセッサだけが特別な入出力を行っているのではありません。言語プロセッサは、入力した原始プログラムを単なる文字の集まりとみなして、それを加工します(言語の文法に則って変換します)。そしてその加工後の目的プログラムをハードディスク等に出力しているだけです。
このように、原始プログラムを目的プログラムに変換することを翻訳と言いますが、言語プロセッサは、その翻訳の仮定に着目して、以下の図のように分類することができます。
![]()
翻訳プログラムとは、翻訳の対象とするプログラムを一度にまとめて翻訳する言語プロセッサの総称です。対してインタプリタ(解釈実行プログラム)は、プログラムの各命令を一つづつ機械語に翻訳する言語プロセッサの総称です。
今まで暗黙のうちに、言語プロセッサを翻訳プログラムと同じもののように説明していましたが、実は上図に示すように、言語プロセッサにはインタプリタもあるのです。
インタプリタは原始プログラムを一度にまとめて翻訳しません。翻訳するタイミングは、原始プログラムを実行しようとする時です。「え、原始プログラムは機械語じゃないから、実行できないんじゃないの?」
その通りです。そのように見えるだけです。この理屈を以下に説明しましょう。原始プログラムのライン数(行数)が1000行あったとしましょう。これらの行すべてをまとめて機械語に変換するのが、翻訳プログラムですね。すると当然、目的プログラムも(原始プログラムの)1000行に対応した命令数(語数)になるはずです。
ところが、コンピュータ(とういかCPU)は、1命令サイクルで1つの命令しか解釈&実行できません。つまり、CPUが解釈&実行する機械語は、命令サイクル実行直前に1語だけあればいいのです。インタプリタはこの点を利用します。
インタプリタは、実行しようとする原始プログラムを読込んで、少しだけ(1行だけ)翻訳します。そして翻訳した分の機械語の実行が終了したら、また少しだけ翻訳し、その分の実行を行います。こうすることで、ユーザからは原始プログラムを直接実行しているように見えるのです。
インタプリタで翻訳して実行する場合は、実行の途中途中で「翻訳」の過程があるために、翻訳プログラムを通して作成したものと比べ処理速度が圧倒的に遅い、という欠点があります。今でも社会一般で利用されているシステムのほとんどは、翻訳プログラムを通して作成されています。
なお、アセンブラ、コンパイラ、ジェネレータについては、プログラム言語の分類について知らなければなりませんので、これは来週にしましょう。
ではまた来週。