【发布时间】: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