程式語言

用於將指令傳達給機器的語言

程式語言(英語:programming language),是用來定義電腦程式形式語言。它是一種被標準化的交流技巧,用來向電腦發出指令,一種能夠讓程式設計師準確地定義電腦所需要使用資料的電腦語言,並精確地定義在不同情況下所應當採取的行動。

「程式語言」的各地常用名稱
中國大陸程序設計語言、編程語言
臺灣程式設計語言、程式語言
港澳程式設計語言、程式語言
程式設計語言中的經典語句:
Hello World

最早的程式語言是在電腦發明之前產生的,當時是用來控制提花織布機英語Jacquard loom自動演奏鋼琴的動作[1]。在電腦領域已發明了上千不同的程式語言,而且每年仍有新的程式語言誕生。很多程式語言需要用指令方式說明計算的程式,而有些程式語言則屬於宣告式程式設計,說明需要的結果,而不說明如何計算。

程式語言的描述一般可以分為語法英語Syntax (programming languages)語義。語法是說明程式設計語言中,哪些符號或文字的組合方式是正確的,語義則是對於編程的解釋[2]。有些語言是用規格檔案定義,例如C語言的規格檔案也是ISO標準中一部份,2011年後的版本為ISO/IEC 9899:2017,而其他語言(例如Ada或者Perl)有一份程式語言實現英語Programming language implementation檔案,視為參考實現英語reference implementation

概論 編輯

程式語言原本設計是專用於電腦,也用來定義演算法或者資料結構。故而程式設計師試圖使程式碼容易閱讀

 
BBC BASIC語言顯示在螢幕上

程式語言往往使程式設計師能夠比使用機器語言更準確地表達他們所想表達的目的。對那些從事電腦科學的人來說,懂得程式設計語言是十分重要的,因為在當今所有的計算都需要程式設計語言才能完成。

之所以有那麼多種不同的程式語言存在的原因是,編寫程式的初衷其實也各不相同;新手與老手之間技術的差距非常小,而且有許多語言對新手來說太容易學;還有,不同程式之間的執行成本(runtime cost)各不相同。

有許多用於特殊用途的語言,只在特殊情況下使用。例如,PHP專門用來顯示網頁Perl適合文字處理;C語言被廣泛用於作業系統編譯器的開發(所謂的系統程式設計)。[3]

高階語言的出現使得電腦程式設計語言不再過度地依賴某種特定的機器或環境。這是因為高階語言在不同的平台上會被編譯成不同的機器語言,而不是直接被機器執行。最早出現的程式語言FORTRAN的一個主要目標,就是實現平台獨立。

雖然大多數的語言既可被編譯又可被解譯,但大多數僅在一種情況下能夠良好執行。在一些程式設計系統中,程式要經過幾個階段的編譯,一般而言,後階段的編譯往往更接近機器語言。這種常用的使用技巧最早在1960年代末用於BCPL,編譯程式先編譯一個叫做「0代碼」的轉換程式(representation),然後再使用虛擬器轉換到可以執行於機器上的真實代碼。這種成功的技巧之後又用於Pascal和P-code,以及Smalltalk和二進位碼,在很多時候,中間過渡的代碼往往是解譯,而不是編譯的。

如果所使用的翻譯的機制是將所要翻譯的程式碼作為一個整體翻譯,並之後執行內部格式,那麼這個翻譯過程就被稱為編譯。因此,一個編譯器是一個將人可閱讀的程式文字(叫做原始碼)作為輸入的資料,然後輸出可執行檔(object code)。所輸出的可執行檔可以是機器語言,由電腦的中央處理器直接執行,或者是某種模擬器的二進位代碼。

如果程式碼是在執行時才即時翻譯,那麼這種翻譯機制就被稱作直譯。經直譯的程式執行速度往往比編譯的程式慢,但往往更具靈活性,因為它們能夠與執行環境互相作用。

特點 編輯

每一種程式設計語言可以被看作是一套包含語法詞彙含義的正式規範。

這些規範通常包括:

程式語言不成文規定:

大多數被廣泛使用或經久不衰的程式語言,擁有負責標準化的組織,經常會晤來創造及發布該程式語言的正式定義,並討論擴充或貫徹現有的定義。

資料和資料結構 編輯

現代電腦內部的資料都只以二元方式儲存,即開-關模式(on-off)。現實世界中代表資訊的各種資料,例如名字、銀行帳號、度量以及同樣低階的二元資料,都經由程式設計語言整理,成為高階的概念。

一個程式中專門處理資料的那個系統被稱為程式語言型別系統type system);對型別系統的研究和設計被稱為類型理論(type theory)。語言可以被分為靜態型別系統(statically typed systems),例如C++Java,和動態型別系統(dynamically typed systems),例如LispJavaScriptTclProlog。前者可被進一步分為包含宣告類型(manifest type)的語言,即每一個變數和函式的類型都清楚地宣告,或type-inferred語言(例如MUMPS,ML)。

