查看原文
其他

《赵海平与张宏波谈编程语言》访谈实录

sinoon ByteDance Web Infra 2021-12-11

前言:本文整理自 Web Infra 第一期大咖面对面:Web Infra 大咖面对面 : 赵海平与张宏波聊聊编程语言

两位老师在对谈中严谨不失轻松幽默,读者可以从中看到工业界与学术界两种不同的视角下的碰撞,抽象与具体的观察,两位老师会谈到对 TypeScript、Rust、Go、PHP、WebAssembly、编译器、haskell、低代码、元宇宙的各自看法。

希望对读者可以有些许启发,也欢迎大家关注我们第二期的 Web Infra 大咖面对面,将会邀请 Three.js 作者来到我们的直播间,2021 年 12 月 21 日晚上 8 点,将在近期发布问题收集和直播地址,敬请关注。

正文

李燕伦:今天我们非常有幸能够请到赵海平老师和张宏波老师同框,海平老师和宏波老师都分别给大家打个招呼吧。

张宏波、赵海平:哈喽,大家好

结缘 Facebook ?

李燕伦:两位老师的经历都非常的有趣,能分别简单的介绍一下吗?

赵海平:我是在北大毕业的,后来去美国,最开始读的生物,后来特别喜欢计算机,然后就转到计算机。然后就去硅谷工作,2007 年到 2015 年是在 Facebook ,后来觉得国内特别有意思。2015 到 2019 在阿里巴巴,然后又来到了字节跳动。去年 3 月加入的字节,一直到现在差不多有一年半的这个样子。

张宏波:我本科是隔壁的,是清华电子工程系的。然后我大四去 MSRA(微软亚洲研究院)实习的时候,在那里接触到函数式编程语言,当时觉得编程语言的理论很优美,后来我就去宾夕法尼亚大学读编程语言的博士,但后来因为某些原因就直接去工作了。我一开始是在 Bloomberg 纽约工作,然后我在闲暇的时候就做了 ReScript 的一个原型 (BuckleScript)。后来大概待了三年,这个原型当时在 Bloomberg 是最成功的一个开源项目。

后来我回国的时候,然后 Facebook 联系到我,当时他们告诉我,他们已经在 messenger 用到了 ReScript 这个语言,后来就破例让我可以在家一直远程办公,从 17 年到现在也有 4 年半了。

李燕伦:好的,一会儿也会问到两位老师回国的体验。在这次活动开始之前,我们提前收集了一些同学的问题,其实大家都在感叹两位老师在一起出现,简直是梦幻联动,因为你们两个之前都在 Facebook 工作过,所以很多人对你们两个在 Facebook 的工作经历比较感兴趣,你们两位能分别展开聊一聊吗?比如你们是在 Facebook 认识的?还是说在国内认识的?

赵海平:宏波是 2017 年?

张宏波:对对对,17 年在的(Facebook),但是我很早就听过海平的大名。

赵海平:哈哈哈,我是 2015 年 3 月份离开的,所以我们应该没有 overlap 。要不然你先说一说 Facebook 的感想,因为我觉得我的那个时间好早,已经(过去很久了)...

张宏波:但其实我在 Facebook 是一个非标准的,不像大部分人在 Facebook 的工作情况,因为我一开始加进入 Facebook 就已经在国内了,只有刚入职的时候在 FacebookMenlo Park 待了三周,然后就一直在国内。我其实在 Facebook 主要做的事情就是做 ReScript 编译器的开发工作,因为有用在 facebookmessenger 。因为是在国内,工作是很轻松的,只需要负责编程语言这一块,而且不需要和他们调整时差,做的也是自己感兴趣的工作,所以这几年还是过得比较开心的。

我们这个编译器已经做了整整有六年多了,其实还是一个持续性很长的工作,大概有 12,000 多个 commits,是积累很长时间的一个项目,包括它的构建系统、IDE。

赵海平:那咱俩可能真的是代表 Facebook 不同的阶段,可能你加入的时候 Facebook 已经是一个大公司了。我加入的时间阶段,2007 年到 2015 年恰好是 Facebook 从小到大不断增长的这么一个过程。所以你在中国的话就比较幸运。像我的话,伴随着公司发展,换 office (办公地点)就换了有不计其数次,不断(出现)人坐不下了,然后又换一个大一点的地方,然后又坐不下了,又换大一点的地方,换了好多次。然后工作上,基本上没有太多的时间去思考很多其他的问题,完全是一直在解决线上的问题,当时线上有各种各样的问题,不断的去提新的方案,去解新的问题,基本上是属于一个快速成长的一个过程,就喘不过气了的一个过程。

可能到 2011 年 2012 年之后开始,随着这个人多了起来,今天大家就感觉到好很多。我是到 2011 年的时候,才真正有一个所谓的团队了。在 2011 年之前,我所在的团队是没有名字的,当时就是叫 engineer (笑),一个 pool 就是一堆人,然后说你们都是属于 engineer 的,没有划分说具体去做什么,但是到后来就越来越正规了。

Facebook 第一位华人工程师?

李燕伦:坊间传言海平老师是 Facebook 第一个华人工程师。因为我感觉海平老师比较严谨,这个梗还挺好玩的,你可以解释一下吗?

赵海平:首先如果你说华裔的话,其实更早有好几个属于那种 ABC(American Born Chinese)的华裔。但是如果非要说华人但不是华裔的话,真的是从内地过去的那种,实际上至少有两个人在我前面,一个是台湾人,哈哈哈,还有一个人他确确实实从大陆过去的,但是他是做 DBA,去管理数据库的。

所以说你可能要加很多的定语,比如一定要中国大陆过去的,然后必须还是软件工程师,不能是去管理 database 的,然后才可以排到第一。

送给新手程序员的建议

李燕伦:因为我感觉两位老师在这个职业生涯都做到了比较高的级别,像海平老师以前在阿里做到了 P10,然后我就想问一下两位老师,程序员如何才能做到比较高的级别。因为我现在是一个新手程序员,我的梦想就是有一天成为一个 P10 的程序员。我希望两位老师给我一些实用的建议,两位老师会给我什么建议呢?

赵海平:宏波,要不然你先来,我觉得我介绍的经验会不会是上一个世纪的经验,会不会已经不符合那个现在的公司的情况了?(被宏波老师劝了一下)好,那我只说我自己的一个感受吧,因为我以前是学生物的,在我学生物的时候,虽说那个时候在实验室已经是个博士生了,实际上已经是算开始工作了。因为我不热爱生物,所以说我每次去生物实验室的时候,我是很累很头疼很不喜欢的,你知道吧,所以后来我转到计算机(专业)之后,我就每天都过着快乐的(无法描述的)生活。所以我自己的一个人生最大的一个感悟就是说一定要做自己喜欢的事情,因为你特别的爱好,所以你就肯多花很多的时间。

我原来在生物实验室的时候,也有其他的人特别喜欢生物,人家没事就在那看 paper ,因为我不喜欢,我也不会去看 paper ,所以人家天天看 paper 的话,人家生物自然就学得好。那我在做计算机的时候,因为我特别爱好计算机,所以我也不会感到累,我花时间比别人多,所以自然进步的就比别人快。这是一个(正反馈),因为然后你进步快的话,你就会更喜欢计算机,因为你做得比别人好。你更喜欢计算机的话,你就会又花更多的时间,这是一个特别好的良性循环。

所以说,我觉得如果问我怎么样在职场上成长特别迅速,我觉得就是一定要寻找自己特别喜欢的点,然后去深挖,在自己特别喜欢的点上你可以快速成长,因为你肯花比别人多很多的时间。然后这个时候,如果你真的是很专心,完全的投入到你喜欢的那个东西里面,然后可能也许技术层级就自然而然涨上去了。如果你的注意力在技术层级上的话,可能你就没有办法很投入。所以说其实这是一个欲速则不达的一个事情,你越是不去想它,反而可能那个效果会更好一些。我不知道宏波是怎么样子的一个体会。

张宏波:我非常同意海平的观点,我觉得要做自己喜欢做的事情。像我在做 PL,是从 08 年到现在也有十几年了,如果自己没有那么热爱的话,是很难坚持下来的。而且我们 PL 这个领域老实说就是相对比较冷的东西,如果纯做 PL 的话,其实不好找工作的,但是因为自己特别热爱这个事情,当你做到在这个领域做得最好的话,那你相对来说就没有这方面问题。所以我觉得要做自己喜欢做的事情,你才能坚持下来。另外一个,我个人感触比较深的是,如果你要在公司升职的话,还是要对公司的业务有了解。在你的技术能够沉淀下来的同时,还是需要花点时间去了解公司的业务。

国内外工作体验有什么不同?

李燕伦:明白明白,我这就回去,让我更多爱自己的工作一点。然后回到那个海外工作的这个点上。因为你们两个都在国外工作多年,然后又都有国内工作多年的经历。所以比较好奇你们两个觉得国内外工作的不同的体验分别是什么样子的?

赵海平:这回一定要宏波老师先来,哈哈哈。

张宏波:我觉得这个还真应该让海平先来,因为我虽然在国内待了很多年,但其实我那个工作环境还是国外的,所以对比反而没有那么强烈。

赵海平:明白了,说虽然是 Facebook 但是你其实人是在中国这边,没有在 office 对吧?

张宏波:对,其实我没有在中国的公司待过,所以没法做对比。

赵海平:OK,其实我说心里话,我觉得互联网公司,不管是硅谷、阿里巴巴、字节跳动,总的来说其实是非常类似的。其实你是可以感觉到大家是趋同的,说你们要 open 的 office space (开放的办公空间),那我也要这样子,然后你们要点缀一下办公室,那我也要点缀一下,你们要有个人空间,我也要。我觉得这些都大同小异。尤其是你比如说这个一定要有厨房,一定要有小吃,一定要有喝的饮料。然后食堂的伙食一定要搞得特别好的,在互联网公司都很在意员工的感受。所以总的来说的话基本上差不多。如果非要我在这个细节里边去挑这个 difference 的话,我觉得可能字节的话,可能更像 Facebook,如果我画一个轴,强行的把这些公司放在两边的话,阿里巴巴可能会跟更加强调人和人之间一定要面对面的沟通,有很多人和人之间的活动,开会的话很强调说一定要大家在一起去商量一些事情。

