CHAPTER 03

环境搭建

本章为实践准备,根据你选择的语言完成环境搭建

1. 选择你的语言

本课程提供 Go、Rust、Java、C++ 四种语言的完整实现。你可以选择自己熟悉的语言跟着做,也可以对比多种语言的实现来加深理解。

Go

语法简洁,标准库强大,非常适合快速实现存储引擎原型。课程主要参考实现。

Rust

内存安全、零成本抽象,适合追求高性能和安全性。学习曲线稍陡但收获丰厚。

Java

生态成熟,企业级首选。通过实现存储引擎可以深入理解 NIO、ByteBuffer 等底层 API。

C++

贴近硬件,性能极致。适合想深入理解内存管理和系统编程的开发者。

每种语言的代码都在同一个仓库的不同目录下:go/rust/java/cpp/。你可以随时切换查看。

2. 获取课程代码

课程代码托管在 GitHub 上,每个章节对应一个 Git 提交:

$ git clone https://github.com/codepie-labs/codepie-1-kv-storage.git
$ cd codepie-1-kv-storage

# 查看所有章节对应的提交记录
$ git log --oneline
2e264b4 chapter13: 内存索引优化
ec9af33 chapter12: Merge 数据清理
c39a439 chapter11: WriteBatch 原子写
...
ab9a411 chapter04: 内存和磁盘设计

# 切换到某个章节的代码
$ git checkout ab9a411 # 切换到第 4 章
建议的学习方式
先从第 4 章的提交开始,自己跟着教程写代码。如果遇到困难,可以 git checkout 到对应的提交查看参考实现。每写完一章,和参考实现对比一下,看看有没有更好的写法。

3. 环境安装

请根据你选择的语言,安装对应的开发环境。点击下方的语言标签查看安装步骤。

Go
Rust
Java
C++

安装 Go

需要 Go 1.19 或更高版本。

# macOS (Homebrew)
$ brew install go

# Linux (官方二进制包)
$ wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
$ export PATH=$PATH:/usr/local/go/bin

# Windows: 下载安装包 https://go.dev/dl/

# 验证安装
$ go version
go version go1.22.0 darwin/arm64

初始化项目

$ cd go/
$ go mod tidy # 下载依赖
$ go test ./... # 运行测试,确保一切正常
ok bitcask-go/fio 0.003s
ok bitcask-go/index 0.002s

Go 的依赖管理使用 go.mod,已经配置好了,go mod tidy 会自动下载所有依赖。

安装 Rust

使用 rustup 安装 Rust 工具链,需要 Rust 1.70 或更高版本。

# 安装 rustup(macOS / Linux)
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 验证安装
$ rustc --version
rustc 1.77.0 (aedd173a2 2024-03-17)
$ cargo --version
cargo 1.77.0 (3fe68eabf 2024-02-29)

构建与测试

$ cd rust/
$ cargo build # 编译
$ cargo test # 运行测试
running 8 tests
test result: ok. 8 passed; 0 failed

Rust 使用 Cargo.toml 管理依赖,cargo build 会自动下载并编译所有依赖。

安装 JDK 和 Maven

需要 JDK 11 或更高版本,以及 Maven 3.6+。

# macOS (Homebrew)
$ brew install openjdk@17
$ brew install maven

# Linux (apt)
$ sudo apt install openjdk-17-jdk maven

# 验证安装
$ java -version
openjdk version "17.0.10"
$ mvn -version
Apache Maven 3.9.6

构建与测试

$ cd java/
$ mvn compile # 编译
$ mvn test # 运行测试
Tests run: 10, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS

Java 项目使用 Maven 管理,依赖定义在 pom.xml 中。JUnit 4 用于单元测试。

安装编译工具链

需要支持 C++17 的编译器和 CMake 3.14+。

# macOS (Homebrew)
$ brew install cmake
$ brew install llvm # 推荐,macOS 自带的 clang 可能缺少标准库

# Linux (apt)
$ sudo apt install build-essential cmake

# 验证安装
$ cmake --version
cmake version 3.28.0
$ clang++ --version # 或 g++ --version
Apple clang version 17.0.0

构建与测试

$ cd cpp/
$ mkdir -p build && cd build
$ cmake .. # 配置(首次会下载 Google Test)
$ cmake --build . # 编译
$ ctest --output-on-failure # 运行测试
100% tests passed, 0 tests failed out of 10
macOS 用户注意
如果编译时遇到 fatal error: 'string' file not found,说明系统自带的 CommandLineTools 缺少 C++ 标准库头文件。可以安装 Homebrew 的 LLVM 并指定编译器:
cmake .. \
  -DCMAKE_CXX_COMPILER=/opt/homebrew/opt/llvm/bin/clang++ \
  -DCMAKE_C_COMPILER=/opt/homebrew/opt/llvm/bin/clang \
  -DCMAKE_EXE_LINKER_FLAGS="-L/opt/homebrew/opt/llvm/lib/c++ -Wl,-rpath,/opt/homebrew/opt/llvm/lib/c++"

C++ 使用 CMake 构建系统,Google Test 会通过 FetchContent 自动下载。

4. 推荐的编辑器 / IDE

语言推荐工具说明
GoVS Code + Go 扩展 / GoLandGo 官方的 VS Code 扩展(gopls)体验很好
RustVS Code + rust-analyzer / RustRoverrust-analyzer 提供优秀的代码补全和类型推断
JavaIntelliJ IDEA / VS Code + Java 扩展IDEA 社区版免费,Java 开发体验最佳
C++VS Code + clangd / CLionclangd 提供代码补全和错误检查
无论选择哪个编辑器,请确保安装了对应语言的 LSP(Language Server Protocol)支持,这会让你在编码过程中获得实时的类型检查和代码补全。

5. 项目结构预览

从第 4 章开始,我们会按照以下结构逐步构建代码:

codepie-1-kv-storage/
├── go/                    # Go 实现
│   ├── go.mod
│   ├── data/              # 数据文件、日志记录
│   ├── fio/               # 文件 IO 管理
│   ├── index/             # 内存索引
│   └── ...
├── rust/                  # Rust 实现
│   ├── Cargo.toml
│   └── src/
├── java/                  # Java 实现
│   ├── pom.xml
│   └── src/
└── cpp/                   # C++ 实现
    ├── CMakeLists.txt
    ├── src/
    └── tests/

每种语言的代码独立组织,但逻辑结构基本一致:数据层(data)、IO 层(fio)、索引层(index)、引擎层(db / engine)。

本章小结

  1. 课程提供 Go、Rust、Java、C++ 四种语言的实现,选择你熟悉的语言即可。
  2. 代码仓库中每个 Git 提交对应一个章节,可以随时 checkout 查看参考实现。
  3. 确保你的开发环境已经就绪:编译器/运行时 + 构建工具 + 编辑器。
  4. 运行 go test / cargo test / mvn test / ctest 确认环境正常。

一切准备就绪!下一章我们开始写第一行代码 —— 实现文件 IO 和内存索引。