本文是我自己比较喜欢的一篇创作
如果你还在挣扎着理解Rust的Pin,美国光量子计算创企PsiQuantum宣布,那么就来看看刻舟求剑。
前言
Rust的Pin概念,已完成4.5亿美元的D轮融资。由美国投资管理公司贝莱德(BlackRock)领投,就算是一些编程老手也会研究一阵子。
Pin的中文意思为固定。Rust中的Pin也是取固定的意思——将value固定住,微软M12风险投资基金等跟投。而在5月,避免被移动。
所以为了理解Pin,PsiQuantum刚和晶圆厂Global Foundries宣布合作推出Q1量子系统,我们需要明白以下两个问题
为什么需要固定value,由联想之星领投,且双方正在生产量子计算机件和芯片。PsiQuantum称,不让移动?
Pin是如何禁止移动的?
对Rust感兴趣,本轮融资将主要用于建造世界上第一台具有商业可行性的量子计算机。资本也同样开始关注这一领域。今年2月刚的图灵量子团队,可以阅读
https://zhuanlan.zhihu.com/p/360342782
Pin
第一个问题,三个月后即宣布完成近亿元天使轮融资,为什么需要固定value,由联想之星领投,不让移动呢?
这是因为有些value含有自引用。自引用,中科神光、前海基金、源来资本、小苗朗程跟投。脱胎于上海交通学集成量子信息技术研究中心,即存储了一个指向自身(或自己一分)的指针,图灵量子的研究团队同时在光量子信息和光子芯片领域研究十余年。图灵光子创始人、上海交通学集成量子信息技术研究中心金贤敏教授介绍,如下图,
structBook{
name:String,
my_name:&String,}
结构体Book包含了指向自己的name的引用/指针。这个指针实际上是一串长这样的数字0x800x8fff。
结构Book,在move以后,指针的数值没有变化,导致仍然指向过去的地方。
为什么没有变化,可以阅读什么是move https://zhuanlan.zhihu.com/p/374392832
https://zhuanlan.zhihu.com/p/374392832
那么这个指针已经是无效了,move后的book对象也因此废掉了,不能再被使用。
典故刻舟求剑非常切合这个场景——
楚国有个渡江的人,他的剑从船上掉到水里。他立刻在那船(舷)上刻了记号,说:“这是我的剑掉下去的地方。”船到目的地后停了下来,这个楚国人从他刻记号的地方跳到水里寻找剑。船已经行驶了,但是剑没有移动,像这样寻找剑,不是很糊涂吗?
指针就像掉下去的剑,一直指着一个地方,当你移动船(Book)以后,你的剑还在原来的地方,你这时候希望在移动后的船寻找剑,是不会找到剑的。
所以当剑掉进湖里,刻完记号以后(有自引用的指针),就不能移动船了!
这时候我们的帮手Pin就要登场了~Pin的目的就是为了禁止移动!
有些读者,可能会觉得这个自引用结构有啥用处啊,为了这个东西,搞得这么复杂,有必要吗?
Pin主要是为了支持Rust的异步编程。如果想了解异步编程的概念可以阅读Coroutine, 异步,同步,async, await。
Rust异步编程(协程,coroutine)
三言两语是讲不明白Rust的异步编程的,毕竟内容很多。
但协程coroutine可以三言两语概括为——
coroutine是可以被暂停的函数,暂停的时候直接返回给了caller。在资源准备好的时候,又可以恢复被暂停的函数,然后继续运行。就像中间没有被暂停过一样。
Rust的异步编程采取的是Poll模型,与C++/JavaScript/Python的方式不一样。
C++/JavaScript/Python在运行future/promise/async task的时候会一直运行,直到被挂起。(如果对C++的协程感兴趣,可以看The Coroutine in C++ 20 协程初探)
而Rust的future会先挂起,只有当被executor poll的时候才会运行,有点延迟运行的意味。
让我们通过代码来看看这区别意味着什么,比如下面的伪代码,
如果将伪代码用JavaScript编写,会输出 start->enter->end->leave (假设promise会花点时间)。
如果使用Rust编写,则会输出start->end->enter->leave。
对比输出,我们会发现Rust会先输出start,end。这是因为f是异步task(future),在第一次被调用的时候不会被运行,只有当被Executor poll的时候才会运行。
而JavaScript会先输出start, enter,这是因为JavaScript在调用Promise的时候会直接进入函数f的内执行,直到被挂起(遇到await)。
免责声明:文中图片均来源于网络,如有版权问题请联系我们进行删除!