张宏波:我想是比较注重企业文化吗?还是?

赵海平:对,就是强调人和人之间的联系。那 Facebook 的话,其实比较强调的是用软件来驱动很多的工作的流程,可能这个人我跟他这个一直是处于这个上下游的关系,在某一个 task 的一个 flow 的过程当中,但是可能一两年我都没有见过这个人,但是这个在阿里的话好像一般都是相互之间会有认识,有机会去相互了解更多的人。

所以我不觉得好和不好,我觉得阿里可能比较温暖一些。但是 Facebook 的效率比较高一些。那字节其实更像 Facebook ,字节其实也是很强调软件流程的工作效率。尤其是飞书,我觉得飞书做得真的非常的不错,可能比 Facebook 里面的很多的软件做的都要好。

张宏波:我采访一下海平,因为你都在这三个公司待过,你觉得这三个公司的工作强度怎么样?

赵海平:我不觉得我有代表性,你知道吗?因为一方面工作性质没有代表性。另外一方面,可能在心态上,我很多的时候我就很高兴地去做一些事情。所以我是想强调工作强度的话,首先这是一个比较敏感,但实际上很多的时候人是一个意志动物。回到我刚刚说的那个你喜欢的话题,你比如说,你打麻将打游戏,打到凌晨两三点你也不觉得累,你说这个强度大不大?你说不大呀,我特别喜欢,我其实可以通宵的,对吧,看你有多喜欢。如果你要是不喜欢,就像我原来做生物的时候,我可能早上一早起九点钟,我就已经累了对吧?所以我就会说天呐,那个强度很大,所以这个可能仁者见仁智者见智,这件事你去问很多的人肯定回答是不太一样的。

编程语言学到什么程度才算掌握

李燕伦:哦,明白,我觉得因为之前提到的问题,相信直播间的小伙伴应该对两位老师的经历都有了一定的了解。

然后我们现在就回归到今天的话题,我们来聊一聊编程语言。我们搜集的问题里边,大家问了许多不同语言,他不止问了 PHP 和 ReScript,所以大家还是想知道两位老师对这些语言的看法。

想问一下两位老师,一门编程语言学到什么程度才算掌握?

张宏波:一般来说一门语言,它的本质就是提供一些 API 和运行时,让你可以在之上做一些事情。比如说 Objective-C 你可以写 mobile ,另外一个,它是给你提供一种抽象机制,它可以让你做模块化的编程。

对 JavaScript 来说,它的最大的优点就是你的无处不在。但这个语言它本身它设计的时候是比较草率,一开始设计的时候不是都说是一周设计出来的,所以它从抽象的这种程度来说并不是设计一个非常完美的语言。所以接下来这十几年都在给这语言打补丁。

有一本书叫 JavaScript The Good Parts,其实我觉得像学习 JavaScript 这种语言的话,你只要学习它的 Good Parts, 那个 Bad Parts 你就可以忽略掉,或者说只有等你真正需要的时候,才去了解为什么。而且现在因为有了 TypeScript,很多 Bad Parts 你都可以避免掉。所以你只要学对应你有用的抽象就好,就不要去 focus 在一些犄角旮旯里面去。

李燕伦:那我理解,其实还是要根据业务来对吧,根据我实际业务,然后来判断我对这门语言要学到什么地步,是这个意思吗?

张宏波:如果你需要表达某种抽象机制的话,学经典的设计模式就可以了。就不用纠结在 JavaScript 语言本身,比如说最早的 JavaScript 他有 prototype chain 那个链,是一个 proto 属性,那些很细节的东西,我觉得不需要去纠结。

李燕伦:明白,我希望面试也不要问我太细节的,因为国内的面试他会问的很深,JS 的话也会问到原型链,就问的特别深。

张宏波:对,但因为 ES6 以后他有了 class 的,其实你可以不用踩这种坑的,我个人觉得其实是可以忽略掉的。

PHP 是万恶之源?

李燕伦:好的。下面有一个问题是网友问海平老师的,有人在技术博客上会公开说 PHP 是万恶之源,那想问一下海平老师觉得 PHP 的未来在哪里?

赵海平:很抱歉,我没有看到这个博客,那个可能有前后话,有 context 或者说有针对性。我不知道这个万恶之源指的是什么,但是因为我没有读,所以我只能猜想,肯定对 PHP 不满意,对吧,觉得这个语言里面有一些设计的不完美的地方,有一些特别不好的地方,可能很长时间都没有能够改掉,大家抱怨了这么多年,然后一直是这个样子。我猜想可能是这样子的一个情况。

但是我觉得对于一个语言来说,就像我想去了解这个博客一样,一定要去了解它的来龙去脉,了解它的 context。那我们了解 PHP,也是需要了解它的来龙去脉,了解它的 context ,你们要知道那个 PHP 那个它产生的那个年代是上个世纪末的时候,恰好那个时候 web server 如雨后春笋一样子,出现了很多的这个 WebSite ,互联网才开始出现,那是一个很激动人心的时刻。与此同时,所有的东西都非常的原始。都很 primitive 我不知道抱怨 PHP 不好的人,他们有没有听过一个词叫 LAMP, 这个词很关键很重要。这个 LAMP 是什么?英语里面这个词叫灯,但实际上它是四个 software 的缩写。

L 是 Linux, Apache、MySql、PHP,LAMP 是 fundamental software for internet。

这个叫鼻祖,你明白了吗?你现在抱怨雅虎做多么的不好,对不起,雅虎是 internet 的鼻祖好吗?你要尊敬它,那个叫 legendary 的,像爷爷一样的那个身份,你懂了吗?他当年出来的时候肯定是有很多的弊端的对吧?那你说他为什么不改呢?是因为我们有太多的东西依附他,依靠他,去改的话牵一发动全身。

所以实际上,不是说负责 PHP 的人看不到这些缺点,你可以去敲她的门说,听着,我告诉你 PHP 这些地方不好,但是我都知道,但是我改不了好吧,所以这要去理解和包容。你要去 understandwhat's going on,你要去 understand 说 PHP 它是怎么来的?然后它为什么有今天这样的一个状况?然后其实有很多的时候,甚至对每一个 feature 你觉得这个东西设计的好奇怪,好莫名其妙非常的不好,你要去读他的历史,为什么会是这样子的?你就会发现有可能就有一个很有趣的故事。所以这就是我想说的,你对 programming language 有多少的爱,你的包容心就会有多强。所以说看到一些不好事情的时候,最后反而变成一个很有乐趣的事情,其实有很多的故事。所以说我不反对任何的说 PHP 不好的一些评语,确实还有很多的设计是不好的。但是与此同时我又能够理解他,我又知道他为什么不好。

李燕伦:哇,听到海平老师说到 LAMP,其实我的第一份工作就是 PHPdeveloper,我当时用的就是 Lamp ,我觉得还可以,做业务还 OK,但是后来我换了一份实习做了 Java,然后我就觉得哇(Java)好痛苦,因为 PHP 什么都写在一起。然后 Java 就是 Controller 要写一层,Services 要写一层,然后 Java 我真的好痛苦。但是我个人对 PHP 是非常喜欢的,因为写东西就会很开心。但是有一个同学说这个世界上他是没有完美的编程语言的,所以想问问两位老师,着重回答一下 PHP 的缺点是啥?

赵海平:PHP 的缺点,我举一个可能大家诟病最多的就是它有很多的所谓的 semantics 语义,它定义很模糊。比如说这个 false,很多的 value==false 这个怎么去解释?这个除非你要去查那个表,否则的话你自己是猜不出来的。

这种设计,它就所谓的比较 hacky,没有那个 Java 那么 formal 。所以我有时候建议,如果你去学校学一个语言的话,可能你应该去学 Java ,为什么呢?因为 Java 它的设计非常的 formal 、正规,非常的 canonical ,canonical 就是很正规军、正规化,然后它有很多的东西是来龙去脉,很有道理的。然后 PHP 的很多的设计,有一些随意性,有一些 on the fly ,比如我今天在这写的时候,就这样定义,结果一下子就错了好多年。

所以如果你要问我 PHP 哪里不好的话,你到网上去一搜,你可以看得到很多这样子的 example。但是就像你刚刚说的那一句话,我觉得我们原来在 Facebook 的时候,大家一边在抱怨 PHP 不好,一边迅速的把这件事情给做完了。明白我说的意思吗?PHP 写东西实际上是很快的,因为他很 hacky 所以说他可以很快的把这个网页攒出来。

Facebook 没有那么在意代码一定要写得非常的完美,为什么呢?是因为当时大家也不知道网站应该建成什么样子,也许第二天代码就被删掉重新写了,所以你去过度的 polish 打磨代码,有的时候反而还不如快速写完,叫所谓快速迭代的过程。

所以 PHP 就跟 Facebook (当时的)研发的模式恰好很匹配,大家也没有那么强的抱怨。但是如果换另外一个公司,你很在意那个代码的这个稳定性和持续性。比如说你是一个搞金融的公司,你很在意代码的可维护性,那可能 PHP 就不是一个好的语言。

Golang 的精华和糟粕

李燕伦:好的,我感觉 PHP 和 Java 前两年热度是非常高的,但是近几年 Golang 出来之后,Golang 就开始变得特别火。所以想问一下两位老师对 Golang 的看法,有人提问说关于 Golang 的精华和糟粕希望两位老师都聊一聊。

张宏波:其实我用过一些功能,但我不是特别精通,我觉得 Golang 还是一个不错的语言。

比如它的 interface define,据我所知,是第一个主流语言把 structuraltyping 用在工业语言当中,当然其实很多学术语言已经有了。然后他的编译很快,我也非常赞同,编译速度是很重要的。对我来说,Golang 比较缺失的就两块,一个是泛型,但是现在泛型已经加上去了。然后另外一块,我觉得现代语言都应该有代数数据类型和模式匹配。但是 Golang 很遗憾,Golang 作为一个新生语还是没有引入,所以我觉得也是比较遗憾的。

