---
slug: how-program-runs
lesson: 2
chapter: 1
chapterTitle: 程序
title: C++ 程序是怎么跑起来的？从代码到运行发生了什么
description: 源代码必须先编译成机器码才能运行。本课讲清编译与运行的关系、编译错误与运行错误的区别，并用动态流程图观察程序一步一步执行的过程。
code: |
  #include <iostream>
  using namespace std;

  int main() {
      int a = 6;
      int b = 7;
      cout << a * b << endl;
      return 0;
  }
faq:
  - q: 编译和运行是一回事吗？
    a: 不是。编译是把源代码翻译成机器码，只需一次；运行是执行翻译出的程序，可以执行多次。编译不通过，程序不会进入运行阶段。
  - q: 编译错误和运行错误有什么区别？
    a: 编译错误发生在翻译阶段，程序尚未执行，如漏分号、变量未定义，编译器会指明出错位置；运行错误发生在程序执行期间，如除以零、数组越界，通常表现为崩溃或结果错误。
  - q: 为什么 C++ 不能直接运行源代码？
    a: 因为 CPU 只能执行机器码。源代码是写给人阅读的，必须由编译器先翻译。这也是 C++ 运行快的原因之一——翻译工作在运行前已全部完成。
---

<div class="answer">
CPU 只认识机器码，读不懂源代码。因此从代码到运行分两步：
先由编译器把源代码整体翻译成机器码（编译），再由操作系统执行翻译出的程序（运行）。
编译不通过，运行无从谈起。
</div>

## 两步：先编译，后运行

点击一次「运行」，背后依次发生两件事：

1. **编译**：编译器把源代码从头到尾翻译成机器码。翻译通过，得到可执行程序；翻译失败，得到编译错误。
2. **运行**：操作系统启动该程序，从 main 开始逐句执行，直到 return 结束。

```cpp
#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 包含的头文件到底是什么。
