12 月 23 日,七牛云 CEO & ECUG 社区发起人许式伟先生在 ECUG Con 2018 现场为你们带来了主题为《再谈 Go 语言在前端的应用前景》的内容分享。前端
本文是对演讲内容的实录整理。git
今年是举办 ECUG Con 的第 11 年,以前我谈的基本都是服务端的开发实践。从去年起我开始不谈后端而是谈前端。固然,去年我没有说为何我会关注前端。今天再谈 Go 语言在前端的应用以前,我先简单聊一下思路脉络,为何我今天会关注前端。程序员
最先的 PC 时期,常见的设备主要是台式机、笔记本。这两类设备是 PC 时代主流设备,用的操做系统主流的是三个,分别是 Mac 、 Linux、Windows。前二者市场占有率很是少,基本是 Windows 一统天下。浏览器早期由于 Windows 的流行,主要是 IE,但在今天 Chrome 市场占有率很是高。另外还有 Safari、Firefox,你们也都耳熟能详。github
从苹果发布 iPhone 为标志,咱们开始进入移动时期。这个时期的设备主要是手机和平板,以手机为主。操做系统基本是安卓和 iOS,像 Windows Mobile 之类的占比很是少。浏览器不是 Chrome 这类桌面浏览器,而是从微信小程序开始,有了移动时代的浏览器。在国内小程序的种类很是多,包括支付宝小程序、头条小程序等等。我认为这才真正是移动浏览器战争的开始。golang
比较奇怪的是,为何移动浏览器之争没有在美国开始,而是在中国开始,这也是比较有意思的地方。小程序相关的技术,不管是谷歌仍是其余公司,也都在琢磨,固然也多是我孤陋寡闻,我没有看到国外出现移动浏览器的迹象。为何我说 Chrome 这些不是移动下的浏览器,是由于操做手感差异很是大。微信小程序是第一次试图让 BS 结构的应用和 Native 应用手感无差异,这是很是重要的尝试。编程
我也畅想了一下将来,移动时期设备还比较少,笔记本、手机、平板是最主流的设备。台式机今天不太见获得,但笔记本你们常常会用。ECUG 是在 2007 年,差很少苹果发布第一代苹果手机时开始的。在那时候,我作了一个判断,将来是一个强悍的服务端加上多元化的终端,其实就是前端。但今天在我看来,前端多元化尚未真正意义上的出现。小程序
在 ECUG 的第 11 年,能够看到这个多样化的趋势已经愈来愈趋向于现实,包括手机以后下一个前端战场,在我看来是汽车。汽车很是火爆。固然,会有更多设备,不少人都会认为下一个是所谓的物联网时代,咱们没必要谈这么抽象的名词,也能预测到将来前端的趋势会很是多元化。这个多元化和 PC 时期、移动时期都很是不同,由于屏幕的尺寸在前端交互里占很是关键的因素。除了汽车,今天手表也蛮多,但普及率可能还不如手机和平板。手表是一个很特别的东西,它在这么小的屏幕上,要把前端玩出花来,实际上是很是难的事情。将来操做系统到底会是怎么样的?今天仍是未知状态。后端
前端的演进跟设备演进很是有关联。因此前端的演进是大起大落的,这和服务端很是不同。服务端的发展很是稳健。操做系统偏 Unix 系为主,到今天仍然如此,不太剧烈变更。但前端因为终端变化,致使操做系统的演进很是剧烈。微信小程序
云计算的演进,我分三个阶段:第一阶段,以亚马逊的 EC2 为典型表明的,我叫作机器计算阶段。虚拟机(VM)为基础构建了整个体系结构。虚拟机和物理机没什么区别,如今你们摸不到虚拟机,但从操做一台虚拟机手感来讲和物理机区别不大。浏览器
今天看到不少不同的地方,由于容器兴起了,从 2014 年开始兴起到今天典型的标志是 Kubernetes 一统了容器操做系统的天下。以这样的基础,能看到云计算演进到了第二阶段。容器计算时期和机器计算时期的计算不太同样,容器会愈来愈关注运维的自动化以及相关基础支撑,它最终要达到的目标是让服务端基本趋向于免运维。之后你们作业务时,基本不用太在乎服务端的事情。
这也会带来另一个问题,再下一阶段云计算会走向哪里?在我看来是应用计算。由于云已经随着容器技术的发展愈来愈标准,云计算下一阶段应该会偏向于业务,和业务作愈来愈强的融合,再也不只是关注基础架构,而是关注应用自己的业务架构。应用业务架构里,端占很是大的成份。云计算和端并非割裂的。
在我看来,云计算会使得后端的技术栈愈来愈标准化。后端的大部分技术难题均可标准化解决。每个公司都有一个基础架构部,而云计算就是把技术架构部从公司里面搬到外面。这个标准化是天然发生的。正由于如此,业务的难点和挑战会愈来愈向前端转移。服务端没太大的挑战。服务端从支撑业务的角度看,挑战愈来愈少。但从服务端的体系,可能侧重点会愈来愈偏向于业务运营体系的标准化,就是 BI (商业智能)方面的东西。但这个事情的标准化比前端更难。
今天我为何会谈前端?当下咱们仍然在很努力地推动后端技术的标准化,但在我看来,在能够预期的几年内这个事情就会被解决,更远的将来必定会把精力花在前端。
不少人都知道七牛云跟 Go 语言很是有渊源,我本身大概在 2012 年也比较狂妄地作了一个预测,认为 Go 语言必定会进语言排行榜第一,我设的时间是 10 年左右。2012 年到如今差很少进入第 7 个年头。Go 是很专一的语言,用 Go 的人基本都集中在后端的开发,并且是偏向于后端 API 层面的开发,Web 占比相对少不少。Go 的专一使得它今天基本占领整个云计算领域。不少云计算公司技术栈,Go 在里面的占比会愈来愈高。这样的专一也让 Go 语言在今年里程碑式地进入前十的排名。
专一后端开发是没办法让 Go 排到第一的。缘由很简单,后端开发尤为是云计算致使后端技术愈来愈标准化后,会使得 Go 语言愈来愈没有用武之地,由于不少问题的复杂性被云计算公司解决掉了。大部分公司都是作本身的业务就行了,没有必要关心高并发、高可用这种服务端的复杂性。服务端的挑战,随着云计算的影响会变弱。这样 Go 语言今天所处的位置,若是是一个公司,应该有危机感,还要突破下一个战场。在我看来它必定会进入前端,也会让 Go 语言更偏向于通用语言,领域会愈来愈泛。这样的一个变化才可以让 Go 成为真正意义上语言排行榜的第一。
前端需求量最大
前端是开发人员最多,需求量最多的工种,对语言的要求必定是入门门槛比较低,心智负担最小。而这个很是适合 Go。我 2011 年推 Go 时,大部分人不太了解 Go,但今天 Go 语言的受众已经很是广,你们有很大共识的一点是,Go 语言的入门门槛很是低,心智负担比较少。基本程序写出来编译经过,大几率没有问题。这样的特性使得它很是适合前端。
前端须要工程化更强的语言
前端业务量很是大,因此前端代码量比后端多不少。前端是负责和用户打交道的,和人打交道的东西是最复杂也最容易发生变化的。今天可能这个知识更好,明天可能换了一种新的知识,尤为是我前面提到了端的变化。从 PC、笔记本到手机,屏幕尺寸不同,以及过去以键盘为交互主体变成了触摸屏,再到将来手表或者汽车。为何不少公司都关注语音交互,就由于像汽车、手表这样的设备,语音交互是一个比较好的手段。但这些都有很大的不肯定性。前端的变化是很剧烈的,而交互的手感以及为了让用户舒服、爽,程序员要付出的努力也会是很是大的。前端的代码量必定是最多的。
前端很是须要有强工程化能力的语言。今天咱们看到前端最大的代码量确定是 JavaScript,但 JavaScript 几乎是没有工程化支持的。它之因此叫 Script,是由于小,相似于微信小程序。你们仔细想一想,小程序必定不小。在这样一个不小的东西上,或者代码量更多的应用里,须要工程语言更强。JavaScript 为何流行,是由于它的「垄断地位」。有个趋势已经发生了,但今天还不是特别强烈,就是会有愈来愈多语言进军前端,Go 只会是其中之一。这是由需求决定的,我也认为 Go 是最有但愿的那几个之一。
前面谈为何我会在 ECUG Con 谈前端,今天我讲的东西,也许对你们影响不会太大,由于 Go 作前端毕竟还很是初级,但 ECUG Con 我但愿它是一个前瞻趋势探索的会议,我并不倾向于它必定是很是实用的,它不须要今天跟你们聊了,明天就把它用到工程上,我对它并非这样的定义。我但愿 ECUG 自己是一种对将来有预见的社区。
回顾 Go 在前端的进展,GopherJS 是第一个真正产生了影响力的进展。在 GopherJS 以前有很是多人作前端相关的事情。谷歌也有人推出了一个框架叫作 GXUI,GXUI 今天已经不怎么维护了。
不少人会试图作跨平台的框架,但实际上跨平台的框架最有但愿的必定是浏览器。由于浏览器就是跨平台框架。在我看来,像 QT 包括谷歌作的 GXUI,都相对比较局限。但 GopherJS,我认为它是在前端第一个真正能立得住脚的尝试。他就是干我刚才说的事情,让 Go 语言的程序员能写前端。怎么写?它作了一个编译器,这个编译器把 Go 代码翻译成 JavaScript 代码,天然而然 Go 就能写前端了。它是把 JavaScript 做为前端的一个机器语言,由于 JavaScript 的位置是绕不过去的。
但也不见得真的绕不过去。前端的机器语言在今天的标准确定是 JavaScript,但咱们也看到了另一个东西,叫 WebAssembly,顾名思义它将本身看作是 Web 的汇编语言。但其实这个 WebAssembly 是二进制的,我以为说它是 Web 的汇编语言,不如说它是 Web 的机器语言。WebAssembly 的覆盖面比你们想象得要广,今天全部主流的浏览器都已经支持了。JavaScript 的「垄断位置」已经有一些变化了,它并不会一直这样垄断下去。你们可能也听过 Go 已经支持 WebAssembly,并且是语言内建支持,这对 Go 来讲也是很是重要的。
Go 在前端的进展,第二个大里程碑事件是 Go 内建支持了 WebAssembly(https://github.com/golang/go/wiki/WebAssembly)。从 Go 的 1.11 版本开始。这是 Go 官方对 WebAssembly Go 支持的介绍,编译过程是把 GOOS 环境变量定义成 js,架构选 wasm,这样就能够编译出 wasm 文件,而不是本地的可执行程序。这里有一些 DEMO,是一些社区的人用 Go 写的 WebAssembly 样例。
DEMO 样例展现:
https://stdiopt.github.io/gowasm-experiments/
https://justinclift.github.io/wasmGraph1/
https://stdiopt.github.io/gowasm-experiments/splashy/
这展现的效果就是后面的源代码实现的。看起来好像也没有什么,但这个支持是很是关键的。Go 开始在语言内建就支持 Web 前端的开发。尽管今天它仍是一个经验版的状态,但也是很是重要的里程碑。作这件事情的人和前面干 GopherJS 是同一波人。有那么一堆人他们在努力把 Go 推向前端。
前面两个若是你们关注 Go 语言应该比较多人知道,但接下来这件事情应该大部分人都不知道。有一个新东西叫作 TinyGo,它是在嵌入式设备上跑 Go,它是一个剪裁版的 Go(https://github.com/aykevl/tinygo )。由于 Go 主要是针对服务端开发,因此你们对 Go 编译出的可执行文件有多大一点都不在乎,但若是留意过就知道它很是大。TinyGo 试图让编译出的文件足够小,由于在嵌入式设备上磁盘空间很是珍贵,内存也很珍贵。它竟然也支持 WebAssembly,可以作 Web 开发,虽然裁掉了不少 Go 的特性。不知道它后面的演化怎么样,由于这个项目还很是新,不到一年。对于新出现的东西,咱们只能关注,也没有办法真的用到什么工程上。
Go 2D 游戏开发引擎(https://github.com/hajimehoshi/ebiten ),实际上 3D 已经出现了,今天没有列出来。这个游戏引擎是日本人作的,并且已经拿它作了多款的手游开发。它是一个已经商业化的引擎。支持的平台很是广,用这个游戏引擎作出的游戏可以支持 PC 操做系统如 Windows、Mac、Linux、FreeBSD,也支持手机操做系统 Android、iOS,还支持 Web 开发如 GopherJS、WebAssembly。它是一个生产级的引擎。我去年演示的 DEMO,用 Go 写了一个少儿编程语言 Scratch 的解析器,这个解析器就是用这个 2D 游戏开发引擎作的。
下一个有趣的东西是 Go 的前端代码托管(https://github.com/dave/jsgo )。JavaScript 有不少公开的前端代码托管,但这里出现了 Go 前端代码托管。直接往这里一扔就直接上云了。这看起来很小众,但有人干这些事情。
这也有一些 DEMO:
这是一个拼数字的游戏。
https://jsgo.io/hajimehoshi/ebiten/examples/2048
这是俄罗斯方块。
https://jsgo.io/hajimehoshi/ebiten/examples/blocks
这是一个游戏,你们以前见过的版本是小鸟,不是土拨鼠。
https://jsgo.io/hajimehoshi/ebiten/examples/flappy
这是一个 To do list 类的 Web 应用。加它只是为了展现 Go 也能作一个标准的前端开发。
Jsgo.io 既支持 GopherJS 也支持 WebAssembly。咱们刚才看到的游戏,不是一个 js 文件,是不少个。源代码里,Go 会 import 一些 Go 标准库,好比字符串转换库 strconv。字符串转换 Go 标准库会直接被编译成一个单独的 js 文件。这个作法的好处是第一遍慢一点,但后面的加载会很是快(由于基本不用改)。大的前端应用这样被拆解以后,从长远来讲加载速度会比较快。它支持分模块加载,并且咱们不用为分模块加载付出什么努力,Go 的引用最后会变成一个模块引用,对应到 js 也是一个模块。这样编程会很是爽。前端 JavaScript 语言里,这种模块化编程并非语言内建支持的。
Jsgo.io 对 WebAssembly 的支持目前还不体完善,跟刚才的 GopherJS 不同,它目前不能作到分 package 引用,编译出来的是一个大的 wasm 文件。但这只是临时状态,由于这块的支持才刚开始作。
前面我也说过,Go 的通用卡平台 gui 库不少人在尝试,但无一不是失败了结。这并非因为 Go 引发的,是由于像 QT 这类的跨平台方案自己并非符合趋势的东西。最有但愿的跨平台方案仍是浏览器技术,基于 HTML5 和小程序,它们是真正的生产级的跨平台方案。尤为是小程序的出现,今天看到不少跨平台库,好比 React 作出的应用仍是有生硬的地方,但微信小程序是第一个试图让 Web 跟 Native 体验一致的。
Go 跨平台的游戏引擎,已经基本接近生产级,它是很是重要的突破口。
在我看来,Go 第一个在前端的突破,必定是从游戏领域开始。它对 Go 的意义是 0 到 1 的历史性突破。若是没有商业公司用它,这个东西就是一个玩具。但 Go 的游戏引擎不会是玩具,由于会有愈来愈多商业公司用它。未必是这个游戏引擎,也许会有人作出更牛的,但这是个靠谱的方向。对于 Go 来讲,就跟 Docker、Kubernetes 的流行表明 Go 占领了云同样。Go 在前端也须要一个杀手锏,它就是游戏引擎。