電腦科學

電腦科學會研究「運算」呢樣嘢嘅理論特性以及實際應用。



**電腦科學**（），又叫**運算科學**或者**計算機科學**，係專門研究運算嘅科學工程領域。電腦廣義上指運算機械，即係曉用數據做運算，並且俾出有用結果嘅機械，簡單例子：而家手上有「每個學生喺呢次考試當中攞到嘅分數」嘅數據，要用呢柞數字計出邊個考第一。電腦科學就係集中思考曉做呢啲嘢嘅機械點樣表示同儲起數據、用各種嘅演算法嚟處理數據以及彼此之間傳送數據... 等嘅問題。

電腦科學理論同實踐兼備。一方面，電腦科學好似一般嘅科學領域噉，包含一啲好抽象同理論化嘅研究，例如係運算理論上對運算機械嘅研究噉，呢啲研究會將運算機械想像成好似以下噉嘅數學物體：

上圖呢部機械（有限狀態機）會攞一串符號做輸入，再話俾用家知，串符號入面 0 嘅數量係咪雙數：部機開始於 \text{S}_1 狀態；當部機讀到一個 0 嗰陣，會進入 \text{S}_2 狀態，而當佢再讀到個 0 嗰時，會返去 \text{S}_1 狀態；如果佢讀到嘅係 1 或者第啲符號嗰時，部機唔會改變狀態；喺部機讀完嗮串符號之後，如果串符號入面 0 嘅數量係雙數，佢會處於 \text{S}_1 狀態，否則佢就會處於 \text{S}_2 狀態。呢部抽象機械可以用多種唔同嘅物理機制實現，運算理論上屬於抽象思考。

另一方面，電腦科學又屬工程學，包含實踐性質嘅研究，思考點樣用運算機械造出有經濟價值嘅產品。應用電腦科學嘅例子有電腦圖像學同電子遊戲開發呢兩個領域。電腦圖像學顧名思義研究電腦圖像，諗點樣運用電腦做嘅運算嚟製造圖像，而呢啲圖像可以用嚟將數據視覺化，或者整動畫同電子遊戲等嘅產品；電子遊戲開發就係思考點整電子遊戲，會運用電腦圖像、電腦編程同人工智能等電腦科學上嘅技術，務求製作出好玩同好賣嘅電子遊戲。

## 定位

### 基本概念

*"Computer science is no more about computers than astronomy is about telescopes."*（粵譯：天文學唔係研究望遠鏡，電腦科學同理唔係研究電腦。）
:Michael Fellows （美國出世嘅電腦科學家米高·菲路）

電腦科學研究嘅重點係運算。廣義上，運算指涉及跟從一個定義好嘅模型，通過一連串算術同非算術步驟，做出嚟嘅計算。例如，演算法可以理解做用家俾一部電腦包含一串有先後之分嘅指示，每行指示教部電腦做某啲計算⸺可以係算術性質嘅（加減乘除等），又可以係做邏輯代數等等⸺通過呢啲指示，部電腦最後會俾出一個輸出，如果個演算法設計得好而且部電腦能夠無誤噉行段演算法嘅話，個輸出正正會係個用家想要嘅結果。

舉個簡單例子，好似係以下呢段用粵文寫嘅演算法噉：
:要解決嘅問題：家吓俾一列正數你，假設呢個列唔係一個空列，同我搵嗰列數入面最大嗰個出嚟。
:用嘅演算法嘅步驟：
::設一個變數，叫佢做 **max**，並且將佢個數值設做 0；
::將收到嗰列正數逐個逐個攞嚟同 max 比較吓；
::如果撞到一個大過 max 嘅數（叫呢個數做 **x**）嘅話，
::::將 max 嘅數值設做 x，並且繼續將 max 同下個正數比較吓；
::將最後得出嗰個 max 嘅數值俾出嚟。max 嘅數值會係成列數入面最大嗰個。
做咗呢柞運算步驟之後，得出個輸出（max）會係用家想要嘅結果（列數入面最大嗰個）。

### 三大範式
廿一世紀初一般主流學界都認同，電腦科學包含咗多種唔同嘅研究範式，當中蘇聯出世嘅電腦科學家彼得·惠拿就主張，電腦科學包含三大範式，由唔同角度研究同「運算」相關嘅課題：
***[[數學]]**：電腦科學，尤其係運算理論等比較理論化嘅子領域，會運用好似數學噉嘅演繹推理方法（例如係數學證明），即係齋靠已有嘅知識去嘗試推理出新嘅知識；例子有停機問題嘅思考，喺解決呢個問題嘅過程入面，亞倫圖靈用咗反證法證明呢個世界上冇可能有電腦能夠攞一個程式嘅碼做輸入，再俾出正確嘅「呢段碼會唔會停機」輸出－成個過程都係齋靠邏輯推理，就好似一般數學家嘅思考過程噉。
***[[科學]]**：另一方面，電腦科學嘅某啲子領域又會運用科學方法做研究，即係唔係齋靠諗，而係去攞一啲描述現實世界嘅數據，再用數據驗證佢哋嘅假說；例子有人工智能（AI）上嘅研究，人工智能其中一個目的係要令電腦做出有智能嘅行為，所以人工智能領域嘅科學家好多時會做實驗－好似物理學等自然科學領域噉－嘗試了解智能嘅本質，例如搵柞馬騮返實驗室嗰度，觀察佢哋係點運用工具嚟解難嘅（一般認為，曉用工具係智能嘅表現），得到數據之後，嘗試編寫出能夠教電腦做出同樣行為嘅程式。
***[[科技]]**：除此之外，電腦科學嘅研究好多時會似科技同工程學領域嘅噉，以「創造出最優質嘅技術或者產品」為目標；例子可以睇電子遊戲開發呢個領域，電子遊戲開發嘅過程會用到好多涉及電腦嘅技術－電子遊戲本質上就係電腦軟件嘅一種，所以要製作一隻電子遊戲實要做大量嘅程式編寫，而且電子遊戲仲會用到電腦圖像（用電腦造嘅圖像）同人工智能等嘅技術；所以遊戲製作研究會思考「一個遊戲程式用乜演算法行先會順暢」等嘅問題，而憑藉呢啲知識，遊戲製作師會以「製作出好玩（吸引到玩家俾錢）嘅遊戲」做目標工作－好似以「設計出最佳產品」為目標嘅工程師噉。可以睇埋工程學設計過程。

