電腦程式編寫

整同設計能夠執行得到嘅電腦程式嘅過程

電腦程式編寫din6 nou5 cing4 sik1 pin1 se2英文computer programming),簡稱程式編寫cing4 sik1 pin1 se2programming)或者編程pin1 cing4,係指整同設計能夠執行得到嘅電腦程式嘅過程。編寫電腦程式嘅過程大致上涉及以下嘅工序[1][2]

  • 編程員要分析手上需要解決嘅問題,即係做需求分析分析吓個客或者用家想要個程式解決啲乜嘢問題[3]
  • 佢需要諗應該用邊啲演算法(algorithm)同度吓用緊嗰啲演算法嘅準確性同效率
  • 佢跟住就要揀返隻程式語言,並且用隻語言寫好個程式嘅源碼(source code);
  • 打後個編程員要做嘅工作仲包括咗測試debug、保存住程式嘅源碼同埋管理編程過程整出嚟嘅產物。
上圖段源碼係用高級程式語言寫嘅,但依然明顯唔似人日常傾偈講嘢。
一個人坐喺電腦前面寫程式;佢部電腦嘅熒光幕顯示一段段嘅源碼。

程式編寫係編程員用程式語言向電腦俾命令嘅過程:電子電腦嘅原理係內部用微弱嘅電流嚟傳有電(1)同冇電(0)嘅訊號(詳情可以睇下邏輯門相關嘅文),而電腦內部用嘅機械語言就係用一串串有電冇電訊號教部電腦做運算[4];而好似組合語言高級語言等高級啲嘅程式語言就會將呢啲訊號以人類比較容易睇得明嘅符號文字等)呈現出嚟[5];喺用家用呢啲比較高級嘅語言寫好咗源碼之後,部電腦就會用編譯器(compiler)將段碼轉化做機械語言,等部電腦能夠行段命令[6]

喺廿一世紀初,程式編寫係好多科技產品當中不可或缺嘅一環,例如人工智能視像遊戲等大受歡迎嘅技術都會用到程式編寫嘅技術-人工智能簡單講就係用有技巧嘅程式編寫嘅方法嚟令機械做出類似有智能噉嘅行為[7],而視像遊戲基本上就係以電腦程式嘅形式存在嘅遊戲[8]。程式編寫亦因為呢啲廣泛嘅應用而成為咗一種相當有市場價值技能[9]

基本概念

 
一個解決「盞燈唔着」呢個問題嘅演算法-演算法可以用流程圖表示。
睇埋:理論電腦科學

演算法

內文:演算法
睇埋:演算法分析

一個電腦程式實會包含若干段演算法(algorithm)。喺數學電腦科學上,一個演算法係一串能夠完全唔含糊噉話俾人或者電腦聽要點樣解決某啲問題嘅命令[1][10]。好似係以下呢段嘢噉[11]

要解決嘅問題:家吓俾一柞正數輸入)你,假設呢個列唔係一個空列,同我搵嗰柞數入面最大嗰個出嚟。

用嘅演算法嘅步驟:

  1. 設一個變數,叫佢做「max」,並且將佢個數值設做「0」;
  2. 將收到嗰柞正數逐個逐個攞嚟同 max 比較吓;
  3. 如果撞到個大過 max 嘅數(叫呢個數做「x」)嘅話,將 max 嘅數值設做 x,並且繼續將 max 同下個正數比較吓;
  4. 將最後得出嗰個 max 嘅數值(輸出)俾出嚟。max 嘅數值會係成柞數入面最大嗰個。

諗演算法嘅過程係將一份作業揼散做組成份作業嘅細部份,而每個細部份都要係一啲電腦普遍都會識做嘅簡單運算工作(例如係「比較兩個,睇吓邊個大啲」)-呢啲細部份可以話係組成演算法嘅元素,有咗呢啲細部份就有可能將任何「人會想要電腦做嘅工作」砌出嚟[11][12]

分析

