電腦編程嘅大綱

以下呢篇大綱，旨在將電腦編程會用到嗰啲重要概念冚唪唥列嗮佢哋出嚟。

（；）係指「整同埋設計能夠行得到嘅電腦程式」嘅工作，响軟件工程、電子遊戲製作同 AI 等嘅多種電腦相關工作上都係一種不可或缺嘅技能。

## 平台

## 範式

*程序式（procedural）：強調「電腦程式係一連串要行嘅指令」，集中於將寫緊嘅電腦程式分開做若干橛，每橛都係一拃彼此相關嘅指令（每橛都係一段**程序**－睇埋子程序同控制流程嘅概念）。
*模塊化（modular）：著眼於想將一個好龐大嘅電腦程式分做若干嚿功能上互相獨立嘅部份（每嚿都係一嚿**模塊**；module），每嚿都要係可以獨立噉行得到嘅。可以睇吓下面講到嘅超距作用。

### 物件導向

物件導向編程（object-oriented programming，OOP）係指以物件（object）嚟做一個程式嘅基本單元；一件物件會包括一柞特定嘅數據，呢啲數據（特性）因為用途上有某啲共通點而俾設計者擺埋一齊嚟睇；除此之外，一件物件通常仲會掕住一啲專門處理同嗰件物件相關嘅工作嘅子程序，呢啲子程序就係嗰件物件嘅方法。
*類別（class）：一個類別會講明屬於呢個類別嘅物件每一件會掕住嘅
**變數（特性；attribute）、同埋
**子程序（方法；method），
**而一件物件就係佢所屬嗰個類別嘅一個實例（instance），即係按個類別嘅模嚟造出嘅。
*類別變數（class variable）：個類別有嗰啲變數。
*實例變數（instance variable）：個類別嘅每個實例都會有嘅變數，每個呢啲變數都係照住個類別個版整嘅。
**睇埋建構子（constructor）同解構子（destructor）。
*物件生命週期（object lifetime）：指一件物件由「被創造」至「被剷走」之間嘅嗰段時間。
*封裝（encapsulation）：指將（通常係將屬同一件物件嘅）數據同埋操縱呢啲數據嘅子程序「包埋一齊」，等呢啲數據同子程序難以俾外界干擾同亂咁用。
*繼承（inheritance）：物件嘅類別之間可以有嘅一種關係；抽象啲噉講，如果話物件類別 A 由類別 B 嗰度「繼承」啲嘢，意思係指類別 B（超類別；superclass / parent）有嘅特性，類別 A（子類別；subclass / child）冚唪唥有齊嗮，不過類別 A 可以有類別 B 冇嘅特性。
**多重繼承（multiple inheritance）：俾一個子類別有多過一個超類別，而嗰啲超類別之間冇直接嘅繼承關係。
**多態（polymorphism）：廣義上指一嚿嘢有多個唔同嘅型態；例如喺 OOP 當中，一個類別可以有個方法，但個方法喺唔同子類別入面都唔同樣－`Shape`（形狀）呢個類別有個方法 `Area` 計件屬呢個類別嘅物件嘅面積，`Shape` 喺呢個程式入面有兩個子類別 `Circle`（圓形）同 `Square`（正方形），兩個子類別嘅 `Area` 方法唔同樣（兩種形狀計面積條式唔同），噉個程式就算係展現咗多態。
*物件組成（object composition）：廣義上係泛指將啲物件或者資料類型砌埋一齊組成更加複雜嘅物件。
*物件結合（object aggregation）：物件結合意思係指件複雜物件 `com` 由多件物件組成，但 `com` 並唔「擁有」啲組成部份－當 `com` 俾人剷走嗰陣，如果用嘅係物件組成，組成 `com` 啲物件都會跟住被剷走，但喺物件結合之下，啲組成部份並唔隸屬於 `com`，就算 `com` 俾人剷走，啲組成部份仲可以繼續噉存在。
*基於類別（class-based）定基於原型（prototype-based）：兩種相對嘅 OOP 做法；基於類別編程係比較常見嗰種，意思係指個 OOP 程式以類別做出發點－
*:  定義類別 X 有邊啲特性同方法；
*:  建立物件 A，A 屬類別 X；
*:  建立物件 B，B 屬類別 X... 如此類推；
**而基於原型編程就唔同，唔會明確噉定義「個類別係乜」，而係會攞一嚿已有嘅物體做「原型」－
*:  攞一嚿物件 A；
*:  建立一件新嘅物件 B，並且指明 B 繼承嗮 A 啲特性同方法（A 係 B 嘅原型）；
*:  跟住可以用同樣嘅方法建立更多嘅物件；

