Programming languages 为什么有些语言需要分号?
我知道分号在Java等语言中表示一行的结尾,但为什么Programming languages 为什么有些语言需要分号?,programming-languages,Programming Languages,我知道分号在Java等语言中表示一行的结尾,但为什么 其他人经常问我这个问题,我真的想不出比使用换行符或空白更好的方法来解释它的工作原理。它们不表示行结束,而是表示语句结束 有些语言不需要它们,但是这些语言不允许在一行上有多个语句,或者一个语句跨越多个文件行(没有像VB的uu信号这样的其他信号) 为什么有些语言允许一行有多个语句?其原理是空格是不相关的(行尾字符是空格)。这允许灵活地设置代码的格式,因为格式不是语义的一部分。许多语言允许您随意设置间距。这允许您控制代码的外观 考虑: Strin
其他人经常问我这个问题,我真的想不出比使用换行符或空白更好的方法来解释它的工作原理。它们不表示行结束,而是表示语句结束 有些语言不需要它们,但是这些语言不允许在一行上有多个语句,或者一个语句跨越多个文件行(没有像VB的uu信号这样的其他信号)
为什么有些语言允许一行有多个语句?其原理是空格是不相关的(行尾字符是空格)。这允许灵活地设置代码的格式,因为格式不是语义的一部分。许多语言允许您随意设置间距。这允许您控制代码的外观 考虑:
String result = "asdfsasdfs"
+ "asdfs"
+ "asdfsdf";
因为您可以插入额外的换行符,所以可以将该行拆分为多行而不会出现问题。语言仍然需要知道行结束了,这就是为什么需要分号。简短回答:
因为其他人都这么做
理论上,语言的语句是语言设计者在解析文件时能够从语法上解释的内容。因此,如果语言设计者不想使用分号,他们可以使用句点、破折号、空格、换行符或其他表示语句分隔的符号
语言设计者经常使语法易于理解,从而使其变得流行
因此,如果某个语言设计师创造了一种使用“:-)”来表示语句结尾的语言,那么它将:1)很难阅读;2) 不受已经习惯使用“;”的人的欢迎
echo“小心”:-语言会这样做,因为它表示
语句的结尾,而不是行的结尾,这意味着可以压缩代码,使其更小,占用更少的空间
采用C++代码(<代码>包含< /代码>):
for(int i=0;i<5;++i){
有些编程语言使用它来表示语句的结束,从而使语言从语句的角度看不到空格。在mid中需要注意的一点是,如果在编译时检查新行或分号,然后必须评估几种不同的“情况”编译器可能会得到您想要做的错误,并且需要更长的时间来查找这些情况,而不是简单地在语句末尾查找分号。一些高级语言试图减少分号的使用或完全删除分号,以节省一些击键,这些语言更倾向于comfor程序员的t,通常伴随着各种语法糖;有人可能会说不使用分号是一种语法糖。
语言中分号的使用或不应根据语言所要达到的目的,C语言和C++语言主要是关于性能的,java和C++在抽象意义上比C和C++高一点,然后我们有了像斯卡拉、Python和Ruby这样的东西,它们主要是为了使编程更舒适。性能成本(Ruby公开承认这一点,在Python上非常明显)。
那么为什么有些语言“需要”分号呢
- 使编译更容易
- 语言的设计者认为它更加一致
- 历史原因(java、C++和C++也是C的子)
最后一件事是Javascript实际上在编译期间或IIRC之前添加了分号,所以它实际上不是无分号的
简短答复:
因为其他人都这么做
不是,也不是所有人。此外,许多流行语言,如Python、Ruby或Visual Basic,不使用分号作为语句结尾,而是使用换行符。许多,不是“所有人”,仍然使用分号,因为历史原因,而不是理性的论证:分号在第一个计算时代曾在取代穿孔卡片格式方面发挥了重要作用,但今天它可以被完全抛弃
事实上,有两种指定语句结尾的常用方法:
使用分号
保持原样。这会使编译器读取一个换行符作为语句的结尾。当您想将语句扩展到多行时,只需使用一个特殊字符(如Python中的\
)来表示语句尚未完成
为了使代码更具可读性,使用特殊字符来指定语句结尾应该是一个例外,而不是规则。首先,分号是语句分隔符,而不是行分隔符。有些语言使用新行字符作为语句分隔符,但忽略所有空白的语言倾向于使用分号朗
为什么语言忽略空白?
一种语言忽略空白,允许程序员按照自己的喜好格式化源代码
if (welcome)
System.out.println("hello world");
及
这不是因为在语言的语法中,每一个都有一个单独的大小写,而是因为空格被忽略了
为什么编程语言需要语句分隔符?
这是问题的核心。为了理解它,让我们考虑一个没有任何语句分隔符的小语言。它包含以下语句类型:
var x = foo()
y[0, 1] = x
bar()
这里,y
是一个二维数组,x
被写入y
的一个条目
现在让我们看看这些语句,就像编译器看到它们一样:
var x = foo() y[0, 1] = x bar()
因为没有语句分隔符,编译器必须自己识别每个语句的结尾,才能理解输入。编译器能够做到吗?我想在上面的例子中,编译器可以做到
if (welcome) System.out.println("hello world");
var x = foo()
y[0, 1] = x
bar()
var x = foo() y[0, 1] = x bar()
[x, y] = ["hello", "world"]
foo()
[x, y] = [1, 2]
foo() [x, y] = [1, 2]
foo()[x, y] = [1, 2]