電腦編程嘅大綱
跳去導覽
跳去搵嘢
以下呢篇大綱,旨在將電腦編程會用到嗰啲重要概念冚唪唥列嗮佢哋出嚟。
平台[編輯]
範式[編輯]
- 程序式(procedural):強調「電腦程式係一連串要行嘅指令」,集中於將寫緊嘅電腦程式分開做若干橛,每橛都係一拃彼此相關嘅指令(每橛都係一段程序-睇埋子程序同控制流程嘅概念)[1]。
- 模塊化(modular):著眼於想將一個好龐大嘅電腦程式分做若干嚿功能上互相獨立嘅部份(每嚿都係一嚿模塊;module),每嚿都要係可以獨立噉行得到嘅[2]。可以睇吓下面講到嘅超距作用。
物件導向[編輯]
物件導向編程(object-oriented programming,OOP)係指以物件(object)嚟做一個程式嘅基本單元;一件物件會包括一柞特定嘅數據,呢啲數據(特性)因為用途上有某啲共通點而俾設計者擺埋一齊嚟睇;除此之外,一件物件通常仲會掕住一啲專門處理同嗰件物件相關嘅工作嘅子程序,呢啲子程序就係嗰件物件嘅方法[3][4]。
- 類別(class):一個類別會講明屬於呢個類別嘅物件每一件會掕住嘅
- 類別變數(class variable):個類別有嗰啲變數。
- 實例變數(instance variable):個類別嘅每個實例都會有嘅變數,每個呢啲變數都係照住個類別個版整嘅。
- 物件生命週期(object lifetime):指一件物件由「被創造」至「被剷走」之間嘅嗰段時間[6]。
- 封裝(encapsulation):指將(通常係將屬同一件物件嘅)數據同埋操縱呢啲數據嘅子程序「包埋一齊」,等呢啲數據同子程序難以俾外界干擾同亂咁用[7]。
- 繼承(inheritance):物件嘅類別之間可以有嘅一種關係;抽象啲噉講,如果話物件類別 A 由類別 B 嗰度「繼承」啲嘢,意思係指類別 B(超類別;superclass / parent)有嘅特性,類別 A(子類別;subclass / child)冚唪唥有齊嗮,不過類別 A 可以有類別 B 冇嘅特性[8]。
- 物件組成(object composition):廣義上係泛指將啲物件或者資料類型砌埋一齊組成更加複雜嘅物件[11]。
- 物件結合(object aggregation):物件結合意思係指件複雜物件
com
由多件物件組成,但com
並唔「擁有」啲組成部份-當com
俾人剷走嗰陣,如果用嘅係物件組成,組成com
啲物件都會跟住被剷走,但喺物件結合之下,啲組成部份並唔隸屬於com
,就算com
俾人剷走,啲組成部份仲可以繼續噉存在[11]。 - 基於類別(class-based)定基於原型(prototype-based):兩種相對嘅 OOP 做法[12];基於類別編程係比較常見嗰種,意思係指個 OOP 程式以類別做出發點-
- 定義類別 X 有邊啲特性同方法;
- 建立物件 A,A 屬類別 X;
- 建立物件 B,B 屬類別 X... 如此類推;
- 而基於原型編程就唔同,唔會明確噉定義「個類別係乜」,而係會攞一嚿已有嘅物體做「原型」-
- 攞一嚿物件 A;
- 建立一件新嘅物件 B,並且指明 B 繼承嗮 A 啲特性同方法(A 係 B 嘅原型);
- 跟住可以用同樣嘅方法建立更多嘅物件;
郁手編寫[編輯]
- Hello World:係指喺螢幕顯示「Hello, World!」(你好,世界!)噉嘅字串嘅電腦程式;呢種程式通常都係每種程式語言最基本、最簡單嘅程式,常用於示範一隻程式語言點運作。例如係以下呢段 C 嘅碼噉:
int main() /* 下面嘅係主程序... */ { printf("Hello, World!"); /* 呢句嘢叫部電腦出「Hello, World!」噉嘅字串。 */ }
- 直譯器(interpreter):指一個能夠直接噉執行以某啲程式語言寫嘅指示嘅程式。
- 讀取-求值-輸出循環(read-eval-print loop,REPL):一種簡單嘅編程環境,部機係噉重複「攞一條表達式、行、然後彈個 output 出嚟睇」噉嘅過程[13]。
- 條件陳述式(conditional statement):絕大多數程式語言都會有嘅一種陳述式,功能係視乎情況(睇埋邏輯與、邏輯或同邏輯非)決定係咪要做某啲運算同採取某啲行動-一句條件陳述式會掕住一柞碼同一句佢要評估嘅條件,當個電腦程式行到個條件陳述式嗰時,如果個條件係真,個程式就會行條件陳述式掕住嗰柞碼,否則個程式就唔會行嗰柞碼[14]。好似以下噉:
- 遞歸(recursion):指一個子程式用到佢自己,例如以下呢段簡單嘅碼噉[15]:
function dream() print "Dreaming" dream() // dream 呢個子程式當中用到自己。
- 應用程式(application software):電腦程式一種,指個程式設計嚟做某啲特定嘅作業,對部電腦本身嘅運作冇幫助,通常攞嚟俾終端用家用嘅;例如一隻電子遊戲或者一隻文書處理器就係應用程式-一隻電子遊戲會呈現一隻遊戲嚟娛樂玩家,而一隻文書處理器會俾用家有得處理文字,兩種程式都唔會幫部電腦運作[16]。
- Regex(全名 regular expression):指由一段字符當中搵出某串特定嘅字符,好似係[17]
^The
(搵出以The
做開頭嘅字符串)end$
(搵出以end
做結尾嘅字符串)^The end$
(搵出同「The end
」完美符合嘅字符串)... 呀噉。
- cmd.exe:又有叫命令提示符(command prompt),係好多個作業系統(包括 Microsoft Windows)預設嘅命令行直譯器,會俾用家以命令行介面嘅形式嚟指揮部電腦做嘢,一行指令望落係類似噉嘅樣[18]:
C:\>CommandA && CommandB && CommandC