赵海平:对,我觉得对,因为宏波是那个学语言出身的,所以说这个观点都是这个带有强烈的这个 academic (学术)的特点。我说一下 industrial(工业)的观点,互补一下。

Golang 我不知道为什么,说糟粕、精华本身带有强烈的感情色彩。然后我觉得也要像 PHP 一样去理解和了解它的来龙去脉:为什么 Google 要去做 Golang 呢?是因为我们在这个过去的五到十年里面,就发现了实际上绝大多数的公司在写什么呢?在写分布式计算。特别常见的情况是我调你、你调它,它调它。你们知道微服务为什么现在这么 popular 因为现在就是这样子,团队大了之后拆分 engineering task 拆分完了之后,我就要 RPC 调用对吧?所以说这个变成了这个这个很多的 application 就变成了所谓的 IOintensive 的这种形式,就是他不是一个简单的计算,他可能也许跟 20 年前的话,很多的软件都是在做大量的计算对吧,没有太多的 RPC 因为都在一个机器上进行。

后来这拆分了之后,计算的比重相对来说就没有那么多了,更多的是 IO,那么 IO 的话,问题就来了,你的线程模型是什么?好吧,那 Java 说让我来解决这个问题,Java 说我们就有就 thread 对吧。后来结果发现 threadJava 那个 thread does't work 就不行,给你 50 个 thread 是 OK 的,给你 1000 个 threadJava 那个就不要跑了,这个速度太慢了。所以的话大家在沿着这个 IO 如何让 IOintensive 的 application 跑的好,然后就有很多的想法和思想出来。

然后最后就发现了。天,原来我们一定要用比如说 epoll 这种模型,要搞 user thread ,相当于在 user space 里面用户的这个轻量级的这种 thread 来解决 IO 的问题。Go 就是迎合这个趋势。那我想让其他的人都能够很快的去跳到这个模型上,所以他才把 goroutine (协程)这个概念变成了 first classcitizen ,所以其实人家的本意是在这里。

当然你可以抱怨 go 有很多的不好的地方,你如果问我,我可能会挑他的 error handing 做的不太好,他没有 exception ,我写 C++ 的话,我觉得 exception 还是很有用的,让很多的那个代码变得很整洁,那 go 的话就不行,一定要 return 一个 error 。

那这个也不是说错误,这个程序语言就跟这个人生一样,只有选择没有对错。千万不要一棒子打死人家这个选择,天哪你没有 exception 那你就是错的。只是人家这样选择的目的是因为 exception 是一个性能损耗点,那我要快,为了极致的性能,对不起你们所有写 Go 语言的人,你们自己累一点,你们自己去 check 一下那个 return value ,就不要说太简单了,所以这就是一个取舍。

所以一个 tradeoff,你可以不同意这个取舍。但是没办法,这个语言是人家发明的,人家帮你做了一个决定,所以说你去理解了人家 decision 背后的为什么之后,可能就会心平气和很多。你不能够去说什么精华或者糟粕,这么多人一起的集体的创造的一个智慧的结晶,他不太可能有糟粕在里面,只是会有选择,可能是你不喜欢的选择这个是完全有可能。

李燕伦:哇,我觉得只有选择没有对错,这个真的是打动我的内心,一下子好感动。然后因为宏波老师刚才说 Golang,之前有个缺点是不支持泛型,然后所以有个同学就想问,你说 Golang1.8 以后他开始支持泛型了,对于这个你有什么看法吗?

张宏波:我觉得挺好的,尽管我个人没有 followGolang 的开发,但是我听说也是那个和 Java 一样的,你是编译的时候有类型,然后到后面就去掉了 (type erasure),但我觉得还是解决了很多痛点。

WebAssembly

李燕伦:好的,我们刚才都在聊后端语言,然后聊到后端语言,然后我们不得不要聊到 WebAssembly ,近几年这个概念太火了,因为 WebAssembly 的出现,它让各种语言编写的代码都可以接近原生的速度在 web 中运行。后端代码可以在 Web 中运行了。想请问一下两位老师对 WebAssembly 的看法。

张宏波:我纠正你刚才有一个错误的观点, WebAssembly 可以让各种语言以接近原生的速度来跑,这个是不对的。因为你只能说对底层语言 C++ 或者它编译出来的部分,是可以跑得很快的。但是你说 JavaScript 或者 PHP 理论上也是可以编译到 WebAssembly 的,但它照样是很慢的,因为它的速度快与慢是由于语言的特性决定的。不是说你有了 WebAssembly ,它就突然就变快了。

然后 WebAssembly 它现在是有两种模式的,一种是跟 Web 平台没有关系,他只是作为一个通用的 IR(中间语言) 你任何语言都可以编到这个 IR 以后,你可以在云端也可以计算,然后它比传统的 IR 有个好处,首先它是一个跨平台的,编译成 WebAssembly 之后就可以扔到任何一个操作系统上跑。另外一个,它设计的初衷是有安全考虑的,它可以很快做安全的校正,然后可以提供一个很好的 sandbox 这是在后端的使用。但前端主要是,它可以把一些计算比较复杂的应用那个移植到 C++,然后把它编译成 WebAssembly 然后再进行调用。比如说一些传统的编码解码这些方面。

现在用的比较多的成功的案例是把一些老的 C++ 程序搬到 Web 平台上。最近的一个比较成功的案例,Adobe 的 photoshop 应该是用 C++ 代码写的,我可以把很多已有的代码直接通过一些这个新的技术把它编到你的 Web 平台。这样你可以把一些老的应用提供给更多的用户。

这是 WebAssembly 的两种使用方式。回到 ReScript 和 PHP,因为 ReScript 是一门静态语言,它是可以编译到 WebAssembly 的,而且调用是可以走通的,已经有人试过了。像 PHP 或者 JavaScript 这种特别动态的语言,目前来说,即使把它变到 WebAssembly 里,性能是得不到提升的,你需要把它的很多语言特性给裁掉,像 TypeScript 有人做了一个子集,做成了一个 AssemblyScript ,它是非常非常小的子集,然后你才可以把它编译成有效的 WebAssembly。所以 WebAssembly 不是一个让你任何东西突然就变快了。

赵海平:我们语言小组对 WebAssembly 也感兴趣,感兴趣的点其实是在他的 inter-operability 上,我不管你以前的语言是什么,这个编译完了之后,然后一下就可以这个相互调用了。这个是我们现在在看的点,但是才刚刚开始看,理解并没有那么深刻。其实但是我觉得这个 WebAssembly 这个事儿挺有意思的,随着到 2021 年,其实就会发现我们有很多种语言了,实际上你看 WebAssembly 也好,LLVM 也好,其实要回答的问题基本上都是怎么样让这么多语言相互之间可以很好的融合,或者说节省 engineering effort ,我觉得这个趋势可能真的还挺好的。

张宏波:我想说一下,其实 WebAssembly 还是没有解决这个问题的。像不同语言,如果它有垃圾回收的话,那个互操作还是很难的问题,不是因为 WebAssembly 它就自动解决了。

赵海平:是的是的,还是有一些 fundamental problem 。

Rust 怎么看?

李燕伦:聊到新技术,近几年其实 Rust 也非常火,它由 Mozilla 创建,Facebook ,苹果、谷歌、亚马逊这些大厂都把  Rust 的用在系统基础建设、加密、虚拟化以及更多底层的编码中。然后 Vercel(Next.js) 的一个人,他说 Rust 会是 JavaScript 未来基础设施。所以想问一下两位老师,对 Rust 的看法是什么?

赵海平:字节内部其实有很多的人喜欢 Rust,内部的用户群特别大,很多人加入到群里。然后他们会问我喜不喜欢 Rust,我特别谨慎,我特别怕说错话,因为我要说 Rust 好与不好的话,特别怕变成一个站边的问题,所以我保持比较谨慎的态度。但是可能最终我们是要去支持 Rust,毕竟要鼓励大家去尝试一些新的东西。不过,Rust 的优点和缺点其实都是很明显的。在目前看来(2021 年),Rust 的优点的话,毫无疑问比如说它没有 Garbage Collector(垃圾回收机制) ,它是强调 object ownership(所有权),可能写的时候稍微费一些劲,但是在运行的时候没有 Garbage  Collection 这个障碍,然后就可以很高效。然后其他比如说像做一些 system program 的话比较安全,优点特别的明显,都非常认可,但是缺点也很明显。比如说这个编译速度比较慢,基础库也不完整,然后这个可能 IDE 的 support 也不是特别的好。然后还有一个是,它不是很好学,learning curve 还是挺高的,你想要搞明白那个 object ownership 可能你还真得要是一个高手,你可能才能够完全彻底的去理解。所以我觉得属于一个我们去跟随着这个社区不断的进步的这么一个状态。

张宏波:我补充一下,Rust 和 ReScript 它有共同的渊源。如果你喜欢 Rust 的话,你也会喜欢 ReScript,因为他们都是从那个 ML(metalanguage) 语言出来的,就是元语言。Rust 最早的编译器是用 OCaml 写的,ReScript 就相当于 Rust 把 GC(前文所指的 Garbage  Collection) 给拿掉,你不需要去学那些 lineartypes 那东西确实比较绕。如果你没有 C++ 或者 C 的基础,可能都很难理解。所以如果你喜欢 Rust 的话,你也会喜欢 ReScript,而且 ReScript 因为有了 GC ,模式匹配、用户体验可以做得更好。然后回到最开始的问题,Rust 现在很火,而且生态也在慢慢的建成,但 Rust 客观来说它的门槛是很高,主要是在 linear types ,它的类型已经 leak 到了用户,即使我只是你的 library user (库的使用者),我也必须要了解这个东西怎么回事,门槛还是相对比较高。

编程语言解决的本质问题是什么?

李燕伦:感谢两位老师的见解。我们刚才其实聊了非常多的编程语言,我们聊了 Go、PHP、ReScript、Rust,想更深入的请两位老师聊聊,编程语言它解决的本质问题是什么?它又是如何解决的?然后想想请两位老师展开的讲一讲。