## 理論電腦科學

理論電腦科學係電腦科學當中最抽象化嘅子領域。理論電腦科學嘗試了解「運算」呢樣嘢嘅數學性質，會用數學上用嘅方法－數學證明等－嚟搵出描述運算嘅定理。理論電腦科學純粹以增進人類對運算嘅了解為目的，所以係一個好理論化嘅領域，但理論電腦科學上嘅進步往往會引致按呢啲知識嚟設計嘅電腦能夠做更有效率嘅運算。

### 運算理論

運算理論專門研究運算嘅本質，思考機械點樣用演算法解難，嘗試了解運算機械嘅能力同極限係乜。運算理論上嘅研究會用數學證明等嘅數學方法，思考
*唔同種類嘅理論型運算機械喺解難能力上有乜嘢差異（自動機理論）；
*有啲乜嘢問題係能夠或者唔能夠用運算機械解嘅（可運算性理論）；以及
*一個運算上嘅問題最高嘅可能解決效率（運算複雜度理論）

... 等等嘅問題。

舉個例說明，停機問題就係可運算性理論上嘅經典問題：

首先，電腦程式可以分做兩大種：
:例：while (true) continue；呢種程式**唔會停機**－部電腦一行呢個程式就會一路行落去，永世唔會停。
:例：print "Hello, world!"；呢種程式**會停機**－部電腦會逐行逐行碼行咗佢，最後停低。

根據英國數學家亞倫圖靈嘅證明，呢個世界**冇可能**有電腦能夠攞一個程式嘅碼做輸入，再俾出正確嘅「呢段碼會唔會停機」輸出。個證明大致上係噉：

想像有個程式，`halts(f)`，如果 `f` 係一個會停機嘅子程序，`halts(f)` 會出「真」（1），否則`halts(f)` 會出「假」（0），再想像以下呢個程序：


```python
def g(): # 定義 g
    if halts(g): # 如果 halt(g) 係真...
        loop_forever() # 做永遠唔停嘅 loop
```


呢個程序會引致一個大矛盾：如果 `g()` 係會停機嘅，噉 `halts(g)` 會出「真」，於是 `g()` 就會進入永遠係噉行（loop_forever）嘅狀態－出現矛盾；而如果 `g()` 係唔會停機嘅，噉 `halts(g)` 會出「假」，於是 `g()` 就唔會進入永遠係噉行（loop_forever）嘅狀態－又出現矛盾。因為噉，`halts(f)` 呢一個程式冇可能存在喺呢個世界上。

呢個證明對運算本質嘅了解作出咗貢獻，而且由頭到尾淨係用數學證明嘅做法。

### 數據結構

數據結構係指電腦組織內部數據嘅方法：要做運算，部電腦就實要用某啲方法儲住要用嘅數據，例：要做到將兩個數值加埋一齊，部電腦首先要能夠記住嗰兩個數值；好似陣列噉，就係一種常用嘅數據結構，所有主流程式語言都有陳述式俾用家製造陣列，陣列有一個整數表示佢嘅大細，個整數表示個陣列有幾多個**元素**，每個元素都有個順序（通常由 0 起始）嘅數字表示佢係個陣列嘅第幾個元素，例：有個陣列叫 `thearray`，噉 `thearray[0]` 就係指 `thearray` 嘅第一個元素。數據結構上嘅研究思考部電腦以乜嘢方法儲住啲數據，以及唔同嘅儲數據方法有乜嘢優缺點，分別喺乜嘢時候啱用。

### 資訊理論

資訊理論研究資訊要點樣量化、儲起同傳達。資訊理論嘅核心概念係熵；資訊理論當中嘅「熵」係一個指標，用嚟量度一個有隨機性喺入面嘅變數或者過程當中帶有幾多不確定性喺入面。舉個例說明，想像家吓掟一個銀仔同擲一粒六面嘅骰仔，假設個銀仔同粒骰仔係冇出千嘅：掟一個銀仔有 2 個可能結果，而擲一粒六面骰有 6 個可能結果。擲骰仔當中有更多可能性喺度，所以不確定性亦都更加大－有更多嘅資訊熵；當一個人知道咗一次掟銀仔或者擲骰仔嘅結果嗰陣，佢會清楚知道結果－資訊熵變成 0。對比兩個情況，「話俾人知掟銀仔嘅結果」所俾到嘅資訊－消除嘅資訊熵－少過「話俾人知擲骰仔嘅結果」所俾嘅。由呢個例子可見，資訊理論做到將資訊呢個本來相當含糊嘅概念量化，令資訊成為一個喺科學上可以被研究嘅對象。

