電腦程式設計

出自維基百科,自由嘅百科全書
Jump to navigation Jump to search
一段源碼;佢係由一種比較高階啲、似自然語言啲嘅程式語言寫出來嘅,但係都仲好明顯唔似人類日常傾偈講嘢。

電腦程式設計粵拼:din6 nou5 cing4 sik1 cit3 gai3英文computer programming),廣東話日常講嘢通常會就噉嗌程式設計或者編程(programming),係整同設計能夠執行得到嘅電腦程式嘅過程。喺設計電腦程式嘅過程當中,個程式設計員要做嘅嘢包括咗分析要解決嘅問題、諗用邊啲演算法好、計同度吓用緊嗰啲演算法嘅準確性同效率,而個設計員跟手就會揀返種程式語言,並且用佢寫好個程式嘅源碼(source code)[1]。打後個設計員要做嘅工作仲包括咗測試除錯、保存住個程式嘅源碼、做組建自動化嘅過程、同埋管理由呢個程式設計過程整出來嘅產物等等。

程式設計嘅終極目的係要揾出一串能夠令到部電腦曉自動噉去解決一個問題嘅指令。電腦處理訊息嘅方式同人類嘅好唔同,好依賴要有清楚明確嘅指令,所以要做程式設計就要識得多個範疇嘅專業知識-好似係邏輯同簡單嘅數學呀噉,而且有學者就主張喺檢驗一個程式係咪啱用嗰陣可以運用數學證明嘅方法[2]

演算法[編輯]

內文: 演算法

喺清楚咗寫緊個程式要解決啲乜嘢問題之後,首先要做嘅就係要諗吓應該用乜嘢演算法(Algorithm)好。喺數學同電腦科學上,一個演算法係一串能夠完全唔含糊噉話俾人或者電腦聽要點樣解決某啲問題嘅指令[1][3]。好似係以下呢段嘢噉[4]

要解決嘅問題:家吓俾一柞正數你,同我揾嗰柞數入面最大嗰個出來。
用嘅演算法嘅步驟:
  1. 設一個變數,叫佢做「max」,並且將佢個數值設做「0」;
  2. 將收到嗰柞正數逐個逐個攞來同 max 比較吓;
  3. 如果撞到一個大過 max 嘅數(叫呢個數做「x」)嘅話,將 max 嘅數值設做 x,並且繼續將 max 同下個正數比較吓;
  4. 將最後得出嗰個 max 嘅數值俾出來。max 嘅數值會係成柞數入面最大嗰個。

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

演算法研究[編輯]

  • 演算法有分好多唔同種[5],有啲好似上面呢個噉簡單,有啲就複雜到就算係讀開電腦相關領域嘅人就噉一睇都未必會明佢哋搞緊乜。
  • 無論係學術上對演算法嘅研究定係實際應用,程式設計員都好關注點樣先至可以揾到有效率嘅演算法,目的係要用最少嘅步驟做最多嘅嘢。理論電腦科學同做程式設計會用大 O 符號(Big O notation)等嘅方法將演算法分門別類,研究吓每個演算法要用幾多時間同記憶先至做到佢應該做嘅嘢[6]。一個專業嘅程式設計員會好熟悉常用嘅演算法同埋佢哋有幾複雜,並且運用呢啲知識來喺做嘢嗰陣揀要用嘅演算法。

程式語言[編輯]

內文: 程式語言

程式語言(Programming language)係人類同電腦溝通嘅媒介。最原始嘅電腦唔會識得聽自然語言(Natural language;即係好似廣東話同閩南話呢啲日常講嘢用嘅語言),所以就噉將頭先嗰段演算法串嘢打落去部電腦嗰度係唔會有任何結果出到來嘅。一個程式設計員喺決定咗要喺佢個程式入面用呢個演算法之後,就實要揾返個啱用嘅程式語言,用佢將嗰段演算法寫做一串電腦會聽得明嘅指令。頭先嗰個演算法用 Python(1991 年出嘅一種程式語言)寫出來嘅話會係[4]

  Input: A list of numbers, L.
  Output: The largest number in the list L.
  
  def find_max (L):
   max = 0
   for x in L:
       if x > max:
           max = x
   return max

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

廿一世紀頭嘅人比較常用嘅程式語言包括咗[7]

高階低階[編輯]

顯示緊機器語言嘅熒幕;呢種語言完全唔似自然語言,冇返噉上下專業訓練實唔會睇得明。