演算法分析(analysis of algorithms)係程式編寫相關研究上嘅一個重要課題:演算法有分好多唔同種,有啲好似上面嗰個噉簡單,有啲就複雜到就算係讀電腦相關領域嘅人就噉一睇都未必明呢啲演算法搞緊乜[13];而無論係學術上對演算法嘅研究定實際應用,編程員都好關注要點先可以搵出有效率嘅演算法,目的係要用最少步驟做最多嘅嘢,運算理論(theory of computation)等嘅領域會用大 O 符號(Big O notation)等嘅方法將演算法分門別類,研究吓每款演算法要用幾多時間記憶先做到佢應該做嘅嘢。專業嘅編程員會熟悉常用嘅演算法同每個演算法有幾複雜,並且運用呢啲知識喺做嘢嗰陣揀選要用嘅演算法[14]

 
基本嘅輸入輸出模型;喺最抽象化嘅層面嚟講,一個電腦程式可以想像成一個過程(process),由一個輸入(input)嗰度做一連串運算,最後俾出一個相應嘅輸出(output)。

資料類型

內文:資料類型
睇埋:數據結構

資料類型(data type)係一件資料會具有嘅一個屬性,一件資料會掕住個類型,個類型會話俾部編譯器(compiler)知個程式打算點樣用呢件資料,等部編譯器識得適當噉將段碼變成電腦直接行到嘅機械碼[15]。常見(絕大多數程式語言都支援、而且最多人用)嘅資料類型包括

  • 整數(integer,int),指件資料表示緊一個整數
  • 浮點數(floating point number,float),指件資料表示緊一個可以係小數實數
  • 字符(character,char),指件資料表示緊一個文字等非數字嘅符號
  • 布林(Boolean,bool)指件資料表示緊一個真(1;True)假(0;False)值

... 等等。舉個簡化例子,想像家陣部電腦收到一件數據 00001,如果呢件數據標明咗係一個整數,噉部電腦就知呢件數據代表緊 1 呢個整數,但如果件數據標明咗係一件布林資料,噉呢件數據所代表嘅係先至啱。喺寫程式嗰陣,每個變數常數都會有佢嘅資料類型[註 1];而如果用家嘗試將一個類型唔啱嘅數值加落去一件資料嗰度-例如個程式嘅開頭講明咗 max 呢個變數屬一個整數,但程式半路出現 max = 0.005(將 max 數據設做 0.005),個程式就會同個用家講話程式出錯[16][17]

       (真)、 (假)
整數 浮點數 字符 布林

程式語言

內文:程式語言
睇埋:寫程式架生

程式語言(programming language)係人向電腦俾命令嘅媒介。最原始嘅電腦唔會識得聽自然語言(natural language;即係好似廣東話同閩南話等日常講嘢用嘅語言),所以就噉將頭先嗰段「搵一個數列入面嘅最大數值」嘅演算法打落去部電腦嗰度,係唔會有任何結果出嘅。一個編程員喺決定咗要喺佢個程式入面用個演算法之後,就需要搵返隻啱用嘅程式語言,用隻語言將個演算法寫做一串電腦會聽得明嘅陳述式(statement)先得。頭先嗰個「搵數列嘅最大數值」演算法用 Python(1991 年出嘅一隻程式語言)寫出嚟嘅話會係噉[11]

# 入嘅嘢:一列冧巴,叫佢做「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      # 俾返個最大值出嚟。

語言比較

睇埋:程式語言理論

唔同程式語言支援唔同風格嘅程式編寫。喺搞清楚要用乜嘢演算法解決個問題之後,個編程員就需要諗吓用邊一隻程式語言將個程式寫出嚟。揀用邊隻語言取決於好多因素,例如係隻語言有幾啱用、公司政策、有冇啱用嘅編譯器同埋係個編程員自己嘅習慣呀噉。最理想嘅情況係個編程員揀用最啱用嗰種語言。

雖然話唔同程式語言有咁大嘅差異,但都有好多功能係多人用嘅程式語言冚唪唥都會有嘅。美國電腦科學家亞倫·當尼(Allen B. Downey)喺佢本著作《How To Think Like A Computer Scientist》(粵譯:點樣好似電腦科學家噉思考)入面指出,所有程式語言都有以下呢啲功能[18]

  • Input:由鍵盤、檔案或者部電腦駁住嘅第啲架生嗰度攞資訊。
  • Output:將自己攞到或者處理過嘅資訊喺個熒光幕上面顯示出嚟,再唔係就將呢啲資訊傳去某個檔案或者第件架生嗰度。
  • 算術:做一啲基本嘅算術運算,好似係等等。
  • 條件執行:檢查吓某啲狀態,並且根據狀況決定做邊樣嘢好。
  • 重覆:係噉重覆做某樣作業做若干次,通常次次做親嗰樣作業都會有些少唔同。

