編譯器

編譯器（compiler）是一種電腦程式，它會將某種程式語言寫成的原始碼（原始語言）轉換成另一種程式語言（目標語言）。
它主要的目的是將便於人編寫、閱讀、維護的高級計算機語言所寫作的原始碼程式，翻譯為計算機能解讀、運行的低階機器語言的程序，也就是執行檔。編譯器將原始程序（source program）作為輸入，翻譯產生使用目標語言（target language）的等價程序。源代碼一般為高階語言（High-level language），如Pascal、C、C++、C# 、Java等，而目標語言則是彙編語言或目標機器的目標代碼（Object code），有時也稱作機器代碼（Machine code）。
一個現代編譯器的主要工作流程如下：
源代碼（source code）→ 預處理器（preprocessor）→ 編譯器（compiler）→ 彙編程序（assembler）→ 目標代碼（object code）→ 鏈接器（linker）→ 執行檔（executables），最後打包好的檔案就可以給電腦去判讀執行了。

**歷史**
早期的計算機軟件都是用匯編語言直接編寫的，這種狀況持續了數年。當人們發現為不同類型的中央處理器（CPU）編寫可重用軟件的開銷要明顯高於編寫編譯器時，人們發明了高級編程語言。由於早期的計算機的內存很少，當大家實現編譯器時，遇到了許多技術難題。
大約在20世紀50年代末期，與機器無關的編程語言被首次提出。隨後，人們開發了幾種實驗性質的編譯器。第一個編譯器是由美國女性電腦科學家葛麗絲·霍普（Grace Murray Hopper）於1952年為A-0 系統編寫的。但是1957年由任職於IBM的美國電腦科學家約翰·巴科斯（John Warner Backus）領導的FORTRAN則是第一個被實作出具備完整功能的編譯器。1960年，COBOL成為一種較早的能在多種架構下被編譯的語言。
高級語言在許多領域流行起來。由於新的編程語言支持的功能越來越多，計算機的架構越來越複雜，這使得編譯器也越來越複雜。
早期的編譯器是用匯編語言編寫的。首個能編譯自己源程序的編譯器是在1962年由麻省理工學院的Hart和Levin製作的。從20世紀70年代起，實現能編譯自己源程序的編譯器變得越來越可行，不過還是用Pascal和C語言來實現編譯器更加流行。製作某種語言的第一個能編譯器，要麼需要用其它語言來編寫，要麼就像Hart和Levin製作Lisp編譯器那樣，用解釋器來運行編譯器。

**教學用的編譯器**
編譯器的構造與優化是計算機專業的大學課程，課程名稱一般為「編譯原理」或「編譯器」。通常在課程中包含了如何實現一種教學用程序語言的編譯器。一個著名的例子是20世紀70年代，瑞士計算機科學家尼克勞斯·維爾特（Niklaus Emil Wirth）用於講解編譯器的構造時使用的PL/0編譯器。儘管它很簡單，PL/0編譯器介紹了這個領域的幾個有影響的概念：
# 逐步求精的程序開發（也是 1971年 Wirth 的論文的標題）
# 使用遞歸下降解析器
# 使用EBNF指定語言的語法。
# 代碼生成器產生便攜P-code
# 在自舉問題的正式描述中使用T-diagram。

**分類**
編譯器的一種分類方式是按照生成代碼所運行的系統平臺劃分，這個平臺稱為目標平臺。
有一些編譯器輸出的代碼，將運行於與編譯器所在相同類型的計算機和操作系統之上，這種編譯器叫做本地編譯器。輸出可以運行於不同的平臺之上的編譯器，叫做交叉編譯器。由於嵌入式系統通常沒有軟件開發環境，因此，為這類系統開發軟件時，通常需要使用交叉編譯器。
編譯器所輸出於虛擬機上運行之代碼，編譯器和編譯器輸出的運行平臺有可能相同，也有可能不同。因此，對於這類編譯器，不去區分它是本地編譯器還是交叉編譯器。

**參考文獻**

