我在谷歌上搜索了一下Go的网站,但我找不到Go非凡的构建时间的解释。它们是语言特性(或缺乏特性)的产物、高度优化的编译器还是其他什么?我并不是在推广围棋;我只是好奇。
当前回答
简单(用我自己的话说),因为语法非常容易(分析和解析)
例如,没有类型继承意味着不需要进行有问题的分析,以确定新类型是否遵循基类型施加的规则。
例如,在这个代码示例:"interfaces"中,编译器在分析该类型时不会去检查预期的类型是否实现了给定的接口。只有在它被使用之前(如果它被使用)才会执行检查。
另一个例子,编译器会告诉你你是否声明了一个变量而没有使用它(或者如果你应该持有一个返回值而你没有)
以下代码不能编译:
package main
func main() {
var a int
a = 0
}
notused.go:3: a declared and not used
这种强制和原则使生成的代码更安全,并且编译器不必执行程序员可以执行的额外验证。
总的来说,所有这些细节使语言更容易解析,从而导致快速编译。
再一次,用我自己的话来说。
其他回答
简单(用我自己的话说),因为语法非常容易(分析和解析)
例如,没有类型继承意味着不需要进行有问题的分析,以确定新类型是否遵循基类型施加的规则。
例如,在这个代码示例:"interfaces"中,编译器在分析该类型时不会去检查预期的类型是否实现了给定的接口。只有在它被使用之前(如果它被使用)才会执行检查。
另一个例子,编译器会告诉你你是否声明了一个变量而没有使用它(或者如果你应该持有一个返回值而你没有)
以下代码不能编译:
package main
func main() {
var a int
a = 0
}
notused.go:3: a declared and not used
这种强制和原则使生成的代码更安全,并且编译器不必执行程序员可以执行的额外验证。
总的来说,所有这些细节使语言更容易解析,从而导致快速编译。
再一次,用我自己的话来说。
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编译器快。
推荐文章
- 在SQL Server上使用varchar(MAX) vs TEXT
- .toArray(new MyClass[0]) or .toArray(new MyClass[myList.size()])?
- 在C和c++中静态变量存储在哪里?
- 如何加入一个字符串片成一个单一的字符串?
- VS2013外部构建错误"error MSB4019: The imported project <path> was not found"
- 如何导入本地包没有gopath
- 无法加载文件或程序集…参数不正确
- 是什么导致JNI调用变慢?
- 检查属性是否有属性
- 如何快速清除JavaScript对象?
- 去测试字符串包含子字符串
- Node.js vs .Net性能
- 如果使用if-return-return或if-else-return?
- 在子目录中测试Golang
- Gradle构建脚本依赖项