プログラミングの話という前提で書かせて貰います。
まず、「変数に値を保存する」処理は、基本的には「メモリに値を書き込む」処理と同様です。
ただし、処理系(コンパイラなど)の最適化の際に、メモリを使わない様に変換する可能性はあります。
例えば、C言語で次の様なループを書いたとします。
int sum = 0;
for( size_t i = 0; i < 100; i++ ) sum += i;
この時、変数i,sumはメモリではなくレジスタ(CPU内部のデータ格納領域)を使用する事も有ります。
これは、コンパイラが「いちいちメモリを読み書きするより、レジスタ上に置いた方が高速だ」と判断した場合です。
まとめると、「基本的にはメモリに書き込む」ただし「最適化でレジスタを使う場合もある」という事です。
プログラミングの話という前提で書かせて貰います。
まず、「変数に値を保存する」処理は、基本的には「メモリに値を書き込む」処理と同様です。
ただし、処理系(コンパイラなど)の最適化の際に、メモリを使わない様に変換する可能性はあります。
例えば、C言語で次の様なループを書いたとします。
int sum = 0;
for( size_t i = 0; i < 100; i++ ) sum += i;
この時、変数i,sumはメモリではなくレジスタ(CPU内部のデータ格納領域)を使用する事も有ります。
これは、コンパイラが「いちいちメモリを読み書きするより、レジスタ上に置いた方が高速だ」と判断した場合です。
まとめると、「基本的にはメモリに書き込む」ただし「最適化でレジスタを使う場合もある」という事です。
インタプリタも、今どきは中間コードへの実行時(JIT)コンパイルをするのが多いので、最適化もあります。
たしかに、変数が実体を持つならレジスタだけで収まる可能性は低いとは思いますが、
ループ展開とか、変数の共通化や定数化などで実体自体がなくなる可能性があります。
しかし、コンパイルも実行時であるとするなら、ループ展開のためのループ変数や、中間コードへ書き込む値という形でメモリ領域を使っているともいえるかもしれませんし、変数が出た段階で名前テーブルとしてメモリを使ってるともいえるかもしれません。
さらに、コンパイラ型ではコンパイル時のこういったことを考慮しないのか、とか、中間コードをキャッシュする場合はどうなんだとか、そんな話もあり得るので、結論としては
「あいまいなものなのでなんとも言えない」
とかいう話になるのでは?
コンパイルとインタープリタのちがいが、いまいち良くわかっていないようです、オレ。
まず、そのへんの理解をふかめることが必要かと。みなさま、ご意見、ありがとうございまーす!
インタプリタも、今どきは中間コードへの実行時(JIT)コンパイルをするのが多いので、最適化もあります。
2016/12/07 12:43:29たしかに、変数が実体を持つならレジスタだけで収まる可能性は低いとは思いますが、
ループ展開とか、変数の共通化や定数化などで実体自体がなくなる可能性があります。
しかし、コンパイルも実行時であるとするなら、ループ展開のためのループ変数や、中間コードへ書き込む値という形でメモリ領域を使っているともいえるかもしれませんし、変数が出た段階で名前テーブルとしてメモリを使ってるともいえるかもしれません。
さらに、コンパイラ型ではコンパイル時のこういったことを考慮しないのか、とか、中間コードをキャッシュする場合はどうなんだとか、そんな話もあり得るので、結論としては
「あいまいなものなのでなんとも言えない」
とかいう話になるのでは?
コンパイルとインタープリタのちがいが、いまいち良くわかっていないようです、オレ。
2016/12/08 11:46:30まず、そのへんの理解をふかめることが必要かと。みなさま、ご意見、ありがとうございまーす!