高級低級

 
顯示緊機械語言嘅熒幕;呢種語言完全唔似自然語言,冇返咁上下專業訓練實唔會睇得明。
內文:高級程式語言低級程式語言

程式語言可以分做高級(high-level)同低級(low-level)兩大種類。呢種分級唔係話唔同程式語言有啲勁啲有啲渣啲,而且基於一隻程式語言有幾似自然語言:

  • 低級嘅語言,好似係機械語言(machine language)噉,差唔多完全係由 1 同 0 等嘅數字組成嘅,一般人冇乜可能會睇得明,但電腦就係基於呢啲語言嚟行嘅-機械語言完全冇將電腦嘅運算抽象化
  • 而高級啲嘅語言,好似係頭先提過嘅 Python 噉,就係啲電腦科學家為咗令寫程式呢家嘢容易啲而設計出嚟嘅,呢啲語言比較似自然語言,例如上面嗰串 Python 碼就有 if 等嘅英文字,所以對於一般人嚟講比較易明,但就同電腦實際處理緊嘅訊號(有電冇電)好唔同,所以喺用高級語言寫程式嗰陣,吓吓寫完段源碼之後都要搵編譯器將段源碼事先轉化成機械語言,或者搵直譯器將段源碼實時處理;但係即使係用編譯器,編出嚟嘅機械碼行起上嚟可能會慢少少[19]

廿一世紀頭嘅人比較多人用嘅高級程式語言包括咗[20]

... 等等。

編程範式

內文:編程範式
睇埋:抽象化 (電腦科學)

編程範式(programming paradigm)係一種按功能而對程式語言作出嘅分類法,唔同程式語言有唔同嘅功能[註 2],唔同嘅功能會支援唔同嘅編程「處理方法」,而一隻程式語言可以屬多過一種編程範式[21]

舉個例說明,物件導向程式編寫(object-oriented programming,OOP)係一種常用嘅編程範式,指建構程式嗰陣用物件(object)嚟去做基本單元:個程式會有一個個嘅類別(class),每個類別會若干個實例(instance),每個物件都係一個實例,會有若干份資料,而且每件同一類別嘅物件有嘅變數都一樣[22][23]。例如以下呢段 C++ 碼噉:

class Car { // 「Car」係一個類別。
  public: // Car 嘅每一個實例(每件屬於 Car 嘅物件)都會有以下呢啲變數...
    string brand; // 牌子
    string model; // 型號
    int year; // 年份
};

呢種做法喺好多應用上都好幫到手令個程式更加容易打理,例:一位電子遊戲製作師喺度編寫佢隻新遊戲遊戲程式,佢想創造一個遊戲世界俾玩家喺裏面移動;佢想個虛擬世界設計成好似一個現實嘅城市噉,度緊個城市其中一條街要點設計,佢想條街有幾架車泊咗喺度做背景,佢可以設定一個嘅類別,個類別每個實例都有色水位置等嘅變數,然後叫個程式將「建構一個車嘅實例」呢樣嘢做三次-就唔使吓吓都重新打過「建構一個車嘅實例」嘅碼[24]。因為 OOP 咁好使好用,有好多常見嘅程式語言都支援 OOP(為用家提供一啲專做 OOP 嘅陳述式),包括咗 C++、JavaScript 同埋好多遊戲引擎都支援嘅 C#... 等等[25]

 
OOP 嘅例子;如果家陣用家想部電腦顯示四個外形上有少少唔同嘅星形物體,個程式可以將嗰四件物體當成喺「顏色」呢個變數上唔同、但屬同一個類別嘅物件。

Debug

 
1947 年嗰個「bug」;當時電腦科學家喺部電腦入面搵到隻飛蛾,從此程式出錯有咗個花名叫「蟲」。
內文:Debug
睇埋:Logging (電腦)

