Go 摆脱了 C,又惹上了 Java?

开发 后端 开发工具
4月份进行的 NYJavaSIG 聚会上 Go 团队的技术主管经理分享了《Go for Java Programmers》,为 Java 程序员提供的 Go 入门指南,正式向 Java 领域进军了吗?

talks.golang.org 前几天放出了 PPT《Go in Go》和 《The State of Go》讲解最近 Go 的开发动态和成果:

随着 Go 1.5 版本的开发,现在整个系统都是使用 Go 编写的(有一小部分汇编)

C 已经成为过去时了。

Go 1.5 计划在 8 月份发布,将会尝试支持 iOS。(Go 1.4 已经正式支持 Android
 

4月份进行的 NYJavaSIG 聚会上 Go 团队的技术主管经理分享了《Go for Java Programmers》,为 Java 程序员提供的 Go 入门指南,正式向 Java 领域进军了吗?

OSC 上两年前就有 Go 要涉猎 Java 领域的文章和讨论了:

不知道现在大家的看法是否有些改变。

[[137898]]

《Go in Go》

随着 Go 1.5 版本的开发,现在整个系统都是使用 Go 编写的(有一小部分汇编)

C 已经成为过去时了。

注: gccgo 仍然很强大
这篇文章主要探讨原始编译器 gcc

为什么之前用 C 编写?

启动

(而且 Go 的主要目的不是作为一个编译器实现语言)

为什么编译器使用 Go 重写?

不单单是验证,我们还有更多实际的原因:

  • Go 比 C 容易编写(实际上)

  • Go 比 C 容易调试(即使没有调试器的情况下)

  • Go 将成为你唯一需要会的语言,鼓励贡献

  • Go 有更好的模块化,工具链,测试工具,配置工具等等

  • Go 很简单就能进行并行操作

虽然看起来很多优势,但是还是夸的太早了:)

设计文档: golang.org/s/go13compiler  

为什么运行时也是用 Go 重写?

我们有自己的 C 编译器来编译运行时,我们需要一个带有跟 Go ABI 一样编译器,比如 segmented stacks。

使用 Go 编写可以摆脱 C 编译器的劣势,这是比使用 Go 重写编译器还重要。

(所有使用 Go 重写编译器的理由都可以作为使用 Go 重写运行时的理由)

限制运行时只用一种语言编写,更容易进行集成,管理 stack 等等操作。

跟往常一样,简化是首要的考虑因素。

历史

为什么我们要有完全属于自己的工具链?

  • 我们的 ABI?

  • 我们自身的文件格式?

Go 的大规模重大改进要比 GCC 或者 LLVM 要更困难。

news.ycombinator.com/item?id=8817990

重大改进

由于使用自身工具简化的功能和使用 Go 重写后的一些改进:

  • linker 重构

  • 新垃圾收集器

  • 堆叠图

  • 连续栈

  • 写屏障

***三个都不可能用 C 实现:

  • C 是非类型安全的

  • 因为***化而造成堆栈槽混淆

(Gccgo 很快会有 segmented stacks 和 imprecise (stack) collection )

更多技术细节改进请看 PPT 原文。

启动

不需要 C 编译器,只需要一个 Go 编译器

因此需要从 1.5 的源代码去下载安装构建 Go

我们使用 Go 1.4+ 作为基础库来构建 1.5+ 的工具链

详情: golang.org/s/go15bootstrap  

未来

未来仍然有很多任务要完成,但是 1.5 已经完成的差不多了。

未来的计划:

  • 更好的转义分析

  • 新编译器后端使用 SSA(使用 Go 会比 C 简单很多)

更多优化:

  • 从 PDFs (或者是 XML)生成机器描述,将会有一个纯机器生成指令定义,“从 PDF 读入,写出一个汇编配置”;

  • 已经部署反汇编程序

总结

摆脱 C 是 Go 项目的一个巨大改进,代码更整洁,提升可测试性,可部署性,也更容易运行。

新的统一工具链减少了代码数量,提升可维护性。

灵活的工具链对可移植性也很重要。

《The State of Go》

这篇 PPT 主要讲解了 Go 1.5 的开发成果,用数据说话,各种图表显示 Go 1.5 跟 Go 1.4 简直不是一个级别的,大量的优化和极高的性能提升。

Go 1.5 主要特性:

1. 并发垃圾收集机制,目标是:GC 延迟小于 10 毫秒。

新的垃圾收集机制是花费一些内存和 CPU 时间来换取更低的延迟时间:

2. 更高的并发性能,设置 GOMAXPROCS=N (where N is your number of CPUs):

更好的 goroutines 执行性能:

更好的 goroutines 转换性能:

3. 整体性能

《Go for Java programmers》

这是 Google 的 Go 团队技术主管经理 Sameer Ajmani 分享的 PPT,为 Java 程序员快速入门 Go 而准备的。

Go 和 Java 有很多共同之处

  • C 系列 (强类型,括号)

  • 静态类型

  • 垃圾收集

  • 内存安全 (nil 引用,运行时边界检查)

  • 变量总是初始化 (zero/nil/false)

  • 方法

  • 接口

  • 类型断言 (实例)

  • 反射

Go 与 Java 的不同之处

  • 代码程序直接编译成机器码,没有 VM

  • 静态链接二进制

  • 内存布局控制

  • 函数值和词法闭包

  • 内置字符串 (UTF-8)

  • 内置泛型映射和数组/片段

  • 内置并发

Go 特意去掉了大量的特性

  • 没有类

  • 没有构造器

  • 没有继承

  • 没有 final

  • 没有异常

  • 没有注解

  • 没有自定义泛型

为什么 Go 要省去那些特性?

代码清晰明了是首要的

当查看代码时,可以很清晰的知道程序将会做什么

当编写代码的时候,也可以很清晰的让程序做你想做的

有时候这意味着编写出一个循环而不是调用一个模糊的函数。

(不要变的太枯燥)

详细的设计背景请看:

更多详细内容和代码示例请看 OSC 翻译频道:http://www.oschina.net/translate/go-for-java-programmers-ppt

原文和所有图片都来自 talks.golang.org。

责任编辑:王雪燕 来源: 开源中国社区
相关推荐

2015-08-21 10:38:16

编程语言GoC语言

2009-11-02 09:49:12

2019-03-14 11:00:40

GoLua语言

2022-01-25 10:40:30

Windows 10微软升级

2022-03-18 16:14:44

戴尔

2021-01-17 23:09:29

Windows 10Windows微软

2013-12-06 11:14:52

宽带标准100M

2015-01-04 14:14:40

2023-03-06 07:50:19

内存回收Go

2022-06-17 07:44:40

VSCode C#开源

2024-03-18 08:06:59

JavaGo开发

2023-04-28 08:35:22

Vue 3Vue 2

2014-07-18 14:10:07

WIFI华为

2010-04-01 09:17:02

C++程序员

2022-07-26 01:11:09

AMD芯片Intel

2022-12-14 08:42:46

IDEAIDEA插件

2009-11-11 10:43:49

Go语言Google

2023-04-26 08:43:28

GoCGO语言

2014-08-11 10:27:10

光纤

2023-12-14 13:28:00

Spring流程Web
点赞
收藏

51CTO技术栈公众号