## 郁手編寫

*Hello World：係指喺螢幕顯示「Hello, World!」（你好，世界！）噉嘅字串嘅電腦程式；呢種程式通常都係每種程式語言最基本、最簡單嘅程式，常用於示範一隻程式語言點運作。例如係以下呢段 C 嘅碼噉：
*:
```c
int main() /* 下面嘅係主程序... */
{
    printf("Hello, World!"); /* 呢句嘢叫部電腦出「Hello, World!」噉嘅字串。 */
}
```

*直譯器（interpreter）：指一個能夠直接噉執行以某啲程式語言寫嘅指示嘅程式。
*讀取-求值-輸出循環（read-eval-print loop，REPL）：一種簡單嘅編程環境，部機係噉重複「攞一條表達式、行、然後彈個 output 出嚟睇」噉嘅過程。
*條件陳述式（conditional statement）：絕大多數程式語言都會有嘅一種陳述式，功能係視乎情況（睇埋邏輯與、邏輯或同邏輯非）決定係咪要做某啲運算同採取某啲行動－一句條件陳述式會掕住一柞碼同一句佢要評估嘅條件，當個電腦程式行到個條件陳述式嗰時，如果個條件係真，個程式就會行條件陳述式掕住嗰柞碼，否則個程式就唔會行嗰柞碼。好似以下噉：
**`IF..GOTO`，如果 .. 為真，goto 某個位，常見於非結構化嘅程式語言。
**`IF..THEN..(ENDIF)`，如果 .. 為真，做 `THEN` 後面嘅 ..，`ENDIF` 用途在於標記掕住碼嘅終結。
**`IF..THEN..ELSE..(ENDIF)`，如果 .. 為真，做 `THEN` 後面嘅 ..，否則做 `ELSE` 後面嘅 ..，`ENDIF` 用途在於標記掕住碼嘅終結。
**`IF..THEN.. ELSE IF .. THEN .. ELSE..(ENDIF)`
*遞歸（recursion）：指一個子程式用到佢自己，例如以下呢段簡單嘅碼噉：
*:
```c
function dream()
    print "Dreaming"
    dream() // dream 呢個子程式當中用到自己。
```

*應用程式（application software）：電腦程式一種，指個程式設計嚟做某啲特定嘅作業，對部電腦本身嘅運作冇幫助，通常攞嚟俾終端用家用嘅；例如一隻電子遊戲或者一隻文書處理器就係應用程式－一隻電子遊戲會呈現一隻遊戲嚟娛樂玩家，而一隻文書處理器會俾用家有得處理文字，兩種程式都唔會幫部電腦運作。
*Regex（全名 regular expression）：指由一段字符當中搵出某串特定嘅字符，好似係
*:`^The`（搵出以 `The` 做開頭嘅字符串）
*:`end$`（搵出以 `end` 做結尾嘅字符串）
*:`^The end$`（搵出同「`The end` 」完美符合嘅字符串）... 呀噉。
*cmd.exe：又有叫命令提示符（command prompt），係好多個作業系統（包括 Microsoft Windows）預設嘅命令行直譯器，會俾用家以命令行介面嘅形式嚟指揮部電腦做嘢，一行指令望落係類似噉嘅樣：
*:`C:\>CommandA && CommandB && CommandC`

