为什么有些语言不使用分号和大括号?

时间:2010-05-17 10:50:43

标签: programming-languages language-design

有趣的是,有些语言不使用分号和大括号,即使它们的前辈有它们。就个人而言,由于这个原因,我在Python中编写代码会让我感到紧张。谷歌的GO语言中也缺少分号,尽管词法分析器使用规则在扫描时自动插入分号。

为什么有些语言不使用分号和大括号?

13 个答案:

答案 0 :(得分:23)

每种编程语言都必须有一些区分语句结束,函数调用参数列表或下一个代码块的方法。

有些语言使用;和{}(C,Java)

某些语言依赖于已知大小的参数列表(x86汇编代码)

有些人使用括号来形成s-expression(Lisp,Clojure)

有些人使用空格(Python)

有些使用特殊关键词,如begin .... end(Pascal,Delphi)

所以基本上这只是语言设计的选择。总有一些相当于;或{},即使乍一看看起来不一样......

答案 1 :(得分:15)

您可以争辩说,当您使用分号和大括号时,仍然会使用空格和新行缩进代码 - 出于可读性原因。因此,在这个意义上,这些分隔符可以被认为是多余的。

答案 2 :(得分:11)

这些语言的设计者可能认为大括号和分号是不必要的,当线条延续可以(通常)由于语句不完整而被检测到,并且可以通过空格检测块。

就个人而言,它也让我感到紧张,但是C#中缺少检查的异常对我有一段时间的影响...我怀疑当你习惯这样的方案时,它可以提高可读性(这是要点)。当然,这确实意味着你需要对空白更加小心。

答案 3 :(得分:9)

我们一直使用缩进来表示语句分组作为可读性辅助很长一段时间。当缩进和实际语句分组(由{};表示,开始/结束,等等)发生冲突时,这偶尔会导致问题;我们读了一个含义,但代码实际上说了别的。

Python采用了简化方法。如果我们发现缩进有助于表达清晰,那么为什么不将语言本身确定为分组。当我们编写代码时,我们向其他读者表达意图,因此查看写作大师所说的内容通常很有用:

一个句子应该包含没有不必要的单词,一个段落没有不必要的句子,因为绘图应该没有不必要的行和机器没有不必要的部分。 ~Will Strunk,Jr。,The Elements of Style,1918

所以,也许编程语言应该没有不必要的语法元素...... ??

答案 4 :(得分:8)

有两个原因:有许多不同的方法可以在代码块周围添加大括号(参见indent styles),读取/解析其他人编写的代码可能非常困难。另一方面,Python代码看起来总是相似,缩进级别为代码结构提供了非常清晰的视觉线索。作为副作用,它会强制您保持代码结构简单,因为深度嵌套会使您的代码消失在屏幕的右侧:)

至于分号 - 我经常被for(i=0;i<=100;i++);错误所困扰,我很高兴我不会陷入Python的陷阱......

答案 5 :(得分:6)

  

“句法糖导致癌症   分号。”    Alan Perlis

答案 6 :(得分:6)

  

为什么有些语言不使用分号和大括号?

一些设计师认为,诸如分号和括号之类的“句法噪音”会使读者分心。有多种方法可以消除它们:

  • Python和Haskell使用了显着的缩进。

  • Clu和Lua使用非常精心设计的语法。

  • 标准ML使用关键字来引入每个构造加上let - 绑定,这消除了对大多数分号的需要,同时还提供了一种方便的方式来声明局部变量。

  • Bourne shell使用重要的换行符来消除分号

  • Scheme使用极其规则的语法,其中唯一的句法标记是括号。像Olin Shivers这样的长期计划者声称,几周后,你的大脑会调整,你不再看到括号。

有如此多的设计,有如此多的变化这一事实表明,许多语言设计者将分号和大括号视为语法噪音,如果可能的话将被消除。通过消除语法噪音,设计师制作程序更容易一次阅读和理解。并且许多程序员感觉更有效率,好像信噪比已经提高并且他们更清楚地引导他们的代码。 (我不会说他们是对的,我不会说他们错了,但我会说有语言设计决定,这个很容易防守。)

  

语言设计师使用分号和括号是否有原因?

许多现代的半冒号和支撑语言都是明确地设计的,或者在某些情况下不是那么明确地设计,以吸引C程序员。毕竟,如果它有分号和括号,它必须易于学习。正确?

答案 7 :(得分:5)

使用分号和括号等分隔符只是一种品味问题。实际上,编译器可以在没有它们的情况下工作,那么,为什么要在现代编程语言中使用它们呢?正如我所说,这是一个品味的问题,并且...一个长期建立的事实上的语法,重新解决C.很难与之抗争。

有一个字段,其中大括号和分号是有用的:代码生成。当您生成希望以某种反射行为进行编译/解释的代码时,编写大括号(例如,只有一行,单行)通常比编写编程语言所需的结构(如例如,Python。想想一个带有几个unnested循环的函数。您必须跟踪每行所需的标签数量。

答案 8 :(得分:5)

他们应该使用它们吗?

答案 9 :(得分:4)

有些人认为分号和花括号不是人类可读的文字。我个人赞成Pascal风格的begin end块,就纯粹的含义而言,它看起来更自然,更容易理解,即使对于非启动式的编程语言也是如此:“看,是说开始,然后是一些东西,然后结束,所以它必须是从这里开始并在那里结束的东西,某种块,呵呵......“。然而,分号和括号通常更容易解析,因此这更容易使用它们而不是缩进或其他结构;设计师如果没有它们就会更容易理解语言,但更容易用它们解析,应用你提到的技巧:词法分析器使用规则在扫描时自动插入分号。

答案 10 :(得分:4)

分号和{}具有语义含义(主要是变量生命周期)以及语法。在C ++中,我编写了类似

的代码
{
    lua_table tab;
    {
        lua_string str;
    }
}

它们非常有用,因为使用C ++中的Lua堆栈非常糟糕。

答案 11 :(得分:4)

对于某些人来说,分号和大括号看起来像噪音,难以阅读“实际”代码。

由于您可以让解析器基于标点符号或缩进来识别块(不涉及技术问题),因此使用一个或另一个替代方案只是程序员偏好的问题。

我的印象是,这种偏好可能主要是由于之前的程序员背景。

答案 12 :(得分:-2)

我真的不明白你为什么这么问。你讨厌编写Python代码?好吧,不要!没有人取消过C / C ++ /等等。