manbetx万博体育无情的编译器的奇事

在电影里2001:太空奥德赛计算机程序哈儿去流氓,表现向太空飞船的船员无情人有情。这究竟是如何的新手去编程语言必须感觉。

自从2009年推出以来,这门语言已经在网上引发了大量关于其固执己见的哲学观点的讨论。因为它是静态编译的语言,所以它有一个编译器。和HAL一样,Go编译器是相当顽固的-我敢说-无情

以…为例这个可怜的开发商谁也无法相信围棋编译器可以这么残忍:

TBH,这是我所见过的一种编程语言的最愚蠢的事

奇怪,我以为空引用的发明这里是明显的赢家。不管怎么说,把那家伙来声明愚蠢的巅峰之作终于达成?转到编译器不会让你有未使用的导入运行代码。

在这一点上,你可能会觉得奇怪,为什么编译器是如此的坚定看法?据我所知,它在这方面的独特。为什么,例如,不只是表现在这种情况下,一个警告?

让我们问问那些应该知道的人:语言创造者。在他们当中,你会发现计算机科学的两位传奇人物:罗伯·派克和肯·汤普森。他们都参与了Unix的开发。让我们看看他们的官方最佳实践指南有效围棋答案:

这是导入包[...]不使用它的错误。未使用的进口臃肿的程序和缓慢的编译。

很公平。没有人喜欢慢的编译器。你会在网上找到旺盛的好评快速Go的编译器是多么的。它的工作流程就感觉像是在用闪电般快速的反馈回路动态类型语言。

这并非偶然。

其实,这是语言的核心设计原则之一。不允许未使用的导入只是一块拼图。要获得在这一切起源,检查从以下摘录的一瞥Rob Pike访谈

起点是编译时间长- 对于一些我们在谷歌的大的软件,编译时间可以过长,甚至与我们的大型分布式编译集群。依赖关系管理(或缺乏)的C和C ++导致太多代码经历的编译器。你可能会说,Go是在等待大型编译时构思出来的。

我们都见过无数左右迷因在等待什么编译器做开发- 但是这一次肯定叫绝。与后面的故事,你就会明白为什么围棋是从地上爬起来,以尽可能快的编译。而为了到那里,你必须做出牺牲。通过不允许浪费想通过编译器管道未使用的进口,加工效率要高得多。但对于一个局外人,只看到了冰山一角,这可能看起来像“在编程语言的最愚蠢的事”。

但冰山要深得多。

最快的编译器可能追求产生了极大地影响每个应用程序的设计中的另一个无情的决定:不允许循环包依赖。当包一种依赖于包反之,我们有一个圆形的包的依赖,或导入周期。为此,Go会速度比你可以说“周期”扔你一个错误。

从设计的角度来看,在封装级循环是个坏消息。它紧耦合一切对周期,使其难以改变,原因有关。有趣的是,许多其他的编程语言有关导入周期相当宽容。在Java中,例如,你可能没有注意到,有在你的代码周期的。那为什么走得这么冷酷?

编译器的速度,再次。Go使用一个一个通道编译它只处理每个源文件一次。因此,它不像Java那样复杂多通道编译-但是非常快。这个决定也从根本上影响下围棋的设计。这迫使语言很简单:语言规范可以很容易地在不到一天的时间来阅读,而你需要一个古老的红木树产生足够的纸Java的规范。

从技术上讲,我们还没有回答为什么要去不能只是开发过程中使用的警告。幸运的是,转到常见问题作用:

有些人要求编译器选项来打开这些检查关闭或至少减少他们的警告。这样的选择还没有被添加,但是,因为编译器选项不会影响语言的语义,因为围棋编译器不报告警告,只是防止编译错误。

你读过之后,这应该是毫不奇怪。谈到这些错误为警告将严重破坏其重点是速度和简单的语言的核心理念。因此,这是唯一正确的否认任何这类请求。

在这一点上值得一提的是有解决这个问题的简单的方法,在开发过程中。惯用的方法是使用下划线为进口名:

进口_ “FMT”

通过这种方式,它只会被编译器忽略。但是,一个更明智的方式已经出现:(现在官方的)命令工具goimports自动添加缺少的进口,并删除未使用的。你可以配置你的选择来运行它的编辑保存文件后。正如你所现在期望的,它是快如闪电。这需要开发出循环,从另一个一个工具解决的问题。我不禁微笑在讽刺的却是辉煌。

正如我们所看到的,围棋编译器可能被认为是无情的。至少哈儿有柔和的声音软化的打击!但是,正如你所看到的,它有最好的意图。这是一个很小的代价为简单性和速度,你得到的回报。最终,你的代码和工作流程都是为它更好。

斯蒂芬·贝肯

从事软件开发工作。大部分时间都花在追求代码的简洁、优雅和美观上。或者只是在两者之间把事情做完。

评论的Disqus