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:声明包名为Main
  • api:表示这是公开的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:多文件项目 #

创建一个简单的计算器程序,包含加减乘除功能。

十一、总结 #

本章我们学习了:

  1. 程序结构:包声明、主函数、返回值
  2. 编译运行:使用编译器和Bazel构建
  3. 基本输出:Print函数和格式化
  4. 代码风格:缩进、命名、格式化
  5. 多文件程序:库文件、导入、依赖
  6. 错误处理:常见错误和调试技巧

接下来让我们深入学习Carbon的基础语法!

最后更新:2026-03-27