compiler-development について
LLVM を使ったコンパイラーやプログラミング言語の実装を支援するスキルです。フロントエンド設計、LLVM IR 生成、JIT コンパイル、最適化パス、言語実装パターンを扱います。
主な機能
- 01レキサー、パーサー、AST の設計
- 02LLVM IR の生成
- 03ORC JIT コンパイル
- 04最適化パスの構成
- 05型システムとエラー処理
活用シーン
- 01言語フロントエンドの設計
- 02LLVM IR の生成とデバッグ
- 03JIT コンパイラーの構築
- 04型とメモリー安全機能の設計
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ gmh5225/ awesome-llvm-security --skill compiler-developmentインストール後、Claude Code で/compiler-developmentを入力して読み込まれたか確認します。
詳細
コンパイラー開発スキル
このスキルでは、LLVM インフラストラクチャを使用してコンパイラーや言語実装を構築するための包括的な知識を提供します。
コンパイラーアーキテクチャの概要
従来の3フェーズ設計
Source Code → Frontend → Middle-End (Optimizer) → Backend → Machine Code
↓ ↓ ↓
AST/IR LLVM IR Passes Target Code
フロントエンド開発
字句解析
// Token types for a simple language
enum class TokenKind {
Identifier,
Number,
String,
Keyword,
Operator,
Punctuation,
EndOfFile
};
struct Token {
TokenKind kind;
std::string value;
SourceLocation location;
};
パーサーの実装
- 再帰下降:実装が簡単で、エラーメッセージも適切です
- 演算子優先順位解析:式の解析に効率的です
- LALR/LR:複雑な文法には Bison などのツールを使用します
AST の設計
class Expr {
public:
virtual ~Expr() = default;
virtual llvm::Value* codegen() = 0;
};
class BinaryExpr : public Expr {
std::unique_ptr<Expr> LHS, RHS;
char Op;
public:
llvm::Value* codegen() override {
llvm::Value* L = LHS->codegen();
llvm::Value* R = RHS->codegen();
switch (Op) {
case '+': return Builder.CreateFAdd(L, R, "addtmp");
case '-': return Builder.CreateFSub(L, R, "subtmp");
case '*': return Builder.CreateFMul(L, R, "multmp");
case '/': return Builder.CreateFDiv(L, R, "divtmp");
}
}
};
LLVM IR の生成
モジュールとコンテキストの設定
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/IRBuilder.h"
class CodeGen {
std::unique_ptr<llvm::LLVMContext> Context;
std::unique_ptr<llvm::Module> Module;
std::unique_ptr<llvm::IRBuilder<>> Builder;
public:
CodeGen() {
Context = std::make_unique<llvm::LLVMContext>();
Module = std::make_unique<llvm::Module>("my_module", *Context);
Builder = std::make_unique<llvm::IRBuilder<>>(*Context);
}
};
関数の生成
llvm::Function* createFunction(const std::string& name,
llvm::Type* returnType,
std::vector<llvm::Type*> params) {
llvm::FunctionType* FT = llvm::FunctionType::get(returnType, params, false);
llvm::Function* F = llvm::Function::Create(
FT, llvm::Function::ExternalLinkage, name, Module.get());
llvm::BasicBlock* BB = llvm::BasicBlock::Create(*Context, "entry", F);
Builder->SetInsertPoint(BB);
return F;
}
JIT コンパイル
LLVM ORC JIT
#include "llvm/ExecutionEngine/Orc/LLJIT.h"
auto JIT = llvm::orc::LLJITBuilder().create();
if (!JIT) {
handleError(JIT.takeError());
}
// Add module
(*JIT)->addIRModule(llvm::orc::ThreadSafeModule(
std::move(Module), std::move(Context)));
// Look up symbol and execute
auto Sym = (*JIT)->lookup("main");
auto* MainFn = (int(*)())Sym->getAddress();
int result = MainFn();
最適化パスのパイプライン
新しいパスマネージャー(推奨)
#include "llvm/Passes/PassBuilder.h"
void optimizeModule(llvm::Module& M) {
llvm::PassBuilder PB;
llvm::LoopAnalysisManager LAM;
llvm::FunctionAnalysisManager FAM;
llvm::CGSCCAnalysisManager CGAM;
llvm::ModuleAnalysisManager MAM;
PB.registerModuleAnalyses(MAM);
PB.registerCGSCCAnalyses(CGAM);
PB.registerFunctionAnalyses(FAM);
PB.registerLoopAnalyses(LAM);
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
llvm::ModulePassManager MPM = PB.buildPerModuleDefaultPipeline(
llvm::OptimizationLevel::O2);
MPM.run(M, MAM);
}
カスタムパスの実装
struct MyPass : public llvm::PassInfoMixin<MyPass> {
llvm::PreservedAnalyses run(llvm::Function& F,
llvm::FunctionAnalysisManager& FAM) {
for (auto& BB : F) {
for (auto& I : BB) {
// Transform instructions
}
}
return llvm::PreservedAnalyses::none();
}
};
言語実装のパターン
メモリーセーフな言語
- LLVM のメモリーサニタイザーフックを使用します
- GEP のイントロスペクションを使用して境界チェックを実装します
- 参照カウントまたはガベージコレクションを統合します
型システム
- AST の構築時に型推論を実装します
- 適切な LLVM 型(i32、float、struct、ptr)を生成します
- 単相化またはボックス化によってジェネリック型を処理します
エラー処理
- LLVM の landingpad/invoke を使って例外処理を生成します
- Result/Option 型をタグ付き共用体として実装します
- LLVM の personality 関数を使用して巻き戻しを処理します
注目すべき言語実装
システム言語
- Rust:複雑な借用チェッカー、トレイトシステム → LLVM
- Zig:コンパイル時評価、安全性機能
- Carbon:C++ との相互運用、モダンな構文
スクリプト言語
- Julia:JIT コンパイルによる科学技術計算
- Crystal:Ruby のような構文、静的型付け
- Nim:Python のような言語、マルチバックエンド
ドメイン固有言語
- Solidity:Ethereum のスマートコントラクト
- MLIR:ML/AI ワークロード向けのマルチレベル IR
- Halide:画像処理 DSL
開発ワークフロー
- シンプルに始める:Kaleidoscope チュートリアルから始めます
- 機能を段階的に追加する:一度に1つの言語機能を追加します
- 徹底的にテストする:コンパイラーの各フェーズに単体テストを用意します
- LLVM ツールを使用する:IR のデバッグには opt、llc、llvm-dis を使用します
- プロファイルして最適化する:一般的なコードパターンに注力します
リソース
公式チュートリアル
- LLVM Kaleidoscope:ゼロから言語を構築する
- Clang の内部構造:フロントエンド実装のパターン
- LLVM バックエンドの作成:ターゲットコードの生成
コミュニティプロジェクト
さまざまな言語パラダイムにわたる100以上の実装例については、README.md の DIY Compiler セクションを参照してください。
詳細情報の取得
リソースへのリンク、ツールの一覧、プロジェクトの参考情報について、最新かつ詳細な情報が必要な場合は、次の場所から最新データを取得してください。
https://raw.githubusercontent.com/gmh5225/awesome-llvm-security/refs/heads/main/README.md
この README には、厳選された包括的な一覧が含まれています。
- 100以上の DIY コンパイラー実装(DIY Compiler セクション)
- ツールチェーンの設定と IDE のセットアップ
- コンパイラー開発のチュートリアルと書籍
コメント
Markdown 対応