2014-06-09 103 views
4

爲什麼Go編譯器會生成大的二進制文件?Go爲什麼會爲小程序生成大的二進制文件?

例如編譯下面的代碼後,我收到了1.8 MB EXEC文件

package main 
import "fmt" 
func main(){ 
    fmt.Println("Hello World") 
} 

我測試在Ubuntu和Win7的上面的代碼和結果是一樣的!

我還用+70行代碼編寫了一個更大的程序,生成的二進制文件再次出乎意料地是1.8 MB(實際上有幾個字節差異)。我想知道Go編譯器轉儲到二進制文件中的是什麼。

+0

可能重複的[如何減少編譯的文件大小?](http://stackoverflow.com/questions/3861634/how-to-reduce-compiled-file-size) – kostix

回答

13

Why is my trivial program such a large binary?(從轉到編程語言FAQ):

在GC工具鏈(5L,6L和,8L與)的接頭做靜態鏈接。 因此,所有Go二進制文件都包含Go運行時間以及支持動態類型檢查,反射甚至恐慌時間堆棧跟蹤所需的運行時類型信息。

在Linux上使用gcc靜態編譯和鏈接的簡單C「hello,world」程序大約爲750 kB,包括printf的實現。使用fmt.Printf的等效Go程序大約爲1.2 MB,但包含更強大的運行時支持。

+5

暗示:由於2MB來自鏈接在一大堆運行時/標準庫中,二進制大小與您編寫的代碼不成比例 - 如果您編寫10倍或100倍的Hello World,則通常不會獲得18MB或180MB的二進制文件。 – twotwotwo

+1

@twotwotwo,那麼是否有針對嵌入式系統優化的版本? – sepisoad

+3

如果您的目標設備無法使用2MB二進制文件,那麼您可能無法使用Go。如果使用'-compiler gccgo'構建,它會將某些標準庫推入設備上所有Go二進制文件共享的'libgo'中,但無論如何,您的程序都需要這些代碼,並且它會佔用一些空間(就像Java和C#需要將他們的運行時安裝在目標機器上一樣)。 – twotwotwo

相關問題