什么是编译器?

编译系统设计一书里头曾对编译器(compiler)有这样的说明:

程式语言对人及电脑来说,是描述计算过程的记号。如我们所知,这个世界依赖程式语言, 因为在所有电脑上执行的所有软体都是用某种程式语言编写的。但是,在程式可以执行之前,它首先需要翻译成能够被电脑执行的形式。

完成这项翻译工作的软体系统称为编译器(compiler)。

简单地说,编译器就是程式,它可以读取某一种语言(原始语言, source language)编写的程式,然后将程式翻译成等同于另一种语言(目的语言)编写的程式。

[adsense][/adsense]

如果你的程式是像下面的C++程式:

int a, b, sum;

cin >> a;
cin >> b;

sum = a + b;
cout << sum << endl;

不管你看不看得懂这样的程式,我只要跟你说电脑还是无法解读的,他们需要用编译器解译成

00000 10011110
00001 11110100
00010 10011110
00011 11010100
00100 10111111
00101 00000000

这样子的机器码,编译器实在是很伟大,也是你在写程式之前必须配备好的。
所以在你开始设计C或C++程式之前,可以线上购买编译器或是网路下载免费的软体来编译C或C++程式,如果你是使用Mac OS X、Linux、或是其他*nix变种的系统(像是Unix 或是FreeBSD),可能就有安装好的编译器像是gccg++可以使用。

编译器术语

  • 编译 简单地说,就是将原始码档案转成执行档,但严格地说,编译是一种解译的过程。
  • 连结 将编译过的程式码转成执行档
  • 建置 建置是指建立最后执行档的过程(通常被简称为编译),有工具可以帮忙减少建置过程的复杂度–像是makefiles
  • 编译器 一般来说,编译器指的是编译器跟“连结器”
  • 连结器 藉着连结产生可执行的程式
  • 整合开发环境(IDE,Integrated Development Environment),结合文字编辑器跟编译器的软体,这样你可以在IDE内直接编译跟执行你的程式,IDE通常有能力帮你快速跳到编译错误的地方。

了解编译的过程

命令列程式

命令列程式是使用者跟环境之间使用文字来沟通的程式,像是列印文字到荧幕上或是从键盘读取输入。

命令列程式很容易互动,在所有平台上几乎都有可预期的行为,他们也容易用来实作,因此在学习程式语言的基础时很有帮助:在下面的例子中有所有的命令列程式。

编译命令列程式取决于你所使用的特定工具的方法。

对初学者来说要编译C++程式就简单的方法就是使用整合开发环境(IDE),IDE通常整合了几个开发工具,包括文字编辑器跟直接编译程式的工具。

这里有一些如何使用不同IDE编译跟执行命令列程式的操作:

IDE 平台 命令列程式
Code::blocks Windows/Linux/MacOS 使用Code::blocks编译命令列程式
Visual Studio Express Windows 使用VS Express 2013编译命令列程式
Dev-C++ Windows 使用Dev-C++ 5.11编译命令列程式

如果你是使用有开发功能的Linux或是Mac环境,你应该能够直接从终端机编译任何的范例,只要在命令中加入C++11的旗标给编译器:

编译器 平台 命令
GCC Linux以及其他的… g++ -std=c++0x 范例.cpp -o 范例程式
Clang OS X以及其他的… clang++ -std=c++11 -stdlib=libc++ 范例.cpp -o 范例程式
Borland Windows 可参考此文件编译