张宏波:编程语言的本质我刚才已经提到了,它就提供两种功能,一种是提供一系列底层的 API, 比如像 GLSL 就 shade language 我可以让你操作 GPU 这是它的一个最本质的东西,因为有了这个平台你能实现自己想要的功能。然后另外一个他提供一种抽象机制,像最早的汇编,它没有 function ,所以它基本上没有任何抽象机制,你很难做大规模的模块化编程。

所以对于你用户来说,首先我要了解他的 API ,像大部分工业语言,其实它的提供的抽象能力是差不多的。比如你学了 C++ ,你再去学 C# 是很快的,因为它的抽象模式基本上是差不多的。但是如果你学一下学术语言,像 haskell 或者那个 prolog 它给你带来一种全新的体验,它会提供另外一种抽象方式。

赵海平:宏波是正儿八经科班出身学语言的,所以一定要听宏波关于这个问题的看法。

如果问我的话,我可能也是更多的从 industrial(工业)的角度去思考语言。我觉得这个问题问的还挺好的,虽然很深刻,但是其实也有它实用的一面。你想想看,其实我们现在所说的语言,它确实可以让我们帮助我们去做很多的事情,那就是说去 instructcomputer 对吧,告诉计算机帮我们做什么事情。

但是实际上有两件事情,目前它做的不是特别的好,或者说还做不到,或者说不在语言的范畴之内,但实际上是值得问这个问题,为什么他不在语言的范畴之内呢?哪两件事情呢?一个就是数据库,database,其实我也是想问宏波这个问题,对于做学术研究的人, database 是一个 camp,programming language(PL)是一个 camp ,然后这两个 camp 的人实际上思考问题的方式, PL 的人更多的是从 CPU 的角度去思考问题, database 的人更多是从 data 的角度去思考问题。彼此都认为自己是可以囊括这个全世界的。

所以说实际上你看语言实际上跟 database 它对接地方,很多的时候并不是说非常非常的完美。所以很多的时候一个语言在访问数据库的时候,很多的有所谓的 data binding ,这个 problem 要解决。有 serialization(序列化)、deserialization(反序列化),有好多类似这样这方面的问题,它并没有把数据库、database 或者 data 的很多东西囊括在语言里面。

当然有这样的尝试,但是貌似这个目前还是两大 camp, database 和 PL。为什么这两个 camp 的人不能在一起,为什么不把两个东西搞在一起?所以你如果能够问这个问题的话,其实可以回答说什么叫语言的本质是什么。

还有一件事情就是分布式计算。目前还没有一个语言说它能够凌驾在众多的机器之上。我去写一个程序,这个程序咔嚓一下,在几千几万个机器上跑。那当然我们有类似的系统,比如说 map-reduce,但是它没有上升到语言这个层面。它没有说我今天字节只需要一个语言就好了,你们都不要去这写这个写那的什么 server 一个 client 一个,就一个语言,我写一个程序下来,然后一下 deploy 到所有不同的机器上跑,这也是一个好问题,为什么语言就不去做这件事情呢?这也是在回答语言的本质的问题,也没有好的答案。

那在今天其实我们去看,这个问题是有意义的。为什么呢?因为我们微服务实际上是一个很大的调用链。一个服务调其他的,其他服务又调更多的服务,它是一个树状的 call tree,它是有 dependency 的,但是还没有一个语言能够把完整的把整个的 call tree 给描述出来,如果真的可以描述出来的话,那 compiler (编译器)就可以去优化这棵树。我怎么样去优化让整个的调用是最 efficient 的,可是语言并没有回答这个问题,现在情况是,留给大家自己去做一些调度也好,或者自己去做一些优化也好,或者用 WebAssembly 让这个不同的微服务之间有一些 inter-operation。

所以我不知道怎么回答这个问题,我的答案是我不知道,因为我也不满意,我也不觉得我充分理解了语言的范畴,这个边界在哪,也许再隔个五年,十年之后语言又被重新定义了,都是有可能的,对吧?任何问这么有意思问题的人都可以去尝试,都可以去创新。

张宏波:我补充一下,做分布式的语言是有的,据我所知 Berkeley (伯克利大学)里是有,但是可能还没有那么成功。他们和阿里巴巴是有合作的,但还不是个 solved problem。

普通的写业务的程序员要参与语言开发吗?

李燕伦 假设我是一个非常普通的写业务的程序员,我是否需要参与语言的开发呢?如果我真的参与了,我就如何平衡业务跟语言的开发?我参与这件事情对我的好处和坏处是什么?希望两位老师能够从自身的经历讲一下,比如你们是怎么进入的语言开发的,进入到开发之后你们是如何平衡的?给你们带来的好处和坏处是什么?

赵海平:因为我不是学语言出身,所以我是当年在 Facebook 被 push 去做这件事情:我们机器不够用了,所以我们必须要优化。然后毫无疑问大家知道 PHP 慢,慢的意思就是消耗 CPU 消耗多,需要的机器比较多,因此大家都想着要去优化 PHP ,所以我是被逼无奈去做的语言,所以至少这是一个途径,被逼着去做语言。

当时我们在美国的语言小组中,大家总是沾沾自喜,因为当时彼此之间流传着一句话:凡是做 compiler 的人,都是最好的的 programmer 。这句话就是有吹牛的地方,但是它也有它有道理的地方。

当你透彻地理解了 compiler 的时候,你在写程序的毫无疑问就很通透。你知道怎么回事了,你知道怎么写是特别 efficient 的,不仅仅是把它给写完了,功能实现了就完了,你一写的话就能够写得让机器也很喜欢,不仅仅是人很喜欢,机器一运行起来速度也很快。所以可能也许了解语言毫无疑问对于对每一个人技术成长是有帮助的,但是它也是一个很高成本的事情,钻到语言里面去学。你们也知道在上学的时候,compiler 那个课可能就是最难通过的一门课,很艰深,你究竟愿意不愿意花这么大的一个 cost 去做这个努力,我倒真觉得不一定。有的时候也还是要随缘一些。我真的有一天我特别想要去学的话,我就去学。但是如果今儿这边闲待着没有什么事情,就逼着自己去学,也不见得就那么有道理。宏波可能是特别的喜欢语言?

张宏波:对我大部分还是认同的。我客观来说,一般人不一辈子可能都不会去设计一门通用语言,或者是设计出来一门大家用的通用语言。但是我觉得,学习语言设计和编译器还是有点用的。首先对于编译器,它有前端和后端,如果你对后端比较了解,那你优化一些底层上的东西是很给力的。拿我个人来说,我对 OCaml 就非常非常熟,我基本上我看到那个 OCaml 的源代码,我就能知道它的那个汇编代码是什么样,那我就知道它的性能是怎么样的。如果你对后端比较了解的话,你去做性能调优是比较有用的。

然后前端其实也有很多有用的地方,像我们在业务中有很多元编程,就像谷歌的 protobuffer 你要去写很多的代码生成,这一块是需要用到编译器前端知识。所以编译器前端、后端也是可以在业务中有使用的价值。而且我想再补充一句,其实现在的编译器的门槛已经不是那么高了。如果你要做后端的话,你有 LVM IR 就不用自己去查汇编的说明,你只要查一些通用的  LVM IR ,生成到 LVM IR 就可以得到机器码了。然后前端有很多通用的 parser generator 让你去 fit ,有很多各种各样的工具可以用,也是很容易就可以上手的,有的时候不需要了解它的理论也是可以用的。

是什么让你进入 ReScript 开发的?

李燕伦:宏波老师可以讲下,是什么让你进入 ReScript 开发的吗?

张宏波:可以的,因为我当时去读博士,读的就是 metalanguage 。什么叫 meta language, ML 元语言,现在有个很火的概念元宇宙,它是同一个 meta。元语言,就是这门语言是一个用来操作其他语言的语言。所以它一般课后作业,就是你要设计一门语言,去把它设计完了,你还去实现它,所以我就很自然地进入了编译器这一块。然后我个人尽管有学术界背景,但是其实我一个 engineer 是一个工程师,我感觉 PL 作为一个学术界的东西,对工业界影响是有限的。现在绝大部分流行的工业语言都不是科班人搞出来的,像 C++ 、Java 包括 Go,其实都不是有 PL 背景人搞出来的。我们学术界有很多好多思想其实没有流入到工业界去。我个人觉得想把学术界几十年来沉淀下来的东西带到工业界,这是我的一些初心。我想把这个学术界很好的东西搬运到工业界来。

李燕伦:那我理解其实在上学的时候,你就有这样的想法,它一开始是你的一个兴趣,比如一个 side project ,那它是如何变成主业的?

张宏波:对,是这样的。这里有一个故事,我当时的老板是一个法国人,因为 OCaml 这个语言用也是法国人写的,所以他就特别喜欢这个东西。我就一开始在业余的时候,自己开发了一个编译器,当时叫 bucklescript, 它是把 OCaml 可以直接编译到 Web 上,因为我老板特别喜欢 OCaml, 所以我给他做了个 demo ,把编译器本身也编译到 JavaScript,然后通过编译器自举的方式,在浏览器上跑一个编译器,然后你可以左边 OCaml,右边你就可以看到真正的 JavaScript,当时我老板被这个 demo 也震撼到了,那是 2015 年的时候,然后就支持我做这个事情,所以后来慢慢的全职。

什么时候应该考虑设计一门语言?

李燕伦:哇,好酷。我感觉 side project 本来就是自己很喜欢的东西,然后变成了主业,爱好变成了工作的感觉。

刚才聊到海平老师,深入研究那个 PHP 有一部分的原因是因为业务上遇到了瓶颈。一些在国内互联网公司工作的小伙伴,总是感觉会缺少写一门语言来解决实际业务问题的情况。针对这种情况,想请问两位老师,中外公司在这里的区别是什么,是什么时候应该考虑设计一门语言?

