许式伟 :Go+ 已具备第一的潜力

以下文章来源于许式伟,作者许式伟

我的公众号已经停更两年了。因为各种原因,过去两年一直不想说话。去年我唯一接受过的一次采访是雷锋网关于云计算和人工智能的一个专题,主要还是出于朋友面子,以及觉得他们做的事情很有意义。

但是 2024 年收官之际,我还是决定说点什么。2024 年对我而言还是很关键的一年。公司上市了。说不上激动,但的确是一个新的起点。

过去几年我经常思考有关于竞争壁垒的问题。七牛一直都是创新导向的公司。七牛存在的意义是解决社会问题,而不是和谁打,干掉谁。所以在七牛早期我关于竞争考虑得非常少。但这几年仗打多了,我越来越清楚,只有小创新是不行的。小创新打不过来自巨头的模仿。

我个人并不反对模仿。模仿是非常重要的生存技巧。中国公司能卷,生命力顽强,不就是因为擅长模仿么?但是要拿到第一,显然模仿是做不到的,小创新也不行,要有大变革。

怎么才能让别人抄不动?其一是跑得足够快。其二是打明牌,让人想抄都无从抄起。

Go+ 语言是我在 2020 年打的一张明牌。我一直相信,七牛总有一天会因为 Go+ 而不同。李想在一次采访中说:特斯拉的实力最接近苹果,有自己的芯片和操作系统,远非任何传统汽车厂商可比。我非常认同,很多时候竞争壁垒可能来自常人(商人)忽略的地方。想要别人没法很容易抄你,你得走几步别人看不明白,甚至看明白了也学不会的棋。2024 年 Go+ 获得了重大进展,使其具备了未来成为语言榜第一的潜力。所以 2024 年收官,也是今年唯一的一篇公众号文章,我们来聊一聊 Go+ 语言。

语言发展史与趋势

在聊 Go+ 前,我们先回顾一下语言的发展史。注意我说的不是编程语言的发展史,是语言的发展史。

  • 自然语言(沟通):甲骨文诞生于商朝(公元前 1300 年),它可以看作是汉语的起源。自然语言的核心价值是沟通。文字的诞生扩大了沟通的边界,让文明实现了传承能力。
  • 数学语言(科学理论):现代意义上的数学诞生于古希腊时期(公元前 500 年),典型代表是毕达哥拉斯定理和欧几里得的《几何原本》。数学的诞生可以看作是现代科学的起源。数学语言让人类第一次实现了精确表达(自然语言是有歧义的),物理和化学等科学理论都是通过数学公式来表述。
  • 编程语言(工程技术):1951 年,汇编语言诞生。1972 年,C 语言诞生。编程语言精确表达了工序,它的诞生可以看作是现代工程技术(软件自动化)的起源。

自然语言有很强的区域性特征,不同国家和地区各有各的方言。但是数学和编程语言是国际化的,它们代表的是现代科学和现代工程技术(数学是科,编程语言是技)。

人类文明记录的无非是人文、科学和工程技术这三类知识。拍电影、画画过去人们会觉得它是人文,但是 AI 时代的来临人们发现他们都变成了软件工程。在可预见的未来,所有的工程都会用软件工程重新做一遍。

在人类文明中,工程技术类的知识密度最高。随着时间的推移,90% 以上的人类知识都将会是工程技术。从这个意义上说,编程语言虽然诞生比自然语言晚几千年,但编程语言是更高阶的文明密码,它将承载 90% 以上的知识。

编程语言从诞生到今天,不过短短 70 多年时间,它仍然非常稚嫩,但可谓百家争鸣。我把语言榜前 20 的语言先按用途分为通用语言和领域专用语言(DSL),再把通用语言分为静态类型和脚本,然后备注诞生年份,最后整理如下:

  • 通用静态类型:Fortran (1957)、C (1972)、C++ (1979)、Objective C (1986)、Java (1995)、Delphi (1995)、C# (2000)、Go (2009)、Rust (2010)、TypeScript (2012)、Swift (2014)
  • 通用脚本语言:Visual Basic (1991)、Python (1991)、PHP (1994)、JavaScript (1995)、Ruby (1995)
  • 领域专用语言:ASM (1951)、COBOL (1959)、SQL (1974)、Matlab (1984)、R (1993)、Scratch (2007)

历史见趋势。研究语言发展史是很有意思的一件事情。只有站在更大的尺度去看,我们才有可能更加准确预判它的未来。

比如,随着 AI 编程的兴起,业内很多人都惊呼,程序员要失业了。认为未来不需要程序员,人们可以用自然语言编程,这可能是 AI 时代最似是而非、且被广泛接受的认知谬误。

