変数とは、不定の数値である。
プログラミングにおける変数
変数は、メモリ空間上の特定のデータ領域をプログラミング言語上で抽象化したものである。メモリ空間にアクセスする為の橋渡しをする。変数には、任意の値を代入することが可能であり、読み出すことができる。
言語によっては、それぞれの変数に型が定められている。型が定められた変数には、その型を持った値しか代入できない。変数を型によって拘束することで、より堅牢性の高いプログラムを製作することができる、といわれている。
変数という概念を持たないプログラミング言語もあるにはあるが(スタックだけで動く言語とか)実用的なものはあまりない。副作用を持たない純粋関数型言語のようなものであっても、関数定義の束縛変数や関数呼び出しの結果を受ける一時的な変数は存在するし、自分からは変更不能というだけで中の値は呼び出し毎に変わるのが普通である。
一方定数はプログラムの作成時に決まっており、いつどのように参照しても変化しない(といいつつ何事にも例外はあるのだが・・・)
「左辺 = 右辺」は右辺の結果を左辺に代入するという役割がある。
例えば
「5+3=8」という式では、数字は全て定数である。「5+3=x」の場合でも、xは8以外の値を取りようがないので定数である。
では、「5+x=x」という式ではどうなるだろうか?
数学的に考えると「=」の両辺は等価(同じ)でなければならないので「5+xとxが等価になるわけがない」つまり矛盾ということになる。
だがプログラムの世界では先頭から式を評価するため「"5"に"x"を足し、それは新たな"x"と等価である」という考え方になってしまう。ここで前者のxに自在な数値を入力できれば、プログラムは最初のxに5を足した値を新たなxとしてみなすわけである。
この場合でのxはいわば「箱」であり、5+x=xは「箱に5を入れてまた戻す」と例えられる。この場合xにユーザーが数字を入力すると式5+xの出力値も自在に変化するわけで、この場合のxを変数という。
箱vsタグ
ちなみにプログラミング言語における変数には、実は大まかに二種類の考え方がある。
まず昔から入門書などに載っている伝統的な考え方は「変数とは値を入れておける箱のようなものだ」という理解である。実際C言語などのクラシックな言語では、値が実メモリのどこかに置かれている様子を箱で上手く説明することができ、感覚的にも分かりやすい。
もう一つの考え方は「変数とは値にタグを付けるようなものである」という理解である。この場合とにかくどこかに値があって、これにfooとかbarとか書かれたタグが付けられており、その名前で値にアクセスができるということになる。
一見すると両者に大した違いはなさそうだが、例えば次のJavaコードを見てほしい。
import java.util.ArrayList;
class alias {
public static void main(String args[]) {
ArrayList<String> list = new ArrayList<>();
ArrayList<String> other = list; // 別の変数に代入
other.add(“item”); // 要素を追加
for(String s: list) {
System.out.println(s);
}
}
}
実行結果:
% java alias
item
もし変数が箱だとすると、otherとlistは別々の箱なのだからそれぞれに入っているデータは別のものになるはずである。しかし実際にはotherに要素を追加してlistの中身を表示すると、listの方も中身は増えている。
つまりデータが同時に2つの箱に入っているということになってしまうのである。
もちろん「Javaの変数は(基本的に)参照型なので、箱には参照を入れることができるのだ」という説明もできないことはないのだが、であれば実体は結局箱に入っていないわけだから箱モデルにこだわるのは意味がなく、最初からタグ付けされていると説明したほうが自然である。
些細な違いではあるのだが、変数とは何なのかという比喩が意外と微妙な問題をはらんでいることをお分かりいただけただろうか。
数学における変数
単純に、未知もしくは不定である数や事象、または単なる代入されていない値をそれらに代わって表す記号である。
いわば「未確認飛行物体」という鳥か飛行機かスーパーマンかわからないような存在をUFOというようなものである。
変数には、ローマ字のアルファベットや、ギリシャ文字が主に用いられる。方程式の x, y, z や、指数関数のα,βなどが典型例。
日本語の文字を変数の記号として用いようとする運動もある。
関連項目
- 5
- 0pt