我在谷歌上搜索了一下Go的网站,但我找不到Go非凡的构建时间的解释。它们是语言特性(或缺乏特性)的产物、高度优化的编译器还是其他什么?我并不是在推广围棋;我只是好奇。
当前回答
围棋的设计就是要快,这一点已经体现出来了。
Dependency Management: no header file, you just need to look at the packages that are directly imported (no need to worry about what they import) thus you have linear dependencies. Grammar: the grammar of the language is simple, thus easily parsed. Although the number of features is reduced, thus the compiler code itself is tight (few paths). No overload allowed: you see a symbol, you know which method it refers to. It's trivially possible to compile Go in parallel because each package can be compiled independently.
请注意,Go并不是唯一具有这些特性的语言(模块是现代语言的标准),但它们做得很好。
其他回答
围棋的设计就是要快,这一点已经体现出来了。
Dependency Management: no header file, you just need to look at the packages that are directly imported (no need to worry about what they import) thus you have linear dependencies. Grammar: the grammar of the language is simple, thus easily parsed. Although the number of features is reduced, thus the compiler code itself is tight (few paths). No overload allowed: you see a symbol, you know which method it refers to. It's trivially possible to compile Go in parallel because each package can be compiled independently.
请注意,Go并不是唯一具有这些特性的语言(模块是现代语言的标准),但它们做得很好。
我认为不是Go编译器快,而是其他编译器慢。
C和c++编译器必须解析大量的头文件——例如,编译c++“hello world”需要编译18k行代码,这几乎是半兆字节的源代码!
$ cpp hello.cpp | wc
18364 40513 433334
Java和c#编译器在VM中运行,这意味着在它们编译任何东西之前,操作系统必须加载整个VM,然后必须将它们从字节码编译为本机代码,所有这些都需要一些时间。
编译的速度取决于几个因素。
有些语言被设计为快速编译。例如,Pascal被设计为使用单遍编译器进行编译。
编译器本身也可以优化。例如,Turbo Pascal编译器是用手工优化的汇编器编写的,结合语言设计,可以在286类硬件上运行非常快的编译器。我认为即使是现在,现代的Pascal编译器(例如FreePascal)也比Go编译器快。
编译的基本思想实际上非常简单。原则上,递归下降解析器可以以I/O限制的速度运行。代码生成基本上是一个非常简单的过程。符号表和基本类型系统并不需要大量的计算。
然而,降低编译器的速度并不难。
如果存在一个预处理器阶段,其中包含多级包含指令、宏定义和条件编译,尽管这些东西很有用,但加载它并不难。(举个例子,我想到了Windows和MFC头文件。)这就是为什么预编译头文件是必要的。
在优化生成的代码方面,可以向该阶段添加多少处理是没有限制的。
编译效率是主要的设计目标:
最后,它的目的是要快:在一台计算机上构建一个大型可执行文件最多只需要几秒钟。为了实现这些目标,需要解决一些语言问题:表达性强但轻量级的类型系统;并发性和垃圾回收;刚性依赖规范;等等。常见问题解答
关于与解析相关的特定语言特性,语言常见问题解答非常有趣:
第二,该语言被设计成易于分析,并且可以在没有符号表的情况下进行解析。
Go对所有文件导入一次依赖项,因此导入时间不会随着项目大小呈指数增长。 更简单的语言学意味着解释它们需要更少的计算。
还有什么?
推荐文章
- 我可以列出所有的标准Go包吗?
- 确定记录是否存在的最快方法
- 在Go中将float64转换为int类型
- 阅读GHC核心
- Python: List vs Dict用于查找表
- 为什么MATLAB的矩阵乘法运算这么快?
- for循环和for-each循环在性能上有区别吗?
- 就性能而言,使用std::memcpy()还是std::copy()更好?
- 什么时候我应该(不)想要在我的代码中使用熊猫apply() ?
- 人们如何在Go中管理身份验证?
- iOS -构建失败,CocoaPods无法找到头文件
- 访问HTTP响应作为字符串在Go
- 如何解析unix时间戳到时间。时间
- 如何使用yyyyMMddHHmmss格式格式化当前时间?
- 解析.py文件,读取AST,修改它,然后写回修改后的源代码