プログラミングにおける「値」とは
プログラミングにおける「値」とは、式を評価した結果として得られるものです。式は
データ型を持ち、評価の結果は内部的には
ビット列として表現されます。しかし、同じ
ビット列であっても、
データ型が異なれば、異なる意味を持つ値として解釈されることがあります。例えば、ある
ビット列は
整数、
浮動小数点数、
文字列など、様々な
データ型として解釈可能です。
多くの
プログラミング言語で共通してサポートされている値の型としては、数値表現などが挙げられます。一方で、
Pascalの集合型のように、あまり一般的ではない型も存在します。
左辺値と右辺値
C言語などの一部の言語では、左辺値(l-value)と右辺値(r-value)という概念があります。左辺値は、メモリ上のアドレスと結びついたもので、変数やデリファレンスされた参照などが該当します。右辺値は、左辺値である場合も、そうでない場合もあります。
C言語において、左辺値は代入演算子(=)の左側に置けるもの、つまり代入可能なものを指すのが基本です。しかし、配列型の変数のように、アドレスは持つものの代入できない左辺値も存在します。標準化の過程でconst修飾子が追加され、「変更可能な左辺値」と「変更不可能な左辺値」という概念が生まれました。
左辺値はオブジェクトを指し示す式であり、変更不可能な左辺値はアドレスを持つものの、代入はできません。一方、変更可能な左辺値は、指し示すオブジェクトの値を変更できます。右辺値は、式を評価した結果得られる値を意味します。
アセンブリ言語(または
機械語)のレベルでは、多くのアーキテクチャにおいて、値は単なる
ビット列として扱われます。そのため、どの
データ型として解釈するかは原則として自由です。ただし、タグ
ビットなどを用いて、機械レベルで型を区別するアーキテクチャも存在します。
アセンブリ言語では、値を扱う方法として主に2つがあります。1つは、メモリの特定のアドレスに値を直接配置する方法です。多くのアセンブラには、このための疑似命令が用意されています。もう1つは、イミディエイト(即値)を使用する方法です。これは、
機械語の命令列の中に、命令に続いて直接値を埋め込むもので、命令セットによっては値の範囲が制限される場合があります。この制限は、命令セット自体というよりも、命令を
ビット列にエンコードする際の命令フォーマットによって生じます。
関連事項
Value object (値オブジェクト):値そのものを表現するオブジェクト。同一性ではなく、値の内容によって区別されます。
イミュータブル:作成後に状態を変更できないオブジェクト。値オブジェクトは、通常イミュータブルに設計されます。
外部リンク
Value Object
Transfer Object Pattern