赵海平:其实我一开始没有想要去做一个完整的 compiler,故事的开始是,我们都是拿 PHP 去写的 website ,然后有一个函数叫做 id_to_db ,就是你给我一个用户 ID ,我告诉你 hash 到哪一个 database 上,很简单对吧,可能第一天的时候只有一行代码,比如说 modulus 什么一个 100 得到这个 DB 的 number 就完了。但是随着这个时间的发展不断的扩大了,这个函数越来越胖、越来越长。然后后来这个 PHP 的函数可能就有一两页这么大了。

那问题来了,渐渐的公司里面有很多的服务开始用 C++ 写, C++ 的人也需要调这个函数,他也要去通过一个 User ID 去寻找到哪一个 MySQLdatabase 上去访问这个用户的数据。那他又不能直接调 PHP 对不对?怎么办呢?我就手写了一个 C++ 的一个程序去帮他做这些事情。那怎么手写的呢,就是去看的那个 PHP 的函数实现,然后去手写了一个 C++ 的,可是这个函数每次都要变,他一变的话我就要去改一下 C++ 的代码,变一次我就要改一下。

后来我说,我要不然写一个 converter ,去专门去 convert 这个函数。这才是这个故事的开端,到后来的时候,我发现能够把这个函数 convert ,其实 PHP 很多函数都可以 convert ,所以才渐渐地一点一点去扩大的。

并不是说公司鼓励你一上来就去做一个特别耗时的项目,而且 Facebook 也是有要求的。比如说这半年我要打绩效了,那这半年的话你 deliverable(落地的工作)是什么,明白我的意思吗?你不能说:拜拜,我关上门,我要去做一个特别大的项目,两年之后我们再见了。sorry ,不是这样子的,company 里面不是这样子的。我当时为了要做这个项目,最刚开始时候是业余的时间去做的,我是有本职工作的,只是到后来这个项目越 grow 越大,越 grow 越大,然后渐渐那个本职工作我渐渐只能交给别人去做了,才 100% 去做这个项目。

所以我最刚开始的时候,绩效都打得不好,你知道吗?所以可能事后,在不知道细节的情况下去回想,可能会认为 oh my god Facebook 居然会鼓励人做一个这么大的项目。其实不完全是这样子。当然会有鼓励的成分,说鼓励你去探索,鼓励你去 explore different direction ,去尝试不同方向的东西。他不会说拦着你不行,你不可以做这件事情。但是很多很基本的公司规则还是依然需要遵守的。我不知道宏波怎么看,你来说你的感想。

张宏波:对,我觉得我同意海平的观点,但是有一稍微国外和国内稍微有点不一样的。这个项目如果你一开始是征得了你领导同意的,然后你去做,他是可以允许失败,对你的未来是不会有太负面的影响的。他对失败的要稍微宽容一点。

李燕伦:我觉得海平老师刚才的一个困境,宏波老师就没有,因为他说他因为写语言刚开始绩效不好,但是宏波老师的主业就是写语言,这个体验可以分享一下吗?

张宏波:主要是因为我老板很给力。BuckleScript 是在 Bloomberg (彭博社)做的,一开始反馈比较好,后来开源了,开源社区反馈是比较好的。然后公司觉得从一个 PR 角度来说也是可以去支持的,所以一直就活下来了。所以首先你有一个给力的老板,公司也是支持的。因为在当时 Bloomberg ,好像是说 1/4 的钱是要捐出去的,如果你要捐出去,那还不如给我们做点更有意义的事情,对不对?

李燕伦:因为这个问题里有问,什么时候考虑发明新语言,什么时候考虑为现在的语言贡献。然后刚好两位老师是两种情况:宏波老师创建了新语言,海平老师给 PHP 语言贡献了代码, 所以想请问两位老师,为什么海平老师没有自己写个语言?为什么宏波老师没有对现有的语言贡献?

张宏波:我想回刚才问题,因为我现在的语言就没有觉得自己特别觉得顺手的。我拿 Go 举个例子,如果本身支持代数数据类型(ADT)或者模式匹配的话,那我就不去发明一个新的语言了。我设计 ReScript 的原因,就是我觉得现在普遍的工业语言,它没有这样一个很好的代数数据类型来进对一些领域问题进行建模,它缺乏一些特性,我想把这个(代数数据类型)也给带到工业界,让更多人接受到这个特性,主要是从这个角度来考虑的。当然有些学术语言就是有它的问题,它的实现工业强度是很弱的,它实现的编译性能不好,比如像 PureScript 它也是一门比较学术的语言,它该有的 feature 都有,但生成代码效率很烂。所以你也不可能用它来做生产。因此我想有一门语言,它提供我需要的抽象机制,实现强度还可以,它的性能很好,这就是我想要做的事情。

赵海平:对,这个问题问我的话,其实跟我当时面临的困境没有太大的关系。为什么呢?比如你说 Facebook 当时有没有想过直接换个语言算了?是有的,公司当时有四个人,超强的四个 engineer 那个他们都特别喜欢 Python 所以他们就下定决心了,那四个人我的名字我都能叫得上来,这么些年了还记得。他们四个人超强,他们特别喜欢 Python,他们说你们不要再用 PHP 写了,我来要用 Python 重写我们的 website ,但是 sorry 没有其他的人听他们说话,他们就会继续去写 PHP 他不会停下来。明白了吗?为什么?因为那个网站在那 run 对吧,你不可能停下来,停下来让你 convert 成 Python 然后继续前进吗?所以他们四个人确实在玩了命的写 Python 挑灯夜战。

他主要写的速度跟不上,你明白了吗?写 PHP 的那些人洋洋洒洒数千万言那种,你知道吗?他刚 convert 了完几个文件之后,那边说 sorry 我又 commit 十个新的文件。所以最后写 Python 那四个人就只能不了了之。

明白我的意思吗?就说你任何想要去切换到另外一个语言的尝试都是 futile 的,都是很无奈做不到的,就没有办法,最后就只能 give up 就说算了,那我们就放弃了,你就不要去想了,说想手改的方式改成另外一个语言,是做不到的。我们甚至还有一个想法更加 crazy ,我们就说好,比如说这有 200 个 engineer 不是吗,我们现在 IPO 了,我们有钱了,我们招 2000 个 engineer 直接给他就改成 Java 行不行,后来也放弃了,都觉得说这个这个现实是不允许的,所以只能去改 PHP 的底层,因为你在公司里面这样子,这个就是所谓的叫做透明的 solution ,transparent 的一个 solution ,transparent 的含义就是我不影响别人的生活。一般的来讲,这样的 solution 会好一些,大家都能够接受,反正你也不影响别人。

张宏波:是这样,公司一般都喜欢 incremental 的,不希望那个一下一下就切完。那个 risk 太大,但是我们从学院派角度来说,还是希望有一个好的语言。

赵海平:对是的。对是这样子。

其实那样也很好对吧,你去创造一个新语言的时候,如果你有这个机会的话,你去翻新对吧,有很多的新的思想很快的就注入到新的语言里面,但是我不觉得我有过那个机会,所以说这个问题对我来说不适用,我没有办法回答。

怎么去评价这门语言足够优秀?

李燕伦:海平老师刚才说的那句真的非常打动我的内心,就是语言没有对错,只有选择。我们聊了这么多的编程语言,想请两位老师聊一下,在你们心目中,怎么去评价这门语言足够优秀?什么样的编程语言才是很优秀的编程语言?

张宏波:因为其实我接触过很多很多语言,一般语言它给你带来一些新的思维方式,它就会让我眼前一亮,我就觉得它就给你带来一些新的东西,比如我去学 C# 或者 Java,这个都大同小异,我感觉都差不多,没有什么区别,Python、Ruby、Perl 我觉得其实就换个语法,这些都是我从这个学院派角度来讲。

我觉得有几个语言确实影响到我。第一个就是 haskell,它有一个很好的类型系统,让你开阔了眼界,这种是静态语言。还有一门动态语言其实也影响到我。像 Commonlisp 它用来写宏,做语言编程非常非常的方便。你可以写个宏生成宏,然后再生成宏。其实那个宏就是一个简单的编译器,你可以做很多事情,这两门语言都是当时让我觉得比较震撼的语言。

TypeScript 有没有可能作为静态编译语言?

李燕伦:我一会儿就会问到宏,因为我们聊了很长时间的编程语言,都是一些比较宽泛的一些问题。这里有一个比较具体的问题,可能宏波老师会比较感兴趣,TypeScript 有没有可能作为静态编译语言?如果真有的话,那它的前景是什么呢?

张宏波:这个其实学术界是有尝试的,叫 sts ,static typescript 把 TypeScript 的一个子集做 aot 编译。还有一个工业界也有尝试,像那个 AssemblyScript 也是 TypeScript 的一个子集。但是问题就是,子集的话就基本上和 TypeScript 的生态系统就不兼容了。

AssemblyScript 它只能用很小的一个 feature 。甚至还有尝试把 JavaScript 编译成 IoT,但是它的本质也是动态的查询,你不会得到一个更高效的二进制代码。除非你把它一些不好的特性 cut 掉,cut 掉了以后,那它就不是 TypeScript 了。

李燕伦:也就是说短期内它是没有办法会变成一个静态编译语言的?

张宏波:我觉得长期也不太可能,因为这就是它的历史包袱,这也是 TypeScript 能够 popular 的原因,因为它完全兼容 JavaScript,成也是它,败也是它。

李燕伦:然后刚才宏波老师说到宏的问题,恰好就有一个同学问一门语言就是什么场景下会需要用到宏?脚本语言为什么很少有宏?解释型语言不能有宏的功能吗?关于宏想请两位老师展开讲一讲。

张宏波:我可以说一下,先纠正一下问题,脚本语言为什么很少有宏这个观点,这个问题好像就不对。因为像 common lisp,宏始祖 Lisp ,一般解释语言有宏。所以像 hygenicmacro 最早的研究来自于 scheme 、racket 它其实都是动态语言。所以这个问题好像不对。

