Skip to content
📖 Auto 版 Modern C本书目录

程序结构 ​

C 程序由词法单元构成,组织为声明和语句,并按特定顺序编译。Auto 简化了这一结构,但保留了相同的逻辑组织。本章逐步讲解两种语言的文法、声明、定义和语句。

2.1 文法 ​

C 程序由*词法单元(token)*构成:标识符、关键字、字面量、运算符和标点符号。C 标准定义了精确的文法,决定哪些词法单元序列构成有效程序。

C 中基本的词法单元类别如下:

  • 关键字: int、double、if、for、while、return、struct、switch、case、break、default、void、const……
  • 标识符: 你选择的名字——main、count、my_function、Point
  • 字面量: 42、3.14、"hello"、true
  • 运算符: +、-、*、/、=、==、<、>、&&、||……
  • 标点符号: (、)、{、}、;、,

C 的文法是类型前置的。声明时类型在名称之前:

c
int x = 5;
double pi = 3.14159;
const char* greeting = "hello";

Auto 的文法更简洁。类型出现在名称之后,需要的关键字更少:

auto
let x int = 5
let pi float = 3.14159
let greeting str = "hello"

翻译单元和作用域 ​

C 程序由一个或多个翻译单元组成——独立编译然后链接在一起的源文件。每个翻译单元分阶段处理:预处理、词法分析、解析和代码生成。

Auto 遵循相同的模型。每个 .at 文件是一个翻译单元。a2c 转译器独立处理每个文件,生成 .c 文件供 C 编译器编译。

C 有四种标识符作用域:

  • 块作用域: 在 { ... } 内可见(最常见)。
  • 文件作用域: 在整个翻译单元内可见。
  • 函数作用域: 仅用于标签(很少使用)。
  • 函数原型作用域: 仅在函数声明内。

Auto 有两种实际作用域:函数作用域(在 fn 内部)和模块作用域(在顶层)。映射关系很直接。

要点: C 的文法把类型放前面;Auto 的文法把名字放前面。两者携带相同的信息,但 Auto 的顺序在英语中读起来更自然:"let x be an int equal to 5."

2.2 声明 ​

C 中的声明引入一个名称并将其与类型关联。最常见的形式是变量声明:

c
int age = 25;
double height = 1.75;
char initial = 'A';
bool active = true;

在 Auto 中,let 关键字引入不可变绑定,var 引入可变绑定:

auto
let age int = 25       // 不可变
let height float = 1.75
var count int = 0      // 可变

类型推断 ​

Auto 支持使用 var 的有限形式类型推断:

auto
var x = 5              // 推断为 int
var pi = 3.14159       // 推断为 float
var name = "hello"     // 推断为 str

a2c 转译器从初始化器推断类型并生成相应的 C 类型。C 的 auto 关键字(C23 中添加)提供了类似功能,但 Auto 的 var 在所有目标 C 标准中都能工作,因为推断发生在转译时。

基于 MIT 许可发布。