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优化 Pass 流程
  5. 05类型系统与错误处理

适用场景

  1. 01规划语言前端
  2. 02生成和调试 LLVM IR
  3. 03构建 JIT 编译器
  4. 04设计类型与内存安全特性

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/gmh5225/awesome-llvm-security --skill compiler-development

安装后在 Claude Code 中输入/compiler-development确认已加载。

详细介绍

编译器开发技能

本技能全面介绍如何使用 LLVM 基础设施构建编译器和语言实现。

编译器架构概览

经典三阶段设计
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:复杂的借用检查器、trait 系统 → LLVM
  • Zig:Comptime 求值、安全特性
  • Carbon:C++ 互操作、现代语法
脚本语言
  • Julia:JIT 编译的科学计算
  • Crystal:类似 Ruby 的语法、静态类型
  • Nim:类似 Python、多后端
领域专用语言
  • Solidity:Ethereum 智能合约
  • MLIR:面向 ML/AI 工作负载的多级 IR
  • Halide:图像处理 DSL

开发工作流

  1. 从简单开始:从 Kaleidoscope 教程入手
  2. 逐步添加功能:每次添加一种语言功能
  3. 充分测试:为每个编译器阶段编写单元测试
  4. 使用 LLVM 工具:使用 opt、llc、llvm-dis 调试 IR
  5. 分析并优化:重点关注常见代码模式

资源

官方教程
  • LLVM Kaleidoscope:从零构建一门语言
  • Clang 内部机制:前端实现模式
  • 编写 LLVM 后端:目标代码生成
社区项目

参见 README.md 中的 DIY 编译器部分,了解涵盖不同语言范式的 100 多个示例实现。

获取详细信息

需要获取详细且最新的资源链接、工具列表或项目参考时,请从以下位置获取最新数据:

https://raw.githubusercontent.com/gmh5225/awesome-llvm-security/refs/heads/main/README.md

此 README 收录了全面整理的以下内容:

  • 100 多个 DIY 编译器实现(DIY 编译器部分)
  • 工具链配置和 IDE 设置
  • 编译器开发教程和书籍

评论

支持 Markdown