动态语言、解释语言都有宏的,而且它们其实比静态语言更容易做这个事情,因为动态语言它没有类型,做宏的话更容易,静态语言反而不容易。像 ReScript 也是有宏的,我们也提供一个编译器插件,你可以在编译的时候,对代码重新展开生成其他的代码。但它有问题,宏会让你对语言提供的工具做得非常难做,因为你那个展开是可以做任意计算的,做 IDE 就很难了。像 rust 为什么 IDE 有问题,就是它的宏,因为 rust 有宏,有宏的话你的 IDE 就非常难做了。所以我想纠正一下,动态语言也宏是更容易的,静态语言也是有宏的,但静态语言让你的工具更难做。

李燕伦:海平老师对宏是怎么看的呢?

赵海平:这个可以跟宏波探讨一下。其实泛型是不是也是想要达到一些宏的目的,但是可以更 safe 一些,更安全。

张宏波:对对,泛型有两种,像 C++ 那种泛型,它的类型信息真的是用于代码生成的,还有像那个 Java 和 ReScript ,它的类型信息只用来做校验的,他没有用来代码生成。

赵海平:我想说泛型的为什么最后搞着所有语言都或多或少的要支持一些,其实有刚需在里面。实际上我们要 program 的这个世界,它是多维度的。

在这种多维度的情况下,不管我怎么写程序如面向对象,总是有一些维度会被遗忘掉,只有靠宏这样的手段才能够把这个维度覆盖到,不同 object 之间有另外的相似性,然后需要用宏。

张宏波:对,是这样。为什么我们要用宏,因为我们语言的抽象机制不够,所以才要引入宏。所以一般有宏的话,可能说明语言缺乏某种抽象能力。

编译器如何做到自举?

李燕伦:因为我们聊到了很多语言,聊到语言就离不开编译器。

能否请两位老师聊聊编译器如何做到自举?这看起来是一个先有鸡先有蛋的问题,想听听两位老师的看法。

张宏波:我可以说一下,其实自举是有很多种情况的。比如像 OCaml 是怎么做到自举的呢?我自己先用 C 语言写了一个解释器,它可以解释一些字节码,然后我把 OCaml 代码定义成这种字节码,我编译器是用这种字节码写的,然后字节码是依赖一个 C 的解释器,这样就可以完成自举,只要你机器上有 C 的编译器就可以了。

还有另外一种方式是,我有一个编译器可以把我这个语言编译成 C 代码,只要机器上有 C 语言的编译器也就可以自举了。

还有另外一种情况,C 语言的编译器也不是所有机器上都有的,我新造一个芯片,他是没有 C 语言编译器的对吧,这时候就用到交叉编译了,我知道你另外一个体系结构,它的汇编格式我是知道的,我就可以在英特尔的机器上,编译成 ARM 的二进制格式。然后把它拷过去,这样也可以完成自举。

赵海平:我觉得有很多的时候,有些语言特别强调这个,可能一方面是一种精神上的这个洁癖,我谁都不依赖。

张宏波:对,一般都会用自己的语言自举,因为自己写自己的语言会有一种莫名的快感,所以大家都喜欢这种自举。

但是其实是有很多问题的,因为自举的话,它就存在很多依赖关系,所以修改这个语言的话,就会出现很多问题。

它有一个时序的,先修改哪部分然后再修改哪部分,它有一个依赖关系,你不能一下子改了,那它就 break 掉了。

赵海平:所以怎么说呢,程序员比较调皮是吧。(笑)

张宏波:对,所以一般来说,要等这个语言开发的比较成熟了以后再进行自举。

如果你这个语言开发还不是很成熟就开始自举的话,那这个开发模式就不好。我拿 Rust 做一个例子,Rust 一开始用 OCaml 写的,过了很多年以后,觉得 Rust 相对比较稳定以后,再考虑用 OCaml 的编译器给踢掉,换成 Rust。如果它一开始就自举的话,会带来很大的工作量。

hindley milner 类型系统?

李燕伦:有人问到说两位老师可以举几个 hindley milner 类型系统跟实际业务开发的关系吗?

张宏波:HM 系统当时那个 Robin Miler 提出来的,当年他拿靠这个拿了图灵奖。他是基于 lambda 演算,最开始 lambda 演算是没有类型的,untypedlambda calculates,然后在这个基础之上,我需要加一些类型来约束它,然后得到一个 HM 类型系统。它的主要用途其实是在于做 type inference 给这个语言做类型推断。在实际业务中其实很少,主要是在于语言开发中,我要设计一个好的类型系统才会用到。

而且现在新的类型系统,它都不是原始的 HM 类型系统,因为 HM 它速度比较慢。现在的新的 HM 是基于 HM 的类型系统,但不是原来的。会有一些加速的方法,比如像 OCaml 基于 level 根据分层来进行加速的,不完全是最开始的 HM 类型系统。

Parser 有多少种?

李燕伦:聊到那个编译器,想知道说到底有多少种写 parser 的姿势?常见的现成的轮子有什么推荐的?想请两位老师展开聊一聊 parser 。

张宏波:parser 主要看你的用途,比如我主要是给这个语言来写 parser ,一般来说,业界都是手写的。因为我要提供很好的 error message,而且我只要写完一次就不用再写了。比如我写一个 C++ parser 之后就不用再写了,对吧。所以因为我要考虑让它的报错信息更友好,一般是手写的。

如果你是用来做工具的话,那就有很多 parser generator。像最近很火的,在 github 上开源的 tree sitter,它可以在你写完语法之后,有一定程度的出错提示,而且它是 incremental 的。比如我在这个编辑器里面改了一点点东西,它生成的语法树是重用了以前的语法树,它不会重新 parse 所有东西。这是一个最近比较火的一个 parse generator 。

像老的 parser 的话,比如像 ANTLR,基于 JVM 的 parse generator。

赵海平:对,就是那个 ANTLR 确实较有名。所以创造一个新的语言也没有那么难。

不生成 AST 的编译方式?

李燕伦 请问两位老师有不生成 AST 的编译方式吗?

张宏波 有的,其实在很多年前,这是常态,基本上都没有什么 AST,因为当时的内存太宝贵了,还是你生产 AST 的话,就要消耗大量内存,而且编译速度很慢。所以最开始的编译器都没有 AST 的。当你随着计算机发展越来越好的话,内存硬件越来越好了,所以才会有不同的 parse,你可以保留 AST,而且有多层的 AST,有低层的 AST,然后还有进行类型检查过的 AST,然后还会有不同的 IR。但是最开始的最古老的编译器都是没有 AST 的,但现在基本上都有 AST。但如果你需要极度的关注编译器性能的话,你也不用构成 AST ,据我所知,像 QuickJS 好像是没有,因为他想要在一遍中就生成代码,就这样的编译编译速度更快,这种情况它就不生成 AST。

编译器的优化目标?

李燕伦:想请问老师,现在编译器主要的优化目标是什么?

张宏波:我可以简单说两句,但其实我的那个主业不是做后端(编译器后端)。一般来说,编译器在它理论上,是没有一个最优的编译器。所以做优化总是可以做一辈子的,因为它理论上就没有一个最优的。但是在后端(编译器后端)领域里面,据我了解它已经没有太多的 break through 了,现在业界的主要做法是 focus 在某个领域,像 AI 现在比较多针对神经网络,然后进行代码生成,或者针对 GPU 进行代码生成。通用语言的编译器,据我了解没有太多的 break through ,没有很大的创新的余地了。

赵海平:对,这个也是我想说的,好比说有很多人会问说我们字节为什么要有一个 Go 的团队,这就是因为说如果你从社区去拿到一个编译器,那它的这个 optimization 可以 general 的,但是我们针对我们字节内部的这些特殊的场景的话,可能情况就不太一样。

所以很多时候我们做一些优化,是针对性的优化,把它 specialize 的 optimization 在哪些特殊场景之下,采用什么样的优化手段会更理想,而放弃掉 general 的优化途径。

举个最简单的例子,inline ,inline 是一个多大的 function 呢?这个是非常 arbitrary 的,Go 核心的 Google 公司的 developer 他的决定不见得适合你的公司。

所以你自己就可以去 tune 这样的一些 parameter ,如果它恰好有一个合适的 parameter  那可能就很幸运。那可能有的优化,他认为是不重要的,或者他可能认为是重要的,但在你的情况下,就完全不一样了。

我们昨天还在讨论一个 mapstructure 里面的 key-value 中,在 hash key 的时候,它有一个 randomization 的过程,是 Go 在后来的版本才 introduce 的一个东西,但在我们看来,这个过程是不必要的。可是社区认为是必要的。所以这个就是我想说的,在一些特殊场景之下,有一些想法和做法会不一样。

那我们团队有一个任务,还是希望我们自己内部可以节约一些 CPU,就是靠改变这些优化方向。所以我觉得刚才宏波说的很对,没有一个绝对的答案,还是要根据场景来看。

张宏波:其实我最近也有一个例子,就是修改一个函数,它用的是这个语言的通用函数,它比较慢,但是你知道 data source 只有那些可能性,就可以把很多不需要的分支逻辑去掉,它本身是很底层的函数,但后来我们发现它有 20% 的提升,非常大的一个 impact ,就是针对一些特定领域的优化。

ReScript 的优点

李燕伦:我们都知道宏波老师写了一门语言叫 ReScript ,等一下会有 live coding ,要宏波老师先分享一下 ReScript 的细节?

张宏波:对,语言发展它有两个脉络,一个是 Algol 系列的,像 C、C++ 、C#、Java 属于 Algol 系列的。另外一个是函数式编程,Lisp 系,Lisp 以后就有了 ML ,最早主要用来做 AI 和定理证明。ML 之后有法国人搞了 OCaml ,ReScript 是一个基于 OCaml 衍生出来的一个 ML 系列语言。和传统语言相比,我觉得 ReScript 最大的优点是,它特别适用于两个场景,一个是数据建模,因为它有原生的代数数据类型(ADT),而且支持原生的模式匹配,所以你可以定义一个复杂类型,然后进行一些模式匹配,把数据从某种类型变成另外一种格式,是特别容易的,这是第一个优点。第二个优点是,它有类型推断,你基本上不用写任何类型,编译器可以自动推断出它所有需要的类型。这个和 TypeScript 是有区别的,因为 TypeScript 的类型系统是不保证正确的,TypeScript 的类型系统只是大概告诉你它是这个类型,但不能严格证明它就是这个类型。那这样的话,Typescript 类型系统的设计难度就会低很多,你就可以放飞自我加很多 fancy 的功能,ReScript 类型系统是正确的,编译器告诉你是这个类型,那它就是这个类型。

所以总结一下它有两个优点,一个是它特别适用于数据建模,你可以很容易的把数据 A 变成数据 B,另外它有很好的类型推断,你不用写任何类型,编译器能帮你推断出来。

李燕伦:可以给一个在业务中实际的场景中的例子吗?

张宏波:ReScript 实际上是对标 TypeScript 的,在业务中能用到 TypeScript,基本上你就能在业务中写 ReScript 。现在的核心主要是 focus 在你可以把它编译到 JavaScript ,这样你可以用它来进行开发,因为有类型系统保证,所以大规模的重构就很容易。所以基本上能跑 JavaScript 的地方,都可以跑 ReScript 。

李燕伦:有没有业界内在使用的例子?

张宏波:Facebook 的 messager 就是用 ReScript 写的。我们也提供了原生的 React 支持,只要你开发 React 就可以用 ReScript 来写。还有一个是我看到一个中国人写的在线 3D 编辑引擎,也是一个很酷的东西。ReScript 非常适合大规模程序开发,代码要上量级,收益就会越明显,比如你的代码要上万行这个量级,那带来的可维护性、质量提升就会非常巨大。如果你的代码只有几百行,可能就不需要这样的一个 indirection 这样的一层。

像那个文本编辑器,tinymce ,据我所知可能是做的最好的一个文本编辑器。它就大概有 8 万行 ReScript 代码,把实时同步功能用 ReScript 来重写。

赵海平:我问一个问题,你刚刚说那个大规模场景,你认为就是因为强类型有帮助吗?

张宏波:我觉得两个点,一个是你的类型系统是安全的,如果你类型系统有很多漏洞,那你重构一下就有很多问题。

还有一个是,编译器必须得足够快。如果你编译器很慢的话,那想要看到报错,得等我喝杯咖啡回来才能看到。(笑)

所以 ReScript 有很大的强项,就是我们编译器速度是绝对足够快的,一个是算法上做的好,一个是工程上做的好。

李燕伦:关于 ReScript 还有一个问题是,ReScript 的中文文档什么时候上?

张宏波:因为我最近在休产假,因为 Facebook 还比较好,还有 4 个月产假。所以应该明年会上中文档。

开源怎么做?

李燕伦:有关于开源以及如何让开源社区壮大的问题想请问两位老师,最近国内的开源风也挺火的,想听听两位老师的经验和心得。

张宏波:开源的话,是一个营销问题,其实是我们程序员不擅长的,所以第一步首先我们要先克服这个 mental overhead ,努力去 sell 你的东西,不要埋头只顾着写自己的代码。第二是你要把自己东西的文档写好,因为你东西做到再好,大家不懂也不行,你的代码只是 as good as documention。

另一个我觉得,大 V 的推广是很有用的。为什么 ReScript 一开始也能有一些商业用户,我觉得是因为我们有一些大 V 的支持。像那个发明 React 的人,叫 jodan walker ,他当时在 Facebook 也非常喜欢这个东西,所以他也帮我们做了很多推广。我们也在维也纳开过两次全球用户大会,也在芝加哥开过一次全球用户会议,都是很多人参与的。所以大 V 的支持是很重要的。

然后我讲一个教训,这个教训很深刻。就是向后兼容,可能库层面也有,但语言可能教育意义更深刻。一旦你这个语言发布了一个版本之后,你要做任何语义上的修改都会带来问题。所以我特别能理解,PHP 有很多不好的东西,但因为要向后兼容的原因,不会去修改这些东西。当然我们程序员会有一些洁癖,一个东西一开始没有设计好,后面总是想着去修改它。但是一旦去修改的话,会引起很多很多连锁反应。这是一个我比较深刻的体会。

赵海平:我从比较抽象的角度来聊聊这个事情。实际上程序语言或者开源社区都有一个普遍意义上的特点,就是它都是一个群体智慧的结晶。你看现在的语言,你说它创造者的作用重要不重要?当然很重要,但是随着它第一个版本出来之后,它在社区里面的发展,实际上是群体智慧的结果,大家讨论来讨论去最后把这个语言塑造成这个样子。

所以这个是这个时代的特点。到 2021 年这个时代,没有什么事情可以单兵作战了,这个是我回国之后一个很大的体验。我觉得我们国内的工程师单兵的能力其实都不弱,即便是跟 Silicon Valley 的人去比,但是在群体智慧层面,在一个群体里面,大家共建一个东西,把这个东西搭的特别特别的高,这个不见得是我们的强项。我们可能更多的是去做自己的那一块。

所以开源社区这里实际上是一个标志,如果你在一个开源社区里面把一个东西共建的特别好,就表达出来他的共建能力,可以让大家一起使劲,让群体智慧不断的积累结晶,然后不断的发展和壮大。

让群体智慧的结晶自己有生命力,即便是比如宏波现在休产假了,但是社区里面的人不断的去推动 ReScript 去发展,它自己的生命力就出来了。所以宏波可能是孕育出来了 ReScript ,但是 ReScript 就像一个孩子一样,自己会长大。我觉得这一点是特别重要的。

所以你去看美国很多事情,都是群体智慧的结晶,你看华尔街也是,这么些年人家的金融体系的建设。好莱坞的电影制造,甚至是 Silicon Valley ,那么多公司制造芯片,这不是群体智慧吗?很多公司参与到芯片技术的堆积之中。

这是我们要学的,我们一定要学会群体智慧,一定要学会包容和忍让。不要一上来就去挑毛病,更多的去看优点,更多的去看为什么,为什么别人会有这样的想法。

然后大家很包容,彼此很快乐的去共建一个东西。我们可以有不同的意见,我们可以去争论,但是我们最后要把这个东西给堆起来,让他越堆越高。所以我觉得,可以从开源社区去锻炼和训练,训练我们这种建造群体智慧的能力。

李燕伦:海平老师聊到这个点让我深有感触。我们团队最近开源了一个产品叫 Modern.js,希望大家能够加入到我们的项目中,大家一起来共建,让这个项目更好。我也期待大家能够更善意的看待,不管是字节的开源产品还是阿里的开源产品,大家都能更加善意的去看待它,都积极的去拥抱开源产品,积极的共建。这样我们国内的开源社区才会越来越好。

张宏波:确实是这样,开源是一个确实是需要很多人,你不是靠一个人就可以做成,而且对成员的沟通能力要求很高。所以有时候我们在交流的时候,确实发现需要提高自己在沟通方面的能力,大家一起把这个事情做起来。

类型系统 or 编程语言书籍推荐

李燕伦:好,那也非常期待直播前的小伙伴能够积极参与开源项目,向海外展示我们的群体智慧,我们有非常牛逼的程序员,也要让他们知道我们的实力。

下一个问题是,我想入门类型系统或者我想开发一门编程语言的话,两位老师有什么书可以推荐吗?

张宏波:关于类型系统方面,那种平易近人的书,不是很多。因为你看类型系统的书,基本上全是希腊字母。有一本我觉得可以推荐一下,Benjamin C. Pierce 写的 Types and Programming Languages ,它有个缩写叫 TAPL。它从最简单的 lambda calculus 讲起,讲类型系统。然后从函数式语言角度来说,我觉得还有一本书写的非常好,叫 The Functional Approach to Programming ,这本书特别适合程序员,它给的例子都很有趣,你基本上 follow 下来都可以看懂。而且它最后收尾的是一个关于虚拟机的例子,就从一开始学习这门语言,到自己实现一个类型系统、虚拟机。但这本书它比较老,是上个世界七八十年代的,它用的是一个非常老的语法,叫 Caml Light,但这个语法也很容易读懂。所以这本书我也强烈推荐一下。

赵海平:我印象那个我上一次看那种 dedicated programming language 还是在普林斯特学 new jersey ML 的时候,上的 complier 的课程。但是是一本好老的一本书了,属于比较经典的那种,是我们当年的课本。

