mcpField
C
compiler-development

compiler-development

github.com/gmh5225開発89089 回インストール4 週間前に更新
リポジトリ

compiler-development について

LLVM を使ったコンパイラーやプログラミング言語の実装を支援するスキルです。フロントエンド設計、LLVM IR 生成、JIT コンパイル、最適化パス、言語実装パターンを扱います。

主な機能

  1. 01レキサー、パーサー、AST の設計
  2. 02LLVM IR の生成
  3. 03ORC JIT コンパイル
  4. 04最適化パスの構成
  5. 05型システムとエラー処理

活用シーン

  1. 01言語フロントエンドの設計
  2. 02LLVM IR の生成とデバッグ
  3. 03JIT コンパイラーの構築
  4. 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

開発ワークフロー

  1. シンプルに始める:Kaleidoscope チュートリアルから始めます
  2. 機能を段階的に追加する:一度に1つの言語機能を追加します
  3. 徹底的にテストする:コンパイラーの各フェーズに単体テストを用意します
  4. LLVM ツールを使用する:IR のデバッグには opt、llc、llvm-dis を使用します
  5. プロファイルして最適化する:一般的なコードパターンに注力します

リソース

公式チュートリアル
  • 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 のセットアップ
  • コンパイラー開発のチュートリアルと書籍

コメント