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

Why do some programming languages allow semicolons to be automatically included?

本文关键字:包含 许自动 编程语言 为什么      更新时间:2023-09-26

如果忘记了分号,像C++这样的语言将无法工作,但其他语言,如JavaScript会自动包含它们。

我从这篇文章中知道,您是否建议在 JavaScript 中的每个语句后使用分号?,建议使用分号,并且有些场景可能会产生不必要的歧义(例如,不使用大括号时在C++中悬挂其他内容(。

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

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

背景:我是一个新手程序员,最近才开始学习JavaScript。

编辑:我知道那些说它在JavaScript中很糟糕的评论。我问为什么首先允许它发生,如果大多数人认为这是不好的做法。

关于 JavaScript,Douglas Crockford 在这个视频中解释了这个想法的起源。(这是一个很好的演讲,如果你打算继续追求JavaScript,它真的值得你花时间去看。

这是演讲中的直接引用:

分号插入旨在使初学者更容易使用 C 语法。

至于它如何使语言用户受益,Crockford详细解释了为什么它没有好处的几个原因,而是它如何在语法中引入非常严重的歧义和陷阱。 最值得注意的情况之一是尝试使用左大括号编码样式返回对象文本(来源于视频(:

return
{
    ok: false
};

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

return;
{
    ok: false;
}

试图让初学者更容易使用语言可能是善意错误的重要来源。

JavaScript 语言的作者 Brendan Eich 有一篇关于这个主题的博客文章,名为 The infernal 分号,主题是自动分号插入 (ASI(。

相关引述:

ASI是(正式的(语法纠错过程。


我希望我在 1995 年 5 月的那十天里在 JS 中使换行符更加重要。然后,我们将诅咒需要在连续行的末尾使用中缀运算符,或者可能是暴力括号,以强制连续行。但那艘船在大约17年前航行。


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

很久以前,在遥远的尘土飞扬的过去,做这样的事情主要是为了弥补编译/链接/运行周期至少以小时为单位,并且经常运行超过一天的事实。等待数小时才能获得结果可能会非常令人沮丧,却发现编译器由于一些愚蠢的拼写错误而停止在第 3 行(或其他什么(。

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

那些不研究历史的人注定要重蹈覆辙。一些过于傲慢而不敢从历史中吸取教训的人也重复了它。关于导致语言设计师目前犯这个错误的确切字符缺陷,可能还有相当大的争论空间。不过,关于这是否是一个错误的争论空间要小得多(实际上根本没有(——它显然是,而且是不可原谅的。

在 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,它是混合的,所以在使用时会留下一些歧义;