---
# System prepended metadata

title: '[C] 第?章 環境建置篇'
tags: [c, tutorial]

---

<style>
.text-img {
    width: 1em;    
}

.codeblock {
    width: 2em;    
}
</style>

## 前言

C語言是一個高效率的程式語言，不同於Python等高等程式語言，C語言的檔案(`*.c`)無法像是Python一樣按下按鈕就可以直接執行，在寫完`.c`檔案時，我們需要手動使用編譯器(compiler)把`.c`檔案轉換成`.exe`檔案。

> `.c`為C語言的專屬檔案格式，其編碼格式跟純文字檔一模一樣(皆為`utf-8`)，故`.c`檔案是可以用記事本(notepad)進行編輯的喔！

> `.exe`檔案為window專屬的格式，在macOS上會是`.app`檔，而在linux則沒有為這種可執行的二進位檔案給予其他後綴。

> `.exe`檔案不能用一般文字編輯器開啟，因為`.exe`檔案是二進制的，吃`utf-8`檔案格式的編輯器無法順利讀取。但是也有一些特殊的編輯器可以開啟這種二進位檔案，不過打開後都是`0010001001001...`，也不會有人看得懂😂。

## 編譯還是直譯？

說到這邊，我們可以來比較一下編譯(compile)與直譯(interpret)的差異。

| | 編譯 compile | 直譯 interpret |
| :---: | :---: | :---: |
| 邏輯 | 將文字檔案**翻譯**成二進位檔案 | 直接執行文字檔案 |
| 結果 | 會產生一個`.exe`檔案並執行它 | 中途不會產生其他檔案 |
| 效率 | 非常高(執行`.exe`檔時不必再翻譯) | 非常低 |
| 特點 | 只要語法有錯 編譯時期就會被抓到 | 只會在執行到錯誤的行數時才會報錯 |
| 舉例 | c / c++ / rust / java | python / javascript |

電腦是binary的編碼格式，在硬體層是用高電位(1)與低電位(0)來儲存此資訊，而人類很明顯不是以1/0溝通。所以翻譯人類看得懂的格式給電腦看是非常重要的。編譯器與直譯器都有此功能。而差別可以用以下舉例說明。

小傑(非本人🤣)作為一個以中文為母語的人類，並不懂其他語言，但是小傑是一個數學天才，全世界的人都想問他數學問題。但是小傑發現，好多人寄來的數學問題都不是以中文敘述，~~所以小傑決定放棄他們(X)~~，所以小傑決定請一個翻譯專家進行對這些題目進行翻譯。

| 角色 role | 對照 reflection |
| :---: | :---: |
| 小傑 | 電腦 |
| 中文 | 二進位 |
| 其他語言 | 文字格式 |
| 翻譯專家 | 編譯器或是直譯器 |

翻譯員試了兩種方式

1. 整份翻譯完後重寫一份以中文為敘述的題目給小傑寫
2. 在小傑身旁逐行翻譯念給小傑，小傑一邊寫題目

| 1 | 2 |
| :---: | :---: |
| 編譯器 | 直譯器 |
| 會產生新檔案 | 不產生新檔案 |
| 寫題目的效率很高 | 寫題目的效率很低 |

這就是編譯與直譯的區別啦！

❗ 如果學到一定程度後想更了解編譯原理，筆者這邊推薦一些資源。(持續更新)