### 形式化方法

形式化方法泛指一啲用嚟描述、開發同驗證軟件同硬件系統嘅數學方法。呢啲方法會用數學模型描述軟件同硬件系統，幫分析者手分析個系統，例：個電腦系統嘅運算速度（\text{sp}）有條公式表示個速度受邊啲因素（x_i）影響，\text{sp} = \beta_1 x_1 +...；分析者只要知道嗰啲因素嘅數值，佢就可以用條公式計出個電腦系統嘅運算速度；所以有咗條公式，佢就有得計出啲因素要喺乜嘢數值，先可以令速度最大化；喺呢點上，電腦科學同第啲工程學領域一樣－用數學模型模擬一個系統，並且靠呢啲模型對系統嘅設計作出思考，最後設計出更加能夠幫設計者達到佢目的嘅系統。形式化方法好多時會用到運算理論、資訊理論同程式語言理論上嘅知識，而且可以話係軟件工程嘅理論基礎。

## 電腦系統

電腦系統係指一個能夠做有用運算嘅系統。一個電腦系統能夠用某啲方式接收輸入（input），進行某啲型式嘅運算，再俾出輸出（output）；如果一個電腦系統設計得妥當，噉個輸出正正會係個用家想要嘅。電腦科學領域會對電腦系統嘅設計作出比較抽象嘅思考，集中諗「個系統應該要進行點樣嘅運算」，然後再同電腦工程等領域嘅專家合作，等後者用物理方法實現佢哋嘅設計。

### 電腦架構

電腦架構係指對電腦系統結構嘅思考－設計電腦系統嘅「結構」包括咗指明部電腦有邊啲子系統、每個子系統會做乜嘢運算、以及每個子系統會同邊啲子系統互相收發數據。例如馮紐曼架構就係廿世紀常用嘅一種電腦架構，一部用馮紐曼架構砌出嚟嘅電腦大致上會有以下呢啲組成部份：
*處理器，負責做算術運算同埋寄存（暫時儲住用緊嘅數據）嘅工作；
*控制單元，負責記住手上做緊嘅工作同指揮處理器嘅運作；
*記憶體，負責儲住啲數據同指令；同埋
*I/O（input/output）機制，負責由外界收訊號（例：透過鍵盤）同向外界傳訊號（例：透過熒光幕）。即係：




電腦架構上嘅研究會對「CPU 應該要點樣攞記憶入面嘅數據」、「一粒 CPU 要有乜嘢部份」以及「一部電腦唔同子系統之間要有乜嘢資訊傳遞」等嘅課題進行概念化嘅思考，而電腦工程以及電子工程等硬件方面嘅領域跟住就會負責諗呢啲架構概念要點樣用物理方法實現，兩者合作嘗試設計出性能更好－行得更快、製作成本更低－嘅電腦。

### 並行性質

並行運算、平行運算同分散運算係三個唔同（但相關）嘅重要運算系統概念：
*並行運算最廣義上指一個程式、一部電腦或者一個網絡能夠並行噉做幾個唔同嘅運算工序－即係例如工序 A 喺第 0.5 秒開始做同喺第 0.8 秒完結，而工序 B 喺 0.6 秒開始同喺第 0.9 秒完結（喺 0.6 同 0.8 秒嗰段時間之間，A 同 B 都係處於「做緊」嘅狀態）－而唔係好似最簡單嗰種運算噉，集中淨係做工序 A，做完 A 再集中做 B... 一路做到做嗮要做嘅工序為止。喺有多個處理器嘅電腦系統當中，並行運算可以提升運算嘅速度。
*平行運算可以話係並行運算嘅一種，指多項計算或者過程嘅執行同時發生：大嘅運算問題可以分做細嘅子問題，而呢啲細問題可以同時分噉解決，於是個電腦系統可以將個問題所用嘅數據拆開，每件送去唔同嘅處理器嗰度，等嗰啲處理器同時各自噉做所需嘅運算，然後再由處理器嗰度接收啲訊號，將得到嘅各件 `output` 砌返埋一齊。如果啲演算法設計正確，砌返埋一齊嘅結果正正會係設計者想要嘅。喺平行運算上，要點樣控制唔同子問題之間嘅通訊以及時間同步係重要嘅課題。
*分散運算係指個電腦系統有多部位於唔同－彼此之間有網絡嘅－電腦，呢啲電腦之間會互相通訊，靠呢啲通訊協調彼此嘅行動，用嚟達到某啲共同目的，而且由用家嘅角度睇望落好似係一部單一嘅電腦噉；一個分散式系統會有若干個**節點**（node），當中每個節點都係一部能夠獨立存在嘅電腦，而且有獨立嘅記憶體。

要說明平行運算同分散運算之間嘅差異，想像以下呢幾個過程嘅日誌（`Ty` 代表件事喺時間點 `y` 發生）：

  **P1**
    **T1**：由記憶體讀取 input a
    **T1**：由記憶體讀取 input b
    **T2**：用 a 做 input 運算 function_01 呢項工序
    **T2**：用 b 做 input 運算 function_02 呢項工序

  **P2**
    **T1**：節點 1 由自己記憶體讀取 input a
    **T2**：節點 1 由自己記憶體讀取 input b
    **T3**：節點 1 用 a 做 input 運算 function_01 呢項工序，output 係 b
    **T4**：節點 1 將 b 傳去節點 2
    **T5**：節點 2 用 b 做 input 運算 function_02 呢項工序

`P1` 反映咗一個平行運算，`function_01` 同 `function_02` 呢兩個運算過程可以直接噉使用同一柞記憶；而 `P2` 反映咗一個分散運算，`Node 2` 呢個節點唔可以直接用 `Node 1` 呢個節點嘅記憶，而係要 `Node 1` 將個 `output` 用訊號傳俾佢先可以用。喺某啲情況下，平行運算可以搞到個系統出一啲齋用非平行分散式運算唔會出嘅錯。

### 電腦性能

電腦性能係電腦系統相關研究常考慮嘅一柞指標，指一個電腦系統能夠做幾多有用嘅運算同埋做起呢啲運算上嚟嘅效率係點。電腦科學家會用準確度、運算時間同速度等嚟量度一部電腦嘅性能。而一般嚟講，一部性能良好嘅電腦具有以下嘅特徵：
*做起運算上嚟用嘅時間少；
*用嘅運算資源（睇埋上面寄存器）少；
*快速嘅數據壓縮同解壓；
*數據傳遞花嘅時間短... 等等。

## 電腦通訊

運算機械之間會為咗達到各種目的而互相傳遞資訊，例如廿一世紀無所不在嘅互聯網科技噉，就涉及電腦之間係噉收發大量嘅資訊用嚟達到各種嘅用途。電腦科學上有對電腦通訊嘅問題作出思考，務求令電腦之間嘅通訊更加安全同有效率。

### 電腦網絡

電腦網絡係指若干部電腦（每部電腦為止一個節點），會共同使用一個網絡傳輸協議彼此之間分享資源。喺物理上，電腦網絡會包含若干部電腦，彼此之間以某啲方式－最簡單嘅係駁電線傳電子訊號－互相傳達訊號。電腦網絡有好多用途，例如受一個組織（一間學校或者一間公司）使用、外人用唔到嘅內聯網可以用嚟俾一個組織內部嘅成員之間交流工作要用嘅資訊，而互聯網連接世界各地嘅電腦，令世界各地嘅人有得彼此交流圖像、文字、錄音同影片等嘅多種資訊。

電腦科學上嘅研究會將電腦網絡按各種特性分類，了解唔同類型嘅網絡喺性能上有乜差異，並且嘗試靠噉思考要點設計出更高效率嘅網絡：網絡拓樸係指一個網絡嘅節點之間以乜嘢方式連埋一齊；網絡拓樸係抽象化嘅，唔重視電腦嘅物理位置，而只係集中思考啲電腦之間嘅連繫規律；數據傳輸就係指一個網絡嘅節點之間以乜嘢物理方式傳遞數據，當中最簡單嘅做法係駁線（可以睇埋光纖），不過廿一世紀開始嘅電腦網絡亦有大把無線技術可以用。

喺將電腦網絡分好類之後，電腦科學上就可以用好多方法衡量唔同類型網絡嘅網絡性能，即係唔同類型嘅網絡有幾能夠有效率噉幫用家達成目的。常用嘅網絡性能指標有：
*頻寬（bandwidth）：指耗用嘅資訊量位元速率，以每秒嘅數量表示，一般數值愈大愈好；
*時延：指由一個節點傳到第個節點嗰度要花嘅時間，一般數值愈細愈好；
*順應力：指個網絡有幾能夠喺異常情況出現（例如突然間有好多用家想要攞數據）嗰陣維持正常運作；
... 等等。

### 電腦保安

電腦保安泛指對電腦系統同網絡作出保護，等軟硬件同數據免受偷竊同損壞：隨住電腦網絡嘅普及，數據嘅流通變得容易，同時數據亦有更加有可能會落入犯罪份子嘅手，例如銀行系統所做嘅網絡通訊會包含用戶嘅信用咭號碼同戶口有幾多錢等嘅資訊，而呢啲資訊一旦落入犯罪份子嘅手，可以搞到銀行同用戶損失慘重。除此之外，大企業喺開發新產品嗰陣會想將個項目嘅內容保密，航空交通控制會想為咗確保航空安全而想保護自己用嘅電腦系統... 等等，所以電腦保安喺廿一世紀嘅電腦科學上係一個大課題。

電腦保安嘅核心概念係漏洞。漏洞泛指一個電腦系統或者網絡喺設計同執行上一啲可以俾人利用嘅弱點，例如軟件後門就係一種常見嘅漏洞，指一個系統或者網絡有方法俾人避開一般鑑別－即係入密碼等鑑別身份嘅過程－同保安控制就進入到，搞到黑客等嘅人物能夠攞到啲佢哋唔應該攞得到嘅數據。公共漏洞同暴露（CVE）等嘅資料庫會列出同討論電腦保安上常見嘅漏洞，而電腦科學上嘅學術研究亦會探討「電腦系統要點樣設計先可以冇漏洞」等嘅課題。

