第二章:开发环境搭建

好,咱们正式开始动手了。写编译器这事儿,工具链选不对,后面全是坑。我这些年折腾过不少语言和工具,踩过的雷能绕地球一圈。今天就把我觉得最靠谱的一套方案分享给你。

2.1 选择开发语言

先聊语言。你可能会问:「到底用 C、C++、Rust 还是 Go?」

我个人习惯用 C++。为什么?

  • 性能够硬。编译器本身就是个性能敏感的系统软件,C++ 能让你精确控制内存和 CPU。
  • 生态成熟。LLVM、GCC 这些底层工具全是 C++ 写的,你直接复用它们的 API 非常方便。
  • 抽象能力适中。比 C 多了类和模板,比 Rust 少了借用检查器的束缚,写起来顺手。

当然,Rust 也很香。如果你追求内存安全,又不怕学习曲线陡峭,Rust 是未来趋势。Go 呢?说实话,写小玩具可以,但做生产级编译器,GC 和 goroutine 调度带来的不确定性会让你头疼。

我的建议: 如果你刚入门,选 C++。等把编译原理吃透了,再换 Rust 也不迟。

2.2 安装编译器工具链

工具链选哪个?LLVM 是首选。

我记得第一次用 GCC 写编译器时,被它的中间表示折腾得够呛。LLVM 的 IR 设计得干净、文档齐全,而且有丰富的 Pass 框架。说白了,LLVM 就是为编译器开发者准备的瑞士军刀。

安装步骤很简单:

# Ubuntu / Debian
sudo apt install llvm clang lld

# macOS (Homebrew)
brew install llvm

# Windows
# 去 https://releases.llvm.org 下载预编译包

验证安装:

clang --version
llvm-config --version
注意: 版本别太老。LLVM 14 以上比较稳。我曾在 LLVM 10 上踩过一个 IR 生成 bug,折腾了两天才发现是版本问题。

2.3 配置 IDE

编辑器这块,我推荐 VS Code。轻量、插件丰富、调试方便。

必装插件:

  • C/C++ (微软官方)
  • CMake Tools
  • GitLens
  • Clangd (代码补全和诊断)

如果你喜欢重型 IDE,CLion 也不错。CMake 集成做得很好,但启动慢、吃内存。我平时写小项目用 VS Code,做大项目才切 CLion。

配置 VS Code 的 settings.json:

{
  "C_Cpp.default.compilerPath": "/usr/bin/clang++",
  "cmake.configureOnOpen": true,
  "editor.formatOnSave": true
}

2.4 版本控制:Git

写编译器,版本控制是命根子。你改一行代码,可能整个语法分析器就崩了。没有 Git,你连回退的机会都没有。

我建议你养成一个习惯:每实现一个功能点就 commit 一次。比如:

git init
git add .
git commit -m "feat: 添加词法分析器基础框架"

分支策略用简单的 main + dev 就行。别整 Git Flow,咱们写课程项目,不是搞企业级发布。

避坑指南: 我曾经在写语法分析器时,连续改了 3 天没 commit。结果一个重构把整个 AST 搞坏了,回退都找不到节点。从那以后,我每写一个函数就 commit 一次。

2.5 构建工具:CMake

Makefile 太原始,手写容易出错。CMake 是业界标准,跨平台、可读性强。

一个简单的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.20)
project(MyCompiler VERSION 0.1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(mycc
  src/main.cpp
  src/lexer.cpp
  src/parser.cpp
)

target_link_libraries(mycc PRIVATE LLVM)

构建命令:

mkdir build && cd build
cmake ..
make -j$(nproc)

嗯,这里要注意:-j$(nproc) 能利用多核加速编译。我第一次写编译器时不知道这个参数,每次编译都干等 5 分钟,后来同事提醒才恍然大悟。

2.6 知识体系总览

下面这张图,是我用 SVG 画的本章核心逻辑。你一看就明白各个工具之间的关系:

编译器项目 开发语言 (C++) 工具链 (LLVM) IDE (VS Code) 版本控制 (Git) 构建工具 (CMake) 调试 (LLDB/GDB)

你看,整个环境搭建就是这六个模块。它们互相配合,缺一不可。语言是基础,工具链是引擎,IDE 是操作台,Git 是安全网,CMake 是调度员,调试器是放大镜。

2.7 快速验证

环境搭好了,咱们写个 Hello World 试试:

// hello.cpp
#include <iostream>
int main() {
    std::cout << "Hello, Compiler!" << std::endl;
    return 0;
}

用 CMake 构建:

mkdir build && cd build
cmake ..
make
./hello

如果看到 Hello, Compiler! 输出,恭喜你,环境搭建成功!

小技巧: 把 CMake 的构建类型设为 Debug,这样调试信息更丰富:cmake -DCMAKE_BUILD_TYPE=Debug ..

好了,环境就绪。接下来咱们就可以真正进入编译器的核心世界了。


可可精品资料库