コンパイラ
字句解析・構文解析から、SSA形式の中間表現、定数畳み込みやループ展開などの最適化、レジスタ割り当てまで、コンパイラのしくみを3択問題で学べます。
—あなたの正答率
0 / 50解いた問題
コンパイラの要点
コンパイラは、人が書いたプログラムを、CPUが実行できる機械語に翻訳するソフトウェアです。ソースコードを単語に分ける字句解析、文法にしたがって木構造をつくる構文解析、型や名前の正しさを調べる意味解析を経て、中間表現(IR)に変換します。
中間表現の上では、定数畳み込み、共通部分式の削除、インライン展開、ループ展開、ベクトル化などの最適化を行い、最後にレジスタ割り当てと命令スケジューリングでCPUに合ったコードを生成します。最適化のしくみを知ると、速いプログラムの書き方や、ハードウェアの性能を引き出す方法が分かります。
コンパイラの問題一覧(50問)
- コンパイラの字句解析の役割として正しいものはどれか。
- コンパイラの構文解析で行うこととして正しいものはどれか。
- コンパイラの意味解析で見つかる誤りの例として最も適切なものはどれか。
- 抽象構文木(AST)の特徴として正しいものはどれか。
- コンパイラの内部で、ソース言語にもCPUにも依存しない中間表現(IR)を使う主な利点はどれか。
- 基本ブロックの説明として正しいものはどれか。
- 制御フローグラフで、節と矢印が表しているものの組み合わせとして正しいものはどれか。
- SSA形式の中間表現の特徴として正しいものはどれか。
- 上のコードをSSA形式にすると、if文の後で「x3 = φ(x1, x2)」のような式が入る。このφ関数の働きとして正しいものはどれか。
- コンパイラの定数畳み込みの例として正しいものはどれか。
- 上のコードに定数伝播と定数畳み込みを繰り返し行うと、最終的にどのようなコードになるか。
- 上のコードに共通部分式の削除を行ったときの説明として正しいものはどれか。
- 不要コードの削除(デッドコード除去)で取り除かれるものとして正しいものはどれか。
- 関数のインライン展開の利点と欠点の組み合わせとして正しいものはどれか。
- ループ展開(ループアンローリング)の主な効果として正しいものはどれか。
- 上のループで、ループ不変式の移動(ループの外への移動)の対象になる計算はどれか。(x、yはループ内で変更されないものとする)
- 上のループで、添字の計算 i * 4 に強度低減を行ったときの変換として正しいものはどれか。
- 上のループを、SIMD命令を使ってベクトル化しにくい主な理由はどれか。
- 上の関数で、コンパイラが *b の読み込みをループの外に出す最適化を、そのままでは行えない理由はどれか。
- コンパイラのレジスタ割り当てで、干渉グラフを塗り分ける(彩色する)方法を使うとき、グラフの節と辺が表すものの組み合わせとして正しいものはどれか。
- レジスタ割り当てで「スピル」が起こると、生成されるコードはどうなるか。
- コンパイラの命令スケジューリングの主な目的はどれか。
- 上の関数の最後の再帰呼び出しに末尾呼び出しの最適化を行うと、どのような効果があるか。
- コンパイラとインタプリタの違いとして正しいものはどれか。
- JITコンパイルを使う実行環境の特徴として正しいものはどれか。
- LLVMの基本的な構成として正しいものはどれか。
- コンパイラの最適化のレベルを指定するオプションで、最適化をしない設定(-O0など)がよく使われる場面はどれか。
- プロファイルを使った最適化(PGO)の説明として正しいものはどれか。
- リンク時最適化(LTO)によって可能になる最適化として最も適切なものはどれか。
- C言語で、符号付き整数のオーバーフローは未定義動作である。この前提で、上の関数を最適化するコンパイラが生成しうるコードとして正しいものはどれか。
- プログラムの誤りのうち、コンパイルの時点で見つけることができるものはどれか。
- 静的な型をもつ言語で、コンパイラが型検査を行う主な利点はどれか。
- 字句解析でトークンを見分ける規則を表すのによく使われるものはどれか。
- 多くのプログラミング言語の文法を表すのに使われ、構文解析の基礎になる文法の種類はどれか。
- 式 2 + 3 * 4 の抽象構文木の形として正しいものはどれか。
- 中間表現の一つである三番地コードの特徴として正しいものはどれか。
- レジスタ割り当ての準備として行う生存区間(ライブネス)の解析で求めるものはどれか。
- ある関数の中で、同時に生きている値の数が最も多いところで5個だった。干渉グラフがこの5個以外の制約を生まない単純な場合、すべての値をスピルなしでレジスタに置くには、レジスタが少なくとも何個必要か。
- 繰り返し回数が100回のループを、本体を4回分並べるループ展開で書き換えると、回数の判定と分岐は何回になるか。(100は4で割り切れるものとする)
- C言語のプログラムから実行ファイルができるまでの一般的な流れとして正しいものはどれか。
- 生成した機械語の短い並びを小さな窓で見て、むだな命令の組み合わせをより良い命令に置き換える最適化を何と呼ぶか。
- 上のコードで、sqをインライン展開したあとに続けて効く最適化と、その結果として正しいものはどれか。
- ソフトウェアパイプライン化(ソフトウェアパイプライニング)の説明として正しいものはどれか。
- コンパイラが、浮動小数点数の足し算 (a + b) + c を、厳密な設定のもとでは a + (b + c) に勝手に並べ替えない理由として正しいものはどれか。
- コンパイラの自動ベクトル化で使われる命令の種類として正しいものはどれか。
- コンパイラの最適化が守らなければならない基本的な条件として正しいものはどれか。
- コード生成の段階の一つである命令選択(インストラクションセレクション)の説明として正しいものはどれか。
- クロスコンパイラの説明として正しいものはどれか。
- 最適化をかけてコンパイルしたプログラムをデバッガで調べると、一部の変数の値が「表示できない」となることがある。主な理由はどれか。
- 上の関数に、定数伝播・定数畳み込み・不要コードの削除を十分に行ったとき、関数が返す値と残るコードとして正しいものはどれか。