繁体   English   中英

Go的优点和缺点是拒绝未使用的依赖项

[英]Pros and cons of Go rejecting unused dependencies

Google的新语言Go试图通过明确要求实际使用模块中列出的所有依赖项来简化依赖项管理。 编译器将拒绝向模块声明依赖关系的模块,而不使用该模块中的任何内容。

包导入自身或导入包而不引用其任何导出的标识符是非法的。

我可以想到一些明显的优点(例如更清洁的模块),但也许有一些非显而易见的优点。 我能想到的唯一缺点是有一个过于迂腐的编译器,在重构过程中抱怨太多,但也许还有更多?

您是否有其他语言执行此操作的经验? 这种方法的优点和缺点是什么?

您不仅需要显式使用所有依赖项,还必须使用所有变量。 当您有未使用的变量时,编译器会给您错误。

他们很烦人。 但它会让别人高兴,因为他们得到了干净的代码。

我想可能Go设计师打算成为一种主要依赖于IDE的语言。

我猜这个最大的动机和最大的结果是编译时间的改进。 技术预览视频突出了他们在短时间内编译大量代码的能力(他们的例子是在MacBook上8秒内有200,000行代码 - 没有给出机器规格)。

同样在科技视频中,他们特别提到他们实现的最大方法之一就是改变模块编译和链接的方式。

这是一个在当前C / C ++系统中如何工作的例子:

A类在头文件C_H中定义,并在C_CPP中实现。 B类源自C,并在文件B_H和B_CPP中实现。 A类派生自B,并在文件A_H和A_CPP中实现。

由于推导链,A_CPP包括A_H,B_H和C_H。 B_CPP包括B_H和C_H。 C_CPP包括C_H。 由于C预处理器的性质,它基本上将#include转换为剪切和粘贴操作,C_H的内容通过编译器运行3次,B_H运行两次。

此外,A_CPP,B_CPP和C_CPP的内容都存在于它们自己的目标文件中。 因此,当链接器去解析Ao时,它被强制加载并处理Bo和Co。此外,当它解析Bo时,它必须再次处理Co。

预编译的头文件可以帮助解决这个问题的第一部分,但是它们也可能是一个很难维护的问题,而且我知道许多开发人员因为这个原因而根本不使用它们。 它也没有从根本上改变问题 - 标题仍然在多个级别处理多次,现在只处理预编译的二进制文件而不是源代码。 切出几个步骤,但不是整个过程。

以不同方式处理事情。 他们的技术谈话直接从PDF中得出的话

“Go编译器从目标文件中提取传递依赖类型信息 - 但只提供它需要的东西。如果A.go依赖于B.go取决于C.go: - 编译C.go,B.go,然后是A.go. - 编译A.go,编译器读取Bo not Co大规模,这可能是一个巨大的加速。“

好的,完成了轻微的切线。 为什么这有关系? 答案也在Go Tech Talk PDF中:

“包模型:显式依赖关系,以实现更快的构建。”

我猜测Go开发人员认为,当编译时间以秒为单位测量时,即使是非常大的项目,开发人员编译时间缩短也会更有效率。 说我需要8秒钟来编译200,000行代码并发现我有一个无关的包导入,5-10秒(有一个好的IDE,或者熟悉你的开发环境)来找到并修复它,并且另外8秒重新编译。 称它总共30秒 - 现在我所有未来的编译都保持在10秒范围内。 或者我们可以通过包含不必要的依赖项来让我们的模块增长,并观察编译时间从8秒增加到10秒,12秒或15秒。 它看起来并不多,因为我们都习惯于在几分钟的时间内编译时间 - 但是当你开始意识到性能下降25%时,你会停下来思考一下。

编译时间已经很快了。 还要考虑处理器速度仍然在增加(如果没有那么多),并且可用内核数量也在增加(并且编译大量代码非常适合多线程)。 今天8秒内有200,000行代码意味着想象在10年内基本上即时编译200,000行代码并不是不合理的。 我觉得围棋队取得了在这里有意识的决定,使编译时间的过去的事情,而你提出这一问题的仅是很小的一部分,但它仍然其中的一部分。

另一方面,Go团队似乎也开发了一种语言设计理念,这种理念强制实施一些优秀的编程实践。 值得赞扬的是,他们已经努力实现这一目标而没有严重的性能损失,并且基本上取得了成功。 [旁白:我能想到的另外两件事实际影响性能是垃圾收集和强制初始化变量 - 后者在这个时代非常微不足道。]这会让一些程序员感到恼火,同时让别人开心。 在编程世界中,这是一个古老而古老的论点,而且很明显Go的哪个方面已经下降了,无论喜欢与否。

我认为这两种力量共同影响了他们的决定,我认为在一天结束时这是一个很好的方式,虽然我支持这里的其他评论者建议允许“ - 严格”标志或其他一些这样做特定行为是可选的,特别是在项目生命周期的早期阶段。 当我第一次开始编写我知道稍后需要的代码时,我可以很容易地看到自己定义变量或包含包,即使我还没有编写需要它们的代码。

正如yuku所提到的,如果你有一个与Netbeans和Eclipse可以为java做同样的IDE,那么你真的不必关心这类事情。

右键单击边距中的小灯泡,然后选择“删除所有未使用的依赖项”。

对于未使用的变量,它们通常会得到一个波浪形的下划线,并且很容易被发现。

这里唯一的区别是,与其他语言不同,除了IDE之外,你实际上还有编译器抱怨,但如果你使用IDE,那么这就成了一个问题。

在工作中,我们的编码政策几乎表明我们必须做同样的事情(我们自己),当然还有其他语言。 所以我会说这种确实有真正的应用程序。 虽然恕我直言,编译器应该让开发人员选择打开和关闭此行为。 任何人都严格模式?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM