对比一下go语言和c语言编译hello world后的大小, go语言版本有2M大小,而C语言版本仅有8k :
go 代码:
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
#include <stdio.h>
int main()
printf("hello world!\n");
return 0;
大小对比:
# du * -sh
8.0K a.out
2.2M hello
4.0K hello.c
4.0K hello.go
谢谢邀请,有几个问题
1) c版的main后面要返回0,否则编译时会有warning。
2) go版的hello world默认编译出来的a.out是有符号表的,你如果想要去掉符号表,需要
strip -s main
在RHEL6.4上,go1.4 strip -s之后,go版本的hello world只有1.3MB
3) go当时希望解决目前语言的一个问题就是部署时的库依赖,能够迅速的、无缝的部署,试想,如果有一个服务器程序要发布,这个服务器程序依赖于差不多100多个依赖的动态库,每次你加入新的feature之后,依赖的动态库要升级,服务器程序本身也要升级,这在部署的时候是非常麻烦的,所以go推崇的程序发布方式是将依赖的库和程序本身一起发布,也就是说你用go编译出来的程序,不会再依赖其他的库了,你直接拷贝过去就能用!是的,直接拷贝就能用!! java程序要发布,你需要打包JRE环境,python程序要发布,你需要打包python解释器,而go不用。所以去掉符号表的go版的hello world差不多1.3MB,这个在目前硬盘白菜价的市场上,基本上都能接受。(go编译选项 https://golang.org/cmd/link/)
4) C版的hello world我们来看下,都依赖什么。
其中光libc的依赖库就差不多2MB了。
所以从依赖库的角度来看,go版的hello world表现尚可,还在接受范围之内。
希望上述回答能解决你的问题。
从这个意义上讲,
go
的编译基本上相当于gcc -static
。静态链接的C程序也要大很多,因为所有库函数都包含在内了。我的系统是:CentOS release 6.5 (Final)
strip go 版 hello执行文件后大小是1.6M。
如果把a.out依赖的库改名,那么这个程序就不能执行了。
可以看到cp ls mv等命令都不能执行了,go版本的hello还能执行,我要恢复系统先!23333
正在想办法恢复系统.... 如果提前准备一套go版的bash命令要包括cd,mv,就好了!
将hello.c 静态编译后的大小对比:
gcc -static hello.c
照着Linux C man文档inotify的例程给 PHPDroid 写了个C程序,
在Android App卸载删除文件时,捕获IN_DELETE_SELF事件,退出PHP进程.
静态链接,交叉编译,生成的二进制文件也才500多KB.
Go生成的程序比较大可能是因为其内置了GC垃圾回收还有goroutine协程这些机制的实现.
像Go这种无依赖的运行模式还是挺好的,我Ubuntu上静态链接交叉编译的Linux ARM版PHP,用xz打包后不到5.5MB,拿到Android和Raspbian上都能运行,这是一种摆脱依赖地狱的良好体验.