### 密碼學

密碼學係研究密文碼要點樣設計嘅一個領域。密碼學成個領域嘅目標係要確保傳訊人同收訊人以外嘅人冇能力知道所傳嘅資訊嘅內容，最基本嘅概念係加密－「加密」定義係指將一段資訊入碼，轉化成第種表示方式，收訊人部電腦會知段資訊係點加密嘅，所以會有能力解讀段資訊，但收訊人以外嘅人正路就因為唔知個加密方案係點，就算攞到段資訊都解讀唔到段資訊嘅內容，而只係會得到一段望落完全雜亂無章嘅符號。一段加密演算法大致上可以想像成好似以下噉嘅虛擬碼：

  攞傳訊者段資訊做 input；
  按某啲法則，將 input 變做加咗密嘅信息，簡單例子：所有 **a** 變做 **1020**；
  
  收訊者收到段加咗密嘅信息；
  收訊人部電腦按已知嘅法則，將段加咗密嘅信息變返做加密前嘅樣。

密碼學上嘅研究會運用資訊理論等理論嘅知識，思考「加密方案可以按乜嘢特性分類」以及「邊啲類型嘅加密方案比較安全」等等嘅議題，係廿一世紀電腦保安上不可或缺嘅一環。

## 電腦程式編寫

電腦程式編寫（programming）係整同設計行得到嘅電腦程式嘅過程。一個電腦程式有段源碼，段源碼會有若干行用程式語言寫成嘅句子，教部電腦要進行乜嘢運算，而如果個程式編寫得好，最後個程式俾嘅 `output` 正正就係個編程者想要嘅。喺編寫電腦程式嘅過程當中，編程者要做嘅嘢包括咗分析要解嘅問題、諗用邊啲演算法好、以及計同量度吓用緊嗰啲演算法嘅準確度同效率，而個編程者跟手就會揀返種程式語言，並且用隻語言寫好段源碼，打後個編程員仲要做多項工作，包括測試、除錯、保存住個程式嘅源碼同埋管理程式編寫過程整出嚟嘅產物等。

例如上面提到，用嚟搵出最大冧巴嘅演算法用 Python 呢隻程式語言寫出嚟嘅話如下：

```python
# 入嘅嘢：一列冧巴，叫佢做「L」。
# 出嘅嘢：L 入面最大嘅冧巴。

def find_max (L):  # 定義乜嘢係「去搵 L 嘅最大值」。
   max = 0         # 設最大值做 0。
   for x in L:     # 為咗 x 喺 L 入面。
      if x > max:       # 如果 x 大過最大值。
         max = x         # 設最大值做 x。
   return max      # 俾返個最大值出嚟。
```


### 程式語言

程式語言係一種電腦能夠明白嘅語言，可以用嚟編寫程式教電腦做運算。一隻程式語言會有好多陳述式，每款陳述式都可以用嚟教電腦做某個特定嘅動作，編程員會按佢對用緊嗰隻程式語言嘅認識，編寫一段有若干行陳述式嘅源碼，而段碼經過編譯器等嘅架生之後就可以由部電腦執行。舉個簡單例子說明，常用嘅程式語言冚唪唥都會有陳述式做簡單嘅算術，亦會有陳述式教電腦俾一啲字串做 `output`，以下嘅陳述式都係教部電腦俾「哈佬世界!」呢串字做  `output`，不過用咗唔同程式語言寫：

Python（1991 年始創嘅嘅一隻程式語言，常用於機械學習）：

```python
print("哈佬世界!")
```


C＃（2000 年發行嘅一隻程式語言，常用於遊戲編程）：

```csharp
Console.WriteLine("Hello World!");
```


廿一世紀嘅編程界有好多唔同嘅程式語言通用，比較常用嘅有 Python、C 同相關嘅語言以及 JavaScript 等等。唔同程式語言對同一個指令嘅陳述式會有唔同，有陣時甚至會有程式語言有一啲第啲程式語言冇嘅陳述式，所以唔同程式語言會擅長做唔同嘅工作。有經驗嘅編程者會曉按手上嘅工作嘅性質揀要用邊隻程式語言。

### 程式語言理論

程式語言理論（PLT）係研究程式語言應該點樣設計、執行、分析同分類嘅一套理論。廿一世紀初嘅電腦界有好多唔同嘅程式語言，每款程式語言都有獨特嘅功能，程式語言理論上嘅研究會嘗試比較唔同嘅程式語言，會用邏輯等形式化－即係每個符號都有清晰定義，唔似得自然語言咁多歧義－嘅語言表達唔同嘅程式語言，剖析唔同程式語言彼此之間喺解難能力上有乜差異，例如係某隻程式語言會唔會比起第啲程式語言更加擅長解決（需要冇咁多行碼）某啲類型嘅問題等嘅課題。程式語言理論呢個領域會同數學、軟件工程、語言學同認知科學等嘅領域互相影響，而且對應用電腦科學－例如係新程式語言嘅設計等－嚟講相當緊要。

