プログラムは、コンピュータ上で言語処理系(language processor)によって 構造を解析され、実行されます。
機械語のプログラムが命令を 1 列に並べただけなのに対して、 プログラミング言語で記述したプログラムは、入れ子に配置された構成になっています。 この構造を取り出すのが、次の 2 段階です。
| 段階 | やること |
|---|---|
| 字句解析(lexical analysis) | プログラムを単語にあたる字句の並びに切り分ける |
| 構文解析(syntax analysis, parsing) | 字句の並びを言語の構文のパターンと照らし合わせ、プログラムの構造を抽出する |
いったんこの階層構造が抽出できると、左から下を優先に順番にたどることで、 構文要素に対応する処理を行うことができます。
各構文要素に対して、対応する処理をその場で実行する言語処理系を インタプリタ(interpreter)といいます。 ソースコードに含まれる構文を解析しながら、各構文が意味している振る舞いを解釈して実行します。 JavaScript はインタプリタです。
各構文要素に対して機械語の命令を生成していき、実行可能コードを作ります。 ソースコード全体を実行可能コードに変換する言語処理系をコンパイラ(compiler)といいます。 コンピュータが直接実行できるので高速で、 一度コンパイルすれば実行可能コードだけで実行できます。
インタプリタによる実行とコンパイラによる実行を組み合わせた方法です。 ソースコードをバイトコードという中間コードにコンパイルします (これを行うのがバイトコードコンパイラ)。
バイトコードはソースコードより機械語に近いので解析のコストが低く、比較的効率的に実行できます。 そして生成されたバイトコードは、インタプリタの一種である仮想機械で実行できるので、 ハードウェアや OS の違いにかかわらず実行することができます。
プログラミングや理解のしやすさを保つ 1 つの方法は、プログラムをいくつかの単位に分割することです。 何を単位に分割するかは、いろいろな見方(aspect)が提案されています。 JavaScript では、分割単位は関数です。
第 10 回の std2(shincho, taijyu) は、呼び出すたびに引数を指定しなければならず煩雑でした。
そこで、身長と体重を外の変数に覚えておいて引数なしで呼べる std3() にすると楽になります。
── この発想を一般化したのが、
変数と、関連する関数を 1 つの単位として分割する方法、すなわち
抽象データ型(abstract data type)です。
オブジェクト指向プログラミングは、抽象データ型の実現方法のひとつです。 それを容易にした言語をオブジェクト指向言語といいます。JavaScript もそのひとつです。
| 用語 | 意味 |
|---|---|
| クラス(class) | class <クラス名> { <クラスの本体> }。設計図にあたる |
| インスタンス変数 | クラスの中の変数。プロパティともいう |
| メソッド(method) | クラスの中の関数 |
| コンストラクタ | メソッドのうち 1 つだけ。インスタンスを生成する。this.<変数名> で参照する |
| オブジェクトの生成 | new <クラス名>(引数) |
定義する側と使う側。 Person を使う側は、Person の詳細を知る必要がありません。メソッドの呼出し方さえ分かれば使えます。 Person を定義する側は、メソッドの使われ方と意味を変えなければ、 使う側に影響を及ぼさずにプログラムを変更できます。 だからオブジェクト指向プログラミングは、プログラムのメンテナンスや管理を容易にするのです。
JavaScript は、コンピュータ上で実行可能コードを実行するのによく似た実行モデルに基づいています。 このような言語を手続き型言語、または命令型言語といいます。 これに対して、次の 2 つの考え方があります。
| 手続き型言語 | 関数型言語 |
|---|---|
| 「実行の流れ」と「変数内の値」を考慮しながらプログラムを作成する | 小さい関数を合成して大きな関数を作成する |
関数型言語の特徴は次の 3 つです。
# がプロンプト、;; を入力すると実行されます。論理型言語は、事実(fact)と規則(rule)からなる 節(clause)の集まりです。質問に対する真偽を証明することが、そのまま実行になります。 代表が Prolog です。
事実の書き方 <述語> ( <引数>, <引数>, …, <引数> ) . male(katsuo). カツオは男性である 小文字から始まる名前 → オブジェクト(object) 大文字から始まる名前 → 変数(variable) 規則の書き方 <頭部> :- <本体部> . son(X, Y) :- parents(Y, X), male(X). Y が X の親であり、かつ X が男性ならば、X は Y の息子である 本体部は goal1, goal2, …, goaln のようにカンマで区切る(=「かつ」) 同じ頭部の規則を複数並べると「または」になる