Debug 係寫程式嗰陣好緊要嘅一個工序,指喺個程式入面搵吓佢有冇 bug(呢個英文字直譯係噉解)。一種常見嘅 debug 方法係俾個程式行幾次,睇吓佢輸出嚟嗰啲結果有冇異常,呢個過程可能會嘥好多時間(一啲複雜嘅程式要行嗮可能要花好幾日嘅時間),但就好緊要-將一個軭咗嘅程式放出嚟俾人用有陣時後果可以好大鑊,例如係一隻負責用嚟分析科研數據嘅軟件如果有錯,可能會累到用隻軟件嚟做研究嘅科學家跟住錯。對 debug 嘅思考會影響程式語言嘅選擇-某啲程式語言零舍容易有某啲類型嘅問題,噉好多時係因為呢啲語言喺編譯嘅過程當中冇其他語言檢查得咁嚴密[26][27]

Bug 種類

內文:Bug

Bug 主要有以下嘅種類,每種嘅處理手法都唔同:

  • 句法錯誤句法(syntax)係指一款程式語言入面指定「邊啲符號(包括數字字母)嘅組合算係有意思」嘅法則,好似係喺 C 程式語言入面,printf("xxx"); 呢行碼會教部電腦顯示出 xxx 噉嘅字,因為 C 語言嘅句法指明咗 printf陳述式係教部電腦做「顯示段字或者變數嘅數值出嚟」嘅作業,而如果一個編程員打錯字,將段碼打咗做(例如)prinf("xxx");(少噉咗個 t),就會搞到個程式因為句法問題而出錯。句法上嘅錯誤係咁多種錯誤當中最易搵到嘅:喺編譯器將段源碼轉換成機械碼嗰陣,實會捉到句法上嘅錯誤[28]
  • 算術上嘅錯誤:就算一個程式句法冇錯、而且亦冇任何形式嘅打錯字,個程式都有可能喺算術上出錯,好似係除以 0 就會搞到個程式行行吓出錯(行吓行吓,段碼叫部電腦將個變數嘅數值除 0,跟手部電腦就出錯),亦都反映個編程員喺寫個程式嗰陣考慮得唔夠周詳,冇諗到個程式行到呢度有可能會出現個噉嘅數值。要應付呢種錯誤,編程界嘅一種常見做法係叫個程式定時定候將啲變數嘅數值顯示出嚟(可以睇返 C 程式語言嘅 printf),等編程員可以一路睇到個程式行嗰陣每個變數嘅數值點樣變,即係個程式會出好似以下噉嘅輸出[29]
t=0:    position = 0      velocity = 0 // 喺時間點(t)0 嗰陣,position 嘅值係 0,velocity 嘅值係 0 
t=1:    position = 0      velocity = 10 // 喺時間點(t)1 嗰陣,position 嘅值係 0,velocity 嘅值係 10 
t=2:    position = 10     velocity = 20 // ... 如此類推。
t=3:    position = 30     velocity = 30
t=4:    position = 60     velocity = 40
t=5:    position = 100    velocity = 50
  • 迴圈遞歸上嘅錯誤迴圈(loop)係一種好常用嘅編程技術;一個迴圈會掕住若干句陳述式同埋重複條件,個程式會按住條重複條件,重複噉行掕住嗰柞陳述式若干次,直至重複條件達到為止,例子有 while 迴圈for 迴圈都係噉。有陣時,編程員可以打錯字,搞到個程式出現無限迴圈(infinite loop)或者無限遞歸(recursion)等嘅問題[30][31]
  • 資源上嘅錯誤:有返咁上下複雜嘅程式基本上實會用到多件資源,包括用部電腦嘅記憶體記住處理緊嗰啲變數嘅數值;呢個過程可以引起好多錯誤,例如係編程員喺初始化(initialize)嗰陣唔記得咗要設定某個變數嘅數值,然後個程式要攞個變數做運算,跟住搞到部電腦因為個變數冇數值而出錯[32]

... 等等。

質素要求

睇埋:軟件工程

