forked from DlangRen/Programming-in-D
-
Notifications
You must be signed in to change notification settings - Fork 0
/
compiler.d
101 lines (73 loc) · 4.8 KB
/
compiler.d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
Ddoc
$(DERS_BOLUMU $(IX 编译) 编译)
$(P
用 D 编程时经常会用到两个工具,它们分别是$(I 文本编辑器)和$(I 编译器)。D 程序正是在文本编辑器里写就。
)
$(P
当使用类似 D 语言的$(I 编译型)语言时,需要理解编译的概念和编译器的功能。
)
$(H5 $(IX 机器码) 机器码)
$(P
$(IX CPU) $(IX 微处理器) 计算机的大脑是微处理器(或 CPU ,$(I 中央处理单元)的简称)。告知 CPU 要做事叫做$(I 编码),而何时该做何事的指令则叫做$(I 机器码)。
)
$(P
大多数 CPU 都使用特定架构的机器码,而这些机器码指令取决于底层架构设计阶段时的硬件约束。它们在最底层由电子信号实现。在这层,编码的舒适度不是主要考虑因素,所以直接按照 CPU 机器码形式编写程序非常困难。
)
$(P
机器码指令都是特定的数字,它们表示 CPU 支持的各种操作。例如,对于虚构的 8 位 CPU 来说,数字 4 可能表示载入操作,数字 5 可能表示存储操作,而数字 6 可能表示递增操作。假定最左边 3 位表示操作码,最右边 5 位表示用于运算的值,该 8 位 CPU 上机器码示例程序如下所示:
)
$(MONO
$(B
Operation Value Meaning)
100 11110 LOAD 11110
101 10100 STORE 10100
110 10100 INCREMENT 10100
000 00000 PAUSE
)
$(P
由于太贴近硬件,机器码不适合表示$(I 扑克牌)或$(I 学生记录)此类较高层次的概念。
)
$(H5 $(IX 编程语言) 编程语言)
$(P
编程语言的设计目标是用来对 CPU 高效编程,且有能力描述高级概念。编程语言不处理底层硬件约束,它们的主要目的是使用和表现上的简易舒适,更易于人类理解,有点类似于自然语言:
)
$(MONO
if (a_card_has_been_played()) {
display_the_card();
}
)
$(P
然而,编程语言依然比口语更严格、正规。
)
$(H5 $(IX 解释器) 解释器)
$(P
解释器是一种能从源码中读取指令并执行相应命令的工具(程序)。比如对于上述代码,解释器会首先执行 $(C a_card_has_been_played()),而后根据其执行结果选择性地执行 $(C display_the_card())。从程序员的角度来看,依赖解释器执行指令只涉及两个步骤:一,写代码,二,交由解释器执行。
)
$(P
每一次执行程序之前,解释器都必须重新读入源码并了解它们的含义。这也就是为什么使用解释器执行程序往往要比直接执行编译版本的同一程序要慢。此外,解释器在执行代码之前对代码的分析大都非常有限,以至于大多数解释器在执行程序之后方能发现编程错误。
)
$(P
一些语言被设计得非常灵活与动态,诸如 Perl、Python 和 Ruby,这使得代码分析困难重重。因此,这些语言传统上就需使用解释器。
)
$(H5 $(IX 编译器) 编译器)
$(P
编译器是另一种从源码中读取程序指令的工具。与解释器不同的是,它不立即执行代码,而是生成一个用其他语言(通常为机器码)表示的程序。而后,这个被生成的程序负责执行程序员写就的指令。这时,从程序员的角度来看,执行指令就分三个步骤:一,写代码,二,编译,三,执行生成的文件。
)
$(P
不像解释器,编译器一次性地在编译期读入和理解源码。出于这个原因,通常情况下被编译的程序较被解释器所执行的程序运行更快。编译器素来对源码进行深入的分析,这有助于生成更高效的程序,甚至于在程序执行之前就捕捉到编程错误。而在另一方面,每次改变代码都必须重新编译,既复杂又易引起人为错误。另外,编译器往往是针对某一特定平台进行编译,程序需要重新编译以在不同的处理器或操作系统上运行。此外,容易编译的语言与在解释器中运行的语言相比往往缺乏灵活性。
)
$(P
出于对安全及效率等原因的考量,某些语言被设计为可编译的,如 Ada、C、C++ 和 D。
)
$(H6 $(IX 错误, 编译) $(IX 编译错误) 编译错误)
$(P
当编译器按照语言规则编译程序时,一旦碰到$(I 非法)指令就会停止编译。非法指令指的是超出语言规范的地方。诸如圆括号未匹配、分号丢失、关键字拼错等的问题都会引起编译错误。
)
$(P
当编译器看到某段可疑但又不是错误的代码时,会发送$(I 编译警告)。但是,警告几乎总是指示一个实际错误或糟糕的代码风格,所以把警告当作错误对待是一个常见的做法。$(I DMD) 将警告视作错误的编译选项是 $(C -w)。
)
$(Ergin)
Macros:
SUBTITLE=编译器
DESCRIPTION=编译与编译型编程语言简介
KEYWORDS=D 编程语言教程