程式語言有分高階(High-level)同低階(Low-level)[8]。呢種分級唔係話唔同程式語言有啲勁啲有啲渣啲,而且基於佢有幾似自然語言:低階嘅語言,好似係機器語言(Machine language)噉,差唔多完全係由 1 同 0 等嘅數字組成嘅,一般人冇乜可能會睇得明,但係電腦就係基於呢啲語言來行嘅;高階啲嘅語言,好似係頭先提過嘅 Python 噉,就係啲電腦科學家為咗等寫程式容易啲而整出來嘅,佢哋比較似自然語言(上面嗰串 Python 碼就有「if」等嘅英文字),對於一般人來講比較易明,但係就同電腦實際處理緊嘅訊息好唔同,所以用高階語言嗰陣,吓吓寫完源碼之後都要用編譯器(Compiler)將啲源碼轉化,搞到佢哋行起上來慢少少。

語言比較[編輯]

美國電腦科學家 Allen B. Downey 喺佢嗰本著作《How To Think Like A Computer Scientist》(個名直譯係「點樣好似電腦科學家噉思考」)噉講:

喺唔同嘅(程式)語言入面,啲細眉細眼嘢望落係唔同,但係呢啲語言冚唪唥都有幾類基本嘅指令:
輸入:由個鍵盤、檔案、或者其他架生嗰度攞資訊。
輸出:將自己攞到或者處理過嘅資訊喺個熒光幕上面顯示出來,再唔係就將呢啲資訊傳去某個檔案或者第件架生嗰度。
算術:做一啲基本嘅算術運算,好似係等等。
條件性執行:檢查吓某啲狀態,並且根據狀況決定做邊樣嘢好。
重覆:係噉重覆做某啲作業做若干次,通常次次做親嗰樣作業都會有些少唔同。

程式設計概念[編輯]

睇埋:軟件工程

質素要求[編輯]

無論一個程式係用來做乜嘅都好,最後整出來嗰個程式都實要滿足某一啲條件先至會有人肯用。包括咗:

  • 可靠性(Reliability):指個程式有幾常會俾到啱嘅結果,而一個完美可靠嘅程式係實會出到正確結果嘅[9]。可靠性取決於啲演算法喺概念上嘅正確性同埋喺寫程式嘅過程入面有冇出錯,一個唔可靠嘅程式就可能會有競爭危害(Race conditions)或者緩衝區溢位(Buffer overflows)等嘅問題-前者指個程式最後俾出來嗰個輸出會因為一啲唔受控嘅嘢喺時間上嘅先後次序而有異。如果有呢類問題出現,噉表示個程式寫得唔好。
  • 強健性(Robustness):指個程式有幾能夠預測同應對一啲佢自身以外嘅差錯[10],例如係輸入嘅訊息唔啱款、要用嘅資源(好似係電腦記憶)唔夠用、同用家方面嘅出錯呀噉。一個理想、強健嘅程式能夠喺佢自己以外嘅嘢出錯嗰陣應對,而唔至於搞到會當機
  • 易用性(Usability):指一個普通嘅用家有幾易可以正確噉運用呢個程式。一個易用嘅程式會寫得好清楚、冇啲唔等使嘅指令、仲會有好多附加嘅內文來解釋某段指令係為乜嘅,呢啲因素令到做程式設計嘅新仔或者冇份寫嗰個程式嘅程式設計員能夠一睇就知嗰個程式做緊啲乜嘢。人因工程學(Ergonomics)呢門專係研究點樣令到機器更加易用嘅工程學領域對於易用性有詳細嘅研究[11]
  • 可移植性(Portability):指嗰個程式嘅源碼可以喺幾廣泛嘅電腦硬件作業系統上面行,一個有完美可移植性嘅程式能夠喺任何電腦上面行。可移植性由好多因素話事,例如係有啲程式可能用咗一啲比較專業嘅指令,而呢啲指令專業得滯,未必部部電腦都有裝佢哋-噉就會搞到呢個程式喺某啲電腦上面行唔到。
  • 保守性(Maintainability):指個程式有幾易可以俾而家或者將來嘅程式設計員改良、執錯、或者調較。高保守性對於普通嘅用家來講未必噉顯眼,但係對於個程式長遠嘅命運同價值來講就好緊要[12]
  • 效率(Efficiency):指個程式用咗幾多資源。呢度嘅「資源」包括咗時間、電腦記憶、同埋係網絡頻寬等等。一個理想嘅程式能夠好好噉管理佢有嘅資源,例如係唔好俾漏記憶嘅情況發生,並且用最少嘅資源做最多嘅嘢。

源碼嘅可讀性[編輯]

內文: 可讀性

喺程式設計入面,可讀性(Readability)指一個人類就噉望會有幾能夠明一段源碼係點運作同愛來做啲乜。有啲程式好簡潔,但係又有啲可能會有一大柞唔等使嘅指令,一個冇份幫手寫嗰段源碼嘅人一眼望落去可能會俾佢搞到一頭霧水。

