整同設計能夠執行得到嘅電腦程式嘅過程 From Wikipedia, the free encyclopedia
編程(粵拼:pin1 cing4;英文:programming),全名程式編寫或者電腦程式編寫,係指整同設計能夠執行得到嘅電腦程式。編寫電腦程式嘅過程大致上涉及以下嘅工序[1][2]:
喺編程嘅過程當中,編程員要用程式語言向電腦俾命令:電子電腦嘅原理係內部用微弱嘅電流嚟傳有電(1)同冇電(0)嘅訊號,而電腦內部用嘅機械語言就係用一串串 0 同 1 教部電腦做運算嘅[4];而好似組合語言同高級語言等高級啲嘅語言,就會將呢啲 0 同 1 轉化做對人類嚟講易睇易明嘅符號(例如文字噉)[5];用家用呢啲高級語言寫好咗源碼之後,部電腦會用編譯器將段碼轉化做機械語言,等部電腦能夠行段命令[6]。
喺廿一世紀初,編程係好多科技產品當中不可或缺嘅一部份,例如人工智能(AI)同視像遊戲等嘅技術都會用到編程-AI 簡單講就係用有技巧嘅編程方法嚟令機械做出類似有智能噉嘅行為[7],而視像遊戲就係以電腦程式形式存在嘅遊戲[8]。編程亦都因為呢啲廣泛嘅應用而成為咗一種相當有市場價值嘅技能[9]。
一個電腦程式實會包含若干段演算法。喺數學同電腦科學上,一個演算法係一串能夠完全唔含糊噉話俾人或者電腦聽要點樣解決某啲問題嘅命令[1][10]。好似係以下呢段嘢噉[11]:
要解嘅問題:家吓俾若干個正數(input)你,假設呢個列唔係一個空列,同我搵呢啲數入面最大嗰個出嚟
用嘅演算法嘅步驟:
諗演算法嘅過程,係要將一份作業揼散做組成份作業嘅細部份,每個細部份都要係一啲電腦普遍都會識做嘅簡單運算,例如係「比較兩個數,睇吓邊個大啲」噉-呢啲細部份可以話係組成演算法嘅元素,有咗呢啲細部份就有可能將任何「運算解得到嘅作業」砌到出嚟[11][12]。
實際應用會用到嘅演算法,實要係噉將啲資料攞去做運算。一件資料會掕住個類型,個類型會話俾部編譯器知個程式打算點樣用呢件資料,等部編譯器識得適當噉將段碼變成電腦直接行到嘅機械碼[13]。常見-絕大多數程式語言都支援、而且多人用-嘅資料類型包括
int
),指件資料表示緊一個整數、float
),指件資料表示緊一個可以係小數嘅實數、char
),指件資料表示緊一個文字等非數字嘅符號、bool
)指件資料表示緊一個真(1;True
)假(0;False
)值... 等等。
舉個簡化例子,想像家陣部電腦收到一件數據 0001,如果呢件數據標明咗係 int
類型,噉部電腦就知呢件數據代表緊 1 呢個整數,但如果件數據標明咗係 bool
類型,噉呢件數據所代表嘅係真先至啱。寫程式嗰陣,每個變數同常數都會有返個資料類型[註 1];而如果用家嘗試將一個類型唔啱嘅數值加落一件資料嗰度-例如個程式嘅開頭講明咗 max
呢個變數屬一個整數,但程式半路出現
max = 0.005
(將 max
呢件數據設做 0.005)部電腦就會彈件信息出嚟,同個用家講話段碼有錯[14][15]。
(真)、(假) | |||
整數 | 浮點數 | 字符 | 布林 |
程式語言係人向電腦俾命令嘅媒介。最原始嘅電腦唔會識得聽自然語言(簡單講,即係好似廣東話同客家話等日常講嘢會用嘅語言),所以就噉將頭先嗰段「搵一個數列入面嘅最大數值」嘅演算法打落去部電腦度,係唔會有任何結果出到嘅。一個編程員決定咗個程式做要邊啲運算用咩演算法,就需要搵返隻啱用嘅程式語言,用隻語言將啲演算法寫做一串串電腦會聽得明嘅陳述式。頭先嗰段「搵拃數入面最大嗰個數值」嘅演算法用 Python 呢隻程式語言寫出嚟嘅話,會係噉嘅[11]:
# Input:一列冧巴 L。
# Output:L 入面最大嘅冧巴。
def wan2_max (L): # 定義乜嘢係 "wan2_max"。
max = 0 # 設 max 做 0。
for x in L: # 同每個喺 L 入面嘅 x,做...
if x > max: # 如果 x 大過 max,
max = x # 設 max 做 x。
return max # 俾返 max 個值出嚟。
唔同程式語言喺「支持啲咩編程範式」等多方面都可能有異。搞清楚要用乜演算法解問題之後,編程員需要諗吓用邊一隻程式語言,而揀用邊隻語言取決於好多因素,例如係隻語言有幾啱用、公司政策、有冇啱用嘅編譯器同埋係個編程員自己嘅習慣呀噉。
雖然話唔同程式語言有頗大嘅差異,不過都有唔少功能係主流程式語言冚唪唥都有嘅。美國電腦科學家亞倫·當尼喺佢本著作《How To Think Like A Computer Scientist》(粵譯:點樣好似電腦科學家噉思考)入面指出,所有程式語言都有以下呢啲功能[16]:
程式語言可以分做高級同低級兩大類。呢種分級唔係話唔同程式語言「有啲勁啲有啲渣啲」,而且基於一隻程式語言有幾似自然語言:
if
等嘅英文字,所以對於一般人嚟講比較易明,但就同電腦實際處理緊嘅訊號(有電冇電)好唔同,所以用高級語言寫程式嗰陣,吓吓寫完段源碼之後都要搵編譯器將段源碼轉化成機械語言,或者搵直譯器將段源碼實時處理;但係即使係用編譯器,編出嚟嘅機械碼行起上嚟可能會慢少少[17]。喺廿一世紀頭,比較多人用嘅高級程式語言包括咗[18]:
... 等等。
編程範式係一種按功能而對程式語言作出嘅分類。唔同程式語言有唔同嘅功能[註 4],唔同嘅功能會支援唔同嘅編程「處理方法」。一隻程式語言有可能可以屬多過一隻編程範式[19]。
舉個例說明,物件導向編程(OOP)係一種常用嘅編程範式,指建構程式嗰陣用物件嚟去做基本單元:個程式會有[20][21]
class
),每個類別會有若干個實例(instance
),例如以下呢段 C++ 碼噉:
class Car { // "Car" 係一個類別。
public: // Car 嘅每一個實例(每件屬於 Car 嘅物件)都會有以下呢啲變數...
string brand; // 牌子
string model; // 型號
int year; // 年份
};
呢種做法喺好多應用上都好能夠令個程式更加易打理,例子:想像有位遊戲製作師喺度編寫佢隻新遊戲嘅遊戲程式,佢想創造一個遊戲世界俾玩家喺裏面移動;佢想個虛擬世界設計成好似一座現實嘅城市噉,喺度諗緊座城市其中一條街要點設計,佢想條街有幾架車泊咗喺度做背景,佢可以設定一個車嘅 class
,個 class
每個 instance
都有色水同位置等嘅變數,然後叫個程式將「建構一個車嘅 instance
」呢樣嘢做三次-就唔使吓吓都重新打過「建構一個車嘅 instance
」嘅碼[22]。
因為 OOP 咁好使好用,有好多常見嘅程式語言都支援 OOP,會為用家提供一啲專做 OOP 嘅陳述式,包括咗 C++、JavaScript 同埋好多遊戲引擎都支援嘅 C#... 等等[23]。
Debug(粵拼:di6 bak1)係寫好程式之後要做嘅工序。Debug 指檢查吓個程式,搵吓佢有冇 bug(粵拼:bak1-嚟自英文名詞蟲嘅意思),有嘅話就將啲 bug 清除咗佢。
Debug 嘅一種常見方法係俾個程式行幾次,睇吓佢 output 嗰啲結果有冇異常。呢個過程可能會嘥好多時間,複雜嘅程式要行嗮一次,可能要用成幾日咁耐嘅時間。不過 debug 好緊要-將一個有錯嘅程式放出嚟俾人用後果可以好嚴重,例如一隻負責用嚟分析科研數據嘅軟件如果有錯,可能會連累用隻軟件嚟做研究嘅科學家啲研究結果跟住出錯。對 debug 嘅思考會影響程式語言嘅選擇-某啲程式語言零舍容易有某啲類型嘅問題,好多時係因為呢啲語言喺編譯嘅過程當中冇其他語言檢查得咁嚴密[24][25]。
Bug 主要有以下嘅種類:
printf("xxx");
呢行碼會教部電腦顯示出 xxx
噉嘅字,因為 C 語言嘅句法指明咗 printf
嘅陳述式係教部電腦做「顯示段字或者變數嘅數值出嚟」嘅作業,而如果一個編程員打錯字,將段碼打咗做(例如)prinf("xxx");
(少噉咗個 t
),就會搞到個程式因為句法問題而出錯。句法上嘅錯誤係咁多種錯誤當中最易搵到嘅:喺編譯器將段源碼轉換成機械碼嗰陣,實會捉到句法上嘅錯誤[26]。printf
),等編程員可以一路睇到個程式行嗰陣每個變數嘅數值點樣變,即係個程式會出好似以下噉嘅輸出[27]:
t=0: wai_zi = 0 cuk_dou = 0 // 喺時間點(t)0 嗰陣,wai_zi 嘅值係 0,cuk_dou 嘅值係 0
t=1: wai_zi = 0 cuk_dou = 10 // 喺時間點(t)1 嗰陣,wai_zi 嘅值係 0,cuk_dou 嘅值係 10
t=2: wai_zi= 10 cuk_dou = 20 // ... 如此類推。
t=3: wai_zi = 30 cuk_dou = 30
t=4: wai_zi = 60 cuk_dou = 40
t=5: wai_zi = 100 cuk_dou = 50
... 等等。
一般嚟講,無論一個程式係用嚟做乜嘅都好,啲人都會希望個程式具有以下呢啲特性:
if
有問題,then
用噉噉噉嘅步驟嚟應對」,... 等等。
喺程式編寫上,可讀度指一個程式嘅源碼對人嚟講有幾易睇得明。
有啲程式好簡潔,令人一睇就知段源碼係點運作同用嚟做乜;但又有啲程式可能會(例如)有一大柞唔等使嘅陳述式,搞到一個冇份幫手寫段碼嘅人望落就俾佢搞到一頭霧水。可讀度對於一段源碼嚟講相當緊要:首先,可讀度會影響到個程式有幾易用、可移植同可維護-源碼可讀嘅程式會令到其他人一睇就明佢搞緊乜,所以亦都
另一方面,專業嘅編程員會揼好多時間心機去讀同研究彼此寫嘅程式,嘗試理解其他編程員寫嘅程式,以及係將其他編程員嘅程式改少少攞嚟用,而可讀度高會令呢個過程更加容易。事實上有研究指,好多時用一啲簡單方法令段源碼變可讀啲,就能夠幫其他編程員慳好多時間[36]。
要提高一段源碼嘅可讀度,常見嘅方法有[37]:
comment
;一啲會俾個程式忽略嘅文字碼,可以用嚟向睇嘅人講解每行陳述式用嚟做乜);... 等等[36]。例如之前提到嗰個「搵出數列入面最大嘅數值」嘅 Python 程式噉:
冇縮排冇注釋: | 有縮排有注釋: |
---|---|
def wan2_max (L):
max = 0
for x in L:
if x > max:
max = x
return max
|
# Input:一列冧巴 L。
# Output:L 入面最大嘅冧巴。
def wan2_max (L): # 定義乜嘢係 "wan2_max"。
max = 0 # 設 max 做 0。
for x in L: # 同每個喺 L 入面嘅 x,做...
if x > max: # 如果 x 大過 max,
max = x # 設 max 做 x。
return max # 俾返 max 個值出嚟。
|
喺中世紀(5 至 15 世紀)經已有數學家喺度寫類似電腦程式嘅嘢,不過歷史學家一般認為,史上第一個電腦程式係由英格蘭數學家勒芙蕾絲喺 1840 年寫嘅,當時佢為由運算機械之父巴貝治設計嘅分析機寫咗一段演算法,用嚟計白努利數。但係喺 19 世紀至廿世紀初期間,程式編寫一路都係一樣高度專業化嘅嘢,平民好少可會參與[39]。
程式編寫普及化係喺廿世紀中開始嘅:廿世紀初嘅電腦程式編寫用嘅基本上淨係得機械語言同組合語言,而喺 1953 年,美國電腦科學家莊·巴吉斯提出咗「想要有比起組合語言更加易讀嘅程式語言」嘅諗頭,並且喺 1957 年開發咗世上第一隻廣泛俾人使用嘅高級程式語言 Fortran [40]。高級程式語言呢一樣發明令程式編寫更加易做,所以助長咗「冇乜受過專業訓練嘅人自己學程式編寫」嘅風氣。而到咗廿一世紀初,編程經已成為咗好多技術-例如係人工智能同遊戲編程等-嘅重要一環,呢點令編程成為咗一種有相當市場價值嘅技能[9]。
以下係篇文用咗嘅詞彙嘅粵英對照,啲拼音用嘅係粵拼:
Seamless Wikipedia browsing. On steroids.