編譯器compiler)是一種電腦程式,它會將某種程式語言寫成的原始碼(原始語言)轉換成另一種程式語言(目標語言)。

它主要的目的是將便于人编写、阅读、维护的高级计算机语言所寫作的原始碼程式,翻译为计算机能解读、运行的低阶机器语言的程序,也就是執行檔。编译器将原始程序(source program)作为输入,翻译产生使用目标语言(target language)的等价程序。源代码一般为高阶语言(High-level language),如PascalCC++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年代起,实现能编译自己源程序的编译器变得越来越可行,不过还是用PascalC语言来实现编译器更加流行。制作某种语言的第一个能编译器,要么需要用其它语言来编写,要么就像Hart和Levin制作Lisp编译器那样,用解释器来运行编译器。

教学用的编译器

编辑

编译器的构造与优化是计算机专业的大学课程,[1]课程名称一般为「编译原理」或「編譯器」。通常在课程中包含了如何实现一种教学用程序语言的编译器。一个著名的例子是20世纪70年代,瑞士計算機科學家尼克劳斯·维尔特Niklaus Emil Wirth)用于讲解编译器的构造时使用的PL/0英语PL/0编译器。尽管它很简单,PL/0编译器介绍了这个领域的几个有影响的概念:

  1. 逐步求精的程序开发(也是 1971年 Wirth 的论文的标题)[2]
  2. 使用递归下降解析器
  3. 使用EBNF指定语言的语法。
  4. 代码生成器产生便携P-code
  5. 在自举问题的正式描述中使用T-diagram。

分类

编辑

编译器的一种分类方式是按照生成代码所运行的系统平台划分,这个平台称为目标平台。

有一些编译器输出的代码,将运行于与编译器所在相同类型的计算机和操作系统之上,这种编译器叫做本地编译器。输出可以运行于不同的平台之上的编译器,叫做交叉编译器。由于嵌入式系统通常没有软件开发环境,因此,为这类系统开发软件时,通常需要使用交叉编译器。

编译器所输出于虚拟机上运行之代码,编译器和编译器输出的运行平台有可能相同,也有可能不同。因此,对于这类编译器,不去区分它是本地编译器还是交叉编译器。

參考文獻

编辑
  1. ^ Chakraborty, Pinaki; Saxena, P. C.; Katti, C. P.; Pahwa, Gauri; Taneja, Shweta. A new practicum in compiler construction. Computer Applications in Engineering Education. 2014, 22 (3) [2025-03-31]. ISSN 1099-0542. doi:10.1002/cae.20566 (英语). 
  2. ^ The ACM Digital Library. (原始内容存档于2007-07-17). 

延伸阅读

编辑

参见

编辑

外部連結

编辑

📚 Artikel Terkait di Wikipedia

Object Pascal

CodeGear实现兼容。 Borland将第一版Delphi的编程语言命名为Object Pascal,但是后来将其重命名为Delphi编程语言。然而,宣称兼容Object Pascal的编译器通常试图兼容Delphi源代码。 CodeGear,Borland的前子公司,现在是Embarcadero

目标代码

目标代码(英語:Object code)指计算机科学中编译器或汇编器处理源代码后所生成的代码,它一般由机器代码或接近于机器语言的代码组成。目标文件(英語:Object file)即存放目标代码的计算机文件,它常被称作二进制文件(Binaries)。 目标文件包含着机器代码(可直接被计算机中央处理器

CodeWarrior

Symbian OS, and even for BeOS. CodeWarrior支援 Pascal,Object Pascal,Objective-C,以及 Java compilers,可以開發 Mac AP 與 Mac driver。但 CodeWarrior無法開發 OS X 的driver,必須改用

Delphi

續推出新版本的商业产品。因此,有時人们會把Delphi視為Object Pascal的代名词。Borland公司因而把Object Pascal改称为Delphi。2006年,Borland把开发工具产品线独立出来,成立了一家新的公司CodeGear,並把產品線交由此公司负责。原本的Delphi,亦曾一度因此被命名为Turbo

Vala

} } class NormalPrint: Object, Printable { string print () { return "don't forget about me"; } } class OverridePrint: Object, Printable { string print

考那斯鐵路隧道

米。考納斯鐵路隧道於1996年被列入立陶宛共和國不可移動文化遺產名錄。 [1] (页面存档备份,存于互联网档案馆) The Registry of Immovable Cultural Heritage Sites: Unique object code: 16656. Retrieved on 12 May 2010.

优化编译器

(原始内容存档于2017-05-20).  Clinton F. Goss. Machine Code Optimization - Improving Executable Object Code (PDF) (Ph.D. dissertation). Computer Science Department

跨平臺

针对每种操作系统、CPU,而提供并测试各自的编译版本,这种做法的可行性很小;开源软件则允许用户自己来编译目的码(object code),这样在跨平臺方面更好一些。类似的,那些解释型语言,或者需要虚拟机的语言,也更加符合跨平臺的要求,因为用户也要自己进行编译。Sun公司的