* <img src="https://cdn-icons-png.flaticon.com/512/1384/1384060.png" class="text-img"/> [How computer read code?](https://www.youtube.com/watch?v=QXjU9qTsYCc&ab_channel=FrameofEssence)
* <img src="https://hackmd.io/_uploads/rkdVR9AKh.png" class="text-img"/> [CPU運作原理](https://blog.codylab.com/how-cpu-works/)


## 被耽誤很久的環境建置

因為是初學者(應該吧)，在這邊推薦使用整合開發環境IDE(Itergrated Developement Environment)進行撰寫。而筆者推薦<img src="https://1.bp.blogspot.com/-rz3FvejBwD0/XuEVVp8UBQI/AAAAAAAABrk/TJLCJsFkdPoSx7JBmiekrwlSjIZSH91TgCNcBGAsYHQ/s1600/codeblock.png" class="codeblock"/> [codeBlocks](http://www.codeblocks.org/downloads/binaries/)。

windows用戶可以直接用官方的[setup工具](https://www.fosshub.com/Code-Blocks.html?dwl=codeblocks-20.03-setup.exe)進行安裝喔~~
下載完的`.exe`檔案直接執行，一直按next就好。

安裝完後就可以正常開啟codeBlocks了！

## 美化你的codeBlocks

### 調整顏色主題

> 參考[@carlochuang的設計](https://hackmd.io/@carlochuang/codeblocks-theme)

筆者設定會參照上面文章並做些許微調😉

1. 先下載[模擬visual studio主題的設定檔](https://drive.google.com/uc?export=download&id=1qMW-lH3yln37KdykkiAWQU7Gc9Xn6DZE)
2. 確保至少開啟過一次codeBlocks並關閉codeBlocks
3. 找到codeBlocks的安裝目錄

:::spoiler *尋找資料夾for windows用戶*
* 先按`win + r`
* 打`%appdata%`
![](https://hackmd.io/_uploads/ryxyC8OUh.png)
* 應該會跳轉到`C:\Users\{USER_NAME}\AppData\Roaming`
* 選擇`codeBlocks`資料夾
:::

<br />

4. 複製一份`default.conf`並命名成`default_original.conf`(名稱可以自訂)
5. 複製一開始下載的檔案內容到`default.conf`(用記事本開啟並複製即可)
6. 存檔並重啟codeBlocks

這樣子就有暗色主題了喔！
可以按左上角`File > new file(ctrl + shift + n)`創建新檔案
`ctrl + s`存檔，格式選擇`.c`
就可以看到變色了！

### 調整字體

1. 在codeBlocks上面選擇條選擇`Settings > Editor`
2. `General settings`中選擇`font`，按下`choose`

![](https://hackmd.io/_uploads/SylxbwuU3.png)

3. 打`Consolas`然後按`ok`

![](https://hackmd.io/_uploads/BkjwbwdUn.png)

### 調整鼠標顏色

由於鼠標顏色內建是黑色，但是我們剛剛不小心把背景調成了黑色，所以現在要改變鼠標顏色！

1. 在codeBlocks上面選擇條選擇`Settings > Editor...`
2. `Margins and caret`中選擇`caret`，顏色調成白色(寬度可以自訂)

![](https://hackmd.io/_uploads/rJg4fv_Ln.png)

### 其他設定

1. 進到`Settings > Environment`
2. 選則`Colours`，修改下列項目。

![](https://hackmd.io/_uploads/S1CjrDdLn.png)

| 項目 | 說明 | 修改數值 |
| :---: | :---: | :---: |
| Code completion : Tooltip/Calltip background | 提示框背景顏色 | `R60 G60 B60` |
| Code completion : Tooltip/Calltip foreground | 提示框文字顏色 | `R212 G212 B212` |
| Code completion : Tooltip/Calltip highlight | 提示框高亮文字顏色 | `R100 G210 B230` |
| Editor : Highlight occurrence | 和選取文字相同文字的標記顏色 | `R255 G0 B127` |
| Editor : Line numbers background colour | 行數區域背景顏色 | `R40 G40 B40` |
| Editor : Line numbers foreground colour | 行數區域文字顏色 | `R133 G133 B133` |
| Editor : Margin chrome colour | 行數和程式碼中間區域的顏色 | `R30 G30 B30` |
| Editor : Margin chrome highlight colour | 行數和程式碼中間區域的顏色 | `R30 G30 B30` |

3. 進到`Settings > Editor`
4. 選擇`General settings`

開啟`Editor settings > Show indentation guides`
![](https://hackmd.io/_uploads/BkWWPvOUh.png)

開啟`Other editor settings > Highlight line under caret`
![](https://hackmd.io/_uploads/Sy5OPDOLn.png)

至此，你的codeBlocks就被整的十分現代化了。建議重啟來儲存設定。

![](https://hackmd.io/_uploads/HyMvOP_Uh.png)

### 進階字體教學

在寫程式時，我們常用一些符號的組合來表示其他難以被鍵盤打出的符號，如**不等於(!=)**，**箭頭(->)**，而有辦法只改變字體實現符號的相連嗎？

有！~~不然我寫幹嘛。~~

字體其實有一種設定，叫做**連字 ligature**，若啟用連字設定，在使用該字體時，匹配到一定的模式(pattern)，就會顯示特殊的文字。

筆者這邊給大家很好玩的字體去體驗連字 — [Google Icon](https://fonts.google.com/icons?icon.style=Outlined)。
裡面所有的icon都是透過打底下的字，匹配pattern，最後顯示特殊的圖案。
至於怎麼測試呢... 筆者做了一個網站來給大家玩玩這個字體。
:point_right: [Font Ligartures Playground](https://zzzje.github.io/demo/google_icons/)
輸入區可以匹配的icons都能在[這個網站](https://fonts.google.com/icons?icon.style=Outlined)找到。

但是這個字體不是我們要的，~~誰會需要這些icons呢。~~
我們需要的是[Fira code](https://fonts.google.com/specimen/Fira+Code)

1. 進入網站後點擊download按鈕
![](https://hackmd.io/_uploads/S1TOQvGq3.png)
2. 解壓縮下載好的壓縮檔
3. 選取以下檔案
![](https://hackmd.io/_uploads/ryQsHDG5h.png)
> `.ttf`為字體專用的檔案。
4. 打開電腦設定
![](https://hackmd.io/_uploads/HJW3VvGc3.png)
5. 搜尋打`font`，選第一個
![](https://hackmd.io/_uploads/SkFIrvzch.png)
6. 把第3步的5個檔案拖進去

如此一來，你的電腦就有Fira code這個字體了。
接著進入codeBlocks。

1. 將字體改成Fira Code。若忘記怎麼做，可以查看[上面的字體更改教學](#調整字體)。
2. 開啟`Settings > Editor... > General settings > Other editor settings`
3. `Technology`從`Default`改成`DirectWrite`
![](https://hackmd.io/_uploads/By5IDwz5h.png)

大功告成！讓我們來看看 **!=** **->** **=>** 變的怎麼樣吧！
![](https://hackmd.io/_uploads/rJJTPDGq3.png)
是不是超級漂亮:+1:。 