为什么 Go 语言可以交叉编译,打包出目标平台二进制, Java 不行?

2020-07-15 09:13:02 +08:00
 smallyu

好像很多语言的程序包执行都需要相应的环境,除了脚本类的,Java 这种需要编译的,好像经常也是 java -jar abc.jar 这种,而 go 语言能直接编译出不依赖 go 环境的包。可以帮忙提点一下吗盆友们,关于这个问题,应该往哪方面去了解?

7306 次点击
所在节点    程序员
36 条回复
jizhihaoSAMA
2020-07-15 12:23:29 +08:00
@passerbytiny 替代 C cpp 写服务端吧,其他的替代不了
koebehshian
2020-07-15 13:50:50 +08:00
编程语言只规定了语法,编译器或解释器是对编程语言的实现,一种语言可以有多种实现。
DoctorCat
2020-07-15 13:58:25 +08:00
抛开原理,说个分发方面:
Go 把依赖都打包在一个可执行体里了(编译后都是机器码不需要 VM,runtime 部分尺寸相对 Java 运行时要小得多,分发起来轻便)
Java 有一整套的 VM 依赖和其他框架的库依赖(编译后是字节码必须在 JVM 上执行,依赖尺寸太大,所以分开了好。分发起来应用与 VM 独立比较好)。
c2const
2020-07-15 14:05:58 +08:00
go 编译后其实带一个很小的运行库,不过是集成在一起了,和 java 在语言设计之初就不一样。
Java 也有 aot 编译,不过因为语言设计之初的目的,而且现在 java 也太臃肿,做 aot 编译的项目和公司基本都凉了,或者很久没更新了。
最新的商业软件好像是可以支持到 jdk1.8,前几年那公司也倒闭了。

技术原理大概就是

0,把与 jvm 无关的逻辑代码转成汇编(现在有 llvm 方便很多),
1,与虚拟机耦合不深的 native 方法(比如数组拷贝),一般是重新实现一份
2,与虚拟机耦合深的方法(比如获取虚拟机启动时间),一般做法还是需要启动一个最小虚拟机
3,特有语法特性,比如 反射、动态改字节码、jvm 上其它语言的函数式编程……都是大坑

不过计算机的事,没什么是加中间层不能解决的。
huiyifyj
2020-07-15 14:07:28 +08:00
@passerbytiny #17 你说 rust 替代 c/c++我还行,go 就算了。
huiyifyj
2020-07-15 14:08:03 +08:00
@huiyifyj #25
行 => 信
c2const
2020-07-15 14:20:32 +08:00
@huiyifyj 仅个人感觉,go 是抢 c/c++的服务端市场。rust 微软再推,抢 c/c++操作系统、内核组件、安全是为了防止内存泄露相关的漏洞利用,主要还是安全领域相关的吧
个人不太喜欢 go 语法,c/c++真香:)
gz911122
2020-07-15 14:32:13 +08:00
java 也可以的 graalvm 了解一下

先问是不是再问为什么
liuxey
2020-07-15 14:34:46 +08:00
"而 go 语言能直接编译出不依赖 go 环境的包"

Go 把运行环境编译进了二进制包!
flynaj
2020-07-15 14:34:50 +08:00
go 出生比较晚,以前一些没解决的需求不解决,还有更好的性能。多核心支持的话,不会有人用的。
sunziren
2020-07-15 14:35:43 +08:00
同意楼上的,我也有这个疑问,建议你直接问发明 java 的那个人。
locy
2020-07-15 17:13:37 +08:00
java 文件是编译成字节码,字节码!=机器码,字节码是在虚拟机上执行的。
Tink
2020-07-15 17:33:59 +08:00
看一下 编译原理
tairan2006
2020-07-15 19:02:35 +08:00
时代不一样了,云时代 go 确实有部署优势
chihiro2014
2020-07-15 19:15:00 +08:00
Go 就算了。。。
systemcall
2020-07-16 01:33:33 +08:00
时代不一样,Java 出来的那个时代,CPU 指令集和 OS 都五花八门,迫切的需要一个不用重新编译就可以跨平台的系统。当时许多设备的内存是以 KB 来计算的,用 XiP 来运行。0 几年也是这样。以前 Java 用的多的地方基本上就是现在安卓用的多的地方
Java 编译成二进制是可以的,针对平台优化也是可以的,但违背了 Java 的初衷,不过现在也没多少人提了吧。安卓里面用户也不能够直接运行 j2me 应用了。现在的指令集和 OS 就那几个,真是方便

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/690116

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX