是什么让某些语言可以这样做而其他语言则不能呢?为什么不保持统一的系统,在末尾添加分号?
Robert对Swift给出了很好的答案,我将尝试在解析方面添加更多信息,以及为什么使用或不使用分号。
编译程序时,将源文件转换为可执行代码之前需要执行多个步骤,其中第一个步骤是读取和解析。在解析期间,根据语言的语法,您的代码将从字符序列转换为结构化表示。为此,必须以某种方式标识和分隔组成代码的元素(变量,常量,声明等)。当您进行如下声明时:
int someNumber = 0;
这只是一个字符序列,需要以某种方式将其转换为“创建一个称为someNumber
type 的“事物” int
并为其分配值0
”的概念。
这需要确定该语句的确切开始和结束位置。试想一下,如果您有这个:
int someNumber = 0;
int otherNumber = 1;
您需要知道这是两个不同的声明。将;
在类似C语言中用于那些,所以解析器读取字符,直到它找到一个,并试图了解当时刚读单个语句。正如罗伯特所说,这允许在同一行中包含多个语句,例如:
int someNumber = 0; int otherNumber = 1;
与将它们写成两行完全一样的效果。
在其他语言中,例如Python,您应该将每个语句放在不同的行中。
x = 3
if x < 10:
print 'x smaller than 10'
else:
print 'x is bigger than 10 or equal'
因此,无需添加;
,因为该语言本身会阻止您在同一行中添加语句!
还有其他语言,例如LISP或Scheme,具有将语句分组的非常不同的方式(好吧,它们并不是真正的语句,但是现在让我们忽略它)。因此,所有内容都带有括号:
(define (do-stuff x)
(begin
(display (format "value: ~a" x))
x))
同样,你不需要;
仅仅因为你使用相同的符号()
,(
)的东西,在其他语言{
,}
,:
等有人谁只知道Lisp的语法可能会问你:为什么你需要;
在你的陈述结束?
只是添加一个陌生的示例:OCaml不仅在语句末尾有分号,而且还有两个分号!
let rec fact x =
if x <= 1 then 1 else x * fact (x - 1);;
为什么?我不知道。:)
设计不同的语言具有不同的目的和理念。如果所有语言都共享相同的语法和约定,则它们可能只会允许您以相同的方式执行相同的操作。