一般嚟講,無論一個程式係用嚟做乜嘅都好,啲人都會希望個程式具有以下呢啲特性:

  • 可靠性(reliability):指個程式有幾常會俾到啱嘅結果,一個完美可靠嘅程式係每次行嗰陣都會成功俾到正確輸出嘅,  [註 3];可靠性取決於啲演算法喺概念上嘅正確性同寫程式嘅過程當中有冇出錯,唔可靠嘅程式成日會有競爭危害(race condition;指個程式嘅最終輸出會受一啲唔受控制嘅時間差影響)或者緩衝區溢位(buffer overflow)等嘅問題-即係話如果有呢類問題出現,噉通常表示個程式寫得唔好[33]
  • 強健性(robustness):指個程式有幾能夠預測同應對一啲佢自身以外嘅差錯,包括輸入嘅資料唔啱款(例如係輸入需要係浮點數但用家俾咗個字符)、要用嘅資源(好似係記憶體)唔夠用以及係用家方面嘅出錯呀噉。一個強健嘅程式能夠喺佢自己以外嘅嘢出錯嗰陣有方法應對-簡單講可以想像成「if 有問題,then 用噉噉噉嘅步驟嚟應對」,至少唔會搞到輕機[34]
  • 可移植性(portability):指嗰個程式嘅源碼可以喺幾廣泛嘅電腦硬件作業系統上面行,一個有完美可移植性嘅程式能夠喺任何電腦(無論係個人電腦定係手機等)上面行。可移植性由好多因素話事,例如係有啲程式可能用咗一啲比較專業嘅指令,而呢啲指令專業得滯,未必部部電腦都有安裝呢啲指令-噉就會搞到個程式喺某啲電腦上面行唔到[35]
  • 可維護性(maintainability):指嗰個程式有幾易可以俾現時或者將來嘅編程員攞去改良、執錯或者調較。高嘅可維護性對於普通嘅用家嚟講重要性唔係咁明顯,但就對一個程式長遠嘅命運同價值嚟講就好緊要-具有高可維護性嘅程式往往會俾人攞去改完又改,因而有一個更活躍嘅用家群[36][37]
  • 效率(efficiency):指個程式用咗幾多資源。呢度嘅「資源」包括咗時間、電腦記憶、同埋係網絡頻寬等等。一個理想嘅程式能夠好好噉管理佢有嘅資源,例如係唔好俾漏記憶嘅情況發生,並且用最少嘅資源做最多嘅嘢。可以睇埋運算複雜性理論(computational complexity theory)方面嘅內容[38]
  • 易用性(usability):指一個普通嘅用家有幾易可以正確噉運用呢個程式。一個易用嘅程式會寫得好清楚、冇啲唔等使嘅指令、仲會有好多附加嘅內文嚟解釋每段指令係為乜而存在嘅;呢啲因素令到經驗冇咁豐富嘅編程員或者冇分寫嗰個程式嘅編程員能夠一睇就知嗰個程式做緊啲乜嘢人因工程(ergonomics)呢門專係研究點樣令機械更加易用嘅工程學領域對易用性有詳細嘅研究[39]。睇埋下面可讀性

... 等等。

可讀性

內文:可讀性

喺程式編寫上,可讀性(readability)指一段符號(例如係一個程式嘅源碼)對於人嚟講有幾易睇得明。有啲程式好簡潔,令人一睇就知段源碼係點運作同愛嚟做乜;但又有啲程式可能會(例如)有一大柞唔等使嘅陳述式,搞到一個冇分幫手寫嗰段碼嘅人一眼望落就俾佢搞到一頭霧水。可讀性對於一段源碼嚟講相當緊要:首先,可讀性會影響到個程式嘅易用性可移植性可維護性-一個源碼可讀嘅程式會令到其他人一睇就明佢搞緊乜,所以亦都令人容易攞去用、將段碼用落去喺第啲機上(可移植性)同埋係執呢段碼(可維護性);另一方面,專業嘅編程員會揼好多時間心機去讀同研究彼此寫嘅程式,嘗試理解其他編程員寫嘅程式,以及係將其他編程員嘅程式改少少攞嚟用,而可讀性會令呢個過程更容易。事實上有研究指,好多時用一啲簡單方法令段源碼變可讀啲,就能夠幫其他編程員慳好多時間[40]

