Back to top

Crystalコンパイラ テスト問題集

この問題集は JA.md の学習内容を確認するためのものです。

問題編

1. 全体アーキテクチャ

  1. Crystalコンパイルの三層(フロントエンド、ミドルエンド、バックエンド)を、それぞれ主な処理内容とともに説明せよ。
  2. require "prelude" はどのタイミングでどう扱われるか。compiler.cr の流れに沿って述べよ。
  3. --progress フラグを有効にしたとき、どんな情報が得られ、どのような場面で有用か。必要なら --stats との違いにも触れよ。

2. ディレクトリ構造

  1. 次のファイルの責務をそれぞれ1文で答えよ。
  1. syntax/ と semantic/ の役割の違いを、入力と出力の観点で説明せよ。

3. ASTノード体系

  1. ASTNode が持つ location / end_location は何のために使われるか。
  2. 意味解析後の ASTNode に追加される「型依存の仕組み」(例: dependencies/observers)が必要な理由を述べよ。
  3. Visitor と Transformer の違いを、戻り値と用途の観点で比較せよ。

4. 型ヒエラルキー

  1. Crystalの型システムにおける Type 中心の設計が、コンパイラのどの処理で重要になるかを2つ挙げよ。
  2. Union型が必要になる典型的なコードパターンを1つ示し、なぜUnionになるかを説明せよ。

5. Crystal::Program

  1. Crystal::Program を「コンパイル中央データベース」と呼ぶ理由を説明せよ。
  2. Program が管理する情報を3つ挙げ、それぞれの利用箇所を簡潔に述べよ。

6. 字句解析・構文解析

  1. 字句解析(Lexer)と構文解析(Parser)の境界はどこか。トークン列との関係を含めて答えよ。
  2. 再帰下降パーサがCrystalの文法に対して持つ利点を1つ、注意点を1つ挙げよ。

7. requireシステム

  1. require の解決で crystal_path.cr が担う責務を説明せよ。
  2. 同一ファイルの重複読み込みを防ぐ仕組みがないと、どのような問題が起きうるか。

8. 意味解析パス

  1. トップレベル収集パス(宣言処理)が、メイン型推論パスより先に必要な理由を述べよ。
  2. abstract def チェックは、どのような不整合を検出するか。
  3. cleanup_transformer は何を取り除くか。具体例を挙げて説明せよ。

9. 型推論システム

  1. Call#recalculate が型推論の核心と言える理由を述べよ。
  2. オーバーロード解決が失敗する代表的ケースを1つ作り、何が曖昧かを説明せよ。
  3. is_a? / nil? によるフロー依存の型絞り込みを、分岐コード例つきで説明せよ。

10. マクロシステム

  1. マクロ展開が「単なる文字列置換」ではない理由を、ASTレベル処理の観点で述べよ。
  2. MacroInterpreter が必要な理由を、実行時コードとの違いに触れて説明せよ。
  3. マクロがコンパイル時間や可読性に与えるトレードオフを挙げよ。

11. LLVMコード生成

  1. llvm_typer の責務を、Crystal型とLLVM型の橋渡しとして説明せよ。
  2. Union型のコード生成でタグ情報が必要な理由を述べよ。
  3. 例外処理(rescue/ensure)をLLVMで扱う際に難しい点を1つ挙げよ。

12. コントリビュート

  1. 小さな改善PRを出すときの推奨手順を、調査・実装・検証・説明の流れで書け。