1. 程式人生 > ># 程式執行原理(科普)

# 程式執行原理(科普)

# 程式執行原理(科普)

## 目標

* 計算機中的 **三大件**
* 程式執行的原理
* 程式的作用

## 01. 計算機中的三大件

計算機中包含有較多的硬體,但是一個程式要執行,有 **三個** 核心的硬體,分別是:

1. **CPU** 
    * 中央處理器,是一塊超大規模的積體電路
    * 負責 **處理資料**/**計算**
2. **記憶體**
    * **臨時** 儲存資料(斷電之後,資料會消失)
    * 速度快
    * 空間小(單位價格高)
3. **硬碟** 
    * **永久** 儲存資料
    * 速度慢
    * 空間大(單位價格低)

| CPU | 記憶體 | 硬碟 |
| :---: | :---: | :---: |
| ![CPU-w200](media/14951694921910/CPU.jpg) | ![記憶體條-w200](media/14951694921910/%E5%86%85%E5%AD%98%E6%9D%A1.png)   | ![硬碟-w200](media/14951694921910/%E7%A1%AC%E7%9B%98.jpg) |

### 思考題

1. 計算機中哪一個硬體裝置負責執行程式?
    * **CPU**
2. **記憶體** 的速度快還是 **硬碟** 的速度快?
    * **記憶體**
3. 我們的程式是安裝在記憶體中的,還是安裝在硬碟中的?
    * 硬碟
4. **我買了一個記憶體條,有 500G 的空間!!!**,這句話對嗎?
    * 不對,記憶體條通常只有 `4G` / `8G` / `16G` / `32G`
5. **計算機關機之後,記憶體中的資料都會消失**,這句話對嗎?
    * 正確 

## 02. 程式執行的原理

![001_程式執行示意圖-w](media/14951694921910/001_%E7%A8%8B%E5%BA%8F%E6%89%A7%E8%A1%8C%E7%A4%BA%E6%84%8F%E5%9B%BE.png)

1. 程式 **執行之前**,程式是 **儲存在硬碟** 中的
2. 當要執行一個程式時
    * 作業系統會首先讓 **CPU** 把程式複製到 **記憶體** 中
    * **CPU** 執行 **記憶體** 中的 **程式程式碼**

> **程式要執行,首先要被載入到記憶體**

### 2.1 Python 程式執行原理

![003_Python程式執行示意圖](media/14951694921910/003_Python%E7%A8%8B%E5%BA%8F%E6%89%A7%E8%A1%8C%E7%A4%BA%E6%84%8F%E5%9B%BE.png)

1. 作業系統會首先讓 **CPU** 把 **Python 直譯器** 的程式複製到 **記憶體** 中
2. **Python 直譯器** 根據語法規則,**從上向下** 讓 **CPU** 翻譯 **Python 程式中的程式碼**
3. **CPU** 負責執行翻譯完成的程式碼

#### Python 的直譯器有多大?

* 執行以下終端命令可以檢視 Python 直譯器的大小

```bash
# 1. 確認直譯器所在位置
$ which python

# 2. 檢視 python 檔案大小(只是一個軟連結)
$ ls -lh /usr/bin/python

# 3. 檢視具體檔案大小
$ ls -lh /usr/bin/python2.7
```

> 提示:建立 **軟連結** 的目的,是為了方便使用者不用記住使用的直譯器是 **哪一個具體版本**

## 03. 程式的作用

> 程式就是 **用來處理資料** 的!

* **新聞軟體** 提供的 **新聞內容、評論……** 是資料
* **電商軟體** 提供的 **商品資訊、配送資訊……** 是資料
* **運動類軟體** 提供的 **運動資料……** 是資料
* **地圖類軟體** 提供的 **地圖資訊、定位資訊、車輛資訊……** 是資料
* **即時通訊軟體** 提供的 **聊天資訊、好友資訊……** 是資料
* ……

### 3.1 思考 QQ 程式的啟動過程

1. QQ 在**執行之前**,是儲存在 **硬碟** 中的
2. **執行之後**,QQ 程式就會被載入到 **記憶體** 中了

![003_QQ登陸介面-w248](media/14951694921910/003_QQ%E7%99%BB%E9%99%86%E7%95%8C%E9%9D%A2.png)

### 3.2 思考 QQ 程式的 **登入** 過程

1. 讀取使用者輸入的 **QQ 號碼**
2. 讀取使用者輸入的 **QQ 密碼**
3. 將 **QQ 號碼** 和 **QQ 密碼** 傳送給騰訊的伺服器,等待伺服器確認使用者資訊

#### 思考 1

> 在 QQ 這個程式將 **QQ 號碼** 和 **QQ 密碼** 傳送給伺服器之前,**是否需要先儲存一下 QQ 號碼 和 密碼?**

**答案**

肯定需要!—— 否則 QQ 這個程式就不知道把什麼內容傳送給伺服器了!

#### 思考 2

> QQ 這個程式把 **QQ 號碼** 和 **QQ 密碼** 儲存在哪裡?

**答案**

儲存在 **記憶體** 中,因為 QQ 程式自己就在記憶體中

#### 思考 3

> QQ 這個程式是怎麼儲存使用者的 **QQ 號碼** 和 **QQ 密碼** 的?

**答案**

1. 在記憶體中為 **QQ 號碼** 和 **QQ 密碼** 各自分配一塊空間
    * 在 QQ 程式結束之前,這兩塊空間是由 QQ 程式負責管理的,其他任何程式都不允許使用
    * 在 QQ 自己使用完成之前,這兩塊空間始終都只負責儲存 **QQ 號碼** 和 **QQ 密碼**
2. 使用一個 **別名** 標記 **QQ 號碼** 和 **QQ 密碼** 在記憶體中的位置

![004_QQ號碼和密碼記憶體示意圖](media/14951694921910/004_QQ%E5%8F%B7%E7%A0%81%E5%92%8C%E5%AF%86%E7%A0%81%E5%86%85%E5%AD%98%E7%A4%BA%E6%84%8F%E5%9B%BE.png)

> * 在程式內部,為 **QQ 號碼** 和 **QQ 密碼** 在記憶體中分配的空間就叫做 **變數**
> * **程式就是用來處理資料的,而變數就是用來儲存資料的**