# 再觀電腦! ep.1
###### tags: `csst`
## 黃恩明
---
## 電腦基礎架構
- 硬體:CPU 、RAM 、Storage 、GPU
- 軟體:OS、核心、呼叫、中斷
----
### CPU
- Central Processing Unit
- 中央處理器
- 電「腦」

----
### RAM
- Random Access Memory
- ~~隨機存取存儲器~~ 記憶體
- 家用量級:4~128GB

----
### 硬碟
- 傳統硬碟 HDD(有馬達)
- 固態硬碟 SSD(隨身碟)
- 家用量級: 256GB~4TB
 
----
### 科普 - 資料有無重量?

> <span> ~~資料有重量,不信的話把硬碟拿掉看電腦會不會變輕~~ <!-- .element: class="fragment" data-fragment-index="1" --></span>
----
### 科普 - 資料有無重量?
- 若電子在 Floating Gate ,代表 0 ;反之為 1
- 電荷守恆

----
### RAM vs. 硬碟
|| 記憶體 (RAM) | 硬碟 (HDD, SSD) |
|:---:|:---:|:---:|
| 用途 | 快速讀寫資料 | 長期儲存資料 |
| 關機後資料 |消失 | 還在 |
| 存取速度 | 快 | 慢 (SSD > HDD) |
| 舉例 | 書桌 | 書櫃 |
----
### GPU
- Graphics Processing Unit
- 圖形處理器
 /cdn.vox-cdn.com/uploads/chorus_asset/file/19970190/2555435ebae590030837.15346566_NVIDIA_A100_GPU.jpg =360x)
----
### 作業系統 (Operating System)

----
#### 使用者模式/核心模式
- 避免使用者覆寫系統資料
- 需要執行特殊指令時透過 *System Call 系統呼叫* 轉移至核心模式(Ex: 關機)
----
#### 系統呼叫 (System Call)

----
#### 中斷 (Interrupt)
- 暫停目前的工作,做完中斷事件後再繼續處理目前的工作。**不一定是出錯**
- 硬體中斷:
- 按下鍵盤
- 插入隨身碟
- 軟體中斷:
- System Call
- $\div0$ 、存取非法記憶體
---
## 程式之旅
- 編輯器
- 開發整合環境
- 編譯器
----
### 編輯器
- Text Editor (Notepad, VS Code, etc.)
- 原始用途純粹為打字
 
----
### 開發整合環境
- IDE (**I**ntegrated **D**evelopment **E**nvironment)
- 編輯器 + 編譯器 + 除錯工具等...
- Ex: Code::Blocks、安裝套件後的 VS Code
- [VS Code C語言環境設定教學](https://hackmd.io/@tangerine1202/rJtDbme3H)

----
## 編譯器 (Compiler)
1. 預處理 (Preprocessing)
2. 編譯 (Compilation)
3. 組譯 (Assembly)
4. 連結 (Linking)
----
### Example
```c=
#include <stdio.h>
#define BANG(x) printf(x)
int main() {
/* Hello World! */
BANG("Hello World!\n");
return 0;
}
```
----
### 預處理 (Preprocessing)
1. 處理define、註解
2. 新增行號和檔案標識
```bash
gcc -E -ansi hello.c
```
```c=
# 874 "/usr/include/stdio.h" 3 4
# 3 "hello.c"
int main() {
printf("Hello World!\n");
return 0;
}
```
----
### 編譯 (Compilation)
1. 詞法分析 - 產生單字
2. 語法分析 - 組成句子
3. 語義分析 - 理解語意
4. 轉成 *組合語言*
----
### 編譯 (Compilation)
```bash
gcc -S -ansi hello.c
```
```bash
_main: ## @main
.cfi_startproc
## %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $16, %rsp
movl $0, -4(%rbp)
leaq L_.str(%rip), %rdi
movb $0, %al
callq _printf
xorl %ecx, %ecx
movl %eax, -8(%rbp) ## 4-byte Spill
movl %ecx, %eax
addq $16, %rsp
popq %rbp
retq
.cfi_endproc
## -- End function
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "Hello World!\n"
```
----
### 組譯 (Assembly)
將組合語言轉成*目標檔案 (object file)* : 機器碼 / binary
```0101010101```
----
### 連結 (Linking)
將目標檔案 (object file) 與標頭檔等其他檔案連結起來,產生可執行檔

----
### 總結

{"metaMigratedAt":"2023-06-15T12:54:09.695Z","metaMigratedFrom":"Content","title":"再觀電腦! ep.1","breaks":true,"contributors":"[{\"id\":\"2308ee1b-d046-4851-80ab-090ecbeaf503\",\"add\":5317,\"del\":1430}]"}