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

通过 Auto 学习现代 C ​

本书是 Jens Gustedt《Modern C》的 Auto 语言改编版,通过 a2c 转译管线进行讲解。

为什么要写这本书? ​

Jens Gustedt 的《Modern C》是最严谨的 C 语言入门教材之一。它不把 C 当作遗留语言,而是当作一门仍在发展的现代语言来教授——指定初始化器、用 size_t 表示大小、用 EXIT_SUCCESS 表示程序正常终止,以及避免旧式 C 陷阱的类型安全模式。

本书将这些课程适配到 Auto——一种通过 a2c 转译器编译为 C 的系统编程语言。Auto 提供了更简洁的语法表面——用 let 代替类型前置声明,用 for i in 0..n 代替 for (int i = 0; i < n; i++),用 is 代替 switch——同时保留 C 的操作语义。

目标不是隐藏 C,而是通过 Auto 的清晰性教授 C 的概念,然后向你展示确切生成了什么 C 代码。本书中的每个 Auto 程序都有对应的 C 翻译,你可以检查、编译和运行。

本书面向谁? ​

本书面向三类读者:

  1. C 语言学习者,想要一条更平缓的路径进入 Modern C 的严谨方法。Auto 的语法让你专注于概念,不必与分号、格式字符串和头文件搏斗。
  2. Auto 程序员,想要理解底层发生了什么。了解 C 映射让你成为更好的 Auto 程序员。
  3. 系统程序员,在两种语言中工作,想要高级意图和低层实现之间的清晰对应。

你不需要 C 语言经验。你需要基本的编程素养——变量、函数、循环——使用任何语言都可以。

现代 C 与传统 C ​

"现代 C" 这个短语指的是 C17 和 C23 标准推动的风格,而不是许多人联想到 C 的 K&R 风格。关键差异包括:

  • 指定初始化器代替位置初始化。
  • size_t 用于大小和计数代替 int。
  • EXIT_SUCCESS 和 EXIT_FAILURE 代替原始的 0 和 1。
  • 来自 <stdbool.h> 的 bool 代替自制布尔值。
  • 复合字面量用于匿名数组和结构体值。
  • restrict 限定符用于别名优化提示。

Auto 将所有这些作为默认选项。当 a2c 生成 C 时,它使用现代惯用法。

四个层次 ​

《Modern C》将内容组织为四个递进深度层次。我们沿用相同结构:

  • 相遇(第 0-3 章):入门、程序结构、控制流。你与语言初次相遇。
  • 相识(第 4-7 章):类型、指针、I/O,以及值在内存中的存在方式。
  • 认知(第 8-11 章):风格、函数、数组和堆分配。你开始理解模型。
  • 经验(第 12-15 章):预处理器、性能、并发,以及构建真实程序。

本卷涵盖"相遇"层次。读完之后,你将理解 Auto 程序的结构、流程,以及它们生成的 C 代码。

每个层次建立在前一个层次之上。你应该按顺序阅读"相遇"章节。后面的层次会假设你已经掌握了这里的材料。

"相遇"章节为后续所有内容奠定基础。即使你以前用 C 编程过,也要仔细阅读——Auto 到 C 的映射引入了后续章节将要构建的概念。

你将在本卷中学到什么 ​

读完本"相遇"卷之后,你将能够:

  • 编写、编译和运行转译为 C 的 Auto 程序。
  • 理解 Auto 语法和 C 输出之间的映射关系。
  • 在两种语言中使用变量、数组、函数和控制流。
  • 阅读 a2c 转译器生成的 C 代码并理解每一行。
  • 认识 Auto 作为默认选项推广的现代 C 惯用法。

如何阅读本书 ​

每一章分三层呈现 Modern C 中的概念:

  1. 概念本身 -- 用通俗语言解释,并参考 C 的处理方式。
  2. Auto 语法 -- 你在 Auto 中如何书写,更简洁、更规整。
  3. 转译后的 C -- a2c 生成了什么,让你理解映射关系。

代码块有清晰的标注:

auto
// 这是 Auto 源代码
let x int = 42
c
// 这是 a2c 生成的 C 代码
int x = 42;

完整的程序以 Listing(代码清单)形式呈现,包含 Auto 源码和预期的 C 输出。你可以在本书旁边的 listings/ 目录中找到这些文件。

我们建议你带着打开的终端阅读。输入示例。运行它们。修改它们。弄坏它们。理解来自实践。

并排比较 ​

在整本书中,你会看到 Auto 和 C 代码并排呈现。Auto 代码总是在左边(或前面),C 代码在右边(或后面)。这是有意为之:你应该学会在两者之间心智翻译。Auto 语法是你写的;C 语法是实际运行的。

