编译器

编译器（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