大多數語言還能夠在內建的類型基礎上組合出複雜的資料結構類型(使用陣列,列表,堆疊,檔案等等)。物件導向語言Object Oriented Language,又譯作「物件導向語言」)允許程式設計師定義新的資料類型,即對象objects),以及執行於該對象的函式functions)和方法methods)。

除了何時以及如何確定表達式和類型的聯絡,另外一個重要的問題就是語言到底定義了哪些類型,以及允許哪些類型作為表達式的值。諸如C程式語言之類的底層語言允許程式命名記憶體位置、記憶體區域以及編譯時的常數;ANSI C甚至允許表達式返回結構值(struct values)。功能性的語言一般允許變數直接使用執行時計算出的值,而不是指出該值可能儲存的記憶體位址

常見的資料結構

指令及流程控制 編輯

一旦資料被確定,機器必須被告知如何對這些資料進行處理。較簡單的指令可以使用關鍵字或定義好的語法結構來完成。不同的程式語言利用序列系統來取得或組合這些語句。除此之外,一個程式語言中的其他指令也可以用來控制處理的過程(例如分支、迴圈等)。

參照機制和重用 編輯

參照的中心思想是必須有一種間接設計儲存空間的方法。最常見的方法是通過命名變數。根據不同的語言,進一步的參照可以包括指向其他儲存空間的指標。還有一種類似的方法就是命名一組指令。大多數程式設計語言使用呼叫、過程呼叫或函式呼叫。使用這些代替的名字能讓程式更靈活,並更具重用性。

功能 編輯

程式語言可藉助機械、電機、電子、電腦、手機完成人類需求的計算、功能與目的。

實體的傳輸連結 編輯

透過低階程式語言或高階程式語言,將實體間接達成傳輸連結或控制實體。

應用程式的發展 編輯

高階程式語言可發展多功能的應用程式軟體,例如工程計算、作業系統、檔案處理、播放軟體、網頁設計、手機應用程式(App)等。

使用 編輯

程式語言已超過上千種,大部份用在計算領域[4]。程式語言和人類使用的自然語言在精確度和完整性上有很大的差異。

人們在用自然語言溝通時,內容可以不明確,甚至小的錯誤,而聽的人仍然可能理解說的人想要說的內容。但電腦不同,電腦「只做被告知要做的事」,無法理解程式設計者想要寫的程式。語言的定義、編程以及編程輸入的組合需完整定義程式執行時的外部特性。另一方面,演算法的概念可以表示為虛擬碼抑或者為編成碼,是交織有自然語言和程式碼的程式語言,和其他人溝通時使用,此時就不一定要那麼精確。

程式語言提供定義片段資料的結構化機制,以及在資料中需自動進行的運算或是轉換。程式設計者利用程式語言提供的抽象化來表示計算的相關概念,這些概念則是由許多最簡單元素(稱為語言基元英語language primitive)的集合所組成[5]程式設計就是指利用語言基元來撰寫新的程式,或是將舊程式改寫,配合新的應用或是新的環境。

電腦程式語言可能是以批次處理任務的方式執行,中間不需和使用者互動,也有可能是由使用者在直譯器中指定執行特定的的程式。若某一程式語言的是目的是在某一應用軟體(如Unix shell)或其他命令列介面執行其他程式,此程式語言會稱為手稿語言

衡量各程式語言的使用量 編輯

很難去比較哪一種程式語言的使用量最大,而且「使用量」一詞也很難定義。某一種程式語言可能需要較多的時間進行開發,另一種程式語言可能產生的程式碼較長,第三種程式語言可能在CPU中執行的時間較長。有些語言在特定的領域十分受歡迎,例如COBOL在公司的資料中心仍相當常用,多半是在大型計算機上執行[6][7]Fortran常用在科學及工程應用,C語言常用在嵌入式裝置應用及操作系統Perl常用於系統管理和文字處理,JavaScript用於網頁等。

有許多不同的測量程式語言使用的程度的方法,不同的測量方式各有誤差:

  • 計算徵才廣告中提到各程式語言的次數[8]
  • 計算教授或描述各程式語言書籍賣出的數量[9]
  • 佔計各程式語言目前仍在使用程式碼的長度,不過可能會低估一些公開搜尋不容易找到的程式語言[10]
  • 利用搜尋引擎計算找到不同程式語言的次數。

根據TIOBE指數在2022年3月,十大最受歡迎的語言如下:PythonVisual Basic .NETCC++C#JavaJavaScriptPHP組合語言SQL.[11]

歷史 編輯

1940年代當電腦剛剛問世的時候,程式設計師必須手動控制電腦。當時的電腦十分昂貴,唯一想到利用程式設計語言來解決問題的人是德國工程師康拉德·楚澤