要提高一段源碼嘅可讀性,常見嘅方法有[41]

  • 用一貫嘅程式碼風格(programming style);
  • 用好嘅縮排風格(indent styles;喺每一行陳述式前面加空格嘅做法);
  • 注釋(comment;一啲會俾個程式忽略嘅文字碼,可以用嚟向睇嘅人講解每行陳述式用嚟做乜);
  • 分解(decomposition),指將一件複雜嘅工作分做好多件細啲嘅工作,等想改段源碼嗰個人能夠直接飛去佢想改嗰部份[42],例如係喺編寫遊戲程式嗰陣,啲編程員好興俾唔同嘅人物關卡各有自己嘅檔案,等啲人玩起改檔上嚟易搞啲;

... 等等[40]。例如之前提到嗰個「搵出數列入面最大嘅數值」嘅 Python 程式噉:

冇縮排冇注釋: 有縮排有注釋:
def find_max (L):                                   
max = 0
for x in L:
if x > max:
max = x
return max
# 入嘅嘢:一列冧巴,叫佢做「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      # 俾返個最大值出嚟。

簡史

 
英格蘭數學家勒芙蕾絲嘅畫像
睇埋:電腦科學史

中世紀(5 至 15 世紀)經已有數學家喺度寫類似電腦程式嘅嘢,不過歷史學家一般認為,史上第一個電腦程式係由英格蘭數學家勒芙蕾絲(Ada Lovelace)喺 1840 年寫嘅,當時佢為由運算機械之父巴貝治(Charles Babbage)設計嘅分析機(Analytical Engine)寫咗一段演算法,用嚟計白努利數。但係喺 19 世紀至廿世紀初期間,程式編寫一路都係一樣高度專業化嘅嘢,平民好少可會參與[43]

程式編寫普及化係喺廿世紀中開始嘅:廿世紀初嘅電腦程式編寫用嘅基本上淨係得機械語言組合語言,而喺 1953 年,美國電腦科學家莊·巴吉斯(John Backus)提出咗「想要有比起組合語言更加易讀嘅程式語言」嘅諗頭,並且喺 1957 年開發咗世上第一隻廣泛俾人使用嘅高級程式語言 Fortran [44]。高級程式語言呢一樣發明令程式編寫更加易做,所以助長咗「冇乜受過專業訓練嘅人自己學程式編寫」嘅風氣。而到咗廿一世紀初,編程經已成為咗好多技術-例如係人工智能遊戲編程等-嘅重要一環,呢點令編程成為咗一種有相當市場價值技能[9]

註釋

  1. 亦有程式語言係曉自動噉探測件資料嘅類型,例子有 Python
  2. 技術性啲講,即係唔同程式語言將唔同嘢抽象化
  3. 數學上,  係指「事件   發生嘅機會率」。

睇埋

