情報学基礎 / 第 11 回

プログラミング言語(2)

言語処理系、オブジェクト指向、関数型・論理型

この回のねらい

プログラムの実行と言語処理系

プログラムは、コンピュータ上で言語処理系(language processor)によって 構造を解析され、実行されます。

機械語のプログラムが命令を 1 列に並べただけなのに対して、 プログラミング言語で記述したプログラムは、入れ子に配置された構成になっています。 この構造を取り出すのが、次の 2 段階です。

段階やること
字句解析(lexical analysis) プログラムを単語にあたる字句の並びに切り分ける
構文解析(syntax analysis, parsing) 字句の並びを言語の構文のパターンと照らし合わせ、プログラムの構造を抽出する

いったんこの階層構造が抽出できると、左から下を優先に順番にたどることで、 構文要素に対応する処理を行うことができます。

字句解析と構文解析をやってみる入力できます

言語処理系の種類

インタプリタ

各構文要素に対して、対応する処理をその場で実行する言語処理系を インタプリタ(interpreter)といいます。 ソースコードに含まれる構文を解析しながら、各構文が意味している振る舞いを解釈して実行します。 JavaScript はインタプリタです。

コンパイラ

各構文要素に対して機械語の命令を生成していき、実行可能コードを作ります。 ソースコード全体を実行可能コードに変換する言語処理系をコンパイラ(compiler)といいます。 コンピュータが直接実行できるので高速で、 一度コンパイルすれば実行可能コードだけで実行できます。

仮想機械(Virtual Machine)

インタプリタによる実行とコンパイラによる実行を組み合わせた方法です。 ソースコードをバイトコードという中間コードにコンパイルします (これを行うのがバイトコードコンパイラ)。

バイトコードはソースコードより機械語に近いので解析のコストが低く、比較的効率的に実行できます。 そして生成されたバイトコードは、インタプリタの一種である仮想機械で実行できるので、 ハードウェアや OS の違いにかかわらず実行することができます。

3 つの実行方式を見比べる動かせます

オブジェクト指向プログラミング

プログラミングや理解のしやすさを保つ 1 つの方法は、プログラムをいくつかの単位に分割することです。 何を単位に分割するかは、いろいろな見方(aspect)が提案されています。 JavaScript では、分割単位は関数です。

第 10 回の std2(shincho, taijyu) は、呼び出すたびに引数を指定しなければならず煩雑でした。 そこで、身長と体重を外の変数に覚えておいて引数なしで呼べる std3() にすると楽になります。 ── この発想を一般化したのが、 変数と、関連する関数を 1 つの単位として分割する方法、すなわち 抽象データ型(abstract data type)です。

オブジェクト指向プログラミングは、抽象データ型の実現方法のひとつです。 それを容易にした言語をオブジェクト指向言語といいます。JavaScript もそのひとつです。

用語意味
クラス(class)class <クラス名> { <クラスの本体> }。設計図にあたる
インスタンス変数クラスの中の変数。プロパティともいう
メソッド(method)クラスの中の関数
コンストラクタメソッドのうち 1 つだけ。インスタンスを生成するthis.<変数名> で参照する
オブジェクトの生成new <クラス名>(引数)
Person クラスを動かす動かせます

  
上のボタンを、左から順に押してみてください。

定義する側と使う側。 Person を使う側は、Person の詳細を知る必要がありません。メソッドの呼出し方さえ分かれば使えます。 Person を定義する側は、メソッドの使われ方と意味を変えなければ、 使う側に影響を及ぼさずにプログラムを変更できます。 だからオブジェクト指向プログラミングは、プログラムのメンテナンスや管理を容易にするのです。

いろいろなプログラミング言語

JavaScript は、コンピュータ上で実行可能コードを実行するのによく似た実行モデルに基づいています。 このような言語を手続き型言語、または命令型言語といいます。 これに対して、次の 2 つの考え方があります。

関数型言語

手続き型言語関数型言語
「実行の流れ」と「変数内の値」を考慮しながらプログラムを作成する 小さい関数を合成して大きな関数を作成する

関数型言語の特徴は次の 3 つです。

  1. 関数の中に入れ子に関数を定義できる
  2. 関数を引数として受け取ったり、結果として返したりできる
  3. 定数、演算子のオペランドと結果、関数の引数と結果が、一貫性をもって組み合わさっているか検証する (この一貫性の検査を型推論という)
OCaml を読むクリック
上のボタンを、左から順に押してください。# がプロンプト、;; を入力すると実行されます。

論理型言語

論理型言語は、事実(fact)規則(rule)からなる 節(clause)の集まりです。質問に対する真偽を証明することが、そのまま実行になります。 代表が Prolog です。

事実の書き方
<述語> ( <引数>, <引数>, …, <引数> ) .

male(katsuo).     カツオは男性である

小文字から始まる名前 → オブジェクト(object)
大文字から始まる名前 → 変数(variable)

規則の書き方
<頭部> :- <本体部> .
son(X, Y) :- parents(Y, X), male(X).
Y が X の親であり、かつ X が男性ならば、X は Y の息子である
本体部は goal1, goal2, …, goaln のようにカンマで区切る(=「かつ」)
同じ頭部の規則を複数並べると「または」になる
Prolog を動かす ── サザエさんの人間関係本物の推論です

  
?-
質問を入力すると、事実と規則から証明できるかどうかを探します。 変数(大文字で始まる名前)を含む質問には、当てはまる値をすべて返します。
← 第10回 プログラミング言語(1) 第12回 情報セキュリティと暗号化 →