幾十年後,電腦的價格大幅度下跌,而電腦程式也越來越複雜。也就是說,開發時間已經遠比執行時間寶貴。

於是,新的整合、可視的開發環境越來越流行。它們減少了所付出的時間、金錢(以及腦細胞)。只要輕敲幾個鍵,一整段代碼就可以使用了。這也得益於可以重用的程式碼庫[12]

參見 編輯

參考文獻 編輯

  1. ^ Ettinger, James (2004) Jacquard's Web, Oxford University Press
  2. ^ 語言系統簡介. .nuu.edu.tw. [2014-06-05]. (原始內容存檔於2014-05-28). 
  3. ^ MXL
  4. ^ HOPL: an interactive Roster of Programming Languages. Australia: Murdoch University. [2009-06-01]. (原始內容存檔於2011年2月20日). This site lists 8512 languages. 
  5. ^ Abelson, Sussman, and Sussman. Structure and Interpretation of Computer Programs. [2009-03-03]. (原始內容存檔於2009年2月26日). 
  6. ^ Georgina Swan. COBOL turns 50. computerworld.com.au. 2009-09-21 [2013-10-19]. (原始內容存檔於2013-10-19). 
  7. ^ Ed Airey. 7 Myths of COBOL Debunked. developer.com. 2012-05-03 [2013-10-19]. (原始內容存檔於2013-10-19). 
  8. ^ Nicholas Enticknap. SSL/Computer Weekly IT salary survey: finance boom drives IT job growth. Computerweekly.com. [2013-06-14]. (原始內容存檔於2011-10-26). 
  9. ^ Counting programming languages by book sales. Radar.oreilly.com. 2006-08-02 [2010-12-03]. (原始內容存檔於2008年5月17日). 
  10. ^ Bieman, J.M.; Murdock, V., Finding code on the World Wide Web: a preliminary investigation, Proceedings First IEEE International Workshop on Source Code Analysis and Manipulation, 2001
  11. ^ TIOBE Index for April 2020. TIOBE. 2022-03 [2022-04-07]. (原始內容存檔於2018-02-25). 
  12. ^ Steven R. Fischer,. A history of language,. Reaktion Books,. 2003,. ISBN 186189080X. 

延伸閱讀 編輯

  • Abelson, Harold; Sussman, Gerald Jay. Structure and Interpretation of Computer Programs 2nd. MIT Press. 1996. (原始內容存檔於2018年3月9日). 
  • Raphael Finkel: Advanced Programming Language Design, Addison Wesley 1995.
  • Daniel P. Friedman, Mitchell Wand, Christopher T. Haynes: Essentials of Programming Languages, The MIT Press 2001.
  • Maurizio Gabbrielli and Simone Martini: "Programming Languages: Principles and Paradigms", Springer, 2010.
  • David Gelernter, Suresh Jagannathan: Programming Linguistics, The MIT Press 1990.
  • Ellis Horowitz (ed.): Programming Languages, a Grand Tour (3rd ed.), 1987.
  • Ellis Horowitz: Fundamentals of Programming Languages, 1989.
  • Shriram Krishnamurthi: Programming Languages: Application and Interpretation, online publication頁面存檔備份,存於網際網路檔案館).
  • Bruce J. MacLennan: Principles of Programming Languages: Design, Evaluation, and Implementation, Oxford University Press 1999.
  • John C. Mitchell: Concepts in Programming Languages, Cambridge University Press 2002.
  • Benjamin C. Pierce: Types and Programming Languages, The MIT Press 2002.
  • Terrence W. Pratt and Marvin V. Zelkowitz: Programming Languages: Design and Implementation (4th ed.), Prentice Hall 2000.
  • Peter H. Salus. Handbook of Programming Languages (4 vols.). Macmillan 1998.
  • Ravi Sethi: Programming Languages: Concepts and Constructs, 2nd ed., Addison-Wesley 1996.
  • Michael L. Scott: Programming Language Pragmatics, Morgan Kaufmann Publishers 2005.
  • Robert W. Sebesta: Concepts of Programming Languages, 9th ed., Addison Wesley 2009.
  • Franklyn Turbak and David Gifford with Mark Sheldon: Design Concepts in Programming Languages, The MIT Press 2009.
  • Peter Van Roy and Seif Haridi. Concepts, Techniques, and Models of Computer Programming, The MIT Press 2004.
  • David A. Watt. Programming Language Concepts and Paradigms. Prentice Hall 1990.
  • David A. Watt and Muffy Thomas. Programming Language Syntax and Semantics. Prentice Hall 1991.
  • David A. Watt. Programming Language Processors. Prentice Hall 1993.
  • David A. Watt. Programming Language Design Concepts. John Wiley & Sons 2004.

外部連結 編輯