混沌周刊 #31 | 小心打牌

周二下午好,欢迎来到《混沌周刊》第31期。《混沌周刊》是一个试图从开发者角度为你带来这个世界上发生着什么,发生过什么,以及未来可能会发生什么的栏目,(差不多)每周更新。您可以通过首页的RSSTwitterTelegram频道和电子邮件等方式订阅。如果您觉得本周刊对自己有所帮助,请不吝推荐给其他人,多谢。


🦅 一手打烂的好牌

一个多月以前,Swift语言之父Chris Lattner在Swift官方论坛中公开,自己去年已经离开了Swift核心团队,原因是「有毒」的团队环境。甚至在去年一次会议上,他甚至被不止一个核心团队成员辱骂和大叫。尽管早在2017年,Chris已经离开Apple,但他依然是Swift核心团队的成员(在Saleem Abdulrasool加入以前,除了Chris其余全是Apple的人,我曾调侃这颇像晚清立宪的「皇族内阁」)。Swift在2010年夏天立项,2014年正式发布,这四年大部分时间Chris几乎是独自工作在这个项目上。语言之父在核心团队受到如此对待,实在是难以想象。

当然,Chris对Swift感到失望,不只是因为某些成员的不友善对待,更是因为社区和语言的发展已经严重偏离了他当初的理念和预期:

在Swift语言演化这件事上,我起初的想法还是继续参与社区讨论,但当一些讨论只带来无价值的争吵,当一些提案被直接通过而无视我的评论和担忧,以及当与核心团队一起工作时常遇到不透明时,我意识到我的努力只会增加和同一群人的摩擦,我只是在浪费时间而已。我也并不认为只有我一人有这种想法,比如那条贴子下也有很多社区成员明显也不理解那个提案的动机,声音也没有得到倾听。他们来找到我,因为他们以为我能帮忙。

显然,Swift超出了我个人影响力的范围,并且当初我在意的那些设计理念(比如「简单,但可组合」)已经不再风行。同时,我在Swift之外还有很多兴趣,并不缺可以花时间做的事情。我是那种始终向前看的人,所以当情况让人失望时,我继续向前,并为不用再处理这些事而高兴。

常常和Swift做比较的语言是Rust:

  • 两者都是静态编译型语言(甚至都背靠LLVM)
  • 诞生时间相近(都在2010年左右设计,Rust 1.0发布于2015年,Swift发布于2014年,但2015年正式开源)
  • 理念相近(Rust「使每个人都能打造可靠、高性能的软件」,Swift「把不可能的事变成可能,把复杂的事变得简单)
  • 甚至GitHub Star数也没差太多(截至本文发布时,Rust有65万星,Swift有59万星,有些差距,但长期以来,二者的差距很小)

Mozilla打造了Rust,势利来说Rust没有一个好「爹」,尤其是Mozilla还经历过一轮大裁员。但塞翁失马,焉知非福:2021年,五家公司(华为、Amazon、Google、Microsoft、Mozilla)共同成立了Rust基金会。越来越多的新项目开始使用Rust:用Rust写的操作系统用Rust实现的整套命令行工具,WebAssembly几乎是Rust社区主导,Linux内核也要接受Rust代码了。我们往期的周刊也提到了非常多基于Rust实现的项目。并且,Rust已经占据了Firefox代码库中近10%的源码。要知道这个总数是包含了浏览器自带的JavaScript和HTML的,C++代码也只有27%,这个比例非常惊人。

反观Swift,开局即背靠全世界市值最高的公司,自带稳定的目标用户群体。2015年的开源和向Linux的移植更打开了无限想象。七年过去了,我们还是没看到Swift在Apple平台之外(在国内,甚至这一点还要打上问号)有任何确定的领地。2020年初,IBM也宣布放弃对Swift on Server的资源投入。虽然说语言的发展壮大是时也命也,但如果Apple当年能更在意社区运营,对Swift的态度能更开放,会不会不至于到今天这个一手好牌打烂的样子?也许这样的话,对比Rust、C#,甚至Kotlin时,也不会那么唏嘘。

💬 向C语言说C语言