*呢嚿嘢（this）：常見於 OOP 嘅一種功能，指隻程式語言有方法喺一句指令入面講行緊嗰段碼屬嘅一件物件或者類別；例如想像遊戲編程，其中一件物件有個子程序，個子程序會改變件物件嘅位置，就有可能會出現類似以下噉嘅碼：
*:`this.position = [0,0,0];`；意思係「呢嚿嘢（`this`）嘅位置（`position`）要變成（`=`）指定咗嘅值（`[0,0,0]`）。
*函式庫（library）：指電腦程式用嘅非揮發性（唔會一熄機就冇咗嘅）資源，包括數據庫嘅數據以及陳述式噉；資訊科技工作者好興用函式庫嚟交流，令大家做嘢更加方便，例如 AI 噉，會有 AI 工作者搵埋一拃 AI 工作成日用嘅子程序，將呢啲子程序變成陳述式；第啲 AI 工作者攞去用，就可以達到「用一句碼就叫到部電腦做一樣 AI 常用嘅子程序」噉嘅效果。
*Log：指一個紀錄作業系統或者第啲軟件運行嘅檔案；例如一個（簡化版）伺服器嘅 log 會紀錄好似噉嘅資訊－
*:用家 112XXXXXX 喺 YYYY 年 M 月 D 日 13:51:31 用過 http:xxxxxxxxxx 呢個檔案；
*:用家 129XXXXXX 喺 YYYY 年 M 月 D 日 13:51:40 用過 http:xxxxxx234x 呢個檔案；
*:...
**Log 喺做 debug 等嘅工作嗰陣好有用。
### 源碼編輯

源碼編輯器（source code editor）係指畀用家編輯個程式嘅源碼嘅文字編輯器：一個源碼編輯器可以單獨存在，亦可以係一個網頁瀏覽器或者綜合開發環境（IDE）嘅一部份。源碼編輯器多數都會有功能或多或少噉自動處理代碼風格嘅嘢，包括－
*句法突顯（syntax highlighting）：按一段字嘅特性，將段字顯示做唔同嘅色水或者唔同字款，等段字更加易睇；即係例如顯示段源碼嗰陣，表示變數嘅字冚唪唥黑色，表示迴圈陳述式嘅字冚唪唥藍色，表示注釋嘅字冚唪唥綠色... 如此類推，好似下圖幅 gif 噉，噉用家容易一眼就睇到每段字係表示啲乜。
*自動完成（autocomplete）：指估計用家跟住想打啲乜碼，畀用家齋靠撳一兩個掣就即刻打段碼出嚟；好似下圖幅 gif 噉，用家淨係打咗 `Conso`，個編輯器經已估佢想打 `Console` 同相關嘅陳述式，仲畀佢有得打打吓直接叫個編輯器出其中一段陳述式。
*括弧配對（bracket matching）：指「檢驗啲括弧啱唔啱」嘅功能，例如 `((()))` 呢段碼有 3 個 `(` 3 個 `)`，所以啲括弧配對得啱，而 `(({)))` 呢段碼就唔啱－有 2 個 `(` 3 個 `)`，而個 `{` 冇對應嘅 `}`。括弧配對功能就係攞一段碼，然後話畀用家知「啲括弧啱唔啱，而如果唔啱，係喺邊個位出錯」噉嘅資訊。
*極簡化（minimization）：指由段碼度攞走啲唔必要嘅字符，例如係空格（好多時加落段碼度純粹係為咗等段碼清楚啲易睇啲）呀噉。用以下呢行 JavaScript 碼做例子－
*:
```javascript
var array = [];
for (var i = 0; i < 20; i++) {
  array[i] = i;
}
```

**極簡化咗就會變做噉－
*:
```javascript
for(var a=[i=0];i<20;a[i]=i++);
```

*搵重複（duplications finding）：指探測段碼入面有冇重複咗－代碼重複係指源碼有其中段出現咗超過一次，而呢種情況一般畀人認為係唔理想嘅，例如會嘥位（睇埋 DRY 原則）；唔少寫程式架生都曉自動噉摷吓段碼，睇吓段碼有冇重複嘅情況，有嘅話就建議用家整個子程序嚟解決呢個問題。
*代碼審查（code review）：喺專業嘅軟件工程當中，寫好個程式嘅源碼之後通常會搵人睇吓段碼，當中負責睇段碼嘅人係冇份寫段碼嘅；寫程式架生好多時會有啲功能，幫手做代碼審查嘅工作，例如有唔少常犯錯誤都係電腦程式可以輕易噉探測到嘅，所以寫程式架生好多時會內置埋「自動噉檢查吓啲碼，睇吓啲碼有冇呢啲常犯錯誤」嘅功能。

## 演算法

## 程式語言

