コンパイラ

レジスタ割り当ての準備として行う生存区間(ライブネス)の解析で求めるものはどれか。

  1. Aプログラム全体で、各変数が宣言された行の番号
  2. B変数の値の最大値と最小値
  3. C各時点で、その値があとでまだ使われる可能性があるかどうか
答えと解説を見る

正解:C. 各時点で、その値があとでまだ使われる可能性があるかどうか

生存区間の解析では、プログラムの各時点で、ある値がこの先で読まれる可能性がある(生きている)かを、制御フローグラフをたどって求めます。生きている値はレジスタに保持しておく必要がありますが、もう使われない値のレジスタは別の値に使い回せます。同時に生きている値どうしは同じレジスタに入れられないので、この結果から干渉グラフを作ります。宣言の位置や値の範囲を求める解析ではありません。

  • A. 宣言の位置ではなく、使われる可能性を調べます。
  • B. 値の範囲を求める解析とは別のものです。
  • C. 正しい。各時点で値がまだ使われるかを求めます。
この分野を解く 分野ページへ

コンパイラのほかの問題

  1. ある関数の中で、同時に生きている値の数が最も多いところで5個だった。干渉グラフがこの5個以外の制約を生まない単純な場合、すべての値をスピルなしでレジスタに置くには、レジスタが少なくとも何個必要か。
  2. 繰り返し回数が100回のループを、本体を4回分並べるループ展開で書き換えると、回数の判定と分岐は何回になるか。(100は4で割り切れるものとする)
  3. C言語のプログラムから実行ファイルができるまでの一般的な流れとして正しいものはどれか。
  4. 生成した機械語の短い並びを小さな窓で見て、むだな命令の組み合わせをより良い命令に置き換える最適化を何と呼ぶか。
  5. 上のコードで、sqをインライン展開したあとに続けて効く最適化と、その結果として正しいものはどれか。