xrea-banner xreaad

代入

namespace kilrey; / プログラミング全般 / 基礎概念 / 代入

前のページ(変数)へ / 次のページ(文脈)へ

変数の扱いについては二つの大きい流派があります。 破壊的代入と単一代入です。 破壊的代入とは C 言語や Java などの手続き型言語のように 変数に何度でも値を代入出来ることを指します。 単一代入とは C 言語の const や Java の final 、 Haskell や OCaml などの純粋関数型言語のように 変数を最初に初期化した後は値を変更出来ないことを指します。 以下では両者の利点と欠点について書きます。

破壊的代入での変数は本質的にメモリ領域へのラベルです。 あくまでもメモリ領域ですから読み出しも書き出しも出来たり、 言語によっては変数へのポインタを通して変更することさえ出来たり、 操作の自由度が高いという利点があります。 現在使われている CPU の実行モデルとの親和性が高いため 実行速度も速くなることが多いことも利点です。 しかし、操作の自由度が高いということは同時に 他の部分での操作に依存する面が大きいということが言えます。 例えば変数の値を勝手に変更されたら困りますよね。

単一代入での変数は本質的に初期値への別名です。 実装としては読み出ししかしないメモリ領域へのラベルだったり コンパイル時に完全な定数へ変換していたりしますが、 どちらにせよ二度と変更できないので同じことです。 二度と変更できなければ最適化も容易ですし 論理的な展開も理解しやすいという利点があります。 しかし、自由度は低いですし実行速度にも劣ります。 ちなみに単一代入でも同じ識別子を繰り返し使える言語がありますが、 この場合は識別子が同じだけで別の変数として扱われています。

単一代入での変数はちょうど数学における変数の扱いと似ています。 というより、純粋関数型言語自体が数学のλ計算というものを元に 記述力と実用性を高めたものという位置付けなのですが。 逆に破壊的代入での変数は数学における変数とは全く似ていません。 こちらは前述のチューリング機械を元に 記述力と実用性を高めたものという位置付けです。 λ計算やチューリング機械といった計算理論は過去に幾つも提案されていたのですが、 数学者たちがそれらの理論を研究した結果、 どの理論も等価、つまり相互変換可能、ということが証明されました。 ちなみにそれらの計算理論に基づいた関数をまとめて 計算可能関数と呼ぶ慣わしになっています。 (Wikipedia - チャーチ=チューリングのテーゼ)

前のページ(変数)へ / 次のページ(文脈)へ