程式語言（programming language）泛指用嚟教電腦做運算嘅人造語言，每隻字都會有清楚同固定嘅定義；廿一世紀初常用嘅程式語言有 Python、Java、JavaScript、C、SQL、MATLAB 同埋 Processing 等等。
*程式語言理論（programming language theory）：電腦科學嘅一個子領域，包含研究程式語言呢樣嘢應該點樣設計、分析同埋分門別類嘅一套理論；程式語言理論會用邏輯等形式化－即係每個符號都有清晰定義，唔似得自然語言咁多歧義－嘅語言嚟表達唔同嘅程式語言，剖析唔同程式語言彼此之間喺解難能力上有乜嘢差異，例如係「某隻程式語言會唔會比起第啲語言更加擅長解某啲類型嘅問題」等嘅課題。
**抽象句法樹（abstract syntax tree，AST）：用樹狀圖噉嘅方法嚟表示一段用程式語言寫嘅源碼；噉做可以攞走源碼當中啲標點符號同第啲對分析嚟講冇用嘅符號，等分析起上嚟易睇啲。
*語言原始體（language primitive）：指一隻程式語言入面最簡單嘅元素，簡單到唔會靠第啲元素嚟定義；包括咗「要處理嘅數據」同「做喺啲數據上做啲咩運算」。
*句法（syntax）：指一隻程式語言入面指定「邊啲符號（包括數字同字母）嘅組合算係有意思」嘅法則，好似喺 C 程式語言入面，`printf("xxx");` 呢行碼會教部電腦顯示出 `xxx` 噉嘅字，因為 C 語言嘅句法指明咗 `printf` 嘅陳述式係教部電腦做「顯示段字出嚟」嘅作業。
*抽象化（abstraction）：指由研究緊嗰樣物件嗰度攞走不必要嘅資訊，等個研究者可以集中諗件物件重要嗰啲部份；喺編程上，抽象化包括（例如）同一個子程序改返個名，然後次次想部電腦行個子程序嗰陣直接用嗰個名而唔係將個子程序成段碼再打多次。
*變數（variable）同常數（constant）：喺編程上，一個變數係指某個儲存位置（記憶體地址）加一個符號性嘅名（識別碼），而個變數會有個喺程式執行期間可以改變嘅數值；而常數就係指個儲存位置嘅數值喺程式執行期間唔可以被改變。
*算子（operator）：指一隻程式語言入面行為似函數噉嘅嘢，例如「加減」或者「比較兩個數嘅大細」呀噉；運算數（operand）就係指俾算子攞去計嘅數，例如 `1 + 1` 當中嘅 `1` 係運算數，而 `+` 就係算子。
*子程序（subroutine）：指一個大型程式當中特定嘅一拃程式碼，由一個或者多個陳述式組成，專門完成某項工作，而且獨立於子程式以外嘅陳述式。通常用嚟教個程式做一啲要重複做若干次嘅工作。
*表達式（expression）：喺一段程式碼當中，一段表達式係結合咗若干個常數、變數、子程序同算子而成嘅物體，能夠俾隻程式語言攞去行。
*求值策略（evaluation strategy）：指一隻程式語言用咩方法嚟同啲表達式做求值；舉例說明，想像家陣要行以下噉嘅表達式
*:
```c
def double x = (plus x x) // 「double x 意思等同 x + x」
  def average x y = (divide (plus x y) 2) // 「average x y 意思等同『(x + y) 除以 2』」
```

**用正常次序求值（normal-order evaluation）嘅話，會做嘅嘢係「吓吓都郁手拆咗最左嗰個子程序先」→
*:
```c
(double (average 2 4)) =>
(plus (average 2 4) (average 2 4)) =>
(plus (divide (plus 2 4) 2) (average 2 4)) => ...
```

**而用應用次序求值（applicative-order evaluation）嘅話，會做嘅嘢係「吓吓都郁手拆咗最入嗰個子程序先」→
*:
```c
double (average 2 4) =>
double (divide (plus 2 4) 2) =>
double (divide 6 2) => ...
```

