2014-06-09 1 views
4

Go 컴파일러가 왜 큰 바이너리 파일을 생성합니까? 예를 들어왜 Go는 작은 프로그램을위한 큰 바이너리 파일을 생성합니까?

는 다음 코드를 컴파일 한 후, 나는 우분투 및 Win7에 모두 에 위의 코드를 테스트하고 결과가 동일한 1.8 MB 간부 파일을

package main 
import "fmt" 
func main(){ 
    fmt.Println("Hello World") 
} 
를 얻을!

필자도 +70 줄의 코드로 더 큰 프로그램을 작성했으며 결과 바이너리 파일은 놀라 울 정도로 다시 1.8MB (사실 몇 바이트 차이가 있음)였습니다. Go 컴파일러에 의해 바이너리 파일에 무엇이 덤프되어 있는지 궁금합니다. (이동 프로그래밍 언어 자주 묻는 질문에서)

+0

가능한 중복 [컴파일 된 파일의 크기를 줄이는 방법?] (http://stackoverflow.com/questions/3861634/how-to-reduce-compiled-file-size) – kostix

답변

13

Why is my trivial program such a large binary? : GC의 툴 체인 (5리터, 6리터 및 8리터)에서

링커는 정적 연결을한다. 모든 Go 바이너리에는 Go 런타임 인 ​​과 동적 유형 검사, 반영 및 패닉 타임 스택 추적을 지원하는 데 필요한 런타임 유형 정보가 포함되어 있습니다.

Linux에서 gcc를 사용하여 정적으로 컴파일되고 링크 된 간단한 "hello, world"프로그램은 printf의 구현을 포함하여 약 750KB입니다. fmt.Printf를 사용하는 동등한 Go 프로그램은 약 1.2MB이지만 더 강력한 런타임 지원이 포함됩니다.

+5

묵시적 다음 2메가바이트의 출처부터 런타임/표준 라이브러리의 큰 덩어리에서 링크하면 바이너리 크기는 코드 작성량에 비례하지 않습니다. Hello World를 10x 또는 100x로 작성하면 일반적으로 18MB 또는 180MB 바이너리를 얻지 못합니다. – twotwotwo

+1

@twotwotwo, 그럼 임베디드 시스템 용으로 최적화 된 버전이 있습니까? – sepisoad

+3

대상 장치가 2MB 바이너리를 사용할 수 없으면 Go를 사용할 수 없습니다. '-compiler gccgo'로 빌드하면 표준 라이브러리 중 일부를 장치의 모든 Go 바이너리가 공유하는'libgo '파일로 푸시합니다. 그러나 프로그램에 상관없이 프로그램 코드가 필요하고 어딘가에 공간을 차지할 것입니다 (자바와 C#은 대상 시스템에 런타임이 설치되어야 함). – twotwotwo

관련 문제