Carbon Hello World #
一、第一个程序 #
1.1 创建文件 #
创建一个名为 hello.carbon 的文件:
carbon
package Main api;
fn Main() -> i32 {
Print("Hello, World!");
return 0;
}
1.2 程序解析 #
让我们逐行分析这个程序:
carbon
package Main api;
package Main:声明包名为Mainapi:表示这是公开的API包
carbon
fn Main() -> i32 {
fn:函数定义关键字Main:主函数名(程序入口)() -> i32:无参数,返回32位整数
carbon
Print("Hello, World!");
Print:标准输出函数"Hello, World!":字符串字面量
carbon
return 0;
}
return 0:返回退出码0(成功)}:函数体结束
二、编译与运行 #
2.1 使用Carbon编译器 #
bash
# 编译程序
bazel run //toolchain:carbon -- compile hello.carbon
# 运行程序
./hello
输出:
text
Hello, World!
2.2 使用Bazel构建 #
创建 BUILD 文件:
python
load("@carbon//toolchain:rules.bzl", "carbon_binary")
carbon_binary(
name = "hello",
srcs = ["hello.carbon"],
)
构建运行:
bash
# 构建
bazel build :hello
# 运行
bazel run :hello
2.3 编译选项 #
bash
# 查看编译帮助
bazel run //toolchain:carbon -- compile --help
# 输出LLVM IR
bazel run //toolchain:carbon -- compile --emit=llvm-ir hello.carbon
# 输出汇编代码
bazel run //toolchain:carbon -- compile --emit=assembly hello.carbon
三、程序结构详解 #
3.1 包声明 #
每个Carbon文件必须以包声明开始:
carbon
package Main api;
// 包内容
包声明的组成部分:
| 部分 | 说明 |
|---|---|
package |
包声明关键字 |
Main |
包名(PascalCase命名) |
api |
可见性修饰符 |
3.2 可见性修饰符 #
carbon
package Main api; // 公开API
package Main impl; // 内部实现
package Main; // 默认私有
3.3 主函数 #
程序入口是 Main 函数:
carbon
fn Main() -> i32 {
// 程序代码
return 0;
}
主函数特点:
- 必须命名为
Main - 返回类型为
i32 - 返回0表示成功
3.4 命令行参数 #
Carbon支持命令行参数:
carbon
package Main api;
fn Main(args: [String]) -> i32 {
Print("程序名: {0}", args[0]);
Print("参数数量: {0}", args.size());
return 0;
}
四、基本输出 #
4.1 Print函数 #
Print 是基本的输出函数:
carbon
Print("Hello, Carbon!");
Print("数字: {0}", 42);
Print("多参数: {0}, {1}", "Hello", "World");
4.2 格式化输出 #
Carbon支持格式化字符串:
carbon
Print("整数: {0}", 42);
Print("浮点: {0}", 3.14);
Print("字符串: {0}", "Hello");
Print("布尔: {0}", true);
4.3 多行输出 #
carbon
Print("第一行");
Print("第二行");
Print("第三行");
// 或者使用换行符
Print("第一行\n第二行\n第三行");
五、注释 #
5.1 单行注释 #
carbon
// 这是单行注释
Print("Hello"); // 行尾注释
5.2 文档注释 #
carbon
/// 这是文档注释
/// 用于描述函数、类等
fn Add(a: i32, b: i32) -> i32 {
return a + b;
}
六、代码风格 #
6.1 缩进 #
使用2空格缩进:
carbon
fn Example() -> i32 {
var x: i32 = 42; // 2空格缩进
if (x > 0) {
return x; // 4空格缩进
}
return 0;
}
6.2 命名约定 #
| 类型 | 命名风格 | 示例 |
|---|---|---|
| 包名 | PascalCase | Main, MyPackage |
| 函数 | PascalCase | Main, AddNumbers |
| 变量 | snake_case | my_var, total_count |
| 常量 | PascalCase | MaxSize, DefaultPort |
| 类型 | PascalCase | MyClass, Person |
6.3 代码格式化 #
bash
# 格式化代码
bazel run //toolchain:carbon -- format hello.carbon
# 检查格式
bazel run //toolchain:carbon -- format --dry-run hello.carbon
七、多文件程序 #
7.1 创建库文件 #
创建 math.carbon:
carbon
package Math api;
fn Add(a: i32, b: i32) -> i32 {
return a + b;
}
fn Subtract(a: i32, b: i32) -> i32 {
return a - b;
}
7.2 使用库 #
创建 main.carbon:
carbon
package Main api;
import Math;
fn Main() -> i32 {
var result: i32 = Math.Add(10, 20);
Print("结果: {0}", result);
return 0;
}
7.3 构建配置 #
python
# BUILD文件
load("@carbon//toolchain:rules.bzl", "carbon_binary", "carbon_library")
carbon_library(
name = "math",
srcs = ["math.carbon"],
)
carbon_binary(
name = "main",
srcs = ["main.carbon"],
deps = [":math"],
)
八、错误处理 #
8.1 编译错误 #
carbon
// 错误示例:缺少分号
fn Main() -> i32 {
Print("Hello") // 错误:缺少分号
return 0
}
编译器输出:
text
error: expected ';'
8.2 类型错误 #
carbon
// 错误示例:类型不匹配
fn Main() -> i32 {
var x: i32 = "Hello"; // 错误:字符串不能赋值给整数
return 0;
}
8.3 常见错误 #
| 错误类型 | 示例 | 修正 |
|---|---|---|
| 语法错误 | Print("Hi") |
Print("Hi"); |
| 类型错误 | var x: i32 = "text"; |
var x: String = "text"; |
| 未定义 | UnknownFunction(); |
确保函数已定义或导入 |
九、调试技巧 #
9.1 打印调试 #
carbon
fn Main() -> i32 {
var x: i32 = 42;
Print("调试: x = {0}", x);
return 0;
}
9.2 断言 #
carbon
fn Main() -> i32 {
var x: i32 = 42;
Assert(x > 0, "x must be positive");
return 0;
}
9.3 使用LLDB调试 #
bash
# 编译时保留调试信息
bazel build :hello --copt=-g
# 使用LLDB调试
lldb ./hello
十、实战练习 #
10.1 练习1:输出个人信息 #
carbon
package Main api;
fn Main() -> i32 {
Print("姓名: Carbon学习者");
Print("年龄: 25");
Print("语言: Carbon");
return 0;
}
10.2 练习2:计算并输出 #
carbon
package Main api;
fn Main() -> i32 {
var a: i32 = 10;
var b: i32 = 20;
var sum: i32 = a + b;
Print("{0} + {1} = {2}", a, b, sum);
return 0;
}
10.3 练习3:多文件项目 #
创建一个简单的计算器程序,包含加减乘除功能。
十一、总结 #
本章我们学习了:
- 程序结构:包声明、主函数、返回值
- 编译运行:使用编译器和Bazel构建
- 基本输出:Print函数和格式化
- 代码风格:缩进、命名、格式化
- 多文件程序:库文件、导入、依赖
- 错误处理:常见错误和调试技巧
接下来让我们深入学习Carbon的基础语法!
最后更新:2026-03-27