为什么很多编程语言用 end 作为区块结束符,而放弃花括号
在编程语言的设计中,使用 end
作为区块结束符而放弃花括号 {}
,这一现象的背后有着历史、语言可读性、设计哲学等多方面的考量。尽管 Pascal 等老牌编程语言的历史遗产影响了后来的某些语言,但我们发现一些新兴编程语言如 Lua、Julia 也同样采用了 end
,这说明这种设计是一定是有其合理性的。
笔者最爱的编程语言 ABAP,也采取了这种设计方式。
本文仅阐述笔者个人观点。
1. 可读性的优先性
end
这种关键字设计本质上是为了提高代码的可读性。对于编程语言而言,代码不仅需要被计算机正确解释,程序员之间的沟通与合作也是非常重要的。语言设计需要考虑代码的清晰度和可维护性,而可读性就是这其中最关键的一部分。
相比于 {}
这种简短的符号,end
是一个更具有语义的符号。例如,假设我们在读一段代码时,看到某个区块用 {}
开头和结束,我们需要依赖上下文来理解这段代码的作用,而如果区块结束用 end
,那么程序员就可以明确地知道该语句块已经结束了,且具备了一个完整的意义。
例如,在 Lua 中,以下代码展示了用 end
的直观效果:
if condition then
-- 执行某些代码
print("Condition met")
end
在这个例子中,end
不仅仅是个结束符,更是对逻辑的一种明确表达:它代表 if
语句的逻辑在这里结束了。与之相比,如果使用花括号,代码会显得不那么直观:
if (condition) {
// 执行某些代码
print("Condition met")
}
花括号 {}
没有明显的语义属性,这使得阅读者在阅读代码时要花费额外的精力去理解每对括号的含义。而 end
则通过自然语言般的流畅表达,使代码逻辑一目了然。
2. 一致性的设计
编程语言的设计往往需要考虑一致性,这是语言保持简洁和稳定的关键因素。end
这种关键词所带来的好处之一是能够为各种代码结构提供一致的结束方式。
例如在 Lua 中,if
、for
、while
等控制结构都用 end
作为结束符,这种一致性可以显著减少学习和记忆负担。程序员不需要记住每种控制结构的不同结束方式,这样的设计使代码的逻辑结构显得更加清晰。在对比中,C 风格的语言采用花括号 {}
,它们可能会带来一些不必要的混淆,特别是当你需要嵌套多层结构时。例如:
function greet()
for i = 1, 5 do
print("Hello, world!")
end
end
在这个例子中,for
和函数 greet
都使用 end
作为结束符,代码结构保持了一致性和对称性。相比之下,C 语言或 JavaScript 中多层嵌套的花括号会变得难以管理,因为花括号没有表达逻辑结束的明确语义。
3. 可读性与代码缩进
花括号 {}
在某些时候容易引起误解,尤其是在代码没有严格缩进的情况下。编程人员可能因为缩进错乱而对代码的逻辑产生错误理解。在没有强制格式化工具的情况下,错误的缩进可能会导致大量的 bug,而 end
则天然地带有明确的语义分界,可以大幅减少这种问题。
考虑一个真实的例子:在一个团队协作项目中,某位程序员没有遵循标准的缩进方式来撰写代码。假如使用的是 C 风格的花括号,这段代码可能会是这样:
if (a > b) {
if (c > d) {
printf("Condition met");
}
}
由于缩进的不对齐,程序员在审查代码时可能误以为 printf("Condition met");
不属于第二个 if
,从而造成逻辑上的理解错误。而如果采用 Lua 风格的 end
语句,这样的错误更容易被避免:
if a > b then
if c > d then
print("Condition met")
end
end
end
在逻辑上更具清晰度,程序员可以非常明确地看到每个区块的结束位置,而不是依赖缩进或者成对的花括号来判断逻辑结构。
4. 符号的视觉负担
花括号虽然在代码编写上十分简洁,但在视觉上却会增加负担。编写代码时,程序员的眼睛需要不断跳跃去查找匹配的括号,这在大型代码库中会成为一种负担。使用 end
可以有效减轻这种负担,因为它的语义更加明确,程序员不必频繁地检查匹配关系,尤其是在深度嵌套的代码中。
以 Julia 为例,Julia 选择 end
而不是花括号,正是为了减轻这种视觉负担。考虑如下代码段:
function factorial(n)
if n == 0
return 1
else
return n * factorial(n - 1)
end
end
在这段代码中,end
明确表明了函数和条件的结束,这使得阅读者可以非常自然地跟随代码的逻辑进展,而无需在脑中进行配对。特别是对于新手编程者来说,end
这种自然语言般的结束方式,更加易于理解和掌握。
5. 语义化设计
end
的使用具有很强的语义化属性。它更像是自然语言中的句号,能够使代码的逻辑表述更加贴近人类的语言习惯,这对于编写更具有可维护性的代码至关重要。编程语言不仅是给机器看的,更是给人看的,end
使得编程语言的表达更具可读性和逻辑流畅性。
举一个生活中的例子来类比,假如我们在写一封信件,信件中的段落需要清晰地结束,我们会用“此致”来表示段落的结束。同样地,end
就像是给代码逻辑段落的结束标志,它清楚地告诉我们:某个逻辑已经到此为止。这种符号化的结束方式使得语言的逻辑结构像自然语言一样,具有开头、主体和结尾。
花括号 {}
则更像是一些速记符号,它的简洁是有代价的——即它缺乏直接的语义。这种差异让 end
在很多场合下成为更优雅的选择,尤其是在需要长时间阅读和维护代码的环境中。
6. 新兴语言对开发体验的重视
一些现代编程语言,比如 Lua 和 Julia,在设计之初就非常重视开发者的体验和代码的可维护性,这促使它们放弃了花括号,转而采用 end
作为代码块的结束符。花括号 {}
的风格更偏向于硬件级别的直接控制,而 Lua、Julia 则更注重代码的表达性和开发效率。
Lua 是为嵌入式脚本而设计的,目标是成为一种简单易用的、适合控制逻辑的语言。Lua 之所以使用 end
,是因为它要在各类硬件设备上运行,并且要被嵌入到 C 或 C++ 程序中使用。end
的选择使得 Lua 的代码非常接近自然语言,这也让嵌入式开发人员更容易上手和调试。
同样地,Julia 作为一种新兴的科学计算语言,在设计时考虑了大量的数学家和科学家。这些领域的从业者往往并非是传统意义上的程序员,因此更具语义化、可读性更强的 end
结束符为他们提供了更低的学习曲线,能够让他们更加专注于数学模型和计算逻辑,而非花费精力在代码的符号配对上。
7. 语法糖与语言的简洁性
在编程语言设计中,end
也可以被视作一种语法糖。语法糖的目的是让代码更易于书写和理解,end
这种设计减少了程序员在编写代码时对于符号的关注,降低了代码书写和理解的复杂度。虽然 {}
也有它的优点——例如减少代码字符量,提高编写速度——但在代码可读性和清晰度的需求下,end
提供了一种更加适合人类阅读的方式。
以 Lua 中常见的 do ... end
为例,这是 Lua 中一种用于局部范围定义的语法,它避免了局部范围的滥用。这样的设计使得代码显得非常自然,并且带有明显的边界感,使得局部范围的作用更加明确。通过这种方式,end
就像是为开发者提供了一层额外的安全网,防止他们因滥用范围而导致代码中的 bug。
8. 历史渊源的影响
在语言设计中,历史遗产是不可忽视的因素。许多使用 end
作为区块结束符的语言,其灵感直接或间接来源于 Pascal。Pascal 作为一种早期的编程语言,强调代码的结构化和可读性,因此选择了 begin ... end
这样的设计方式。在那个年代,编程语言的目标是让更多人能够学习和掌握编程,而不仅仅是服务于专业程序员。
这种结构化编程的思路影响了许多后来的语言设计,包括 Ada、Lua 等。而这些语言在继承 Pascal 的同时,也将其思想进一步发扬光大。特别是在教育领域,end
的设计使得教学变得更为简单,因为它与自然语言更为接近,学生可以直观地理解代码逻辑的起始与结束。
太长不看版
选择使用 end
作为区块的结束符而非花括号 {}
,并不仅仅是历史的偶然,而是编程语言设计者们对可读性、一致性、语义化、开发体验等多个方面的深思熟虑。end
通过其语义化的表达,显著提高了代码的可读性和开发者的工作效率,同时降低了代码的出错概率。在一些现代编程语言中,end
的设计更加贴近自然语言,为广泛的开发者群体,尤其是非传统程序员,提供了更友好的编程体验。
- 点赞
- 收藏
- 关注作者
评论(0)