这样的认知谬误其实深度思考的人一般是不会犯的。比如我前老板雷军,他在自然语言编程说兴起的当下,在一次采访中说现在程序语言不一样了,他在重新学习编程。雷总是一个很严谨的人,但又有程序员式的浪漫,我印象最深的是 2021 年 6 月某天他突然发给我一个 13 年前的 Bug(见图)。所以当他说要重新学编程我是很相信的,这说明他认为这事很重要,而不是像某些 CEO 那样只是说说而已。

自然语言辅助编程,和自然语言编程是完全不同的概念。自然语言辅助编程,这里自然语言是交互工具。而自然语言编程,意味着要用自然语言实现工程自动化。但是自然语言是不精确的,它和工程自动化是相背离的。

如果我们相信硅基生命和星际文明是未来,那么我宁可相信自然语言会消失,机器人有属于自己的浪漫,它并不需要起源于碳基生命的自然语言(自然语言对硅基来说并不 “自然”)。

认为程序员会消失就是胡扯。更清晰的未来是每个人都需要掌握编程语言。十年后,不懂编程就是文盲。AI 时代编程将去神秘化。一周掌握一门编程语言是可能的(哪怕是零编程基础),但是一周学一门外语(自然语言)绝无可能。

扯得远了。研究编程语言的流行趋势,会发现几件有意思的事情:

  • 通用静态类型大约每隔 7 年就会有重大迭代。Top20 中最新的语言是 2014 年出现的 Swift,它也是通用静态类型语言。
  • 通用脚本语言的黄金时间非常短,只有 5 年(1991 – 1995),此后再无流行的脚本语言。
  • 领域专用语言(DSL)概念曾经比较火,但是活下来的不多,只有数据科学(COBOL、SQL、Matlab、R)和 STEM 教育(Scratch)两类。
  • 数据科学是最为古老且持续火爆的领域,延续到了今天的 AI 热潮。COBOL、Fortran(从语言特性来说我把它归为了通用,但从应用领域来说它也是为数据科学而生)、SQL、Matlab 这些都诞生得非常早。
  • 领域专用打不过通用。数据科学作为最古老的领域,最后赢的是却是 Python,它并不是为数据科学而生,甚至创始人自己也料不到它会因 AI 而变得异常火爆,长期霸榜。STEM 教育领域 Scratch 拿着望远镜都看不到对手,这是一个长期被忽视的战场。

结合这些发现,我认为未来编程语言的发展趋势是越来越简单,并趋于大一统

什么是大一统?站在更长的时间维度,领域专用语言和脚本语言都会消失,未来属于通用的静态类型语言。领域专用语言(DSL)的消失比较显而易见,数据科学类的语言都已经被 Python 干趴了,而 STEM 教育领域 Scratch 的对手也已经出现,那就是今天我们这篇文章的主角 Go+ 语言。Go+ 并不是为 STEM 教育而生,但它打 Scratch 属于降维打击,赢是确定性事件。在 Python 如日中天的今天,我说脚本语言会消失可能很多人都会反对,但是从脚本语言的黄金时间只有 5 年来看,脚本并不是流行趋势。

什么是简单?其一是表达更加接近自然语言。其二是语法特性少。在所有流行语言中,Go 是非常独特的存在。主打服务端编程这个非常小众的领域就把自己干到了语言榜前 7 名的位置,这真的不是一般的牛逼,是非常牛逼。而它凭借的并不是提供更多的语法,而是更少。“少就是指数级的多” 更是成为 Go 团队的座右铭。在这一点上,Go+ 语言在 2024 年正式提出了 Go+ Mini Spec,它是一个比 Go Spec 还小得多的语法集。它将成为 Go+ 的推荐语法集,精简但图灵完备,进一步将少就是指数级的多这一哲学进行到底。

Go+ 语言设计与现状

正如雷军说的那样,编程语言真的不一样了。

基于语言会越来越简单,并趋于大一统的判断,我在 2020 年创建了 Go+ 语言。并且在 Go+ 诞生之初我就说,未来 Go+ 一定会是语言榜第一的语言。

我判断 Go+ 会成为语言榜第一,不是基于技术领先性,而是基于市场。对此我经常做的一个类比是 DOS vs. Unix 之战。DOS 不见得技术比 Unix 牛,但是 DOS 选了 PC(个人电脑),而 Unix 选了企业级,个人消费市场远大于企业级市场,所以 DOS 赢了。

Go+ 为什么会赢?我把编程语言的市场分成了 3 块:

  • 工程(engineering):这是现在主流语言的战场,也是精英程序员的主战场。
  • 数据科学(data science):这是 AI 时代最火的战场,当前 Python 称霸。
  • 素质教育(STEM education):这是受众最多的但长期被忽视的战场,当前 Scratch 拿着望远镜看不到对手。

Go+ 想吃哪块蛋糕?全部。

在 2021 年 Go+ 1.0 发布会上,我把 Go+ 诞生比做编程领域的 iPhone 时刻。在 iPhone 一代发布的那场经典演讲中,乔布斯把 iPhone 比做 iPod、Internet、Phone 三合一的一个产品。而 Go+ 同样是 Go、Python、Scratch 的三合一,它们分别代表了工程、数据科学和 STEM 教育。

三合一的目标是好的,但是具体每一个战场 Go+ 要怎么打?会不会因为目标太大而搞得四不像?我们一一分析。

先看工程(engineering)。在这个领域 Go+ 的假想敌是 Go(只是基于市场份额对比意义上的 “敌人”,实际上 Go+ 并不是要打败 Go,而是希望扩大 Go 的适应领域),这个对手非常强大。从 Go 的产品设计来说,我一直认为它在工程领域是巅峰之作,很多年前我甚至和人打赌 Go 会到语言榜第一。但是我后来很快意识到,产品和技术牛,抵消不了战略决策上的问题,市场选择能够决定成败。Go 语言专注于服务端让它浪费了很多市场机会。

Go+ 怎么打败 Go?

第一个关键策略是兼容,对手做得好的要学习。Go+ 前 3 年主要精力花在把兼容 Go 这件事做极致,尽可能做到接近十分的水平。我们不只是兼容 Go 的语法和模块管理,还兼容 Go 的工程生态,包括 VSCode 插件、Debugger、Profile、语言服务器(LSP)以及文档站。

第二个关键策略是兼容 C 和 Python 生态。在 2024 年,Go+ 发布了 v1.3 预览版。它可以 import C 和 Python 的库。这是一件非常了不起的事情,是 Go+ 在 2024 年中最重大的技术突破,它让 Go+ 一下子拥有了无限的可能性。在之前 Go+ 的 RoadMap 中,兼容 Python 库将在 v1.7 版本完成,被认为是一项难而艰巨的任务,而这被我们在 v1.3 版本中就完美实现了。

Go+ 是如何做到 C 和 Python 生态兼容的?我们基于 LLVM 实现了自己的 Go 编译器 LLGo。这个项目很新,2024 年 4 月 15 日启动,5 月 13 日发布 v0.8 版本就实现了 C 和 Python 库的支持,前后只用了不到一个月的时间。

为什么可以做得这么快?这得益于正确的技术路线。LLGo 选择了基于 ABI 二进制兼容 C 和 Python,源码级兼容 Go。Go 虽然有提供 cgo 来兼容 C 生态,LLGo 也兼容 cgo(只是出于尽可能让绝大部分 Go 工程都不需要修改的考虑),但是 cgo 的体验是糟糕的,它没有成为 Go 的亮点,反而成为槽点。而 LLGo 二进制兼容 C 和 Python 的方式意味着我们放弃了古怪的 cgo 语法,用最纯正的 Go 语法来引用 C 和 Python 库,就好像它们天生就是 Go 世界的一部分一样。

第三个关键策略是 classfile 语法特性的引入。classfile 是 Go+ 在工程领域的最大创新。它有两大关键价值。

一是它简化了面向对象编程(OOP)。Go+ 通过变量 + 函数这两个非常基础的概念实现了用户自定义类型(UDT)。很简洁,也很酷。

二是它解决了领域友好(SDF,Specific Domain Friendliness)的问题。

领域专用语言(DSL)是曾经很火的概念。但通过前面编程语言发展史的分析我们知道,DSL 是错误的方向。那么,领域友好(SDF)这件事情正确的方向是什么?

答案是:抽象领域知识。从领域友好的角度,classfile 是一个抽象领域知识的工具。它让 Go+ 几乎在所有领域都看起来好像天生就是为该领域而生一样。

这是一个非常非常酷的能力。

classfile 这个语法特性,从 Go+ 设计之初就存在了(第一个支持 classfile 的版本是 Go+ v1.0.0-beta5),甚至是 Go+ 语言出现的理由。而 Go+ 的第一个 classfile 名为 spx,它的内核诞生于 2017 年底,远早于 Go+。

