言語プロセッサとは、人間が書いたプログラムをそのままではコンピュータが理解してくれないので、コンピュータが理解してくれる機械語に翻訳してくれる翻訳機の総称です。
言語プロセッサには、アセンブラやコンパイラ、インタプリタなど様々な種類があり、それぞれにどんな特徴があるのか、基本情報技術者試験でも過去に何度も出題されています。
その中でもコンパイラについては、かなりの頻出度のため、言語プロセッサの種類についてもしっかり解説しつつ、コンパイラについては更に深堀りして解説していきます。
- 基本情報技術者試験に独学でチャレンジする予定の人
- アセンブラとコンパイラ、インタプリタの違いを知りたい人
- 言語プロセッサがなにかよくわかっていない人
こんな方はぜひ最後まで読んで見てください1
言語プロセッサとは?様々な言語プロセッサをわかりやすく解説!
言語プロセッサとは、人間が理解しやすいように記載されたプログラムを機械が理解できる機械語に変換するソフトウェアのことです。
コンピュータが理解できるのは機械語と呼ばれる、0と1が羅列されたビット列だけです。しかし0と1の羅列では人間には解読が難しすぎるので、人間でもわかりやすい言語で書かれたのがプログラミング言語です。
人間には分かりづらい機械寄りの言語のことを低水準言語と呼び、人間でもわかりやすいプログラミング言語などを高水準言語と呼びます。
また、基本用語として人間が書いた機械がまだ理解できないプログラムのことを原始プログラムやソースコードと呼び、言語プロセッサによって変換したプログラムを目的プログラムやオブジェクトプログラムと呼びます。
言語プロセッサでは、翻訳前の原始プログラムをコンピュータに理解させるために、目的プログラムへ変換するソフトウェアの総称で、アセンブラやコンパイラ、インタプリタなど様々な種類があります。
基本情報技術者試験ではそれぞれの言語プロセッサがどのようなプログラムをどのように変換していくのかを理解しているかを問う問題が頻出なので、言語プロセッサの種類についてしっかり押さえておきましょう。
アセンブラ
アセンブラはアセンブラ言語と呼ばれる、ほぼ機械語で書かれたソースコードを翻訳して機械語に変換するソフトウェアのことです。
アセンブラ言語は、ビット列の機械語に記号を付けたくらいでほぼ機械語なので、低水準言語に属します。
午後試験の選択言語の一つにCASL Ⅱがありますが、CASL IIはアセンブラ言語です。
本講座では、選択言語はPythonをおすすめしているのでCASL IIにはあまり深くは触れませんが、CASL IIをおすすめしている著書も多いので読んでみるのもいいですね。
コンパイラ
コンパイラは、高水準言語で書かれた原始プログラムをコンピュータが理解できる機械語へ翻訳するプログラムのことです。
コンパイラがプログラムを翻訳することをコンパイルと呼びます。コンパイルを一度行うと、何度でも機械語で読み取ることができます。
そのためコンパイラの特徴として覚えてほしいのが、実行するまでには時間がかかる点と、実行速度が後述するインタプリタよりも高速な点です。
インタプリタ
インタプリタは、コンパイラと同じく高水準言語で書かれた原始プログラムをコンピュータが理解できる機械語へ翻訳するプログラムです。
ただし、コンパイラとの違いは、原始プログラムの命令文一文ごとに翻訳して実行する点です。コンパイラでは実行するまでには時間がかかると記述しましたが、インタプリタは実行するまでは早いのが特徴です。
そのためデバック(エラーの修正)しやすい反面、一文一文翻訳するせいで実行速度がコンパイラよりも遅いのも覚えておきましょう。
コンパイラでは、原始プログラムを翻訳して目的プログラムを作成するのですが、インタプリタでは一文のみの翻訳を繰り返しているだけなので、目的プログラムは作成しません。そのため実行するときは毎回解析を行う必要があり、実行速度が遅くなるのです。
その他の言語プロセッサ
以下の言語プロセッサは、アセンブラやコンパイラほどは頻出ではないけれど、過去に1度は出題されていたり、選択肢の中に紛れ込んでいる言語プロセッサなので触れておきます。
- ジェネレータ 👉パラメータを指定してプログラムを自動生成する言語プロセッサ。
- トランスレータ 👉 処理系用に書かれた原始プログラムを他の処理系用プログラムへ変換する言語プロセッサ。
- エミュレータ 👉 ほかのコンピュータ用のプログラムを解読して実行するマイクロプログラム。
- クロスコンパイラ 👉 あるコンピュータ上で、異なる命令形式をもつ別のコンピュータで実行できる目的プログラムを生成する言語プロセッサ。
- プリコンパイラ 👉 言語仕様が拡張された擬似言語を用いた原始プログラムを、高水準言語の命令だけに書き換え、コンパイルできるようにする言語プロセッサ。
原始プログラムが実際に実行されるまでの流れ
言語プロセッサの種類を覚えたら、あとは原始プログラムを翻訳しコンピュータが実際に実行するまでの流れを理解していきましょう。
実は高水準言語をコンパイラによってコンパイルされたプログラムはすぐには実行できません。リンクと呼ばれるプログラムの調整を行い、実行可能なロードモジュールを作成しないといけないのです。もう少し詳しく説明していきましょう。
リンクとは、原始プログラムを作成する際に用いたライブラリ(プログラムの共通部品)と、原始プログラムをコンパイルして作成された目的プログラムのアドレスを調整することです。リンクを行うプログラムのことをリンカと呼びます。
無事、アドレスの調整が完了すると実行可能なプログラムが作成されます。実行可能なプログラムのことをロードモジュールと呼びます。
動的リンキングと静的リンキング
リンクには実行前に行うか実行と同時に行うかで動的リンキングと静的リンキングの2種類に分かれます。
動的リンキングは、プログラムを実行する時に、動的リンクライブラリ(DLL:Dynamic Link Library)から、必要な目的プログラムをリンクしてロードするリンク方法です。
動的リンクライブラリとは、主にOSが提供し複数のプログラムに共通して使用する関数やプログラムを機能単位でまとめたモジュールのこと。例えば、計算機やメモ帳など様々なアプリがあるけど、そのどれもで共通の☓で閉じる機能などは、それぞれのアプリでは動的リンクライブラリから呼び出したほうが楽ですよね。
動的リンクライブラリを用いることで、実行ファイルのサイズを小さくでき必要な時にだけ必要なライブラリを主記憶にロードすれば良いため主記憶利用の効率化が期待できます。
一方で静的リンキングは、プログラムを実行する前に目的プログラムをリンクしてロードするリンク方法です。例えば計算機やメモ帳そのものにしかないような計算機能やマーカー機能などを使うときには静的リンキングを使うのがいいでしょう。
動的リンクライブラリの特徴についても過去に出題されるているので、しっかり押さえておきましょう。
コンパイルの流れをしっかり理解しよう!
コンパイラが原始プログラムを翻訳して、目的プログラムを作成するまでの流れの中に、頻出問題が隠れています。それが、コードの最適化です。
コンパイルの流れをしっかり理解しておくことでコードの最適化とは何を目的として何をすることなのかを理解していきましょう。
- 字句解析
- 構文解析
- 意味解析
- コード最適化
- コード生成
コンパイルは以上の5ステップで行われます。
字句解析では命令文や変数、定数など意味のある基本単位に分解します。構文解析では、構文規則に誤りはないかどうかを判断し、誤りがある場合エラーメッセージを表示させて停止します。
意味解析では、基本単位から構文単位に解釈して、中間コードに変換して出力します。
このタイミングでコードの最適化を行います。
コード最適化は、実行速度を上げるなど、効率のいいコードになるように処理を行います。
イメージしやすいように、英語を日本語に訳すときの流れでコンパイルを説明してみます。
字句解析では、単語の意味を調べたりします。構文解析では文法を調べて、意味解析で大体の直訳を作成します。コードの最適化でもう少し自然な日本語になるように整えたら、翻訳文の完成です。
過去問を解いて今回の理解を深めよう!
ここまでの内容を自分の知識にするために、実際に過去問を解いて見ましょう。
わかりやすい解説も合わせて置くので、繰り返し解いてみてください。
各種言語プロセッサの説明のうち、適切なものはどれか。
出典:平成19年秋期 問40
ア. アセンブラは、ある処理系用に書かれた原始プログラムを、ほかの処理系用の原始プログラムに変換する。
イ. インタプリタは、ほかのコンピュータ用のプログラムを解読し、実行するマイクロプログラムである。
ウ. ジェネレータは、入力・処理・出力などの必要な条件をパラメータで指示することによって、処理目的に応じたプログラムを生成する。
エ. トランスレータは、高水準言語で書かれたプログラムを、解釈しながら実行する。
答え ウ
アセンブラは、アセンブラ言語で書かれたプログラムを機械語に変換する言語プロセッサです。処理系用に書かれた原始プログラムではないので不適切。処理系用に書かれた原始プログラムを他の処理系用の原始プログラムに変換するのはトランスレータの説明です。
インタプリタは、高水準言語を一文一文解析しながら実行する言語プロセッサのことです。他のコンピュータ用のプログラムを解読して実行するマイクロプログラムは、エミュレータと呼ばれる言語プロセッサの説明です。
ジェネレータは、パラメータを指定してプログラムを自動生成する言語プロセッサ。よって説明文は適切です。
トランスレータは、処理系用に書かれた原始プログラムを他の処理系用の原始プログラムに変換する言語プロセッサです。高水準言語で書かれたプログラムを解析しながら実行するのはインタプリタの説明なので不適切。
したがって答えはウです。
次の文はある二つの言語処理系について記述したものである。Bと比べたAの利点を記述しているものはどれか。
A:高水準言語で作成されたプログラムを、中間言語、アセンブラ言語又は機械語で記述されたプログラムに翻訳する。
B:原始プログラム中の命令文を一文ずつ解釈し、実行する。ア. 処理の最適化が図れる。
出典:平成16年春期 問44
イ. 対話的な実行環境が構築できる。
ウ. デバッグ機能を組み込みやすい。
エ. プログラム作成とテストを並行してできる。
答え ア。
まずは、AとBが何なのか。「高水準言語で作成されたプログラムを中間言語、アセンブラ言語、機械語で記述されたプログラムに翻訳する。」のはコンパイラの説明です。一方B「原始プログラム中の命令文を1分ずつ解釈し、実行する」のはインタプリタの説明です。
したがってこの問題は、インタプリタと比べてコンパイラの利点を選択します。
処理の最適化が図れるのはコンパイラの特徴です。インタプリタにはできない特徴ですので適切な選択肢です。
対話的な実行環境が構築できるのは、インタプリタの特徴です。コンパイラでは全て翻訳し終わるまで実行できないので対話的な実行環境は構築できません。よって不適切。
デバック機能を組み込みやすいのはインタプリタの特徴です。デバック機能とは、エラー修正がしやすい機能のことなので、対話的に実行できるインタプリタの方が優れています。よって不適切。
プログラム作成とテストを並行してできるのはインタプリタの特徴です。一文一文解読して実行するインタプリタでは、プログラムを書いてすぐにテストできます。よって不適切。
したがって答えはアです。
手続型言語のコンパイラが行う処理のうち,最初に行う処理はどれか。
ア. 意味解析
出典:平成30年秋期 問19
イ. 構文解析
ウ. 最適化
エ. 字句解析
答え エ。
コンパイラの処理の流れを理解しているかを問われています。
コンパイラの処理の流れは、以下の5ステップです。
- 字句解析
- 構文解析
- 意味解析
- コード最適化
- コード生成
英語を日本語に翻訳するときには、まず単語の意味を調べますよね?
コンパイラでも同じように、基本単位の解析から行いますので、一番最初に行うのは字句解析です。
したがって答えはエ。
リンカの機能として、適切なものはどれか。
ア. 作成したプログラムをライブラリに登録する。
出典:平成30年秋期 問20
イ. 実行に先立ってロードモジュールを主記憶にロードする。
ウ. 相互参照の解決などを行い、複数の目的モジュールなどから一つのロードモジュールを生成する。
エ.プログラムの実行を監視し、ステップごとに実行結果を記録する。
答え ウ。
リンカの機能の前に、リンカと出てきたら、原始プログラムを実行するまでの流れのことだなと瞬時に出てくるように覚えておきましょう。
原始プログラムをコンピュータが実行するには、コンパイルするだけではまだ不十分です。コンパイルして生成された目的プログラムだけではなく、他のライブラリなどと結合したり、アドレスを調整する必要があります。
リンカでは、目的プログラムとライブラリを結合したり、アドレスを調整する機能があり、無事、結合と調整が終わると、実行可能なロードモジュールが生成されます。
したがって答えはウ。
まとめ
今回は、基本情報技術者試験合格のために、言語プロセッサの種類をわかりやすく解説し、言語プロセッサの中のコンパイラに関しては少し掘り下げて解説しました。
言語プロセッサの種類、それぞれの特徴を覚えておくのはもちろん。原始プログラムが実際に実行されるまでの流れと、コンパイラによるコード最適化の目的は頻出問題なので、抜かることなくしっかり押さえておきましょう。
- 言語プロセッサ 👉 人間が書いたプログラムをコンピュータが理解できる機械語へ変換するプログラムの総称
- アセンブラ 👉 アセンブラ言語で書かれたプログラムを機械語に変換する。
- コンパイラ 👉 高水準言語を機械語へ翻訳する。コード最適化を行うことができるので実行速度がインタプリタよりも高速。
- インタプリタ 👉 高水準言語を一文一文解析しながら実行する言語プロセッサ。
- 原始プログラムが実行されるまでの流れ
- コンパイラによって原始プログラムを変換し、目的プログラムを生成
- リンカによって目的プログラムとライブラリを結合したり、アドレスを調整しロードモジュールを生成
- 実行可能なロードモジュールを、実行!
- コンパイルの流れは5ステップ
- 字句解析 👉 基本単位の解析
- 構文解析 👉 構文規則に従っているか解析
- 意味解析 👉 原始プログラムを中間コードに変換
- コード最適化 👉 実行速度を上げるなど、効率の良いコードに改良
- コード生成 👉 中間コードを機械語に変換して目的プログラムを生成