- 呢嚿嘢(this):常見於 OOP 嘅一種功能,指隻程式語言有方法喺一句指令入面講行緊嗰段碼屬嘅一件物件或者類別;例如想像遊戲編程,其中一件物件有個子程序,個子程序會改變件物件嘅位置,就有可能會出現類似以下噉嘅碼:
this.position = [0,0,0];
;意思係「呢嚿嘢(this
)嘅位置(position
)要變成(=
)指定咗嘅值([0,0,0]
)。
- 函式庫(library):指電腦程式用嘅非揮發性(唔會一熄機就冇咗嘅)資源,包括數據庫嘅數據以及陳述式噉;資訊科技工作者好興用函式庫嚟交流,令大家做嘢更加方便,例如 AI 噉,會有 AI 工作者搵埋一拃 AI 工作成日用嘅子程序,將呢啲子程序變成陳述式;第啲 AI 工作者攞去用,就可以達到「用一句碼就叫到部電腦做一樣 AI 常用嘅子程序」噉嘅效果[19]。
演算法[編輯]
程式語言[編輯]
程式語言(programming language)泛指用嚟教電腦做運算嘅人造語言,每隻字都會有清楚同固定嘅定義;廿一世紀初常用嘅程式語言有 Python、Java、JavaScript、C、SQL、MATLAB 同埋 Processing 等等。
- 程式語言理論(programming language theory):電腦科學嘅一個子領域,包含研究程式語言呢樣嘢應該點樣設計、分析同埋分門別類嘅一套理論;程式語言理論會用邏輯等形式化-即係每個符號都有清晰定義,唔似得自然語言咁多歧義-嘅語言嚟表達唔同嘅程式語言,剖析唔同程式語言彼此之間喺解難能力上有乜嘢差異,例如係「某隻程式語言會唔會比起第啲語言更加擅長解某啲類型嘅問題」等嘅課題[20]。
- 語言原始體(language primitive):指一隻程式語言入面最簡單嘅元素,簡單到唔會靠第啲元素嚟定義;包括咗「要處理嘅數據」同「做喺啲數據上做啲咩運算」。
- 句法(syntax):指一隻程式語言入面指定「邊啲符號(包括數字同字母)嘅組合算係有意思」嘅法則,好似喺 C 程式語言入面,
printf("xxx");
呢行碼會教部電腦顯示出xxx
噉嘅字,因為 C 語言嘅句法指明咗printf
嘅陳述式係教部電腦做「顯示段字出嚟」嘅作業[22]。 - 抽象化(abstraction):指由研究緊嗰樣物件嗰度攞走不必要嘅資訊,等個研究者可以集中諗件物件重要嗰啲部份;喺編程上,抽象化包括(例如)同一個子程序改返個名,然後次次想部電腦行個子程序嗰陣直接用嗰個名而唔係將個子程序成段碼再打多次。
- 變數(variable)同常數(constant):喺編程上,一個變數係指某個儲存位置(記憶體地址)加一個符號性嘅名(識別碼),而個變數會有個喺程式執行期間可以改變嘅數值;而常數就係指個儲存位置嘅數值喺程式執行期間唔可以被改變[23]。
- 算子(operator):指一隻程式語言入面行為似函數噉嘅嘢,例如「加減」或者「比較兩個數嘅大細」呀噉;運算數(operand)就係指俾算子攞去計嘅數,例如
1 + 1
當中嘅1
係運算數,而+
就係算子[24]。 - 子程序(subroutine):指一個大型程式當中特定嘅一拃程式碼,由一個或者多個陳述式組成,專門完成某項工作,而且獨立於子程式以外嘅陳述式。通常用嚟教個程式做一啲要重複做若干次嘅工作。
- 表達式(expression):喺一段程式碼當中,一段表達式係結合咗若干個常數、變數、子程序同算子而成嘅物體,能夠俾隻程式語言攞去行。
- 求值策略(evaluation strategy):指一隻程式語言用咩方法嚟同啲表達式做求值;舉例說明,想像家陣要行以下噉嘅表達式[25]
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)嘅話,會做嘅嘢係「吓吓都郁手拆咗最左嗰個子程序先」→
(double (average 2 4)) => (plus (average 2 4) (average 2 4)) => (plus (divide (plus 2 4) 2) (average 2 4)) => ...
- 而用應用次序求值(applicative-order evaluation)嘅話,會做嘅嘢係「吓吓都郁手拆咗最入嗰個子程序先」→
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 以外嘅環境係完全冇用嘅[27];領域特定語言嘅相對係通用電腦語言-通用電腦語言可以用喺多種唔同嘅環境度,例如係 Python 同 C 呀噉。
編程技巧[編輯]
- DRY 原則(英文全名:Don't Repeat Yourself,「唔好重複你自己做過嘅嘢」):程式編寫上嘅一種技巧,指喺寫一隻電腦軟件嗰陣要盡可能避免重複一段碼;一般認為,如果一個程式想將某樣嘢重複噉做幾次嘅話,用程式迴圈或者子程序等嘅技術會比較理想[28]。
- KISS 原則(英文全名:Keep It Simple, Stupid,「將件嘢整簡單啲呀,蠢材」):程式編寫上嘅一種技巧,指「如果有多過一種方法可以達到想要嗰隻效果,噉就應該用最簡單嗰種」;一般認為,一個程式盡可能簡單嘅話可以令個程式易用啲,好處包括咗「下一手編程員接手嗰時輕鬆順利啲」呀噉[29]。
- Log 檔案:廿一世紀初主流作業系統都會內置嘅功能,能夠用某啲方式記住一個作業系統或者軟件行起上嚟「喺邊個時間點發生咗啲乜事」噉嘅資訊;Log 喺寫程式嗰陣時好有用,會話畀編程員知「出咗錯嗰個程式,出錯之前做過咗乜」噉嘅資訊,編程員可以靠呢樣資訊得知「個程式係邊忽有問題」。
- 超距作用(action at a distance):指個程式入面其中一部份出現意料之外嘅問題,而起因在於因為離嗰橛碼遠嘅另一段碼對佢作出咗影響,例如一個長(有幾萬行碼)嘅程式,當中有好多個子程序,其中兩個子程序 A 同 B,A 會更改變數
X
嘅數值,而咁啱 B 又會用到呢個變數,如果 A 搞到X
變咗做個 B 處理唔到嘅數值,就會搞到 B 出錯;超距作用喺正式嘅軟件工程上係一條幾大嘅問題(因為呢啲工作要整好複雜嘅程式),常見嘅解決方法係淨係俾啲子程序同物件更改自己周圍啲局部變數,唔准佢哋更改全局變數或者離佢哋遠嘅物件嘅局部變數[2]。睇埋模塊化編程。 - 可讀性(readability):指一段符號(好似係個程式嘅源碼)對人類嚟講有幾易睇易明;例如電腦工作者之所以會創造高級程式語言,理由就係因為機械語言嗰種「吓吓都係出一大串
0
同1
,而且串嘢入面多咗或者少咗個數就搞到成段碼錯嗮」噉嘅做法可讀性低得好交關;一般嚟講,電腦工作者寫軟件嗰陣都會追求源碼可讀性要高,簡單嘅例子有喺啲程式度落注釋呀噉[30]。
睇埋[編輯]
攷[編輯]
- ↑ Procedural programming vs object-oriented programming. neonbrand.com.
- ↑ 2.0 2.1 Sins of Perl Revisited
- ↑ Kindler, E.; Krivy, I. (2011). "Object-Oriented Simulation of systems with sophisticated control". International Journal of General Systems: 313-343.
- ↑ Oppel, Andy (2005). SQL Demystified. McGraw Hill. p. 7.
- ↑ Booch, Grady (1986). Software Engineering with Ada. Addison Wesley. p. 220.
- ↑ Object Lifetime and Storage Duration in C++. Linux Hint.
- ↑ Rogers, Wm. Paul (18 May 2001). "Encapsulation is not information hiding". JavaWorld.
- ↑ Johnson, Ralph (August 26, 1991). "Designing Reusable Classes" (PDF). www.cse.msu.edu.
- ↑ Cargill, T. A. (Winter 1991). "Controversy: The Case Against Multiple Inheritance in C++". Computing Systems. 4 (1): 69-82.
- ↑ Polymorphism explained simply!. Medium.
- ↑ 11.0 11.1 Yaiser, Michelle. "Object-oriented programming concepts: Composition and aggregation". Archived from the original on April 8, 2015. There is a closely related concept to composition called aggregation. In conversation the differences between composition and aggregation are often ignored.
- ↑ Crockford, Douglas. "Prototypal Inheritance in JavaScript". Retrieved 22 June 2021.
- ↑ Grillmeyer, O. (2013). Exploring Computer Science with Scheme. Undergraduate Texts in Computer Science. Springer New York. p. 239. Retrieved 2021-06-26. The central component to the Scheme interpreter is the read-eval-print loop. Commands are read in, then evaluated. Finally, the evaluated result is printed."
- ↑ Gabbay, D., Giordano, L., Martelli, A., Olivetti, N., & Sapino, M. L. (2000). Conditional reasoning in logic programming. The Journal of Logic Programming, 44(1-3), 37-74.
- ↑ Recursion and Backtracking.
- ↑ Ceruzzi, Paul E. (2000). A History of Modern Computing. Cambridge, Massachusetts: MIT Press.
- ↑ Aho, Alfred V. (1990). van Leeuwen, Jan (ed.). Algorithms for finding patterns in strings. Handbook of Theoretical Computer Science, volume A: Algorithms and Complexity. The MIT Press. pp. 255-300.
- ↑ Stanek, William R. (2008). Windows Command-Line Administrator's Pocket Consultant (2nd ed.). Microsoft Press.
- ↑ Levine, John R. (2000) [October 1999]. "Chapter 9: Shared Libraries & Chapter 10: Dynamic Linking and Loading". Linkers and Loaders. The Morgan Kaufmann Series in Software Engineering and Programming (1 ed.). San Francisco, USA: Morgan Kaufmann.
- ↑ Gordon, M. J. (1988). Programming language theory and its implementation (Vol. 10). Englewood Cliffs, NJ: Prentice-Hall.
- ↑ Neamtiu, Iulian; Foster, Jeffrey S.; Hicks, Michael (May 17, 2005). Understanding Source Code Evolution Using Abstract Syntax Tree Matching. MSR'05. Saint Louis, Missouri: ACM.
- ↑ Friedman, Daniel P.; Mitchell Wand; Christopher T. Haynes (1992). Essentials of Programming Languages (1st ed.). The MIT Press.
- ↑ Schilling, Jonathan L. (April 1995). "Dynamically-Valued Constants: An Underused Language Feature". SIGPLAN Notices. 30 (4): 13-20.
- ↑ Iverson, K. E. (1962, May). A programming language (PDF). In Proceedings of the May 1-3, 1962, spring joint computer conference (pp. 345-351).
- ↑ Abelson, Harold; Sussman, Gerald Jay (1996). Structure and Interpretation of Computer Programs (Second ed.). Cambridge, Massachusetts: The MIT Press. p. 21-22.
- ↑ Normal, Applicative and Lazy Evaluation. Kevin Sookocheff.
- ↑ Marjan Mernik, Jan Heering, and Anthony M. Sloane (2005). When and how to develop domain-specific languages. ACM Computing Surveys, 37(4): 316-344.
- ↑ Foote, Steven (2014). Learning to Program. Addison-Wesley Professional. p. 336.
- ↑ The Routledge Dictionary of Modern American Slang and Unconventional English, Tom Dalzell, 2009, 1104 pages, p.595, webpage: BGoogle-5F: notes U.S. Navy "Project KISS" of 1960, headed by Rear Admiral Paul D. Stroop, Chicago Daily Tribune, p.43, 4 December 1960.
- ↑ Elshoff, J. L.; Marcotty, Mi. (1982). "Improving computer program readability to aid modification". Communications of the ACM, 25(8): 512-521.