为什么有些编程语言允许自动包含分号?

时间:2014-12-11 00:26:42

标签: javascript c++ automatic-semicolon-insertion

如果忘记分号,C ++等语言将无效,但JavaScript等其他语言会自动包含它们。

我从这篇文章Do you recommend using semicolons after every statement in JavaScript?得知,建议使用分号,并且有些场景可能会产生不必要的歧义(例如在不使用大括号时在C ++中悬挂其他东西)。

在某个时间点,必须决定使它们成为可选项(例如,当JavaScript的创建者有意识地选择使其成为可选项时)。

我想知道为什么做出这个决定以及它对这些语言的用户有什么好处。

背景:我是一名新手编码员,最近才开始学习JavaScript。

编辑:对于那些说JavaScript不好的评论,我知道。我问的是,如果大多数人认为这是不好的做法,为什么一开始就允许它发生。

4 个答案:

答案 0 :(得分:4)

关于JavaScript,Douglas Crockford在this video中解释了这个想法的起源。 (这是一个很棒的演讲,如果你打算继续追求JavaScript,那么你真的值得花些时间观看它。)

这是谈话的直接引用:

  

分号插入是为了让初学者更容易使用C语法。

至于它对语言用户有何益处,Crockford详细解释了为什么 有益的原因,而是它如何引入非常严重的含糊之处并深入了解语法。最值得注意的一个案例是尝试使用左括号编码样式(source from the video)返回对象文字时:

return
{
    ok: false
};

实际上返回undefined,因为分号插入在return之后添加了一个,剩下的预期对象文字被解析为代码块,相当于:

return;
{
    ok: false;
}

尝试让初学者更容易学习语言可能是善意失误的重要来源。

答案 1 :(得分:2)

JavaScript语言的作者Brendan Eich在自动分号插入(ASI)主题上发表了一篇名为The infernal semicolon的博客文章。

相关引言:

  

ASI(正式来说)是一种语法错误纠正程序。


  

我希望在1995年5月的那十天里,我在JS中创建了更重要的换行符。然后,我们将诅咒在连续行的末尾使用中缀运算符的必要性,或者或许是粗暴的 - 强制括号,强制继续到连续的行。但这艘船大约在17年前航行。


  

我的两分钱:小心不要使用ASI,好像它给了JS重要的换行符。

答案 2 :(得分:1)

很久以前,在遥远,尘土飞扬的过去,这样的事情主要是为了弥补编译/链接/运行周期至少以小时为单位测量的事实,并且经常运行超过一天。可能(好吧:是)等待数小时结果非常令人沮丧,只是发现编译器已停在第3行(或其他)因为一些愚蠢的错字。

为了解决这个问题,当时的一些编译器尝试来猜测你的预期含义,所以如果错字很小(对于某些“足够小”的定义),它会假设它知道你真正的意图,并继续编译(甚至可能执行),尽管有错误。

那些未能研究历史的人注定要重蹈覆辙。一些过于傲慢从历史中学习的人也会重复这一点。关于字符缺陷的确切类型,可能会引发语言设计者在目前犯这个错误的可能性。关于它是否是一个错误的争论,有更少的空间(根本没有,真的) - 它显然是,并且是不可原谅的。

答案 3 :(得分:1)

在javascript中,半冒号是一个语句分隔符,但是换行符也是如此,所以如果每行都有一个语句,你就不需要它们。

其他语言,如C ++,只有;作为一个分隔符,像新行一样的空白,什么也不做。有利有弊

在C ++中它意味着语法是一致的

如果你写

int x=0;
x++;

如果你然后压缩到一行,它的通用语法相同: -

int x = 0;  x++;
如果你写的话,

在javascript中

var x=0
x++

然后如果你压缩到一行

var x=0 x++

会有问题

您需要var x=0; x++

所以,重要的是空白是否重要。理想情况下,语言会始终使用一种机制。但是对于javascript它是混合的,所以它在使用时会留下一点含糊之处;