**唔同嘅求值策略都有各自嘅利弊，同一條表達式，有可能用一種求值策略會攞到正確答案，但用另一種求值策略就會搞到輕機。
*領域特定語言（domain-specific language，DSL）同通用電腦語言（general-purpose language，GPL）：領域特定語言係指淨係適用於某個應用領域嘅電腦語言，例如 GameMaker 呢隻遊戲引擎就設有淨係可以喺 GameMaker 入面用嘅手稿語言，呢種語言喺 GameMaker 以外嘅環境係完全冇用嘅；領域特定語言嘅相對係通用電腦語言－通用電腦語言可以用喺多種唔同嘅環境度，例如係 Python 同 C 呀噉。
*編譯架生（compiler）：編譯係指將一段源碼轉化做第隻程式語言嘅過程；喺編程上，編譯器最常見嘅用途係，攞嚟將段由高級程式語言寫嘅碼轉化做電腦識睇識行（但淨係由 `0` 同 `1` 組成、對人嚟講難明）嘅機械碼。
*手稿語言（scripting language）：指用嚟操作同更改一個現存系統嘅功能嘅程式語言，好多時係喺行個程式嗰陣直譯，而唔係編譯咗先行嘅；例如遊戲引擎 Unity 係一隻用嚟整電子遊戲嘅軟件，有多種方便整遊戲嘅功能，包括畀用家用 C♯ 呢隻物件導向程式語言（程式語言）寫手稿，用手稿嚟設定隻遊戲入面啲物件嘅行為（更改一個現存系統嘅功能）－C♯ 就係 Unity 嘅手稿語言。

## 編程技巧

*DRY 原則（英文全名：**D**on't **R**epeat **Y**ourself，「唔好重複你自己做過嘅嘢」）：程式編寫上嘅一種技巧，指喺寫一隻電腦軟件嗰陣要盡可能避免重複一段碼；一般認為，如果一個程式想將某樣嘢重複噉做幾次嘅話，用程式迴圈或者子程序等嘅技術會比較理想。
*KISS 原則（英文全名：**K**eep **I**t **S**imple, **S**tupid，「將件嘢整簡單啲呀，蠢材」）：程式編寫上嘅一種技巧，指「如果有多過一種方法可以達到想要嗰隻效果，噉就應該用最簡單嗰種」；一般認為，一個程式盡可能簡單嘅話可以令個程式易用啲，好處包括咗「下一手編程員接手嗰時輕鬆順利啲」呀噉。
*Log 檔案：廿一世紀初主流作業系統都會內置嘅功能，能夠用某啲方式記住一個作業系統或者軟件行起上嚟「喺邊個時間點發生咗啲乜事」噉嘅資訊；Log 喺寫程式嗰陣時好有用，會話畀編程員知「出咗錯嗰個程式，出錯之前做過咗乜」噉嘅資訊，編程員可以靠呢樣資訊得知「個程式係邊忽有問題」。
*超距作用（action at a distance）：指個程式入面其中一部份出現意料之外嘅問題，而起因在於因為離嗰橛碼遠嘅另一段碼對佢作出咗影響，例如一個長（有幾萬行碼）嘅程式，當中有好多個子程序，其中兩個子程序 A 同 B，A 會更改變數 `X` 嘅數值，而咁啱 B 又會用到呢個變數，如果 A 搞到 `X` 變咗做個 B 處理唔到嘅數值，就會搞到 B 出錯；超距作用喺正式嘅軟件工程上係一條幾大嘅問題（因為呢啲工作要整好複雜嘅程式），常見嘅解決方法係淨係俾啲子程序同物件更改自己周圍啲局部變數，唔准佢哋更改全局變數或者離佢哋遠嘅物件嘅局部變數。睇埋模塊化編程。
*可讀性（readability）：指一段符號（好似係個程式嘅源碼）對人類嚟講有幾易睇易明；例如電腦工作者之所以會創造高級程式語言，理由就係因為機械語言嗰種「吓吓都係出一大串 `0` 同 `1`，而且串嘢入面多咗或者少咗個數就搞到成段碼錯嗮」噉嘅做法可讀性低得好交關；一般嚟講，電腦工作者寫軟件嗰陣都會追求源碼可讀性要高，簡單嘅例子有喺啲程式度落注釋呀噉。

## 睇埋
*電腦科學詞彙表
*電子遊戲詞彙表
## 註釋

## 攷