**延伸閱讀**
 archive-url = https://web.archive.org/web/20210501144108/http://llvm.org/docs/CodeGenerator.html#built-in-register-allocators -  Compiler textbook references A collection of references to mainstream Compiler Construction Textbooks- cite book |author1-link=Alfred V. Aho |last1=Aho |first1=Alfred V. |author2-link = Ravi Sethi |last2=Sethi |first2=Ravi |author3-link = Jeffrey D. Ullman |last3=Ullman |first3 = Jeffrey D. |title = Compilers: Principles, Techniques, and Tools |isbn=9780201100884 |publisher=Addison-Wesley |year=1986 |edition=1st |title-link = Compilers: Principles, Techniques, and Tools - cite journal |author-link = Frances E. Allen |last = Allen |first = Frances E. |title = A History of Language Processor Technology in IBM |url = https://archive.org/details/sim_ibm-journal-of-research-and-development_1981-09_25_5/page/535 |journal=IBM Journal of Research and Development |volume=25 |pages=535–548 |number=5 |date=September 1981 |publisher=IBM |doi = 10.1147/rd.255.0535 - cite book |last1=Allen |first1=Randy |author2-link=Ken Kennedy (computer scientist) |last2=Kennedy |first2=Ken |title=Optimizing Compilers for Modern Architectures |publisher=Morgan Kaufmann Publishers |year=2001 |isbn=978-1-55860-286-1- cite book |author-link = Andrew Appel |last=Appel |first = Andrew Wilson |title = Modern Compiler Implementation in Java |edition=2nd |publisher=Cambridge University Press |year=2002 |isbn=978-0-521-82060-8- cite book |author-link=Andrew Appel |last=Appel |first=Andrew Wilson |url=https://books.google.com/books?id=8APOYafUt-oC |title=Modern Compiler Implementation in ML |publisher=Cambridge University Press |year=1998 |isbn=978-0-521-58274-2 |access-date=2020-01-11 |archive-date=2021-04-27 |archive-url=https://web.archive.org/web/20210427035906/https://books.google.com/books?id=8APOYafUt-oC - cite book |last=Bornat |first=Richard |title=Understanding and Writing Compilers: A Do It Yourself Guide |year=1979 |publisher=Macmillan Publishing |isbn=978-0-333-21732-0 |url=http://www.cs.mdx.ac.uk/staffpages/r_bornat/books/compiling.pdf |author-link=Richard Bornat |access-date=2020-01-11 |archive-date=2007-06-15 |archive-url=https://web.archive.org/web/20070615132948/http://www.cs.mdx.ac.uk/staffpages/r_bornat/books/compiling.pdf - oclc=714113472 - cite book |last1 = McKeeman |first1 = William Marshall |author1-link = William M. McKeeman |author2-link = Jim Horning |last2=Horning |first2 = James J. |last3=Wortman |first3 = David B. |url = https://archive.org/details/compilergenerato00mcke |title=A Compiler Generator |location=Englewood Cliffs, NJ |publisher=Prentice-Hall |year=1970 |isbn=978-0-13-155077-3 - cite book |author-link=Steven Muchnick |last=Muchnick |first=Steven |url=https://books.google.com/books?id=Pq7pHwG1_OkC |title=Advanced Compiler Design and Implementation |publisher=Morgan Kaufmann Publishers |year=1997 |isbn=978-1-55860-320-2 |access-date=2020-01-11 |archive-date=2021-02-23 |archive-url=https://web.archive.org/web/20210223022312/https://books.google.com/books?id=Pq7pHwG1_OkC - cite book |author-link=Michael L. Scott |last=Scott |first=Michael Lee |url=https://books.google.com/books?id=4LMtA2wOsPcC |title=Programming Language Pragmatics |publisher=Morgan Kaufmann |year=2005 |edition=2nd |isbn=978-0-12-633951-2 |access-date=2020-01-11 |archive-date=2021-04-27 |archive-url=https://web.archive.org/web/20210427012533/https://books.google.com/books?id=4LMtA2wOsPcC - cite book |last1=Srikant |first1=Y. N. |last2=Shankar |first2=Priti |url=https://books.google.com/books?id=0K_jIsgyNpoC |title=The Compiler Design Handbook: Optimizations and Machine Code Generation |publisher=CRC Press |year=2003 |isbn=978-0-8493-1240-3 |access-date=2020-01-11 |archive-date=2021-04-27 |archive-url=https://web.archive.org/web/20210427020439/https://books.google.com/books?id=0K_jIsgyNpoC - archive-url=https://web.archive.org/web/20150914062457/http://www.scifac.ru.ac.za/compilers/conts.htm - cite book |author-link = Niklaus Wirth |last=Wirth |first=Niklaus |url = http://www.ethoberon.ethz.ch/WirthPubl/CBEAll.pdf |title=Compiler Construction |isbn=978-0-201-40353-4 |publisher=Addison-Wesley |year=1996 |access-date=2020-01-11 |archive-url = https://web.archive.org/web/20170217071020/http://www.ethoberon.ethz.ch/WirthPubl/CBEAll.pdf |archive-date=2017-02-17 |dead-url=yes 

**參見**
 鏈接器- 直譯器- 自舉 (編譯器)

**外部連結**
Compilers- Incremental Approach to Compiler Construction date=20201107223316 a PDF tutorial- Compile-Howto date=20210419041055 
*title=Basics of Compiler Design
*Short animation explaining the key conceptual difference between compilers and interpreters
*title=Syntax Analysis & LL1 Parsing- Let's Build a Compiler date=20160208112336 , by Jack Crenshaw
*title=Forum about compiler development- Difference Between Compiler and Interpreter date=20210308125126