但是 classfile 这个特性 beta 测试了 4 年之久,直到 2024 年 2 月 Go+ v1.2 发布时才定稿。这是非常重大的一件事情,重要性并不亚于 Go+ 支持 import C 和 Python 的库。

有了兼容 Go 的能力,有了 C 和 Python 生态的加持,有了 classfile 带来的领域友好(SDF)能力,我认为 Go+ 打败 Go 只是时间问题。

再看数据科学(data science)。在这个领域 Go+ 的假想敌是 Python。

Go+ 怎么打败 Python?我的答案是:交给时间。数据科学是 Go+ 最后一个想打的山头,不是短期目标。

所以我这里我只是说说 Go+ 赢的逻辑。

数据科学的受众有两类,运营人员和工程师。运营人员通常并没有那么强的编程背景,他们最熟悉的工具是 Excel 和 SQL。而工程师为什么会涉及数据科学?这和 AI 与大数据的兴起是分不开的。在此之前,数据分析主要用于商业决策,并不是企业的产品能力的一部分。但是随着用户的个性化理解,以及 AI 带来的数据工程(数据自动化)的兴起,数据科学就成为了软件工程的关键组成,甚至成为比前后端开发还要重要的工程领域。

既然数据科学是工程的重要组成,算法工程师和传统的软件工程师就需要对话。由于脚本语言的限制,Python 并不擅长大型软件工程。这意味着你很难因为算法用了 Python,去要求前后端开发也用 Python。

但 Go+ 可以。凭借 Python 库的兼容,凭借比 Python 还要精简的语法,凭借强大的工程能力,一个初创团队有机会用 Go+ 一门语言同时搞定算法和前后端开发。同样的故事,大家都知道,JavaScript 已经通过 node 讲过一遍,它的的确确是创业公司的痛点。

最后看素质教育(STEM education)。在这个领域 Go+ 的假想敌是 Scratch。

Go+ 怎么打败 Scratch?

最关键策略是引入 Go+ Mini Spec。Scratch 语言因为专注 STEM 教育,所以它的语言 Spec 非常小,仅包含以下概念:

  • const、var、operator/func/block、event
  • control: if/else, forever, repeat, until
  • type: list

Go+ Mini Spec 概念的数量和 Scratch Spec 很接近,但能力却远远超过。例如在 Scratch 中用户不能自定义函数,只能自定义命令(有的语言中叫过程,在 Scratch 中叫 block)。Go+ 中只做语法集的筛选,所有涉及的概念与工程师们的理解保持一致,避免需要二次学习。

另外,Scratch 中只有内建的 event,而无法用户自定义。而 Go+ 中 event 只是普通函数,特别之处仅仅是它有一个参数是闭包。

需要重点说明的是,Go+ Mini Spec 因为它小巧,所以非常适合 STEM 教育。但 Go+ Mini Spec 并不专为 STEM 教育设计。哪怕工程师在做一项大型工程的时候,我们也非常鼓励他们尽可能只使用 Go+ Mini Spec 来工作,只有在极少的情况下才去用 Go+ Full Spec 中的高级功能。

打败 Scratch 并不需要特别复杂的逻辑。Scratch 几乎垄断了 STEM 教育,但它的弊端也非常明显。

首先,Scratch 用户几乎是必然流失的。小孩在小学到初中阶段用 Scratch,但是到了高中阶段基本都开始转向学习新的语言,比如 Python。

其次,哪怕只是在 STEM 教育,Scratch 的能力也是不完整的。例如它并没有团队协作和工程相关的概念。而到了高中和大学阶段的 STEM 教育,模块、版本管理、团队协作都是 STEM 教育中非常重要的内容。

最后,Scratch 并没有跟上 AI 时代带来的变化。例如,我带几个学生学 Scratch 有近 10 年之久,但是从来没有一个学生自主完成过游戏素材的创作,基本都是网上扒下来改造为主。但现在 AI 的发展正让孩子们自主完成素材创作变得可能。

综上,Go+ 并没有引入非常多的特性来实现工程、数据科学和 STEM 教育的三合一。Go+ 三合一并不是引入更多的功能,而是恰恰相反,我们定义了 Go+ Mini Spec 作为最佳实践语法集,实现了工程、数据科学和 STEM 教育的统一。

2024 年 Go+ 的关键进展从长远来看都至关重要。它们分别是:

  • 引入 Go+ Mini Spec
  • Go+ classfile 语法转正
  • 支持 import C 和 Python 库

这些特性正在让 Go+ 变得独一无二,并具备了未来成为语言榜第一的潜力。

最后的最后,今天除夕夜,在这里给大家拜年啦。祝大家新年好,2025 新年新气象。