编译器（compiler），是一种电脑程式，它会将用某种程式语言写成的原始码（原始语言），转换成另一种程式语言（目标语言）。
它主要的目的是将便于人编写、阅读、维护的高级计算机语言所写作的原始码程式，翻译为计算机能解读、运行的低阶机器语言的程序，也就是执行档。编译器将原始程序（sourceprogram）作为输入，翻译产生使用目标语言（targetlanguage）的等价程序。源代码一般为高阶语言（High-levellanguage），如Pascal、C、C++、C#、Java等，而目标语言则是汇编语言或目标机器的目标代码（Objectcode），有时也称作机器代码（Machinecode）。
一个现代编译器的主要工作流程如下：
早期的计算机软件都是用汇编语言直接编写的，这种状况持续了数年。当人们发现为不同类型的中央处理器（CPU）编写可重用软件的开销要明显高于编写编译器时，人们发明了高级编程语言。由于早期的计算机的内存很少，当大家实现编译器时，遇到了许多技术难题。
大约在20世纪50年代末期，与机器无关的编程语言被首次提出。随后，人们开发了几种实验性质的编译器。第一个编译器是由美国女性电脑科学家葛丽丝·霍普（GraceMurrayHopper）于1952年为A-0系统编写的。但是1957年由任职于IBM的美国电脑科学家约翰·巴科斯（JohnWarnerBackus）领导的FORTRAN则是第一个被实作出具备完整功能的编译器。1960年，COBOL成为一种较早的能在多种架构下被编译的语言。
高级语言在许多领域流行起来。由于新的编程语言支持的功能越来越多，计算机的架构越来越复杂，这使得编译器也越来越复杂。
早期的编译器是用汇编语言编写的。首个能编译自己源程序的编译器是在1962年由麻省理工学院的Hart和Levin制作的。从20世纪70年代起，实现能编译自己源程序的编译器变得越来越可行，不过还是用Pascal和C语言来实现编译器更加流行。制作某种语言的第一个能编译器，要么需要用其它语言来编写，要么就像Hart和Levin制作Lisp编译器那样，用解释器来运行编译器。
编译器的构造与优化是计算机专业的大学课程，[1]课程名称一般为「编译原理」或「编译器」。通常在课程中包含了如何实现一种教学用程序语言的编译器。一个着名的例子是20世纪70年代，瑞士计算机科学家尼克劳斯·维尔特（NiklausEmilWirth）用于讲解编译器的构造时使用的PL/0（英语：PL/0）编译器。尽管它很简单，PL/0编译器介绍了这个领域的几个有影响的概念：
在自举问题的正式描述中使用T-diagram。
编译器的一种分类方式是按照生成代码所运行的系统平台划分，这个平台称为目标平台。
有一些编译器输出的代码，将运行于与编译器所在相同类型的计算机和操作系统之上，这种编译器叫做本地编译器。输出可以运行于不同的平台之上的编译器，叫做交叉编译器。由于嵌入式系统通常没有软件开发环境，因此，为这类系统开发软件时，通常需要使用交叉编译器。
编译器所输出于虚拟机上运行之代码，编译器和编译器输出的运行平台有可能相同，也有可能不同。因此，对于这类编译器，不去区分它是本地编译器还是交叉编译器。