程式語言

**程式語言**（英語：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、Assembly language 及 SQL.。

## 歷史

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

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

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

## 參見

## 參考文獻

## 延伸閱讀

## 外部連結

* 開放式目錄計劃中和 Computer Programming Languages 相關的內容
* 開放式目錄計劃中和程式語言相關的內容
* Syntax Patterns for Various Languages （頁面存檔備份，存於網際網路檔案館）