本系列逐章讲解eigen库。
学编程之前,先搞懂"程序到底是什么"。本章不用写代码,但会帮你建立正确的认知,后面学起来事半功倍。
1.1 计算机是一台"听话的机器"
计算机(电脑)本质上是一台只会执行简单指令的机器。它没有"聪明"可言,你让它做什么,它就做什么,一个字都不差。
它的核心部件只有几个:
| 部件 | 作用 | 类比 |
|---|---|---|
| CPU(中央处理器) | 执行计算和指令 | 大脑 |
| 内存(RAM) | 临时存放正在用的数据 | 书桌(桌面) |
| 硬盘(磁盘) | 长期存放数据 | 书柜 |
| 输入/输出设备 | 键盘、鼠标、屏幕 | 眼睛、嘴、手 |
理解 CPU 和内存的关系非常重要,后面会反复用到:
- CPU 只能处理内存里的数据。硬盘里的数据要先"读"到内存,CPU 才能用。
- 内存是临时的,断电就没了;硬盘是永久的,断电还在。
- 内存很快但容量小,硬盘慢但容量大。
1.2 程序是什么
程序(program)= 一串指令。它告诉计算机:先做什么、再做什么、遇到什么情况怎么办。
比如"计算两个数的和"这个程序,翻译成计算机能懂的指令,大致是:
- 从内存里取出第一个数
- 取出第二个数
- 把两个数加起来
- 把结果存回内存
- 把结果显示到屏幕上
就这么简单。再复杂的软件——微信、游戏、自动驾驶——拆开看,都是无数个这样简单步骤的堆叠。
1.3 编程语言:人和机器之间的"翻译官"
问题来了:CPU 只认识机器码(一串 0 和 1,比如10110000 01100001)。让人直接写 0 和 1,会疯掉。
于是人们发明了编程语言,它是一套人容易读写的规则。比如:
intsum=a+b;// 用人话写,就是"把 a 加 b 的结果存到 sum 里"编程语言分两大类:
- 低级语言:贴近机器,难写但快(如汇编语言)。
- 高级语言:贴近人类,好写好读(如 C++、Python、Java)。
C++ 是一门高级语言,但它的特点是"高级语言的外表,低级语言的控制力"——既能写得像人话,又能精细控制硬件,所以又快又灵活。
1.4 编译:把"人话"翻译成"机器话"
用高级语言写的代码(叫源代码),机器看不懂。需要一个"翻译官"把它翻译成机器码。这个翻译官叫编译器。
翻译方式有两种:
| 方式 | 代表语言 | 特点 |
|---|---|---|
| 编译型 | C++、C、Rust | 先整体翻译成机器码(生成 .exe),再运行。运行快 |
| 解释型 | Python、JavaScript | 边读边翻译边运行。开发快,但运行慢 |
C++ 是编译型语言。所以写 C++ 的流程是:
写源代码 (.cpp) → 编译 (编译器) → 生成可执行文件 (.exe) → 运行这个"先编译、再运行"的流程,你会在第 2 章亲手走一遍。
为什么要学 C++?
C++ 又快又灵活,是高性能计算的首选。游戏引擎(虚幻引擎)、机器人(ROS)、计算机视觉(OpenCV)、科学计算、量化交易、操作系统……大量底层和高性能场景都在用 C++。而Eigen正是 C++ 生态里最常用的科学计算库之一,学会 C++ 是掌握 Eigen 的前提。
1.5 写程序的完整流程(心中有数)
以"写一个计算程序"为例,完整流程是:
- 分析问题:要算什么?输入是什么?输出是什么?
- 设计算法:用什么步骤算出来?(算法 = 解决问题的步骤)
- 写代码:用 C++ 把步骤写下来
- 编译:用编译器翻译成机器码
- 运行测试:跑起来,看结果对不对
- 调试修改:错了就找 bug、改、再编译
编程的本质,就是把解决问题的步骤,用编程语言精确地描述出来。你的价值在于"想出步骤",而"敲代码"只是把想法写下来。
1.6 什么是"算法"
算法(algorithm)就是解决某类问题的明确步骤。它和编程语言无关——你可以用中文描述算法,也可以用 C++ 描述。
举例,计算1 + 2 + 3 + ... + 100:
- 算法 A(笨办法):1+2=3,3+3=6,6+4=10…… 加 99 次。
- 算法 B(聪明办法):用公式
(1+100) × 100 ÷ 2 = 5050,一步搞定。
两个算法都能得到正确答案,但 B 快得多。学习编程,一半是在学"如何设计好的算法"。
1.7 小结
- 计算机只会执行简单指令,程序就是一堆指令。
- CPU 处理内存里的数据,内存临时、硬盘永久。
- 编程语言是人和机器之间的翻译官。
- C++ 是编译型高级语言:写源码 → 编译 → 运行。
- 算法是解决问题的步骤,编程是把步骤写下来。
下一章,我们装上编译器和编辑器,亲手写出并运行你的第一个 C++ 程序。
练习题
- 用自己的话说说:CPU、内存、硬盘分别是什么?它们之间有什么关系?
- 编译型语言和解释型语言的区别是什么?C++ 属于哪一种?
- 用中文描述一个算法:“判断一个数是奇数还是偶数”。
- 为什么说"编程的本质是把解决问题的步骤精确地描述出来"?
这类题没有标准答案:写下你自己的说法就行。读完第 2 章(环境与第一个程序)后回头看一遍,能把自己的描述改成机器听得懂的步骤,就是合格。