## 電腦應用
電腦能夠做到好多人手做唔到嘅運算，而呢啲運算有好多種用途。

### 電腦圖像學

電腦圖像學係研究電腦圖像（簡稱 CG）嘅一個領域。電腦圖像泛指用運算技術造出嚟嘅圖像。呢啲圖像有好多各式各樣嘅用途，例如用嚟整電影同電子遊戲等嘅娛樂作品、用嚟處理由現實世界探測到嘅影像、又或者喺科研上將一啲理論模擬嘅現象呈現出嚟呀噉。整電腦圖像涉及以下嘅工作：
*圖像表示；如果係二維（2D）嘅圖像，噉部電腦要以某啲方式記住幅圖，通常做法係，幅圖每一點都有一柞數字俾部電腦記住，而柞數字就代表咗嗰點「乜嘢色」同埋「有幾光」等嘅資訊；例如部電腦記住 `[[207, 229, 78], [141, 159, 138], [146, 109, 81], ...]` 噉嘅一系列數字，每組數字有三個數，每個最細係 0 最大係 255，第一個數代表嗰一點有幾多紅（R），第二個數代表嗰一點有幾多綠（G），而第三個數代表嗰一點有幾多藍（B），而成串嘢當中有 n 組「每組三個數」嘅數－n 就係幅圖嘅像素；最後形成一個矩陣，令到部電腦可以記住幅圖嘅樣。
*如果係三維模型，噉部電腦可以用同類方法記住個模型嘅樣，例如個模型每隻角都有柞數字俾部電腦記住，數字表達佢個坐標位置，然後每兩隻角之間有數字表達佢哋之間「有冇表面」同埋「塊表面乜嘢色」等嘅資訊；
*幾何變換喺整電腦動畫嗰陣會用到：部電腦會用算式計出幅圖或者個立體模型要點郁，從而達到某啲特定嘅視覺效果。例：假想幅圖喺熒光幕中心點，佢會有個坐標值，然後下一刻部電腦將幅圖嘅 X 坐標值（打橫坐標值）加 40 個像素－就會令幅圖向右邊跳 40 像素（喺實際應用上，通常 X 坐標值愈右愈大）。
... 等等。

顯示電腦圖像嘅過程大致上可以想像成噉嘅演算法：
#設定背景嘅影像；
#計算下一刻嘅影像大致上係點嘅，包括「嗰一刻每件物件喺乜嘢位置」、（如果係立體嘅話）「光源喺邊」、（如果係立體嘅話）「鏡頭喺邊」呀噉；
#基於步驟 2 所得嘅資訊，計算喺下一刻，畫面嘅每一點應該係乜嘢色水；
#將步驟 3 嘅計算結果傳去個熒光幕嗰度，等個熒光幕將個影像顯示俾個用家睇；
#返去步驟 2，直至用家叫部電腦收工為止。

### 科學運算

科學運算係指喺科學上建構數學模型嚟模擬同分析所研究嘅現象嘅做法，往往會用到電腦科學上嘅技術。喺實證科學上，科學家會創建數學模型模擬想研究嘅現象，然後再去搵證據睇吓個模型係咪真係能夠準確噉描述所研究嘅現象；喺廿一世紀嘅科學界，隨住科學家愈嚟愈走去研究複雜嘅現象，要用嘅數學模型變得愈嚟愈複雜，愈嚟愈難以用人手計。因為噉，自然科學家同社會科學家都變到想同電腦科學合作，整出用嚟模擬複雜現象嘅程式。

舉個簡單例子說明，現代生物學其中一個基礎係進化嘅概念：想像一個生物物種族群，個族群嘅基因庫係 x_0 噉嘅樣，家吓佢哋做繁殖生下一代，而下一代嘅基因庫係 x_1 噉嘅樣，因為某啲基因比較有利於生存同繁殖（例如係令隻動物生殖能力勁嘅基因，即係所謂嘅物競天擇），x_1 同 x_0 會有少少差異，而過咗 i 代後嘅基因庫 x_i 可以同 x_0 有巨大差異，令第 i 嘅個體同初代個體唔再算係同一物種－進化就係指一個族群嘅基因庫隨時間嘅變化，以及呢啲變化產生新物種嘅過程。

進化同物競天擇嘅過程可以大致上噉用以下嘅 JavaScript 碼嚟模擬：

