【问题标题】:What languages still start fast with larger amounts of code?哪些语言仍然可以通过大量代码快速启动?
【发布时间】:2016-08-07 20:08:54
【问题描述】:

tl;dr 我想要一个快速的编辑-编译-运行工作流程,但是在“somenamespace_”中为每个函数调用添加前缀很烦人。

C 的一个(有争议的)优点是您可以拥有单独的编译单元。大量代码可以编译成对象和库,它们链接在一起比解析任何数量的 C 代码要快得多。运行速度可能会慢一些,因为无法在编译单元之间进行内联优化,但链接速度非常快,尤其是使用 ld.gold 链接器时。

问题在于,它是 C。几乎没有命名空间。

但即使是 C++(实际上)也不使用单独的编译单元。当然可以,但在大多数情况下,它是关于在头文件中包含兆字节的模板。 “private:”背后的整个哲学是假装你有分离的接口,实际上根本没有它们。因此,语言的标准实践也很重要,因为即使我制作自己的隔离二进制接口,如果每个实现都必须#include 来自第三方的大量代码,那么隔离它们所节省的时间并没有增加。无论如何,C++ 对我来说有点……很有特色。真的,我只想要命名空间。 (和模块......叹息)

像 python、racket 和 java 这样的语言使用部分编译,这似乎足够快,但是对于大型项目,您仍然会在启动时变慢,因为它们每次都必须将所有字节码转换为机器码。没有其他选择(除了编写 C 接口之外)以一种可以快速与您正在处理的代码结合的方式隔离代码。

我只想知道哪些语言可以将大量代码隐藏在小型、快速加载的接口后面,这样一开始编译它们可能会很慢,但随后我可以得到一个快速的编辑-编译-运行周期当我处理它的一部分时。而不是这个python hack,我在进度显示中更改了一些东西,然后在它加载标准库时必须坐在那里盯着它,然后加载数据库代码,然后加载Web服务器代码,然后加载图像处理代码,然后再坐在那里 20 秒,为一些 gui 代码找出 gobject-introspection 的东西。

这并不总是显而易见的。我盯着 D 试图弄清楚它何时在重新编译东西时从依赖项中解析代码,但没有任何线索。 Go 似乎只是将所有代码(包括依赖项!)放在一个编译单元中,但也许我错了?而且我认为 Nim 不会在每次编译时重新生成所有生成的 C,但也许确实如此? Rust 使用单独的编译单元(我认为),但编译起来仍然很慢!而且 python 确实编译得很快,所以只有当我的项目开始变得大并成功时,我才开始被它绊倒。

【问题讨论】:

    标签: performance compilation scalability


    【解决方案1】:

    我还没有学过你提到的其他语言,例如 Rust、D 或 Python。编译 Nim 程序时,它会创建一个名为 nimcache 的文件夹。其中包含所有 .c 和 .o 文件。如果您对 Nim 程序进行更改并重新编译,它会尝试重用该 nimcache 文件夹中的文件。这些文件具有 .c 和 .o 扩展名。

    【讨论】:

      猜你喜欢
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      相关资源
      最近更新 更多