「タグ」で検索してでてきた値札の写真が気に入ったのでアイキャッチ画像に設定しています。
識別についてぼそぼそと書いていきます。
プログラミングで重要なことはものを「識別」することです。
ひとがものを識別する際には名前、色、形、などを使います、プログラミングでは変数、ブロック、名前空間などを使いものを識別します。
名前
double Pi = 3.14 int n = 123 function f(x) = x^2
名前をつけることは多々あります。単純に一時的な識別のために a, b, c…のように名前をつけるのか、特別な定数に名前をつけるのか、もしくは概念的なものに名前をつけるのか・・・。場合によってつける名前は変わってきます。
つけた名前は識別子やシンボルとも呼ばれます。
例えば実世界でものに名前をつける行為はプログラムではオブジェクトに名前をつける行為に相当します。
名前をつける行為そのものは単純ですが、名前には大きな役割があるため気をつけて名前をつけなければなりません。
[追記]2016-09-07
自由変数と変数束縛
オブジェクト(もしくは値)に名前をつける際は名前に紐付けられた値を可変にするか不変にするのか決めておきます。名前に紐付けられた値ではなく、値に紐付ける名前を可変にするか不変か決めることもあります。
一般に命令指向、手続き型などの言語では変数といった場合それは可変です。この可変な変数は値を書き換えることができ動的です、これを”自由変数”と言います。
一方で(主に関数型言語では)不変な変数は”束縛変数”と言われ一度変数に値を束縛(ひも付け)すると書き換えることはできません。自由変数と比べ束縛を用いると数学的な変数をあわらすことができます。ここで数学的な変数というのは式全体で等しい変数のことです。
具体的な例
自由変数
自由変数xをx=2と定義します。この時x=x+1という式を評価すると最終的に変数xには3が代入されます。自由変数は再利用が可能な変数と捉えられます。残念ながら元の値は上書きされてしまうため知る余地はありません。
束縛変数
束縛変数Xに対し2を束縛します。束縛とは値に名前をつける行為(もしくはその逆)のことです。束縛変数からは値を取り出すことはできますが束縛変数は不変ですので後からX=1やX=3.14と値を代入することは許されません。勿論X=X+1とすることもできません。
意味
自由変数は自然現象を表すのに役立ちます。なぜなら多くの自然現象はそれ自体が変化するからです。柿の種からいきなり柿かできるわけではありませんよね、種から芽が生え、芽から木になり、木に柿がなります。この様に自然のモデルはモデル自体が変化するのです。
束縛変数は厳格なシステムの構築に役立ちます。一度値を変数に束縛するとその変数は永久に同じ値を指します、このためエラーの原因が把握しやすくなります。また束縛変数はどんなに参照されたとしても同じ値を指すことが保証されているため並行処理と非常に相性が良いです。
命名規則
[命名規則の例] キャメルケース ... YamadaTaro, yamadaTaro スネークケース ... yamada_taro ハンガリアンケース ... nameYamadaTaro
命名規則とは名前をつける際のルールのことです。名前による識別を助けるために命名規則が導入されます。
例えばC言語の場合は、定数はすべて大文字の名前をつけるのが一般的です。
命名規則を導入しつけられた名前からは、名前がつけられたものが大まかにどのようなものか推測することができます。
空間/ブロック
name { name { name } } { name } ...
プログラミングではブロック(空間)を用いて同じ名前も別々の空間に分けることができます。ブロックを用いた識別では空間は色のようなものです、名前という記号に対して色を塗り分けることで識別できるようにしています。
また RAII プログラミングという技法でも用いられます。
健全性
#define ADD(x) x + 1 int main(void) { printf("%d", ADD(1) * 3 ); return 0; }
C言語の機能にマクロがあります。マクロは単純な置き換えを行います。しかしながら、あまりに単純な置き換えのため思った通りに動作しない場合もあります。
C言語ではマクロの呼び出し元とマクロ本体の空間は、展開後同じ空間に属することになります。これは健全なマクロシステムとは言えません。
このような問題を解決するために健全なシステムを用いることがあります。健全なマクロシステムではそれぞれ別の空間が割り当てられるため、上記のような問題は発生しませんん。