在C语言里是否可以使用垃圾回收?可以。这是一个给C语言使用的GC实现。由于C的语言设计比较简单,所以实现GC的核心,「可达性」,需要一些hack手段。但也因为C语言核心简单,所以我们可以一窥其他语言的垃圾回收是用何种思路实现的。

有一种我也许提过的看待C语言的视角,我至今觉得很合适——C的本质就是高级汇编。有人可以辩称说,既然可以编译到原生二进制的语言都可以转换为汇编,那是否它们都是高级汇编?非也。C语言始终保持低级抽象,并且没有提供C++一样组织高级抽象的能力。这就意味着,熟悉C和汇编的人可以看到一行C代码就反应出对应的汇编是什么样子,其他语言不行——你不知道这个方法是否被重载了,析构函数会做什么,这个位置是否有可能抛出异常……这些因素最终会使得汇编面目全非。

「高级汇编」的另一种理解方式是,你可以把其他语言编译到C,然后把剩下的活交给C编译器就可以了,反正不可能有平台不支持。第24期,我们也提到过有人通过砍掉C的部分特性设计出了一种跨平台汇编。因为各种系统对C的支持实在是太过广泛且悠久,所以C的ABI在同样的操作系统和硬件架构上基本是稳定的(C++不行,即使在同个系统里,不同编译器的实现,甚至同个编译器不同版本的实现,都可能有差异)。我们可以看到大量的语言(比如前面对比的Rust和Swift)的FFI(跨语言接口)本质都是C的接口。因此有人抛出暴论——C不是一种编程语言,更像一种协议

不久前,C语言的下一个标准版本,C23也基本定稿了,变化不大:bool和十进制浮点数Decimal终于成为标准类型,有人力推的Lambda表达式并未进入。


📱 好玩的新软件

Rayon,一个开源的服务器监控管理程序,在macOS和iOS上可用。

Session,一个不需要手机号(甚至不需要注册)的匿名加密聊天程序。不用注册,是因为它采用了类似区块链的原理——随机生成密钥对,加密和辨识用户都靠它。很有创新性的想法,可惜这个名字太不利于SEO了。

Publish,又一个名字没考虑SEO的软件,一个Swift写的静态网站生成器,类似Jekyll或者Hexo. 有人说考验一个语言是否流行的标志,就是是否有它写的静态网站生成器,这下Swift终于成熟了。

有一个在命令行解析处理JSON的程序叫jq(会不会很多年轻人已经不会联想到jQuery了?)。然后我们还有了fq,处理的是图片、视频、音频等二进制文件。

iSMS:基于机器学习技术,免费的iOS短信拦截App.


如预期一般,Chrome版本号步入了三位数大关,目前还没有发现严重的网站错误。Chrome团队还专门写了篇博客纪念这个里程碑。鉴于Firefox也要步入100版本了(目前稳定版98,每6周更新大版本),我还挺怀念那个软件没有固定更新周期的时代的。

有人发现,Mozilla似乎限制中国大陆用户使用部分广告过滤插件,原因和Mozilla的中国分公司因屏蔽广告被相关公司起诉有关。

Web开发领域最权威的文档MDN又改版了

Swift社区的bug管理系统从自建JIRA迁移到GitHub. 此前各类制裁事件让人们担心代码托管平台带来的风险。但Git的设计决定了它可以很轻易地切换代码托管仓库。对社区而言,真正重要的资产或许是各类issue和PR下的讨论,而它们是无法随Git轻易迁移走的。

当然了,相比于被制裁,更应该担心的是GitHub会不会哪天又挂了。刚过去的3月,GitHub出现了多次服务中断的事故。根据GitHub官方博客的事后总结,问题主要来自他们的MySQL数据库集群。

此前我们提到,node-ipc这个仓库被作者以反战名义有意投毒。后续有人挖出了作者的个人信息并公开,还指出他疑似婚内出轨……大概没人能想到这事会如此收场。有关此事,还有一条网络评论让我印象深刻:开源社区虽然脆弱,但整个开源生态圈也有强大的自净能力,想象一下封闭的商业软件里如果发生类似事件会如何吧。我同意。


本期的《混沌周刊》就到这里。如果对本刊感兴趣或有任何建议,欢迎在评论区里留言,以及分享给更多的朋友,谢谢!


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注