中間語言

中間語言（），在計算機科學中，是指一種應用於抽象機器（abstract machine）的程式語言，它設計的目的，是用來幫助我們分析计算机程序。這個術語源自於編譯器，在編譯器將原始碼編譯為目的碼的過程中，會先將原始碼轉換為一個或多個的中間表述，以方便編譯器進行最佳化，並產生出目的機器的机器语言。通常，中間語言的設計與一般的机器语言有三個不同之處：

 每個指令代表僅有一個基本的操作。舉例來說，在微处理器中出現的shift-add定址模式在中間語言不會出現。
 指令集內可能不會包含控制流程的資訊。
 暫存器可用的數量可能會很大，甚至沒有限制。

最常見的中間語言表述形式，是三位址碼（Three address code）。

這個術語也同時用來代稱一些作為中間層的語言，有些高级语言不會輸出為機器語言，它們僅會輸出這種中間語言，而這些中間語言則會像一般語言一樣，提交給編譯器，編譯為機器語言。這通常被用於讓最佳化的過程更簡單，也用於增進可移植性的能力，改進移植的方式則是利用中間語言的編譯器，可以編譯出許多中央处理器及操作系统可使用的機器碼，例如C语言。中間語言的複雜度，通常介於高階語言及-{zh-cn:低级语言;zh-tw:低階語言}-之間，例如-{zh-cn:汇编语言;zh-tw:組合語言}-。

中介碼
中介碼（IR，intermediate representation）是一種数据结构，可將輸入的資料建構為一個计算机程序，也可以將一部份或是所有輸出的程式反推回輸入資料。這意味著中介碼將會保留一些輸入資料的資訊，同時擁有更進一步註釋或是快速查詢的功能。

舉一個典型的例子，它是現代許多編譯器所擁有的功能，它可將一段程式轉換成一個中間層的Graph資料結構，Graph可進行数据流分析，而且可在建立實際運行的CPU指令列表之前進行重組（re-arrangement），這種中間層的使用方式，允許像是LLVM的編譯系統可以同時擁有許多不同的前端語言編譯器，而且可以產生許多不同架構系統的機器碼。

語言
C语言雖然並沒有明確設計為中間語言，但它天生就是-{zh-cn:汇编语言;zh-tw:組合語言}-的抽象形態，它同時作為类Unix系统及其他作業系統中的系統程式語言（System programming language），這令它成為最熱門的中間語言，使用它的包含Eiffel、Sather、Esterel、一些Lisp的方言（Lush, Gambit）、Haskell（Glasgow Haskell Compiler）、Squeak的Smalltalk子集Slang、Cython、Seed7、Vala等等。C的變形已經被用作可攜版的-{zh-cn:汇编语言;zh-tw:組合語言}-同時包含C的功能，包含C--及C中間語言（C Intermediate Language）。

微軟的通用中间语言，在動態或是靜態編譯為機器語言之前，可用作.NET框架底下所有編譯器共享的中間語言。

GCC使用不同的中間語言來達到簡化行動性及跨平台，包含：
 較有歷史的暫存器傳遞語言（RTL，Register Transfer Language）
 使用語法樹（tree language）的GENERIC
 静态单赋值形式（SSA）為基礎的GIMPLE.

多數的中間語言用作支援靜態類型的語言，Parrot intermediate representation則是設計用作支援動態類型的語言，最初有Perl及Python。

ILOC中間語言"An ILOC Simulator" 
by W. A. Barrett 2007, paraphrasing Keith Cooper and Linda Torczon, "Engineering a Compiler", Morgan Kaufmann, 2004. ISBN 1-55860-698-X.在編譯器的設計中，它是用作簡單的目標語言"CISC 471 Compiler Design"  by Uli Kremer

 相關條目 
 抽象語法樹
 字节码
 符号表
 Source-to-source compiler

參考文件

外部連結
 The Stanford SUIF Group

Category:编译原理
Category:编程语言分类