```javascript
var p; // 基因 P 喺個族群當中嘅出現率
var N = 2000;
var generations = 200;
var data = [];
var simulations = 10;

// 定義咗柞子程序先。
function next_generation(simulation_data) { // 呢個子程序負責由一代嘅數據計下一代嘅樣
    var draws = 2 * N;
    var A1 = 0;
    var A2 = 0;
    for (var i = 0; i < draws; i = i + 1) {
        // p 乘嘅數值代表基因 P 有幾有利生存繁殖，嗰個數值愈高愈表示基因 P 有利生存繁殖。
        if (Math.random() <= p * 1.01) { // 喺呢個個案入面，0.5 * 1.01 大過 0.5，所以 A1 嘅數值比較有可能上升。
            A1 = A1 + 1;
        }
        else {
            A2 = A2 + 1;
        }
    }
    p = A1/draws; // 將 p 設做一代後，基因 P 喺個族群當中嘅出現頻率。如果 p 上面乘嗰個數大過 1，噉 p 嘅數值傾向會升。
    simulation_data.push(p);
}

function simulation(simulation_counter) { // 呢個子程序負責做模擬。
    p = 0.5; // 設 p 做 0.5，即係個族群入面一半個體有基因 P。 
    for (var i = 0; i < generations; i = i + 1) { // 行 200 代（設咗 generations = 200）。
        next_generation(data[simulation_counter]); // 行 next_generation 呢個子程序，行 200 次。
    }
}

// 個主程序喺呢度。
for (var i = 0; i < simulations; i = i + 1) { // 做 10 次模擬（設咗 simulations = 10），
    data.push([]); // 每次都將計出嘅數據放入 data[] 呢個 array 嗰度。
    simulation(i); // 行 simulation 呢個子程序。
}
draw_line_chart(data,"Generation","p",["Population Size:",N,"Generations:",generations]);
// 最後畫條線，以 X 軸表示代，Y 軸表示 p；如果「p * 1.01」當中 p 乘嗰個數大過 1，通常條線會係一條有好多起起跌跌、但總體偏升嘅線。
```


### 軟件工程

軟件工程係指用工程學方法開發電腦軟件嘅過程。軟件工程師會了解佢哋開發嘅軟件要滿足乜嘢需要，然後按照佢哋對呢啲需要嘅分析以及電腦程式編寫等嘅電腦技術，決定要使用嘅軟件架構，並且設計同建構出一隻行得嘅軟件，然後會做測試，而喺隻軟件出咗街之後，佢哋仲會攞用家嘅評價同更新嘅軟件。

軟件工程領域仲會對「做軟件工程應該要做乜嘢工序」等嘅課題作出思考。例如螺旋模型就係一種喺 1980 年代尾興起嘅軟件開發方法；用螺旋模型開發一隻軟件嘅過程包括若干次**迴轉**（loop），每次迴轉都係
#以決定目標起始，
#然後諗吓乜嘢最有可能搞喎成個項目同度吓要點應付，
#跟住郁手整原型同
#計劃下一次迴轉；

螺旋模型喺遊戲製作等嘅軟件開發過程上好使好用－要整出一個可以做測試嘅遊戲程式好多時要花好耐時間，一旦有其中一個部份後嚟先發覺有問題（例：一個創新嘅遊戲機制，做完試玩先至知冇想像中咁好玩）會嘥好多時間，於是遊戲製作師就要用螺旋模型，喺郁手整之前就諗好嗮有乜可能會出錯嘅地方同點應對（例：喺整 beta 途中，特登將隻遊戲設計成冇咗嗰隻新機制都仲行得到）；軟件工程師會思考好似噉嘅模型，嘗試提高軟件工程界開發軟件嘅效率。

#### 遊戲製作

電子遊戲製作係指製作一隻電子遊戲嘅過程，屬軟件工程嘅一個子領域。電子遊戲係以電腦軟件型式存在嘅遊戲，遊戲設計師同製作師會負責設定隻遊戲嘅規則同美學，務求令玩家開心過癮，而一個覺得開心過癮嘅玩家會願意使錢，買嗰隻遊戲同隻遊戲嘅相關產品－呢樣係所有媒體嘅遊戲設計同製作嘅共同目標。廿一世紀嘅電子遊戲設計以及製作係一個高度專業化嘅領域，要製作一隻電子遊戲，製作者需要做多個工序：佢哋要諗好隻遊戲點玩，再做好程式編寫（仲可能會用到人工智能技術）、電腦圖像製作以及為隻遊戲作故仔等嘅工作，途中用到唔少電腦科學以外嘅知識同技術；跟手佢哋仲要試行試玩吓隻初型，發覺到有問題就要返轉頭執；搞掂出得街之後，佢哋仲要度「點樣為隻遊戲做宣傳」等嘅問題，而且喺出咗街之後，製作組往往仲要喺社交媒體等嘅地方留意玩家俾嘅意見，睇吓隻遊戲有冇乜嘢需要再執。

## 人工智能

人工智能（AI）係電腦科學同心靈科學嘅交界領域，專門研究點樣用各種嘅演算法教一部電腦展示好似人類噉嘅智能：一嚿物體如果有能力感知佢四圍嘅環境並且按照所得嘅資訊嚟提升自己達到目的嘅機會率嘅話，噉佢就算係一個智能體，包括人類在內嘅動物都符合呢個定義，而人工智能領域嘅目標就係研究點樣人工噉整一啲智能體出嚟－自自然然，正如機械工程師喺設計飛機嘅翼嗰陣會參考雀仔嘅翼，研究人工智能嘅科學家就要參考現實世界嘅認知系統，並且嘗試整出模仿呢啲認知系統嘅人工智能。

