5.1 软件的分类
| 类别 | 作用 | 举例 |
|---|---|---|
| 系统软件 | 管理硬件、提供基础服务 | 操作系统(Windows/Linux)、驱动程序、编译器 |
| 应用软件 | 完成特定用户任务 | 浏览器、Office、游戏、微信 |
| 中间件 | 连接不同软件组件 | 数据库(MySQL)、消息队列(RabbitMQ)、Web服务器(Nginx) |
5.2 源代码与编译
程序从人类可读的源代码变成机器可执行的二进制代码,有两种方式:
| 方式 | 过程 | 代表语言 |
|---|---|---|
| 编译型 | 源码 → 编译器 → 可执行文件 | C、C++、Go、Rust |
| 解释型 | 源码 → 解释器逐行执行 | Python、JavaScript、Ruby |
| 混合型 | 源码 → 字节码 → 虚拟机执行 | Java、C# |
编译型:hello.c → gcc → hello.exe(可独立运行)
解释型:hello.py → python → 逐行执行(需要Python环境)
5.3 开源 vs 闭源
| 开源(Open Source) | 闭源(Proprietary) | |
|---|---|---|
| 源码可见 | ✅ 任何人都能看 | ❌ 只有开发者可见 |
| 自由修改 | ✅ 可以 | ❌ 不可以 |
| 免费 | 大多数免费 | 通常收费 |
| 安全审计 | 任何人都能审 | 只能信任厂商 |
| 代表 | Linux、Firefox、VSCode | Windows、Office、Photoshop |
💡 开源不等于免费,但大部分开源软件确实免费。开源的核心是自由——自由使用、修改、分发。
5.4 包管理器
包管理器是软件管理的革命——一条命令安装、更新、卸载软件。
| 系统 | 包管理器 | 命令示例 |
|---|---|---|
| Ubuntu/Debian | apt | `apt install nginx` |
| macOS | Homebrew | `brew install python` |
| Windows | winget/choco | `winget install Firefox` |
| Python | pip | `pip install requests` |
| Node.js | npm | `npm install express` |
5.5 程序运行时的内存布局
当一个程序运行时,操作系统为它分配一块虚拟内存:
高地址 ┌────────────┐
│ 栈(Stack) │ ← 局部变量、函数调用,向下增长
├────────────┤
│ ↓ │
│ 空闲区域 │
│ ↑ │
├────────────┤
│ 堆(Heap) │ ← 动态分配(malloc/new),向上增长
├────────────┤
│ 数据段(.data)│ ← 全局变量、静态变量
├────────────┤
│ 代码段(.text)│ ← 机器指令,只读
低地址 └────────────┘
理解内存布局有助于理解:为什么"栈溢出"会发生(递归太深),以及为什么指针错误会导致程序崩溃。
📖 上一篇:[第4章:文件系统](04-文件系统.html)