可讀性對程式設計員來講好緊要。首先,可讀性會影響到一個程式嘅易用性、可移植性同埋保守性-一個可讀嘅程式會令到其他人一睇就明佢搞緊乜,所以亦都令到人容易去用佢、將佢用喺其他機上面、同埋執佢;另一方面,程式設計員會揼好多時間心機去讀同研究彼此寫嘅程式,嘗試理解其他設計員寫嘅程式,以及係將其他設計員嘅程式改少少再攞來用,事實係有研究指,好多時用一啲簡單嘅方法令到段源碼變可讀啲就能夠令其他程式設計員慳好多時間[13]

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

  • 用一貫嘅程式碼風格(Programming style)[14]
  • 用好嘅縮排風格(Indent styles);
  • 注釋(Comment);
  • 分解(Decomposition),指將一個複雜嘅工作分做好多件,等想改段源碼嗰個人能夠直接飛去佢想改嗰部份[15],例如係設計 Game 嗰陣,啲設計員就興俾唔同嘅人物同關卡各有自己嘅檔案,等啲人玩起改檔上來易搞啲;

... 等等。

除錯[編輯]

1947 年嗰個「Bug」;嗰次係啲電腦科學家喺部電腦入面揾到隻飛蛾,從此程式出錯有咗個花名叫「蟲」。
內文: 除錯

除錯(Debugging)係軟件工程上好緊要嘅一樣工序[16],指喺個程式入面揾吓佢有冇 Bug(呢個英文字直譯係「蟲」噉解)。一種常見嘅除錯方法係俾個程式行幾次,睇吓佢輸出來嗰啲結果有冇異常嘅地方,呢個過程可能會嘥好多時間,但係就好緊要-一個程式出錯有陣時後果可以好大鑊,例如係一個負責處理數據分析嘅程式如果有錯,可能會累到用佢來做科研嘅科學家跟住錯,會搞到好大件事。某啲程式語言零舍容易有某啲類型嘅問題,噉好多時係因為佢哋喺編譯嘅過程當中冇其他語言檢查得噉嚴密。

喺揾到一個 Bug 之後,程式設計員好多時會首先試吓將一個程式嘅輸入簡化,睇吓個程式係邊忽衰咗。舉個例說明,如果家吓喺處理一個大檔案嘅編譯嗰陣,個編譯器有 Bug 搞到當咗機,跟手個程式設計員可以試吓將嗰個大檔案斬件做五份,(例如)發現淨係喺個編譯器編譯緊呢五份入面其中一份嗰陣先至會有 Bug,噉就知道,令到個編譯器當機嘅問題喺嗰份嘢入面-呢份嘢入面有某啲類型嘅資訊係個編譯器搞唔掂嘅,噉就幫到個設計員可以進一步估吓個編譯器係邊忽有問題。

程式設計員[編輯]

英格蘭數學家 Ada Lovelace 喺 1840 年寫咗人類史上第一個演算法俾部分析機處理,可以話係史上第一個程式設計員。
內文: 程式設計員

程式設計員(Computer programmer)係受過訓練,專職做程式設計嘅人。佢哋嘅工作包括咗[17]

...等等。

睇埋[編輯]

[編輯]

  1. 1.0 1.1 Knuth, D. E. (1997). The art of computer programming (Vol. 3). Pearson Education.
  2. Hoare, C. A. R. (1969). An axiomatic basis for computer programming. Communications of the ACM, 12(10), 576-580.
  3. Bell, C. Gordon and Newell, Allen (1971), Computer Structures: Readings and Examples, McGraw–Hill Book Company, New York.
  4. 4.0 4.1 4.2 Background: Algorithms.
  5. Clark, K. L., & Darlington, J. (1980). Algorithm classification through synthesis. The Computer Journal, 23(1), 61-65.
  6. 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.
  7. 10 Most Popular Programming Languages Today
  8. Hennessy, John L.; Patterson, David A. Computer Organization and Design. The Hardware/Software Interface. Morgan Kaufmann Publishers.
  9. Institute of Electrical and Electronics Engineers (1990) IEEE Standard Computer Dictionary: A Compilation of IEEE Standard Computer Glossaries. New York, NY.
  10. 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".
  11. 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
  12. "Programming 101: Tips to become a good programmer - Wisdom Geek". Wisdom Geek.
  13. James L. Elshoff, Michael Marcotty, Improving computer program readability to aid modification, Communications of the ACM, v.25 n.8, p.512-521, Aug 1982.
  14. Toward Developing Good Programming Style
  15. Tom DeMarco (1978). Structured Analysis and System Specification. New York, NY: Yourdon, 1978.
  16. Thorsten Grötker, Ulrich Holtmann, Holger Keding, Markus Wloka, The Developer's Guide to Debugging, Second Edition, Createspace, 2012.
  17. Computer Programmer Career Profile.

相關嘅書[編輯]

  • 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)
  • 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)

出面網頁[編輯]

Wikibooks
有一本書關於呢個標題嘅維基書睇:
Wikibooks
有一本書關於呢個標題嘅維基書睇: