Entry

そういえば即値とリテラルのこと

2010年11月19日

こちらのつぶやきに出会って,あー……そうだなぁ,と。

高級言語におけるリテラルのことを即値って言うの,誤用だと思っていたんだけど,黙過された結果今では認められつつあるんだろうか.けっこう権威のありそうなドキュメントでも使われていたりする…….

Twitter / Shutaro Takimoto: 高級言語におけるリテラルのことを即値って言うの,誤用 ...

即値は英語で immediate,リテラルはそのまま literal。意味の違いは微妙なんだけれども,あたしの認識では,前者がアセンブリ用語にいわゆる定数値のことで後者がCを含む高級言語の定数値として使っている感じがしています。もう少し厳密に表現すると,即値というのはレジスタやメモリ(データセグメントやスタックセグメント)の番地で指定した値ではなくて,プログラム(コードセグメント)に書き込んだ値のこと。

例えば,アセンブリで,

mov ebx, esp

と書くと,レジスタ ESP の値を EBP にコピーしますよということになるわけで,これはレジスタの値をコピーしていることになります。だから,esp は即値ではない。一方,

mov ebx, 0x10

は,コードセグメントに置かれている値 0x10 をレジスタ EBX にコピーしているので,0x10 は即値ということになります。CPU 命令の中には,コードセグメントの値を直接取れる命令があって,厳密に言うと,この命令が取る値で即値とされているものだけが即値なんだと思います。多分。

もっとも,C/C++ は高級言語なんですけれど,微妙なところで,

int a = 0x20;

と書く場合,0x20 はコードセグメントに置かれるのが普通です。翻訳すると,上記の mov とそっくりなコードが生成されるはず。んなもんで,あたしゃ普段,C/C++ の定数値のことも即値と言っていたりします。ただ,

char* a = "hello";

の場合,"hello" という「文字列」は即値ではありません。あくまでもリテラル。即値と考えられるのは,「"hello" という文字列が置かれているメモリ上のアドレス値」です。アドレス値は処理系によって値が変わるけれども,コンパイル後に値が決定されて動かなくなるし,それは(普通)コードセグメント上の値として与えられるので,こう解釈して問題はないはず。

他方,もっと高級な LL やら Java やら C# やらに出てくる定数値はというと,定数値といっても処理系(ランタイムや VM)上の値で,取り決め上動かさないことになっているだけだから,即値とは普通言わない気がします。定数値やコードがヒープに置かれることもあるわけで,そうだとすると,さすがに即値とは言えません。

ま,開発の側面からすると,意味が通じればどっちでもいいんですけどね。冒頭のつぶやきと同じく,あたしもちとひかかってたので書いてみただけ。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN