変数 (プログラミング)
読み:へんすう
外語:variable

 プログラミングにおいて、値を一時的または恒久的に格納するための場所として使われるもの。
目次

概要
 数学の変数のように、値が随時変わることからこのように命名されたと思われるが定かではない。また、一度名前を付けて定義されたら以降変化しないものは、これも数学と同様に定数という。
 低級言語(機械語アセンブリ言語に近い言語)の場合は、CPUの機能に依存するためCPUが持つレジスターに値を格納する。従ってレジスターが変数であるとも言えるが、一般にはレジスターを変数とは言わない。
 高級言語でも逐次値を保持する領域が必要なため、そのための領域として変数は機能として用意される。CPUのレジスターが原則数値しか格納できないのに対し、高級言語の場合は使いやすさ、プログラミングしやすさなどを考慮して、様々なものが格納可能な設計になっている。

特徴

変数の型

型付け
 プログラミング言語によって仕様は様々で、「整数、実数、文字列、その他各種で、その種類ごとに扱える型が別れている」プログラミング言語と、「型の概念はなく、変数にはその言語で扱える何でも格納できる」プログラミング言語とがある。
 プログラミング言語に型がないとは言っても、整数と文字列では全く異なる以上、型の概念は内部的にはいずれにせよ存在していて、それをプログラマーに見えるようにしているか意識させないようにしているかの違いでしかない。
 そして前者はプログラムを書くプログラマーが型を手動指定することになるため静的型付け言語と呼ばれ、後者はコンパイラーが実行中に型を選べるようなコードを出力し実行中に随時動的に型を決定するため動的型付け言語と呼ばれる。

型付け
 動的型付け言語は型の概念が要らないため楽だとされ古いスクリプト言語を中心に流行した。その代表がJavaScriptPerlと言ったものである。以降それまで静的型付け言語だった言語が浮気してVisual Basicが何でも格納できるvariant型を導入するなどの影響が見られたが、しかし動的型付け言語は最適化に限界があり言語仕様が高速化の妨げとなるほか、意図せぬバグを量産させ、実用的とは言い難いものだっった。
 一方、静的型付け言語は今も広く使われているC/C++Javaなどその派生プログラミング言語で広く見られるが、変数の型が自明でも逐一指定する必要があり、延いては文字のタイプ数が増え、増えた分だけタイプミスによるバグ混入やビルドエラーなどを発生させ煩わしいという問題を持ち続けていた。
 そこで、両者の良いとこ取りをする概念が新に誕生した。それが「型推論」である。

型推論
 型推論の登場以降、実用的ではない動的型付けは一気に廃れ、世の中の流れは動的型付けから静的型付け+型推論へと移行した。今さら仕様を変えられないJavaScriptは動的型付けのままだが、これが今後どうなるのかは定かではない。
 静的型付けの言語も、Javaなどは変わらず現役だが、C++は予約語autoを型推論に使うという仕様変更を導入して静的型付け+型推論へと変化するなど、大きな影響をもたらした。

変数の宣言と定義

定義
 プログラミング言語にもよるが、変数は原則として使用前に宣言もしくは定義をする。
 定義はその変数の名前と型を書くものである。C/C++であれば、次のようになる。
 int hoge;
 int hoge = 0;
 これによってint型の変数hogeが定義された。二つ目は定義と同時に値の代入も実施している。ただこの書式は従来からの静的型付け言語によく見られる方法で、現在流行している静的型付け+型推論の場合、型は省略できる(こともある)。そこで、Kotlinの場合は次のように書かれる。
 var hoge = 0
 var hoge: Int = 0
 varは変数の定義を意味する予約語である。型は書いてもエラーではないが、多くの型推論言語では変数名の後に :形名 として付記する形を取っている。上記の場合は書かなくても整数値0がIntであるため、自動的にInt型であるとして定義される。これが「型推論」というものである。
 C++でもC++11以降は型推論が導入され、次のように型を明記する必要がなくなった。
 int hoge = 0;
 auto fuga = hoge;
 上記の場合、変数fugaはhogeの型と同じint型になる。

宣言
 変数の宣言は、既に定義された変数を使えるようにする作業である。
 C/C++はグローバル変数(大域変数)が使えるが、別のソースファイルで定義(多くの場合はヘッダーファイルにて実施する)されている場合は、使うソースファイル中で宣言をする必要がある。
 extern int global_var;
 こうすることで、大域変数として定義されているint型変数global_varが、このソースファイル内でも利用可能になる。

種類
 プログラミングにおいては、変数はプログラミングのしやすさ等に鑑み、様々なものが用意されている。
 これは、プログラミング言語によって大きく仕様が違い、そのプログラミング言語を特徴づけるものともなる。

再検索