张宏波:那本书其实也挺不错的,叫虎书是吧?但是其实编译器这么多年发展不像 AI 那么快,其实老的那本书还是可以的,还是不错的一本书( https://www.cs.princeton.edu/~appel/modern/ml/ )。

此处跳过后面的 live coding

Transpiler 如何平衡速度与灵活度?

李燕伦:今天时间有限,宏波老师的 live coding 暂时先到这里。我们就问一下现场同学提的问题。

有一个问题是回到了 transpiler ,对于写 transpiler 来说,如何平衡转换速度和插件易用性?数据结构用 AST 还是 CST?

张宏波:我简单展开一下,因为这个问题用了很多术语。AST 就是抽象语法树,CST 就是带 concretesyntax tree ,它会包含把一些 comment 也包含进去。

一般来说,如果你要做 IDE 或者做 codemod,比如我要把一个代码转换成另外一种代码,需要保留 comment 的时候,就要用 CST。所以这还是取决于你的 use case。如果像 ReScript ,你只需要用来生产其他代码的话,不需要考虑 commnet ,那 AST 就比较简单一点,生成起来容易一些。

如果你需要 codemod,把一些代码重写的话,那你就需要用 CST。我再补充下,pasring 对于编译器来说,生成语法树是第一步,也是最简单的一步,那一步在整个编译器的 pipeline 里面是不怎么耗时间的。一般来说不用太担心性能的。

真正耗时间的是什么呢?类型检查、类型推断,这可能是平方级的复杂度,甚至是指数级的复杂度。汇编代码生成,寄存器分配也是很耗时间的。解析这块基本上是线性的,很快的。

语言设计容易犯什么错误?

李燕伦:因为我们之前也聊到 PHP 的历史包袱问题,线上的小伙伴有提问编程语言在设计的时候,是什么样的设计决策会,会让它后面可能会决定 break 掉某个特性,或者带着历史包袱继续发展。

赵海平:这个可能一上来很多用户去使用,反而可能成为你的包袱,有很多代码依赖你了。如果你非常尊重这些代码的话,那你可能改起来就会有一些忌惮,会导致这些人的代码需要重写。但是如果是一个 fundamental 的 problem 可能也许长痛短痛的问题了。我觉得真的没有一个比较好的答案,因为这个问题可能是绝对的 case by case 的,每个语言可能多多少少都会遇到这样纠结的 moment 。所以就像我刚刚说的,很多时候都是选择,选 A 还是选 B,在某些情况下是正确的,但是到了另外一些情况下可能就不如另外一个选择。

这个时候,如果从群体智慧的角度上看,如果这是一个群体智慧的话,那 ta 自己就开始纠结了。有的人想这样,有的人想那样,所以可能都会有一个博弈决策的过程。这就没有办法了,这就是语言的历史,它本身就会成为它历史的一部分。宏波你有没有比较好的规则或者原则去帮助思考?

张宏波:这个问题是不可避免的,因为人在刚开始设计语言的时候,他很难会想到那么多的问题。然后后来有用户用的时候,发现确实是有设计上的问题。这东西出现之后,那你到底要不要改,这是很困难的问题。

像 Rust 它经历了很长很长时间才到 1.0 版本,它好像是 2015 年还是 2016 年才有 1.0 版本。在之前已经开发六七年了,它都不叫 1.0。为什么?它就是告诉你,它随时都可能修改代码,我就先把你的预期管理好,我就随时都可能会改,这样相对好一点,给你(语言设计者)一个容错的时间比较长。所以我可能会先开源,然后叫 0.1 、0.2 版本,但我不叫 1.0 版本,就是告诉用户这个预期它可能随时都会改的,这样可能沟通起来会容易一点。

但一旦你搞了 1.0 以后,你再改的话,可能就要被群攻了。

低代码怎么看?

李燕伦:下一个问题是关于最近非常火的低代码领域,两位老师怎么看待现在层出不穷的低代码解决方案,以及未来低代码的发展方向会是怎么样的?

赵海平:很有意思,以前 Microsoft 有过一个想法,我们去创建很多 Component ,然后其他的人抓过来用就好了,Component 我去 configure 一下就可以了。然后发现最后有一个 catalog,里面有各种各样的 Component ,整个 catalog 特别复杂和庞大,去查询和寻找到你想用的 Component 本身变成了一个很复杂的任务了。

低代码我没有了解过,如果拖拖拽拽你指的是像 UML 那种,如果你要解决的问题被很好的 categories 的话,一共就这么几类问题,然后拖拽就能大幅提高效率。但是如果到一些细节上,你还需要去改拖拽的 object 的时候,那从问题复杂度上看,可能并没有帮你节省太多。所以可能它不会成为一个通用的解决方案吧。

但是在某些情况下,毫无疑问它是有很多好处的,对吧?你想想看,我们整个 macintosh ,苹果 MacOS 系统的操作,实际上就是把最常用的一些命令变成鼠标这样的拖拽动作。但依然会有特别懂 Mac 的人,和不太懂 Mac 的人。那些不太懂 Mac 的人他是知道这些拖拽动作,但是只要遇到一些复杂的问题的时候,还是会卡壳。

所以说这个方向的未来发展,我觉得可能是去寻找特别适合的场景,会在一些自己的所谓的 niche 里面或者可大可小领域内,在自己专有的领域里面可能还是挺有用的。

是什么在阻碍 haskell 进入工业界?

李燕伦:刚才我们有聊到 haskell ,现场有人提问,haskell 有很多厉害的编程范式,但是似乎即使在一些冷门的场景中都不会使用 haskell ,想请问两位老师,阻碍 haskell 在工业界中使用的因素有哪些?是学习难度还是文档不好?亦或是其他因素?

张宏波:haskell 它肯定是很多因素综合在一起的,它不是单一因素导致的。haskell 有很多好的东西,但也有很多问题。我觉得 haskell 最大的问题是,你让用户用它的时候,必须放弃掉一些东西。比如我想用 haskell 很好的类型系统,那我就不能够很容易的修改数据。所以它不是严格意义上更好的东西,你必须为了获得它很好很安全的类型系统,你就得舍弃某样东西。

像我们小时候学数据结构和算法,那基本上 80% 都是要修改内存的。那你用了 haskell 之后,相当于 50% 、80% 的东西就不能用了,你必须得要用纯的函数式语言,不能再用那些东西(数据结构和算法)。

ReScript 就没有这样的一个问题,就像我刚才展示(live coding)的那样,你还是可以复制,还是可以修改,以前的东西也可以用。但是你也可以用更好的东西,而不是把原来的东西完全给抛弃掉。haskell 是一个比较纯的东西,用了我这个之后就不能用其他的东西了。

赵海平:我自己给这种现象定了一个名词,就是传染性比较强。

张宏波:对,就是你必须放弃以前学到的东西。

赵海平:传染性比较强。contagious ,它需要迅速的占领全部的,大家需要全都改成 functional style 。

很有意思,原来跟我一起做 PHPCompiler 的有一个小伙子,他很年轻,他是 haskell 的超级爱好者,他恨不能什么东西都用 haskell 去写。然后他有一天就跟我说,咱们干脆用 haskell 来做我们这个项目吧,我说没问题呀,但是有一个条件,你要把所有的部分全改成 haskell 我就 OK,如果不能全改了,只改你想要改的那一部分,然后剩下的这些怎么玩。所以这个推广是一个巨大的问题。

它就是有 contagious ,然后另一方面它就是有学习难度,它的 functional style 的想法还是不太一样。

张宏波:其实我觉得学习难度当然是有的,但是我觉得相比 C++ 来说,还是比较容易的。可能因为我接触的比较多,从小就开始接触 C++ ,学了这么多年了,所以你觉得它不难,但是 haskell 你没怎么学,不能说只学一学期就说比 C++ 难,我觉得如果学同样长的时间,可能 C++ 还是更难一些。

李燕伦:我觉得从语言历史来看,haskell 有点像背后的老大哥,我知道很多语言都受它的影响。甚至像 React 推出 hooks 之后,函数式编程的概念又得到兴起,我觉得函数式编程本身也受到 haskell 的影响。我觉得对于我来说,haskell 像是一个很神秘的语言,但又时时刻刻影响我的工作和生活。

张宏波:对,因为我们做学术界的,基本上就扎堆在 haskell 上面,你的博士论文可能就是给 haskell 加一个特性,加一个 extension 。学术界基本上都是在 haskell 上做研究。所以在这一块上面吸引了很多人。但是你如果真的用在工业界,你就必须得有很多限制。

元宇宙的编程语言?

李燕伦:最后一个问题,想聊一下最近的热点。现在元宇宙这个概念真的是太火了,Metaverse,甚至宏波老师的现任公司和海平老师的前公司都改名成了 meta。所以想请问两位老师觉得未来元宇宙的主流编程语言会是什么?

赵海平:我不知道你们有没有看过 roblox company ,Mateverse 应该就是从 roblox 开始聊起的。那如果你问我 Mateverse 里面主流的编程语言是什么,我觉得我马上就可以现学现卖现用,应该就是低代码(哈哈)。roblox 里面那个编程你们有没有看过?就是低代码。

张宏波:是吗?那我回去得试一下。

赵海平 对,就不太需要特别强的编程 skill ,但我也能很快的攒出一个世界来,还有一些逻辑在里面。那个绝对是低代码非常好的一个例子。

张宏波:那个和 minecraft 有什么区别?

赵海平:很像特别像特别像。

国内编程语言的出路?

李燕伦:还有一个同学关注国内,想请问两位老师,国内编程语言有什么出路?未来在哪个领域可能出现新的编程语言?

张宏波:我觉得国产编程语言首先你要放下这个自己是国产的想法,应该是这个语言它做的很棒,然后碰巧是国产的。而不是基于我们是一个国产语言,然后如何如何的。只是单纯这个语言做的特别好,然后他碰巧是中国人做的。不要去纠结在国产怎么怎么样上面。

而且我感觉一个语言如果做的很好的话,一定是面向全世界的。而不是只面对一个特性的用户群,它是立足于中国但是面向全世界的。

赵海平:还有一点是,它肯定是应运而生的,是有一个场景需要一个语言。我举一个例子,原来在阿里的时候,他们搞量子计算机,那我为了在量子计算机上编程,我就需要一个语言。你看,多合理对吧?恰好那个量子计算机是阿里达摩院搞的一个计算模型,那自然这个编程语言就是 made in china 了,这不就是说中国创造了一个编程语言对吧。

张宏波:对,是这样,你看鸿蒙系统,你需要在上面编程,那自然需要一门编程语言了对吧。还有最近新版本的 WebGPU ,它是做 GPU 操作的,它需要一个新的 shading language ,它也出了一个语言叫 WGLS 跟以前的 GLSL 就不一样了。所以你有一个新的平台,就自然会出门新的语言。

李燕伦:我非常想让对话永远的持续下去,但是今天时间有点不太够了。非常感谢两位老师宝贵的时间,我们今天的访谈到这里就结束了。也非常感谢正在看直播的同学们。

我大概介绍一下我们的这个活动, Web Infra 大咖面对面:是我们 Web Infra 团队和掘金社区的小伙伴一起办的技术分享活动。它的起源不是我们有 KPI/OKR 要求,它的起源于我们 Web Infra 内部的技术分享,因为我们请的一些老师聊的内容太有趣了,也有一些字节外的同学想听,所以我们想发展成字节内外的同学都可以来听。我们会做成一个系列,每次请行业内的大佬来分享。

刚才我们聊到元宇宙,前端同学的话可能会想到 WebGL,聊到 WebGL 肯定就会想到 Three.js 。所以下一期我们会邀请 Three.js 的作者 Ricardo 过来聊一聊 WebGL。

大家可以关注一下 ByteDanceWeb Infra 的公众号,以及掘金技术社区。期待我们下一次再见面!

- END -


: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存