C++ 程序是怎么跑起来的?从代码到运行发生了什么
CPU 只认识机器码,读不懂源代码。因此从代码到运行分两步:
先由编译器把源代码整体翻译成机器码(编译),再由操作系统执行翻译出的程序(运行)。
编译不通过,运行无从谈起。
两步:先编译,后运行
点击一次「运行」,背后依次发生两件事:
- 编译:编译器把源代码从头到尾翻译成机器码。翻译通过,得到可执行程序;翻译失败,得到编译错误。
- 运行:操作系统启动该程序,从 main 开始逐句执行,直到 return 结束。
#include <iostream>
using namespace std;
int main() {
int a = 6;
int b = 7;
cout << a * b << endl;
return 0;
}
在 CppStudio 中运行本课示例:编译瞬间完成,运行阶段流程图依次高亮 a = 6、b = 7、输出 42、return——程序不是一瞬间完成的,它一步一步往下走。
两类错误,两个阶段
分清两个阶段,才能分清两类错误:
| 编译错误 | 运行错误 | |
|---|---|---|
| 发生时机 | 翻译阶段,程序未执行 | 程序执行期间 |
| 典型例子 | 漏分号、变量未定义 | 除以零、数组越界、死循环 |
| 表现 | 编译器指明第几行第几列 | 崩溃、卡住或结果错误 |
| 修复难度 | 低,按报错位置修改 | 高,需要观察运行过程 |
编译错误是初学阶段最常见的报错,它不是惩罚,而是编译器在逐行校对你的代码。
为什么要可视化
传统方式中「运行」是黑盒:按下按钮,只能看到最终结果。中间哪句先执行、变量何时变化,全靠推测。运行错误难修,根本原因就是这个过程不可见。
CppStudio 在浏览器本地完成编译(代码不离开你的设备),运行过程以动态流程图呈现,每个变量的每次变化都记录在监视区。看得见,才修得了。
动手验证
把示例中的 int b = 7; 改为 int b = ; 再运行:程序不会进入运行阶段,编译器直接报出出错行号。改回正确写法再运行一次,对比两个阶段的差异。
下一课:#include 包含的头文件到底是什么。
常见问题
编译和运行是一回事吗?
不是。编译是把源代码翻译成机器码,只需一次;运行是执行翻译出的程序,可以执行多次。编译不通过,程序不会进入运行阶段。
编译错误和运行错误有什么区别?
编译错误发生在翻译阶段,程序尚未执行,如漏分号、变量未定义,编译器会指明出错位置;运行错误发生在程序执行期间,如除以零、数组越界,通常表现为崩溃或结果错误。
为什么 C++ 不能直接运行源代码?
因为 CPU 只能执行机器码。源代码是写给人阅读的,必须由编译器先翻译。这也是 C++ 运行快的原因之一——翻译工作在运行前已全部完成。