Lesson 1:迈出第一步
对齐原书 Lesson 1「はじめの一歩」:建立程序、源代码、编译器和可执行文件的第一条证据链,学会完成编辑、编译、运行与纠错闭环。
学习目标
- 能解释程序、源代码、编译器与可执行文件之间的关系
- 能写出并执行一条最小 C++ 构建命令,判断失败发生在编译还是运行阶段
- 能设计“编辑—编译—运行—观察—修正”的最小练习闭环
为什么第一步不是背语法
刚开始学习 C++ 时,最重要的成果不是记住多少关键字,而是亲手打通一条可重复的路径:把想法写进文本文件,让工具把文本翻译成机器可执行的形式,再观察计算机是否按预期工作。只要这条路径畅通,后面的变量、运算符、分支和类都能通过实验验证;若路径不通,再正确的语法知识也只能停在纸面。
↡为解决某个问题而安排的一组计算机指令;源文件是它的文本表示,可执行文件是经工具翻译后的机器表示。程序不是源文件本身,也不是编辑器窗口。源文件可以被复制、审查和修改;编译器读取源文件并生成目标代码;链接器再组合所需代码,形成可执行文件;操作系统加载可执行文件后,CPU 才真正执行指令。把这些对象分清,才能读懂“文件找不到”“语法错误”“链接失败”和“程序输出错误”分别属于哪一层。
从问题到可观察结果
假设任务是“在终端显示一句话”。人先把需求缩成可观察的结果:启动程序后,标准输出应出现指定文本,进程应正常结束。接着才选择 C++ 表达它。这个顺序很关键,因为“代码能编译”只证明形式被工具接受,不证明它满足需求。
#include <iostream>
int main() {
std::cout << "C++ is ready\n";
return 0;
}此时不必一次学完每个符号。先把它当作一份最小实验材料:文件名为 hello.cpp,预期输出为 C++ is ready,预期退出状态为 0。下一课再逐行拆解 main、std::cout 和语句结构。本课要掌握的是如何证明这份材料真的经过翻译并运行。
工具链各自负责什么
完整工具链至少包含编辑器、编译器、链接器、运行环境和终端。集成开发环境会把它们放进一个窗口,但责任并没有消失。理解责任边界后,即使换成 Visual Studio、Xcode、CLion 或命令行,也能用同一模型定位问题。
↡读取 C++ 源代码,执行语法与类型检查,并把它翻译成较低层目标代码的工具。 ↡把一个或多个目标文件与所需库组合起来,解析跨文件符号并生成最终程序的工具。g++ 或 clang++ 驱动程序通常会依次调用预处理、编译、汇编和链接步骤。下面的一条命令隐藏了多阶段,但输入和输出仍然明确:左侧是源文件,-o 后是要生成的可执行文件。
g++ -std=c++17 -Wall -Wextra hello.cpp -o hello-std=c++17 固定语言版本,避免不同机器默认标准不同;-Wall -Wextra 打开常见警告,使可疑代码尽早暴露;-o hello 明确产物名称。命令没有输出且退出状态为 0,通常表示构建成功,但还没有证明程序运行结果正确。
编译成功之后还要运行
在 macOS 或 Linux 终端中,当前目录通常不在命令搜索路径里,所以要写 ./hello。运行后同时观察标准输出和退出状态:前者回答“程序说了什么”,后者回答“进程是否按约定结束”。
./hello
echo $?预期先看到 C++ is ready,随后看到 0。Windows 的可执行文件通常带 .exe 后缀,集成开发环境的“运行”按钮也会完成同样的加载动作。不要把“点击按钮”记成某个工具专属魔法,应把它还原为“选择某个已构建产物并启动进程”。
先预测错误属于哪一层
先预测三个改动会发生什么:删掉字符串末尾的双引号,编译器应在翻译源代码时拒绝;把输出文字改错,仍可编译运行,但观察结果不符合需求;删除已生成的 hello 后直接运行,则由终端或操作系统报告找不到产物。三种现象分别对应编译错误、逻辑错误和运行入口错误。
错误信息要从第一条有定位的诊断开始读。后续几十条错误常由第一个缺失符号连锁产生。先确认命令处理的是哪一个文件,再看行列位置和错误类别,修正最小范围后重新执行同一命令。这样每次实验只改变一个变量,结论才可信。
保存、重建与陈旧产物
初学者常遇到“明明改了代码,输出却没变”。最常见原因不是 C++ 缓存,而是编辑器内容没有保存,或运行了另一个目录里的旧可执行文件。核对链路时应明确三件事:源文件路径、构建命令中的输入路径、实际启动的产物路径。
可以故意把输出改成 C++ toolchain verified,保存后重新构建,再运行。若结果没变化,先检查文件时间和当前目录,而不是继续改语法。这个练习建立的是一种工程习惯:每个结论都能回到具体输入、命令、产物和观察。
一次完整的最小闭环
第一步:定义输入与预期
在 hello.cpp 中写入最小程序,记录预期输出和退出状态。确认文件已保存,并且终端当前目录能看到它。
小结
- 程序从需求出发,源代码只是可编辑的文本表示;可执行文件才是操作系统加载的产物
- 编译器检查并翻译单个源文件,链接器组合目标代码和库;工具可以集成,责任边界不会消失
- “构建成功”与“行为正确”是两项证据,必须运行并比较实际结果与预期
- 诊断应从第一条根因开始,每次只改一个变量;输出没变化时先核对保存状态、路径和产物
- 最小学习闭环是编辑、保存、构建、运行、观察、修正,再用同一命令复验
练习
- 问题 1:建立证据链。 写出从
hello.cpp到屏幕输出至少经过的四个对象或动作,并说明每一步的输入与输出。
- 问题 2:分类故障。 缺失双引号、输出文字写错、可执行文件不存在,分别属于什么阶段?
- 问题 3:处理陈旧输出。 修改文本并重新运行后结果未变化,给出不改代码的排查顺序。
名词解释
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 程序
- 为解决问题而组织的一组指令,在学习闭环中同时包含可编辑表示与可执行表示。
- 源代码
- 人可读、由编译器处理的程序文本,C++ 实现文件通常以 .cpp 结尾。
- 编译器
- 检查并翻译源代码的工具,负责发现语法和类型层面的错误。
- 链接器
- 解析跨目标文件和库的符号,生成最终可执行产物的工具。
- 可执行文件
- 链接后由操作系统加载的程序产物,不等同于源文件或编辑器工程。