【问题标题】:Why do some programming languages allow semicolons to be automatically included? [closed]为什么有些编程语言允许自动包含分号? [关闭]
【发布时间】:2015-02-09 09:02:54
【问题描述】:

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

我从这篇文章Do you recommend using semicolons after every statement in JavaScript? 知道,建议使用分号,并且在某些情况下会产生不必要的歧义(例如在不使用大括号时在 C++ 中悬挂 else)。

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

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

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

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

【问题讨论】:

  • “它对这些语言的用户有什么好处”——它对 JavaScript 没有好处。这在 JavaScript 中非常非常糟糕
  • 为了编译器的利益
  • @chris 不,甚至对于编译器也不行。将此功能添加到编译器需要额外的工作。
  • “我想知道为什么做出这个决定,以及它对这些语言的用户有何好处。” 只有语言的创造者才能回答这个问题。你应该问他们。
  • @cdhowie 出于某种原因,我觉得它有助于形成语法,我的意思是任何字符都可以被选中

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


【解决方案1】:

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

这是演讲的直接引述:

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

就它对语言用户的好处而言,Crockford 详细解释了它好处的几个原因,而是它如何在语法中引入了非常严重的歧义和陷阱。最值得注意的情况之一是尝试使用左大括号编码样式 (source from the video) 返回对象文字时:

return
{
    ok: false
};

实际上返回未定义,因为分号插入在return 之后添加了一个,并且剩余的预期对象字面量被解析为代码块,相当于:

return;
{
    ok: false;
}

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

【讨论】:

    【解决方案2】:

    JavaScript 语言的作者 Brendan Eich 有一篇关于此主题的博文,名为 The infernal semicolon,主题为自动分号插入 (ASI)。

    相关引述:

    ASI(从形式上讲)是一种句法纠错程序。


    我希望我在 1995 年 5 月的那十天里让换行符在 JS 中更重要。然后我们会诅咒在续行的末尾使用中缀运算符而不是 ASI,或者可能是粗鲁-强制括号,强制延续到连续的行。但那艘船几乎是 17 年前航行的。


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

    【讨论】:

      【解决方案3】:

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

      为了解决这个问题,当时的一些编译器试图对您的预期含义进行第二次猜测,因此如果拼写错误足够小(对于“足够小”的某些定义),它会假设它知道您的真正意图,并继续编译(甚至可能执行)尽管出现错误。

      那些不学习历史的人注定要重蹈覆辙。一些过于自大而无法从历史中吸取教训的人也会重复它。关于导致语言设计者目前犯此错误的确切类型的字符缺陷,可能存在相当大的争论空间。不过,关于这是否是一个错误的争论空间要小得多(根本没有,真的)——这显然是一个错误,而且是不可原谅的。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多