有認知科學家提出，心靈可以分做多個子系統，而當中每一個子系統都負責某啲認知功能，而且每個都可以用一啲演算法嚟模擬，並且創造出能夠展現認知能力嘅機械。用高度抽象化嘅虛擬碼表達嘅話，一個可能嘅心靈模型如下：

  **感知系統**（睇埋機械感知同電腦視覺）
    Input：外界嘅物理刺激；例：視覺感應器傳一串串 `144 100 89` 等嘅碼，每串表示環境每一點有幾多紅幾多藍幾多綠。
    機制：可以睇吓深度學習。
    Output：描述外界嘅資訊，例：`122` 代表「有隻貓」，`456` 代表「有道門」。
  
  **注意力系統**
    Input：主要係感知系統嘅 output 同決策系統嘅 output
    Output：注意力要擺喺邊；例如傳個 output signal「`(248, 987)`」去感知系統嘅控制器嗰度，表示「視線要移去空間嘅 `(248, 987)` 嗰點」。
  
  **記憶系統**
    Input：各系統嘅 output
    Output：儲起做記憶嘅資訊（睇埋記憶體）。
  
  **知識系統**
    Input：記憶儲起咗嘅資訊
    機制：睇埋知識表示同機械學習
    Output：一啲描述「呢個世界係點運作」嘅數學模型，例子可以睇貝葉斯網絡。
  
  **[[決策]]系統**
    Input：各系統嘅 output
    機制：按照知識系統嘅模型估計自己每個可能行動方案會做成乜嘢結果，計吓邊個結果對自己嚟講最理想；`[[Foreach]] 可能行動，計個行動嘅[[效益]]`。
    Output：有個 output 傳遞去**行為產生器**（behavior generator）嗰度，個行為產生器會直接駁落肌肉等嘅力學部份嗰度，令個系統可以採取行動。

... 等等。

## 簡史

電腦科學當中嘅某啲諗頭可以追溯去未有現代電腦嘅時代。遠古嘅人類發明咗好多架生嚟計數，好似算盤噉，而且中世紀（5 至 15 世紀）經已有數學家喺度諗有關演算法嘅概念。不過當時嘅世界未有任何可以算得上係「電腦」嘅機械，所以電腦科學頂櫳都淨係存在喺理論思考當中。

現代電腦最早可以追溯至 17 世紀：當時有德國學者威廉嶭卡同德國數學家萊布尼茲分別喺 1623 年同 1673 年發明咗機械性（用力同物件嘅移動做運算）嘅計數機，可以算係為「曉計數嘅機械」呢個諗頭創咗先河，當中萊布尼茲完善咗－對現代電腦嚟講好重要嘅－二進制系統，俾人視為史上第一個算得上係「電腦科學家」嘅人。

19 世紀係現代泛用電腦嘅開端：1820 年，開始有咗量產計數機呢家嘢，而喺 1822 年，英格蘭數學家巴貝治諗出咗「可以做編程嘅計數機」嘅諗頭，即係所謂嘅分析機；喺 1834 年，巴貝治開始著手研究分析機嘅諗法，兩年間就諗出好多同現代電腦相近嘅概念，所以巴貝治俾好多人覺得係現代電腦之父。打後英格蘭數學家勒芙蕾絲喺 1843 年嘗試翻譯一篇關於分析機嘅法文文章嗰陣，喺佢加入嘅譯者筆記入面記錄咗一個計白努利數嘅演算法，可以話係世界上第一個電腦程式。

廿世紀上半橛係電腦科學萌芽嘅時代：喺 1930 年代，亞倫圖靈開創咗運算理論同人工智能嘅思考，諗出咗圖靈機等現代電腦科學都仲會用嘅諗頭；喺 1937 年，候活·艾肯成功說服 IBM 建造佢（基於巴貝治嘅分析機）構想出嚟嘅超大型可編程計數機；打後喺 1940 年代，又有人開始整更新更勁嘅計數機，仲開始咗嗌呢啲機械做 **computer** ，而紐約市嘅哥倫比亞大學喺 1946 年推出人類史上第一個有學分嘅電腦科學課程－即係話電腦科學正式成為咗一門獨立嘅科學工程學問。

## 數學
電腦科學上常用嘅數學理論有以下呢啲：
*命題邏輯
*集合論
*組合數學
*線性代數
*圖論
*微積分
*概率論
*統計學

## 睇埋
*電子工程
*電腦工程
*數據庫
*資訊科技
*資訊系統
*人機互動
*數碼化革命
*Cyberpunk

## 文獻

*Collier, Bruce (1990). *The little engine that could've: The calculating machines of Charles Babbage*. Garland Publishing Inc. ISBN 978-0-8240-0043-1.
*Peter J. Denning. Is computer science science?, *Communications of the ACM*, April 2005.
*Peter J. Denning, *[https://dl.acm.org/doi/pdf/10.1145/1028174.971303 Great principles in computing curricula]*, Technical Symposium on Computer Science Education, 2004.
*Tedre, Matti (2014). *The Science of Computing: Shaping a Discipline*. CRC Press, Taylor & Francis.
*Tucker, Allen B. (2004). *Computer Science Handbook* (2nd ed.). Chapman and Hall/CRC. ISBN 978-1-58488-360-9.
*Research evaluation for computer science, Informatics Europe report. Shorter journal version: Bertrand Meyer, Christine Choppy, Jan van Leeuwen and Jorgen Staunstrup, Research evaluation for computer science, in Communications of the ACM, vol. 52, no. 4, pp. 31–34, April 2009.

## 註釋

## 引咗

## 拎

* 電腦科學嘅學者社群
* 乜嘢係電腦科學？
* 電腦科學係咪科學？

專業組織網頁：
* Association for Computing Machinery
* IEEE Computer Society
* AAAI
* AAAS Computer Science