Crystalコンパイラ テスト問題集
この問題集は JA.md の学習内容を確認するためのものです。
問題編
1. 全体アーキテクチャ
- Crystalコンパイルの三層(フロントエンド、ミドルエンド、バックエンド)を、それぞれ主な処理内容とともに説明せよ。
require "prelude"はどのタイミングでどう扱われるか。compiler.crの流れに沿って述べよ。--progressフラグを有効にしたとき、どんな情報が得られ、どのような場面で有用か。必要なら--statsとの違いにも触れよ。
2. ディレクトリ構造
- 次のファイルの責務をそれぞれ1文で答えよ。
program.crsemantic/main_visitor.crcodegen/llvm_typer.cr
syntax/とsemantic/の役割の違いを、入力と出力の観点で説明せよ。
3. ASTノード体系
ASTNodeが持つlocation/end_locationは何のために使われるか。- 意味解析後の
ASTNodeに追加される「型依存の仕組み」(例: dependencies/observers)が必要な理由を述べよ。 VisitorとTransformerの違いを、戻り値と用途の観点で比較せよ。
4. 型ヒエラルキー
- Crystalの型システムにおける
Type中心の設計が、コンパイラのどの処理で重要になるかを2つ挙げよ。 - Union型が必要になる典型的なコードパターンを1つ示し、なぜUnionになるかを説明せよ。
5. Crystal::Program
Crystal::Programを「コンパイル中央データベース」と呼ぶ理由を説明せよ。Programが管理する情報を3つ挙げ、それぞれの利用箇所を簡潔に述べよ。
6. 字句解析・構文解析
- 字句解析(Lexer)と構文解析(Parser)の境界はどこか。トークン列との関係を含めて答えよ。
- 再帰下降パーサがCrystalの文法に対して持つ利点を1つ、注意点を1つ挙げよ。
7. requireシステム
requireの解決でcrystal_path.crが担う責務を説明せよ。- 同一ファイルの重複読み込みを防ぐ仕組みがないと、どのような問題が起きうるか。
8. 意味解析パス
- トップレベル収集パス(宣言処理)が、メイン型推論パスより先に必要な理由を述べよ。
abstract defチェックは、どのような不整合を検出するか。cleanup_transformerは何を取り除くか。具体例を挙げて説明せよ。
9. 型推論システム
Call#recalculateが型推論の核心と言える理由を述べよ。- オーバーロード解決が失敗する代表的ケースを1つ作り、何が曖昧かを説明せよ。
is_a?/nil?によるフロー依存の型絞り込みを、分岐コード例つきで説明せよ。
10. マクロシステム
- マクロ展開が「単なる文字列置換」ではない理由を、ASTレベル処理の観点で述べよ。
MacroInterpreterが必要な理由を、実行時コードとの違いに触れて説明せよ。- マクロがコンパイル時間や可読性に与えるトレードオフを挙げよ。
11. LLVMコード生成
llvm_typerの責務を、Crystal型とLLVM型の橋渡しとして説明せよ。- Union型のコード生成でタグ情報が必要な理由を述べよ。
- 例外処理(
rescue/ensure)をLLVMで扱う際に難しい点を1つ挙げよ。
12. コントリビュート
- 小さな改善PRを出すときの推奨手順を、調査・実装・検証・説明の流れで書け。