程式語言

程式語言（programming language）是用來表達電腦程式的電腦語言。它是一套標準化的交流技巧，一種能夠讓程式設計師準確地定義電腦所需數據的語言，以向電腦發出指令並精確地定義不同情況下應當採取的行動。

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

程式語言的描述一般可以分為語法 (程式語言)及語義。語法是說明編程語言中，哪些符號或文字的組合方式是正確的，語義則是對於編程的解釋。有些語言是用規格文件定義，例如C語言的規格文件也是ISO標準中一部份，2011年後的版本為ISO/IEC 9899:2017，而其他語言（例如Ada或者Perl）有一份程式語言實現文件，視為參考實現。

## 概論

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

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

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

有許多用於特殊用途的語言，只在特殊情況下使用。例如，PHP專門用來顯示網頁；Perl適合文本處理；C語言被廣泛用於作業系統和編譯器的開發（所謂的系統編程）。

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

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

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

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

## 特點

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

這些規範通常包括：

- 數據和數據結構
- 指令及流程控制
- 引用機制和重用
- 設計哲學

程式語言不成文規定：

- 標識符（Identifier）命名常規

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

### 數據和數據結構

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

一個程序中專門處理數據的那個系統被稱為程序語言的類型系統（type system）；對類型系統的研究和設計被稱為類型理論（type theory）。語言可以被分為靜態類型系統（statically typed systems），例如C++和Java，和動態類型系統（dynamically typed systems），例如Lisp，JavaScript，Tcl和Prolog。前者可被進一步分為包含宣告類型（manifest type）的語言，即每一個變量和函數的類型都清楚地宣告，或type-inferred語言（例如MUMPS，ML）。

大多數語言還能夠在內置的類型基礎上組合出複雜的數據結構類型（使用陣列，列表，堆棧，文件等等）。面向對象語言（Object Oriented Language，又譯作「物件引導語言」、「面向對象編程語言」）允許程式設計師定義新的數據類型，即對象（objects），以及運行於該對象的函數（functions）和方法（methods）。

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

常見的數據結構：

- 陣列
- 記錄
- 鍊表
- 堆棧
- 隊列
- 樹
- 圖
- 堆
- 散列

### 指令及流程控制

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

### 參照機制和重用

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

## 功能

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

### 實體的傳輸連結

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

### 應用程式的發展

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

## 使用

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

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

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

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

### 衡量各編程語言的使用量

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

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

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

根據TIOBE指數在2022年3月，十大最受歡迎的語言如下：Python、Visual Basic .NET、C、C++、C#、Java、JavaScript、PHP、匯編語言及SQL.。

## 歷史

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

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

於是，新的集成、可視的開發環境越來越流行。它們減少了所付出的時間、金錢（以及腦細胞）。只要輕敲幾個鍵，一整段代碼就可以使用了。這也得益於可以重用的程序代碼庫。

## 參見

- 程式語言列表
- 編譯器、直譯器
- Hello World程序
- 腳本語言
- 程序設計
- 電腦科學、基本的電腦科學主題列表
- 教育程式語言
- 文學編程
- 程式語言理論
- 偽代碼
- 軟體工程、軟體工程主題列表

## 外部連結

- Computers/Programming/Languages
- World/Chinese_Traditional/電腦/程式設計/語言
- Syntax Patterns for Various Languages