コンパイラ

レジスタ割り当てで「スピル」が起こると、生成されるコードはどうなるか。

  1. A値をスタックに退避・読み戻す命令が増え、遅くなりやすい
  2. Bレジスタの数が自動的に増え、すべての値をレジスタに置けるようになる
  3. C使われない値が削除されて、命令の数が少なくなる
答えと解説を見る

正解:A. 値をスタックに退避・読み戻す命令が増え、遅くなりやすい

スピルは、同時に生きている値がレジスタの数より多いときに、一部の値をメモリ(スタック)に置くことです。その値を使うたびに読み込み命令、書き換えるたびに書き込み命令が必要になり、命令が増えてメモリアクセスの分だけ遅くなりやすくなります。そのためコンパイラは、ループの中などよく使われる値をレジスタに残し、あまり使わない値を選んでスピルさせます。レジスタの数はCPUで決まっていて増えず、不要な値の削除とも別の話です。

  • A. 正しい。退避と読み戻しの命令が増え、遅くなりやすくなります。
  • B. レジスタの数はCPUで決まっていて増えません。
  • C. 不要な値の削除は別の最適化です。
この分野を解く 分野ページへ

コンパイラのほかの問題

  1. コンパイラの命令スケジューリングの主な目的はどれか。
  2. 上の関数の最後の再帰呼び出しに末尾呼び出しの最適化を行うと、どのような効果があるか。
  3. コンパイラとインタプリタの違いとして正しいものはどれか。
  4. JITコンパイルを使う実行環境の特徴として正しいものはどれか。
  5. LLVMの基本的な構成として正しいものはどれか。