睇埋:電腦科學同埋電腦編程嘅大綱

  1. 1.0 1.1 Knuth, D. E. (1997). The art of computer programming (Vol. 3). Pearson Education.
  2. Computer Programming.
  3. Kotonya, Gerald; Sommerville, Ian (1998). Requirements Engineering: Processes and Techniques. Chichester, UK: John Wiley and Sons.
  4. Fishbein, M. (1972). Appraising information in machine language form. The American Archivist, 35(1), 35-43.
  5. Manuel Carro; José F. Morales; Henk L. Muller; G. Puebla; M. Hermenegildo (2006). "High-level languages for small devices: a case study". Proceedings of the 2006 International Conference on Compilers, Architecture and Synthesis for Embedded Systems. ACM.
  6. Hoare, C. A. R. (1969). An axiomatic basis for computer programming. Communications of the ACM, 12(10), 576-580.
  7. "Single pixel change fools AI programs". BBC News. 3 November 2017.
  8. McShaffry, M. (2014). Game coding complete. Nelson Education.
  9. 9.0 9.1 Why Coding Is Still The Most Important Job Skill Of The Future. fastcompany.com.
  10. Bell, C. Gordon and Newell, Allen (1971), Computer Structures: Readings and Examples, McGraw–Hill Book Company, New York.
  11. 11.0 11.1 11.2 Background: Algorithms. 互聯網檔案館歸檔,歸檔日期2018年7月3號,..
  12. Harel, David, Feldman, Yishai (2004). Algorithmics: The Spirit of Computing. Addison-Wesley.
  13. Clark, K. L., & Darlington, J. (1980). Algorithm classification through synthesis. The Computer Journal, 23(1), 61-65.
  14. del Amo I.G., Pelta D.A. (2013) SRCS: A Technique for Comparing Multiple Algorithms under Several Factors in Dynamic Optimization Problems. In: Alba E., Nakib A., Siarry P. (eds) Metaheuristics for Dynamic Optimization. Studies in Computational Intelligence, vol 433. Springer, Berlin, Heidelberg.
  15. Aho, Alfred V.; Sethi, Ravi; Ullman, Jeffrey D. (1986). Compilers: Principles, Techniques, and Tools (1st ed.). Addison-Wesley.
  16. Shaffer, C. A. (2011). Data Structures & Algorithm Analysis in C++ (3rd ed.). Mineola, NY: Dover. 1.2.
  17. Cleaveland, J. Craig (1986). An Introduction to Data Types. Addison-Wesley.
  18. Downey, A., Wentworth, P., Elkner, J., & Meyers, C. (2016). How To Think Like A Computer Scientist: Learning with Python 3.
  19. Hennessy, John L.; Patterson, David A. Computer Organization and Design. The Hardware/Software Interface. Morgan Kaufmann Publishers.
  20. 10 Most Popular Programming Languages Today
  21. Programming Paradigms (PDF).
  22. Kindler, E.; Krivy, I. (2011). "Object-Oriented Simulation of systems with sophisticated control". International Journal of General Systems: 313–343.
  23. Lewis, John; Loftus, William (2008). Java Software Solutions Foundations of Programming Design (6th ed). Pearson Education Inc. ISBN 978-0-321-53205-3., section 1.6 "Object-Oriented Programming".
  24. Quick Tip: Intro to Object-Oriented Programming for Game Development.
  25. Jacobson, Ivar (1992). Object-Oriented Software Engineering: A Use Case-Driven Approach. Addison-Wesley.
  26. Thorsten Grötker, Ulrich Holtmann, Holger Keding, Markus Wloka, The Developer's Guide to Debugging, Second Edition, Createspace, 2012.
  27. Agans, David J. (2002). Debugging: The Nine Indispensable Rules for Finding Even the Most Elusive Software and Hardware Problems. AMACOM.
  28. Friedman, Daniel P.; Mitchell Wand; Christopher T. Haynes (1992). Essentials of Programming Languages (1st ed.). The MIT Press.
  29. Pomonis, M., Petsios, T., Jee, K., Polychronakis, M., & Keromytis, A. D. (2014, December). IntFlow: improving the accuracy of arithmetic error detection using information flow tracking. In Proceedings of the 30th Annual Computer Security Applications Conference (pp. 416-425).
  30. Charlesworth, A. (1979). Infinite Loops in Computer Programs. Mathematics Magazine, 52(5), 284-291.
  31. Carbin, M., Misailovic, S., Kling, M., & Rinard, M. C. (2011, July). Detecting and escaping infinite loops with Jolt. In European Conference on Object-Oriented Programming (pp. 609-633). Springer, Berlin, Heidelberg.
  32. Zeller, A. (2009). Why programs fail: a guide to systematic debugging. Elsevier. 7.5.1 Reading Uninitialized Variables.
  33. Institute of Electrical and Electronics Engineers (1990) IEEE Standard Computer Dictionary: A Compilation of IEEE Standard Computer Glossaries. New York, NY.
  34. 1990. IEEE Standard Glossary of Software Engineering Terminology, IEEE Std 610.12-1990 defines robustness as "The degree to which a system or component can function correctly in the presence of invalid inputs or stressful environmental conditions".
  35. Mooney, J. D. (2004). Developing portable software. In Information Technology (pp. 55-84). Springer, Boston, MA.
  36. Foreman, John T.; Gross, Jon; Rosenstein, Robert; Fisher, David; Brune, Kimberly (January 1997). "Maintainability Index Technique for Measuring Program Maintainability". C4 Software Technology Reference Guide: A Prototype (PDF). Software Engineering Institute. p. 231.
  37. "Programming 101: Tips to become a good programmer - Wisdom Geek". Wisdom Geek.
  38. Arora, Sanjeev; Barak, Boaz (2009), Computational Complexity: A Modern Approach, Cambridge University Press.
  39. Wegge, K. P., & Zimmermann, D. (2007, July). Accessibility, usability, safety, ergonomics: concepts, models, and differences. In International Conference on Universal Access in Human-Computer Interaction (pp. 294-301). Springer, Berlin, Heidelberg
  40. 40.0 40.1 James L. Elshoff, Michael Marcotty, Improving computer program readability to aid modification (PDF), Communications of the ACM, v.25 n.8, p.512-521, Aug 1982.
  41. Toward Developing Good Programming Style.
  42. Tom DeMarco (1978). Structured Analysis and System Specification. New York, NY: Yourdon, 1978.
  43. Fuegi, J.; Francis, J. (2003). "Lovelace & Babbage and the Creation of the 1843 'notes'". IEEE Annals of the History of Computing. 25 (4): 16.
  44. Backus, John (October–December 1998). "The History of Fortran I, II, and III". IEEE Annals of the History of Computing. 20 (4): 68–78.
  45. Clements, Paul; Felix Bachmann; Len Bass; David Garlan; James Ivers; Reed Little; Paulo Merson; Robert Nord; Judith Stafford (2010). Documenting Software Architectures: Views and Beyond, Second Edition. Boston: Addison-Wesley.
  46. Pigoski, Thomas M., 1997: Practical software maintenance: Best practices for managing your software investment. Wiley Computer Pub. (New York).