当你看到并排比较时,试着在阅读解释之前识别每个差异。这个练习能培养你流畅阅读生成的 C 代码所需的直觉。

a2c 转译管线 ​

a2c 转译器将 Auto 源代码转换为 C。管线工作流程如下:

Auto 源代码 (.at)
    |
    v
a2c 解析器 -- 将 Auto 语法解析为 AST
    |
    v
a2c 类型检查器 -- 推断类型,验证语义
    |
    v
a2c 代码生成器 -- 生成 C 代码
    |
    v
C 源代码 (.c) -- 使用任何 C 编译器编译 (gcc, clang, MSVC)

调用方式分两步:

bash
auto a2c          # 将 .at 文件转译为 .c
auto b            # 构建:调用 C 编译器

auto a2c 命令生成人类可读的 C 代码。auto b 命令将 C 编译为可执行文件。你随时可以查看生成的 C 代码,准确理解你的 Auto 程序在 C 层面做了什么。

a2c 不做什么 ​

转译器是刻意保持简单的。它不:

  • 优化你的代码(那是 C 编译器的工作)。
  • 为你管理内存(指针和分配是手动的,与 C 相同)。
  • 提供垃圾收集器或运行时系统。
  • 改变程序的语义。

你在 Auto 中写的就是在 C 中运行的。转译器是语法桥梁,不是魔法盒子。

运行时 ​

Auto 附带一个最小的 C 运行时(stdlib/runtime.c),包含大多数程序需要的标准头文件:<stdio.h>、<stdlib.h>、<string.h>、<stdbool.h>、<stdint.h> 和 <inttypes.h>。a2c 转译器根据你的程序使用的功能包含相应的头文件。你很少需要考虑包含问题——它们会自动处理。

约定 ​

代码块 ​

本书中的代码块使用以下三种标签之一:

  • auto -- Auto 源代码,a2c 的输入。
  • c -- C 代码,手动编写的对比示例或 a2c 的输出。
  • bash -- 用于构建和运行程序的 Shell 命令。

代码清单 ​

Listing 是完整的可运行程序,存储在 listings/ 目录中。每个 Listing 包含:

  • main.at -- Auto 源码。
  • main.expected.c -- a2c 预期的 C 输出。
  • pac.at -- 包配置文件。

C 深潜标注 ​

C 深潜: 这些标注探索 Auto 未直接暴露的 C 特定细节。面向想要理解底层 C 机制——调用约定、内存布局、未定义行为陷阱——的读者。初次阅读时可以跳过,以后再回来。

要点总结 ​

要点: 关键原则在要点框中突出显示。将每个章节最重要的教训浓缩为一句话。把它们收集起来作为你的个人参考。

快速参考 ​

现代 C 概念C 语法Auto 等价写法
主函数int main(void)fn main()
变量声明int x = 5;let x int = 5
可变变量int x = 5;(相同)var x int = 5
数组double A[5] = {...};let A [5]float = [5]float{...}
For 循环for (int i = 0; i < n; i++)for i in 0..n
While 循环while (cond) { }while cond { }
If/elseif (cond) { } else { }if cond { } else { }
Switchswitch (x) { case ... }is x { ... }
打印输出printf("%s\n", "text");print("text")
成功退出return EXIT_SUCCESS;(隐式,return 0)
类型别名typedef int Width;type Width int
结构体struct Point { int x; int y; };type Point { x int, y int }
指定初始化(struct Point){.x = 1, .y = 2}Point(1, 2)
布尔类型bool(通过 <stdbool.h>)bool
大小类型size_t(通过 <stddef.h>)uint

关于原书 ​

Jens Gustedt 的《Modern C》(第二版)由 Manning Publications 出版,也可免费在线获取。它组织为四个层次——相遇、相识、认知和经验——逐步加深读者对 C 的理解。

我们改编了《Modern C》的结构和许多示例,但本书不是原书的替代品。如果你想精通 C 本身——每个边界情况、每个未定义行为陷阱、每个优化机会——请直接阅读 Gustedt 的书。我们的目标是通过 Auto 更简洁的语法让相同的概念更容易接触,同时 C 映射始终可见。

致谢 ​

本改编站在以下工作的肩膀上:

  • Jens Gustedt,编写了 Modern C 并免费提供。
  • C 标准委员会(ISO/IEC JTC1/SC22/WG14),将 C 演进为一门现代语言。
  • Auto 语言项目,提供了 a2c 转译器和工具链。

接下来是什么 ​

第 1 章带你上手第一个 Auto 程序,改编自 Modern C 的开篇示例。你将看到数组、循环和输出在两种语言中的工作方式。第 2 章拆解程序结构——声明、定义和语句。第 3 章涵盖控制流:条件、迭代和多路选择。

让我们开始吧。

基于 MIT 许可发布。