docs(Philosophy): 重构 0.1 节文档结构,新增 GUI/CLI 与环境变量配置内容,完善文档内容,新增代码示例。
This commit is contained in:
@@ -9,20 +9,102 @@ tags: [编程, 哲学, 导论, 基础概念]
|
|||||||
|
|
||||||
# 0.1 编程哲学导论
|
# 0.1 编程哲学导论
|
||||||
|
|
||||||
> **本节导读**:从最本质的角度理解"编程"的含义,建立对代码、编译器、程序的核心认知,并初步了解程序设计的基本哲学思想。
|
> **本节导读**:从"程序"的本质出发,建立对程序分类、运行环境的基础认知,进而理解编程的含义、代码与编译器的核心概念,以及程序设计的基本哲学思想。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 一、什么是编程?
|
## 一、什么是程序?
|
||||||
|
|
||||||
### 1.1 词源解析
|
**程序 (Program)** 是经过编译后生成的 **可执行文件**,是计算机能够直接理解和执行的指令集合。
|
||||||
|
|
||||||
|
### 1.1 核心定义
|
||||||
|
|
||||||
|
| 概念 | 类比 |
|
||||||
|
|------|------|
|
||||||
|
| **源代码** | 乐谱(人可读,但不能直接发声) |
|
||||||
|
| **编译器** | 钢琴家(将乐谱"翻译"为按键动作) |
|
||||||
|
| **程序 / 可执行文件** | 录好的音频文件(可直接播放) |
|
||||||
|
| **运行程序** | 播放录音(计算机执行指令) |
|
||||||
|
|
||||||
|
```
|
||||||
|
main.c (Source Code) --[Compile]--> main.exe (Program) --[Run]--> Output
|
||||||
|
Human Readable Machine Executable User Sees
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.2 程序界面类型与环境变量配置
|
||||||
|
|
||||||
|
针对编程初学者的入门需求,本节从程序的交互形式入手,讲解环境变量的底层逻辑与配置必要性。
|
||||||
|
|
||||||
|
#### ① GUI 与 CLI 的交互模式对比
|
||||||
|
|
||||||
|
| 特性 | GUI(图形用户界面) | CLI(命令行界面) |
|
||||||
|
|:----:|:-------------------:|:-----------------:|
|
||||||
|
| **交互方式** | 通过窗体 (Window) 和控件 (Widget) 进行操作 | 通过输入命令字符串直接操作 |
|
||||||
|
| **上手难度** | 较低,直观可视化 | 较高,需记忆命令语法 |
|
||||||
|
| **适用人群** | 普通用户 | 开发者、运维工程师 |
|
||||||
|
| **自动化能力** | 不利于脚本批量执行 | 极高的自动化容错度 |
|
||||||
|
| **典型场景** | 浏览器、办公软件 | g++ 编译、git 操作、服务器部署 |
|
||||||
|
|
||||||
|
> **NOTE**:作为程序员,我们日常开发主要使用 CLI 工具链(编译器、调试器、版本控制等),但最终交付给用户的通常是 GUI 应用。两者相辅相成。
|
||||||
|
|
||||||
|
#### ② 环境变量的核心作用与配置
|
||||||
|
|
||||||
|
**环境变量 (Environment Variable)** 是操作系统中 **进程级别的键值对**,用于向运行中的程序传递配置信息。其中最关键的便是 **PATH 变量**。
|
||||||
|
|
||||||
|
##### 全局访问机制
|
||||||
|
|
||||||
|
```
|
||||||
|
┌──────────────────────────────────────────────────────┐
|
||||||
|
| How PATH Environment Works |
|
||||||
|
| |
|
||||||
|
| User types: g++ main.c -o main.exe |
|
||||||
|
| |
|
||||||
|
| Terminal Search Order: |
|
||||||
|
| +----------+ +----------+ +----------+ |
|
||||||
|
| | Current |->| PATH |->| PATH |-> ... |
|
||||||
|
| | Dir | | Entry #1 | | Entry #2 | |
|
||||||
|
| | (./) | | (C:/... )| | (D:/... )| |
|
||||||
|
| +----------+ +----------+ +----------+ |
|
||||||
|
| | |
|
||||||
|
| v Found! |
|
||||||
|
| C:/mingw64/bin/g++.exe |
|
||||||
|
| | |
|
||||||
|
| v Execute |
|
||||||
|
| main.c --> main.exe (Success) |
|
||||||
|
└──────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
**本质**:PATH 是一个由分号 (`;`) 分隔的 **目录路径集合**,告知操作系统在任意目录下都能搜索并执行指定的可执行文件(如 `g++.exe`)。
|
||||||
|
|
||||||
|
##### IDE 依赖基础
|
||||||
|
|
||||||
|
IDE(如 VS Code + C/C++ 插件)之所以能一键编译运行,其背后依赖的就是环境变量:
|
||||||
|
|
||||||
|
```
|
||||||
|
用户点击 VS Code 中的 "Run" 按钮
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
VS Code 调用终端命令: g++ main.c -o main.exe && ./main.exe
|
||||||
|
│
|
||||||
|
├─── 如果 PATH 中包含 g++ 所在路径 → 编译成功 ✓
|
||||||
|
│
|
||||||
|
└─── 如果 PATH 中没有 → 报错: 'g++' is not recognized ✗
|
||||||
|
```
|
||||||
|
|
||||||
|
> **NOTE**:编译器(g++)、解释器(Python)、构建工具(make、cmake)等都必须配置到环境变量中,IDE 才能在后台自动调用它们完成编译流程,而无需手动指定完整绝对路径。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 二、什么是编程?
|
||||||
|
|
||||||
|
### 2.1 词源解析
|
||||||
|
|
||||||
| 汉字 | 含义 | 词性 | 说明 |
|
| 汉字 | 含义 | 词性 | 说明 |
|
||||||
|:----:|------|:----:|------|
|
|:----:|------|:----:|------|
|
||||||
| **编** | 编写 | 动词 (verb) | 编写代码的动作 |
|
| **编** | 编写 | 动词 (verb) | 编写代码的动作 |
|
||||||
| **程** | 程序 / 程式 | 名词 (noun) | 具有格式和顺序的结构 |
|
| **程** | 程序 / 程式 | 名词 (noun) | 具有格式和顺序的结构 |
|
||||||
|
|
||||||
### 1.2 核心定义
|
### 2.2 核心定义
|
||||||
|
|
||||||
> **编程 (Programming)**:按照一定的 **格式** 与 **顺序** 编写代码的过程。
|
> **编程 (Programming)**:按照一定的 **格式** 与 **顺序** 编写代码的过程。
|
||||||
|
|
||||||
@@ -41,9 +123,9 @@ tags: [编程, 哲学, 导论, 基础概念]
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 二、核心概念
|
## 三、核心概念
|
||||||
|
|
||||||
### 2.1 什么是代码?
|
### 3.1 什么是代码?
|
||||||
|
|
||||||
**代码 (Code)** 本质上是 **文本文件**,即由 ASCII 字符组成的纯文本。
|
**代码 (Code)** 本质上是 **文本文件**,即由 ASCII 字符组成的纯文本。
|
||||||
|
|
||||||
@@ -58,7 +140,7 @@ tags: [编程, 哲学, 导论, 基础概念]
|
|||||||
| C++ | `.cc` / `.cxx` | C++ 源文件(替代写法) |
|
| C++ | `.cc` / `.cxx` | C++ 源文件(替代写法) |
|
||||||
|
|
||||||
> **NOTE**:`.c` / `.h` 通常用于 C 语言代码;`.cpp` / `.h` / `.cc` / `.cxx` / `.hpp` 通常用于 C++ 代码。
|
> **NOTE**:`.c` / `.h` 通常用于 C 语言代码;`.cpp` / `.h` / `.cc` / `.cxx` / `.hpp` 通常用于 C++ 代码。
|
||||||
|
>
|
||||||
> **NOTE**:只要是合法的 C 或 C++ 的 ASCII 文本(无论使用何种扩展名),都可以被称为 **代码**。
|
> **NOTE**:只要是合法的 C 或 C++ 的 ASCII 文本(无论使用何种扩展名),都可以被称为 **代码**。
|
||||||
|
|
||||||
#### 代码示例
|
#### 代码示例
|
||||||
@@ -80,7 +162,7 @@ int main()
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 2.2 什么是编译器?
|
### 3.2 什么是编译器?
|
||||||
|
|
||||||
**编译器 (Compiler)** 是将 **代码** 转换为 **可执行文件** 的工具。
|
**编译器 (Compiler)** 是将 **代码** 转换为 **可执行文件** 的工具。
|
||||||
|
|
||||||
@@ -109,7 +191,7 @@ int main()
|
|||||||
|
|
||||||
#### 编译流程全景图
|
#### 编译流程全景图
|
||||||
|
|
||||||
以 Windows 上的编译流程为例:
|
以 Windows x64 环境下的 g++ 编译流程为例:
|
||||||
```
|
```
|
||||||
Source File(s)
|
Source File(s)
|
||||||
│
|
│
|
||||||
@@ -141,33 +223,11 @@ Executable File (.exe)
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 2.3 什么是程序?
|
## 四、基本设计哲学
|
||||||
|
|
||||||
**程序 (Program)** 是经过编译后生成的可执行文件,是计算机能够直接理解和执行的指令集合。
|
|
||||||
|
|
||||||
#### 直观类比
|
|
||||||
|
|
||||||
| 概念 | 类比 |
|
|
||||||
|------|------|
|
|
||||||
| **源代码** | 乐谱 (人可读,但不能直接发声) |
|
|
||||||
| **编译器** | 钢琴家 (将乐谱"翻译"为按键动作) |
|
|
||||||
| **程序/可执行文件** | 录好的音频文件 (可直接播放) |
|
|
||||||
| **运行程序** | 播放录音 (计算机执行指令) |
|
|
||||||
|
|
||||||
#### 示例
|
|
||||||
|
|
||||||
```
|
|
||||||
main.c (Source Code) --[Compile]--> main.exe (Program) --[Run]--> Output
|
|
||||||
Human Readable Machine Executable User Sees
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 三、基本设计哲学
|
|
||||||
|
|
||||||
> 以下是我对程序基本设计哲学的理解与总结:
|
> 以下是我对程序基本设计哲学的理解与总结:
|
||||||
|
|
||||||
### 3.1 抽象 (Abstraction)
|
### 4.1 抽象 (Abstraction)
|
||||||
|
|
||||||
用代码的方式 **描述问题**,而不纠结于实现细节。
|
用代码的方式 **描述问题**,而不纠结于实现细节。
|
||||||
|
|
||||||
@@ -189,7 +249,7 @@ Human Readable Machine Executable User Sees
|
|||||||
|
|
||||||
**抽象的意义**:当你写 `print("Hello")` 时,你不需要知道显卡如何渲染像素、操作系统如何调度显示驱动——这就是抽象的力量。
|
**抽象的意义**:当你写 `print("Hello")` 时,你不需要知道显卡如何渲染像素、操作系统如何调度显示驱动——这就是抽象的力量。
|
||||||
|
|
||||||
### 3.2 模块化 (Modularization)
|
### 4.2 模块化 (Modularization)
|
||||||
|
|
||||||
将复杂问题 **分解** 为多个相对独立的子问题,每个子问题构成一个 **模块**。
|
将复杂问题 **分解** 为多个相对独立的子问题,每个子问题构成一个 **模块**。
|
||||||
|
|
||||||
@@ -218,7 +278,7 @@ Calculator App
|
|||||||
- 便于团队协作开发:不同成员负责不同模块
|
- 便于团队协作开发:不同成员负责不同模块
|
||||||
- 方便测试与调试:可单独对 `calc_module` 进行单元测试
|
- 方便测试与调试:可单独对 `calc_module` 进行单元测试
|
||||||
|
|
||||||
### 3.3 封装 (Encapsulation)
|
### 4.3 封装 (Encapsulation)
|
||||||
|
|
||||||
将模块的 **实现细节隐藏** 起来,仅 **暴露必要的接口** 给外部使用。
|
将模块的 **实现细节隐藏** 起来,仅 **暴露必要的接口** 给外部使用。
|
||||||
|
|
||||||
@@ -231,7 +291,7 @@ Calculator App
|
|||||||
│ └────────┬──────────┘ │
|
│ └────────┬──────────┘ │
|
||||||
│ │ │
|
│ │ │
|
||||||
│ ┌────────▼──────────┐ │
|
│ ┌────────▼──────────┐ │
|
||||||
│ │ Private │ │ <- Hidden Details
|
│ │ Private │ │ <- Hidden Details
|
||||||
│ └───────────────────┘ │
|
│ └───────────────────┘ │
|
||||||
└──────────────────────────────┘
|
└──────────────────────────────┘
|
||||||
```
|
```
|
||||||
@@ -244,10 +304,11 @@ Calculator App
|
|||||||
| 函数 `sqrt(x)` | 输入 x,输出根号 x | 牛顿迭代法的具体计算过程 |
|
| 函数 `sqrt(x)` | 输入 x,输出根号 x | 牛顿迭代法的具体计算过程 |
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// math_utils.c -- 实现细节
|
// math_utils.c -- Implementation details hidden
|
||||||
static double newton_sqrt(double n) // static: 仅内部可见性
|
|
||||||
|
static double newton_sqrt(double n) // static: internal visibility only
|
||||||
{
|
{
|
||||||
// 牛顿迭代法的具体实现... 外部不能直接调用此函数
|
// Newton's method implementation... external code cannot call this directly
|
||||||
double guess = n / 2.0;
|
double guess = n / 2.0;
|
||||||
|
|
||||||
for (int i = 0; i < 100; i++) {
|
for (int i = 0; i < 100; i++) {
|
||||||
@@ -257,12 +318,10 @@ static double newton_sqrt(double n) // static: 仅内部可见性
|
|||||||
return guess;
|
return guess;
|
||||||
}
|
}
|
||||||
|
|
||||||
// math_utils.c -- 对外暴露的接口
|
// The only exposed interface
|
||||||
// 仅暴露必要的接口,隐藏实现细节
|
|
||||||
// 例如:sqrt(9) = 3.0, sqrt(16) = 4.0
|
|
||||||
double sqrt(double n)
|
double sqrt(double n)
|
||||||
{
|
{
|
||||||
if (n < 0) return 0.0; // 内部校验逻辑,负数返回0
|
if (n < 0) return 0.0; // Internal validation logic
|
||||||
|
|
||||||
return newton_sqrt(n);
|
return newton_sqrt(n);
|
||||||
}
|
}
|
||||||
@@ -277,15 +336,15 @@ double sqrt(double n)
|
|||||||
|
|
||||||
## 本节小结
|
## 本节小结
|
||||||
|
|
||||||
| 概念 | 核心要点 |
|
| 章节 | 核心要点 |
|
||||||
|------|----------|
|
|------|----------|
|
||||||
| **编程** | 按照格式顺序编写代码,本质是对文件的操作 |
|
| **一、程序** | 编译后的可执行指令集;分为 GUI/CLI 两类;依赖 PATH 环境变量实现全局调用 |
|
||||||
| **代码** | ASCII 文本文件,具有约定扩展名规范 |
|
| **二、编程** | 按照格式顺序编写代码,本质是对文件的操作 |
|
||||||
| **编译器** | 将代码转换为可执行文件的工具,经历预处理→编译→汇编→链接 |
|
| **三、代码** | ASCII 文本文件,具有约定扩展名规范 |
|
||||||
| **程序** | 编译后的可执行指令集 |
|
| **三、编译器** | 将代码转换为可执行文件的工具,经历预处理→编译→汇编→链接 |
|
||||||
| **抽象** | 关注"做什么",忽略实现细节 |
|
| **四、抽象** | 关注"做什么",忽略实现细节 |
|
||||||
| **模块化** | 分而治之,降低复杂度 |
|
| **四、模块化** | 分而治之,降低复杂度 |
|
||||||
| **封装** | 隐藏实现,暴露接口 |
|
| **四、封装** | 隐藏实现,暴露接口 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
printf("Hello World!\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user