文獻

  • A. K. Hartmann, Practical Guide to Computer Simulations, Singapore: World Scientific (2009).
  • A. Hunt, D. Thomas, and W. Cunningham, The Pragmatic Programmer. From Journeyman to Master, Amsterdam: Addison-Wesley Longman (1999).
  • Brian W. Kernighan, The Practice of Programming, Pearson (1999).
  • Weinberg, Gerald M., The Psychology of Computer Programming, New York: Van Nostrand Reinhold (1971).
  • Edsger W. Dijkstra, A Discipline of Programming, Prentice-Hall (1976).
  • O.-J. Dahl, E.W. Dijkstra, C.A.R. Hoare, Structured Pogramming, Academic Press (1972).
  • David Gries, The Science of Programming, Springer-Verlag (1981).

經典

  • Donald Knuth. The Art of Computer Programming, Volumes 1-4A Boxed Set. Third Edition (Reading, Massachusetts: Addison-Wesley, 2011), 3168pp. ISBN 978-0-321-75104-1, 0-321-75104-3
    • Volume 1: Fundamental Algorithms. Third Edition (Reading, Massachusetts: Addison-Wesley, 1997), xx+650pp. ISBN 978-0-201-89683-1, 0-201-89683-4. Errata: [1] (2011-01-08), [2] (2017-09-18, 27th printing). Addenda: [3] (2011).
    • Volume 2: Seminumerical Algorithms. Third Edition (Reading, Massachusetts: Addison-Wesley, 1997), xiv+762pp. ISBN 978-0-201-89684-8, 0-201-89684-2. Errata: [4] (2011-01-08), [5] (2017-09-18, 26th printing). Addenda: [6] (2011).
    • Volume 3: Sorting and Searching. Second Edition (Reading, Massachusetts: Addison-Wesley, 1998), xiv+780pp.+foldout. ISBN 978-0-201-89685-5, 0-201-89685-0. Errata: [7] (2011-01-08), [8] (2017-09-18, 27th printing). Addenda: [9] (2011).
    • Volume 4A: Combinatorial Algorithms, Part 1. First Edition (Reading, Massachusetts: Addison-Wesley, 2011), xv+883pp. ISBN 978-0-201-03804-0, 0-201-03804-8. Errata: [10] (2017-09-18, ? printing).
    • Volume 1, Fascicle 1: MMIX – A RISC Computer for the New Millennium. (Addison-Wesley, 2005-02-14) ISBN 0-201-85392-2 (will be in the fourth edition of volume 1). Errata: [11] (2016-08-02).
    • Volume 4, Fascicle 5: Mathematical Preliminaries Redux; Backtracking; Dancing Links. (Addison-Wesley, 2018-10-18) 320pp, ISBN 978-0-13-467179-6 (will become part of volume 4B).
    • Volume 4, Fascicle 6: Satisfiability. (Addison-Wesley, 2015-12-08) xiii+310pp, ISBN 978-0-13-439760-3. Errata: [12] (2017-06-01) (will become part of volume 4B).

出面網頁