使用大量代码时,哪些语言仍能快速启动?

时间:2016-08-07 20:08:54

标签: performance compilation scalability

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

C的一个(有争议的)优点是你可以拥有单独的编译单元。可以将大量代码编译到对象和库中,这些对象比解析任何数量的C代码要快得多。运行速度可能较慢,因为在补偿单元之间无法进行内联优化,但链接速度非常快,尤其是与ld.gold链接器的链接。

问题是,它是C.缺乏命名空间,非常多。

但即使C ++也没有(实际上)使用单独的补偿单元。当然可以,但在大多数情况下,它是在头文件中包含兆字节的模板。 “私人:”背后的整个哲学是假装你有分离的界面,而根本没有它们。因此,语言中的标准实践也很重要,因为即使我创建自己的孤立二进制接口,如果每个实现都必须#include来自第三方的相同数量的代码,那么隔离它们所节省的时间也不会增加。无论如何,C ++对我来说很有意义。真的,我只想要名称空间。 (和模块......叹气)

像python,racket和java这样的语言使用部分编译,这看起来足够快,但是对于大型项目,你仍然会在启动时遇到速度减慢,因为他们必须每次都将所有字节码翻译成机器代码。没有选择(在编写C接口之外)以快速与您正在处理的代码结合的方式隔离代码。

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

这并不总是显而易见的。我正在盯着D试图找出它在重新编译东西的时候从依赖关系解析代码的时候,没有线索。 Go似乎只是将所有代码(包括依赖项!)打成一个单独的编译单元,但也许我错了吗?而且我不认为Nim会在每次编译时重新生成所有生成的C,但也许它会这样做? Rust使用单独的compliation单元(我认为),但它仍然很慢,因为编译!并且python确实可以快速编译,所以只有当我的项目开始变得越来越大并且成功时,我开始被它绊倒。

1 个答案:

答案 0 :(得分:0)

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