[Coding翻译]分号时代的终结

833 阅读5分钟

原文地址:medium.com/@elizarov/t…

原文作者:medium.com/@elizarov

发布时间:2020年2月9日-4分钟阅读

奥斯汀-穆赫恩的《死胡同》

在我早期职业生涯的大部分时间里,我都是用分号来结束或分隔语句的语言来编程的;它就像一个区分编码员和非专业人员的表意符号。我有一种运动反射,不用思考就能打出分号(;)。因此,当我在2010年参与了关于JetBrains正在开发的新语言,也就是后来被称为Kotlin的语言的早期讨论时,我对取消强制性分号的提议并不激动。我想,谁会在意这些分号呢?我有相当强烈的意见,认为有必要解决nulls这个十亿美元的问题¹,以使我们的软件更安全,但视觉效果我不太关心。我是多么的狭隘啊!

事实证明,分号的消失已经成为2000年代末和2010年代崛起的现代语言的显著特征,以至于它几乎成为用 "现代语言 "编程的感觉的代名词。Scala(2004年)、Go(2009年)、Kotlin(2011年)和Swift(2014年)都是静态类型化的,都遵循C/C++/Java的语法传统,都用大括号,都是在最近20年引入并大发展的,尽管有传统,但都已经完全抛弃了强制性的分号。这是一个巧合吗?我觉得不是。我看这是一个趋势。

地面零点

让我们来看看房间里的大象--Python编程语言(1990年)。虽然它并不完全是 "现代 "的,但它的流行程度在最近才有了突飞猛进的发展。通过一些前瞻性的指标,比如PYPL²,它成为了最受欢迎的编程语言,并且一直排在前三名。

从语法上看,Python本身就是一个东西。它是一种罕见的完全缩进敏感的语言(也就是偏旁规则³),而不是什么学术或玩具语言。Python代码干净简洁的外观相当吸引人。从像Python这样精简的东西(除非你尝试面向对象的Python,那就是)切换到像Java(1995)或C#(2000)这样啰嗦的东西是很困难的,所以现代语言在这里竞相寻找一些中间地带并不奇怪。

随着类型引用现在已经成为一个事实上的标准语言特性,在保持类型安全和可扩展性的同时,避免视觉上的噪音和重复性变得可行了。我们的座右铭是。

如果编译器和人类都能很容易地猜到它,那么你就不应该在代码中明确地写出来。

不要重复自己(DRY)的欲望越来越强烈,干净利落是珍惜。无衬线字体已经占据了我们的代码编辑器相当长的时间,新的编码字体将清晰度的门槛提高得更高;编程语言正在变成无衬线字体和无分号字体。

一个错误的开始

不过,通往没有分号的未来的道路是很坎坷的。在JavaScript(1995年)中发生了一次重大的错误启动。JavaScript中的自动分号插入(ASI)规则导致了许多的错误,一段正确格式化的JS代码有两个语句,比如这段。

const name = "World"
["Hello", name].forEach(word => console.log(word))

实际上会被JS的规则解释为一条语句,迫使程序员使用分号只是为了确保编译器理解作者的代码的意思,即使它对人类读者来说一开始就完全不含糊。在JS中,这种情况非常糟糕,以至于现代JS编码风格建议总是使用分号,以节省精神力去思考是否需要分号。TypeScript(2012)作为JavaScript的后向兼容,也深受其害。

解决方法

JS分号的失误曾几乎扼杀了在卷边语言中放弃分号的想法。然而,事实证明,只要明确了设计目标,这并不是一个无法克服的问题。我们的目标不是通过使用启发式方法在这里和那里自动插入分号来有时省略分号,而是要确保每一个遵循语言风格指南的正确格式化的代码根本不需要包含分号。

现代编程风格的严谨性使得即使是对缩进不敏感的C族语言也可以设计这样的规则。我们这些开发人员,都被教导并习惯于在打开括号和运算符后,将语句分成多行。来看看一个多行函数调用语句。

receiver.foo(
   parameter
).doSomethingWithIt() // one multi-line statement

如果格式化得好,它就会与两个独立的语句清晰地区别开来,无论是对于人类还是对于一个精心设计的编译器,即使你把所有的缩进都去掉。

receiver.foo // the first statement
(parameter).doSomethingWithIt() // the second statement

一旦跨过了 "我必须思考这里是否需要分号 "到 "我永远不需要分号 "的门槛,不用写、不用在代码中看到分号的幸福感就会变得真正解放。 就像所有的生活质量改进一样,只有当你不得不暂时不使用分号时,它们才会变得明显。你有没有尝试过阅读用Times New Roman排版的代码?你可能一开始并没有意识到这一点,但你会有一种明显的感觉,那就是有些地方不对--所有的衬线字体都有太多的视觉噪音。如今,当我看到现代代码中的分号时,我也会有同样的感觉,尤其是当它是用一些看似现代的语言写成的。每次我都会情不自禁地打开维基百科,仔细检查一下我所阅读的语言是在哪一年引入的。

我们正生活在分号时代的末期。配方就在那里。它真正变得无处不在只是时间问题。

进一步的阅读和脚注

  1. Null是你的朋友,而不是一个错误
  2. PYPL PopularitY of Programming Language (编程语言的流行)
  3. 越位规则
  4. 类型向右移动
  5. JetBrains Mono Font

www.deepl.com 翻译