程序结构
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" // 推断为 stra2c 转译器从初始化器推断类型并生成相应的 C 类型。C 的 auto 关键字(C23 中添加)提供了类似功能,但 Auto 的 var 在所有目标 C 标准中都能工作,因为推断发生在转译时。