イントロ
プログラミングをする上で英語のドキュメントやリソースを読む必要はどうしても発生する.しかし一部の単語はプログラミングの世界において特別な意味を持っており,辞書を引いてもよく意味がわからないこともよくある.ここではそのような単語の中でよく使われるものを紹介する.
variable: 変数 / constant: 定数
そもそも vary は「変化する」という動詞で,可能を表す -able がついて「変化できるもの」という意味になる.そこから数学において variable は「値が変わりうるもの」という意味で使われるが,プログラムにおいては必ずしも「値が変わりうる」ものとは限らず,単に「値を格納するもの」という意味で使われることが多い.逆に constant は「変化しない」という意味であり,値を変えられない variable を constant variable と呼ぶ.JavaScript で変数を宣言するときにつける var
const
はこれらから来ている.
function: 関数
数学の関数 (function) から来ており,値をいくつか与えると何らかの値を1つ返す.多くの言語では,関数ひとつひとつについて引数の個数が決まっており,これを arity と呼ぶ.
parameter: 仮引数 / argument: 実引数
function の定義では引数に名前をつけることにより,変数のように扱うことができる.この変数が parameter である.一方,function が実行されたときに各 parameter に渡された値が argument である.
ちなみに parameter の発音は「パラメーター」より「パラミター」に近い.
call, invoke, apply: 呼び出す
関数を実際に呼び出すことを言う.
static: 静的 / dynamic: 動的
static とは「実行せずとも最初から決まっている」という意味であり,逆に dynamic は「実行中に変わる」「実行してみないと分からない」「実行されるときの状況によって変わる」という意味である.
例えば Java は静的型付け言語と呼ばれるが,それは変数の型が実行せずとも分かる,ということである.逆に JavaScript は動的型付け言語であり,必ずしも実行する前に「この変数はこの型だ」とは断定できない.実際,ある変数の型が実行の途中で Number から String になることは十分にありえる.他には,ウェブサイトの分類の一つとして static website と dynamic website があるが,static website (静的サイト)はアクセスすると事前に作られた HTML ファイルが送られてくるだけだが,dynamic website はリクエストされるたびにサーバーがプログラムで HTML を生成する.
binding: 束縛
変数は「名前」と「値」のペアであるとみなせる.この「名前」と「値」の関連付けを binding と呼ぶ.変数の宣言は binding の作成,変数への代入は binding の変更とみなせる.
environment: 環境
関数呼び出しの文脈で使われる environment (あるいは context) とは,コードのどこかを実行しているときに,その時点でアクセスできる変数や引数といったものを指し,binding の集合とみなすことができる.プログラムで変数を参照するというのは,environment の中から該当する名前をもつ binding を探す行為ととらえることができる(「探す」のがコンパイル時なのか実行時なのかは言語による).
expression: 式 / statement: 文
プログラムにおいては expression とは「評価(evaluate)できるもの」である.評価とは,値を計算することである.また,「代入の右辺に置けるもの」と考えても良い.例えば
(2 + 3) * (8 - 1)
repeat("bla", 100)
のようなものである.
この単語がよく使われるのは文法(syntax)についての文章である.例えば JavaScript の if (condition) statement
の condition
は MDN で
An expression that is considered to be either truthy or falsy.
と書かれている.つまり,expression であればなんでも括弧の中に置けるということである.逆に statement を置くことはできない.
一方 statement とはプログラムにおける実行単位である.statement はどのような処理を行うかを表し,使える statement は言語によって決められている.
例えば Java や C で ;
で区切られた部分一つ一つが statement であり,if () {}
while () {}
for () {}
なども statement である.statement は普通値を返さないので expression ではない.
int x = 0; // statement
// statement
for (int i = 0; i < 10; i++) {
x += i; // statement
}
operator: 演算子 / operand: 被演算子
operator とは +
<
のように,いくつかの値を受け取り(これが operand)何らかの値を返す記号である.特別な syntax を持った function とみなすこともできる.
例えば 1 + x
は 1
と x
が operand,+
が operator である.+
は2つの値を受け取って和を返す function と見ることができる.
多くの言語では function は f(1, 2)
のように自身が前に来て,引数が後に来る.一方,+
のような operator は自身が operand の間に来る.これらを区別するべく,前者は prefix notation (前置記法),後者は **infix notation (中置記法)**と呼ばれる.
syntax: 文法 / semantics: 意味論
プログラミング言語には syntax とそれに対応する semantics が存在する.
syntax はあくまで「どのような形のコードが書けるか」ということしか規定しない.例えば JavaScript では x = if (false) { return 1 }
というコードは書けない.
一方 semantics は,それぞれの syntax を「コンピューターはどう解釈するのか」「実行すると何が起きるのか」というプログラムとしての意味をさす.例えば JavaScript の if statement は下のような形(syntax)をしているが,その semantis は「もし exp
を評価した結果が true ならば statement1
を実行し,false ならば statement2
を実行する」である.
if (exp)
statement1
else
statement2
parse: (syntax を)解析する
プログラムは所詮単なる文字列であり,コンピューターがプログラムを理解するのは単純な話ではない.例えば「ここはif
文でここからここまでがelse
節で...」「3 + 4 * 2
は 4 * 2
を先に計算してから 3 +
するという意味だ」などと解析する必要がある.一般にプログラムは下の図のように木構造をなし,これを abstract syntax tree (抽象構文木) や parse tree と呼ぶ.
(画像はWikipedia より)
プログラミング言語に限らずこのように syntax を解析することを parsing という.例えばプログラム上で HTML を解析したい場合は HTML parser を使用することになるだろう.
identical: 同一の / equal: 等しい
多くの言語では参照型と呼ばれるデータ型がある(C系の言語ではポインターとも呼ばれる).たとえば Python のリストが入った変数は,リストそのものではなく,実際にはリストデータが存在するメモリアドレスを値として持っている.
下の Python コードでは,l1
と l2
は全く同じリストであるが,メモリ上では別々の場所に存在する.見た目と中身が同じだけの別々の存在である.値を比較する ==
では True
が返るが,参照先のアドレスが同じであるかをチェックする is
では False
が返る.==
は値の等しさ equality をチェックするのに対し,is
は存在としての同一性 identity をチェックする,と表現されることが多い.
>>> l1 = [1, 2]
>>> l2 = [1, 2]
>>> l1 == l2 # equality
True
>>> l1 is l2 # identity
False
また,引数をそのまま返す function を identity function と呼ぶことがある.これについてはアドレスがどうとかいう意味ではなく,単に「まったく同じ」値を返すという意味で使われている.
ちなみに「アカウントのID」のように使われる「ID」という言葉は identity もしくは identifier の略である.
mutation: ミューテーション
mutation (mutate の名詞形) とは参照型の変数について,参照先のオブジェクトに変更を加えることを言う.これは re-assignment (再代入)とは本質的に異なることに注意.
例えば JavaScript において以下のように配列は push
メソッドで要素を追加することができる.これは a
という変数が参照している配列に変更を加える mutation である.よって同じ配列を参照している b からも変化が観察できる.一方再代入 a = [3, 4]
を行うと a
が別の配列を参照するようになり,b とは無関係になる.re-assignment は参照の変更であるとみなせる.
let a = [1, 2]
let b = a // b と a は同じ配列を参照する
a.push(3) // (mutation) 3 を配列に加える
console.log(a) // [1, 2, 3] と出力される
console.log(b) // [1, 2, 3] と出力される
a = [3, 4] // (re-assignment)
console.log(a) // [3, 4] と出力される
console.log(b) // [1, 2, 3] と出力される
mutation を行うことがでる変数やオブジェクトを mutable であるといい,逆に mutation ができないものを immutable であるという.例えば JavaScript の object や array はデフォルトで mutable だが string は immutable である.関数型言語では immutable なオブジェクトを主に使う.
optional: あってもなくてもいい
例えば Python(3) の input(str)
関数は引数str
を与えても与えなくてもいい.この意味でstr
は optional parameter であるといえる.
potential: ~かもしれない
この単語は特にプログラミング特有の意味はないが,辞書を引いてもよく意味が分からない単語だと思われる.形容詞の前に置くことで「~かもしれない」という意味になる.例えば空かもしれない配列を potential empty array と言ったりする.