程式語言
程式語言(粵拼:cing4 sik1 jyu5 jin4;英文:programming language),又叫編程語言,係一種畀電腦執行嘅人工語言,用嚟定義電腦程式嘅文法規則,並可以向電腦發出指令。
程式語言嘅描述一般可以分為句法同語義。語法係說明編程語言入面,邊啲符號或文字嘅組合方式係啱嘅,而語義係對於程式嘅解釋[1]。有啲語言係用規格檔案定義,例如C語言嘅規格檔案係ISO標準嘅一部份,2011年後嘅版本為ISO/IEC 9899:2011[2],而其他語言(好似Perl)有一份主要程式嘅語言實現檔案,視為係參考實現。
語言比較
編輯唔同程式語言支援唔同風格嘅程式編寫。喺搞清楚要用乜嘢演算法解決個問題之後,個編程員就需要諗吓用邊一隻程式語言將個程式寫出嚟。揀用邊隻語言取決於好多因素,例如係隻語言有幾啱用、公司政策、有冇啱用嘅編譯器同埋係個編程員自己嘅習慣呀噉。最理想嘅情況係個編程員揀用最啱用嗰種語言[3]。
雖然話唔同程式語言有咁大嘅差異,但有一啲嘢係多人用嘅程式語言冚唪唥都會有嘅。美國電腦科學家亞倫·當尼(Allen B. Downey)喺佢本著作《How To Think Like A Computer Scientist》(粵譯:點樣好似電腦科學家噉思考)入面指出,所有程式語言都有以下呢啲功能[4]:
高階低階
編輯程式語言可以分做高階(high-level)同低階(low-level)兩大種。呢種分級唔係話唔同程式語言有啲勁啲有啲渣啲,而且基於抽象層次。
喺最低嘅層次,電腦實際處理緊嘅訊號係由有電冇電控制,所謂抽象層次就係指你有幾 「抽離」[5]:7 呢種最低嘅層次。但係就算係最低級嘅機械語言用數字表達命令,其實已經抽離咗呢個層次,所以我哋講嘅高級係指抽離咗命令集嘅層面,即係話,你越唔使微觀管理部電腦,越可以容易表達宏觀嘅概念,語言就越高級,高低級亦都其實唔係一個二元嘅分別,而係構成一個光譜。
舉個實例,淨係講 「條件性執行」。例如你想話 「如果乜乜等如乜乜乜,就噉噉,唔係就噉噉噉」,如果你用嘅係最低階嘅機械語言(machine language),你會要注意好多細節,例如位址、暫存器、點樣做比較、字節數量等等,你打入去嘅亦都全部係數字;上一級,組合語言(assembly language),你已經係寫英文簡寫,亦唔使操心啲嘢位址喺邊,要跳幾多個字節等等;再上一級,去到高階語言,用 if else 之類嘅字,雖然仍然係一種特別嘅語言,基本上已經係類似人話。
機械語言 (6502)[註 1] |
組合語言 (6502) |
高階語言 (C) | |||||||
---|---|---|---|---|---|---|---|---|---|
行動碼 | 運算值 | 意思 | 標籤 | 行動碼 | 運算值 | 注釋 | |||
AD | 00 30 | 將喺位址 $3000 嘅字節載入暫存器A | LDA | VAL1 | ; 將 VAL1 載入暫存器A | if (val1 == val2) { | |||
CD | 01 30 | 暫存器A同喺位址 $3001 嘅字節比較 | CMP | VAL2 | ; 暫存器A同 VAL2 比較 | ||||
D0 | 06 | 唔同就向前跳 6 個字節 | BNE | SKIPA | ; 唔同就跳去 SKIPA | ||||
20 | 00 31 | 呼叫喺位址 $3100 嘅嘢 | JSR | TASKA | ; 呼叫 TASKA | taska(); | |||
18 | 進位設做 0 | CLC | ; 進位設做 0 | } else { | |||||
6D | 03 | 進位係 0 就向前跳 3 個字節 | BCC | SKIPB | ; 進位係 0 就跳去 SKIPB | ||||
20 | 00 32 | 呼叫喺位址 $3200 嘅嘢 | SKIPA: | JSR | TASKB | ; 呼叫 TASKB | taskb(); | ||
SKIPB: | } |
高階語言唔係單純因為佢用英文字就高階(啱啱個例子入面嘅組合語言其實都有 if,只係減咗筆,冇寫出來),更加係因為你用呢個 if 就可以表達例如係 「如果乜乜,就噉噉」 嘅概念,而唔使好似個例子入便噉要寫反話或者用其他唔自然嘅表達方法。高階語言就係啲電腦科學家為咗令寫程式呢家嘢容易啲而設計出嚟嘅,對於一般人嚟講比較易明[5]:7–10。
高階點轉低階
編輯任何高於機械語言層次嘅語言都唔可能喺電腦上面直接行[5]:8,尤其係高階語言所表達嘅嘢唔喺命令集嘅層次,同機械語言冇直接對應。要行高階語言寫嘅程式,視乎語言,通常有兩種做法⸺一就係用編譯器(compiler)將段源碼直接或者間接轉化成機械語言,唔係就用直譯器(interpreter)直接處理,連轉化都唔做。(混合情況都會有,例如 Java 嘅編譯器通常係將源碼譯成一種虛擬機嘅機械語言,但係咁即係呢種機械語言仍然唔可能喺電腦上面直接行,要再用直譯器處理。)
有人會認為編譯出來嘅機械語言行起上嚟會慢少少[6],但係其實演算法同數據結構亦都會影響快慢;另外,行得快但係唔常用,或者行得快但係睇唔明所以改唔到亦都係冇用[5]:10。
常見嘅高階語言
編輯廿一世紀頭,比較多人用嘅高階程式語言包括咗[7]:
... 等等。
幾隻常用程式語言嘅嘜頭 | ||||||
---|---|---|---|---|---|---|
程式語言理論
編輯程式語言理論(programming language theory,PLT)係研究程式語言應該點樣設計、執行、分析同分類嘅一套理論。廿一世紀初嘅電腦界有好多唔同嘅程式語言,每款程式語言都有獨特嘅功能,程式語言理論上嘅研究會嘗試比較唔同嘅程式語言,會用邏輯等形式化(formalized)-即係每個符號都有清晰定義,唔似得自然語言咁多歧義-嘅語言表達唔同嘅程式語言,剖析唔同程式語言彼此之間喺解難能力上有乜差異,例如係某隻程式語言會唔會比起第啲程式語言更加擅長解決(需要冇咁多行碼)某啲類型嘅問題等嘅課題。程式語言理論呢個領域會同數學、軟件工程、語言學同認知科學等嘅領域互相影響,而且對應用電腦科學-例如係新程式語言嘅設計等-嚟講相當緊要[3][8]。
註
編輯- ↑ 呢個表入面所有數字都係十六進制,喺 6502 嘅語法 $ 表示十六進制
參考
編輯- ↑ 范國泰。〈語言系統簡介〉. 《系統程式規劃》。台灣苗栗市:聯合大學電子工程學系。原著喺2014-05-28歸檔。喺2014-06-05搵到。
- ↑ 黄章进。〈C++语言漫谈〉 (PDF)。喺2014-06-05搵到。
- ↑ 3.0 3.1 Michael J. C. Gordon. Programming Language Theory and Its Implementation. Prentice Hall.
- ↑ Downey, A., Wentworth, P., Elkner, J., & Meyers, C. (2016). How To Think Like A Computer Scientist: Learning with Python 3.
- ↑ 5.0 5.1 5.2 5.3 Sethi, Ravi (1989). Programming Languages: Concepts and Constructs (英文). Reading, MA: Addison-Wesley.
- ↑ Hennessy, John L.; Patterson, David A. (1993). Computer Organization and Design: The Hardware/Software Interface. Morgan Kaufmann Publishers.
- ↑ Kim, Larry (2015-06-01). "10 Most Popular Programming Languages Today". 喺2022年9月17號搵到.
- ↑ Gunter, Carl and Mitchell, John C. (eds.). Theoretical Aspects of Object Oriented Programming Languages: Types, Semantics, and Language Design. MIT Press.