当前位置:   article > 正文

gm怎么刷东西 rust_只使用 rust,可以写一个 flutter 吗?

用rust 重写flutter

d7ab0b19f27a27e22cdd7726c77a7769.png

halo大家好,俺是 132,昨晚在群里讨论了很多天马行空的东西,我决定记录一下,虽然不一定能搞

前阵子写了 fard,小程序底层架构,大家应该也都知道了这个套路,无非就是 js 引擎跑 js,得到一个结果,传递到 UI 线程,画 UI

万变不离其宗,RN,flutter,electron,deno 统统都是一个套路,只不过 RN 的 UI 线程是原生组件库,而 flutter 则是 skia

假如我们现在要用 rust 写一个 js 版本的 flutter,会是怎样的?

deno

deno 是很经典的一个 rust 项目,基本上我们使用 rust 写框架都可以从 deno 学到一些东西,尤其是 binding,进程隔离和通信,内存共享等等

如果你看过 deno 源码的话,你会发现 deno core 核心代码也就千行级别,做的事情非常简单

我们如果写一个 rust 版本的 flutter,可以说 deno core 这部分代码是肯定少不了的

why not v8?

很好,核心的 core 部分已经决定抄 deno 了,但 deno 还是绑的 v8,这个我们是一定要砍掉的……

为什么要砍掉 v8 呢?因为我们在画 UI

我们画 UI,没有复杂的 js 逻辑,并不需要 v8 这种 JIT 的引擎,使用 v8,我们画 UI 的过程是这样的:

js业务 -> babel -> 打包成新的js -> v8 解析 -> 跑 -> 得到结果 -> 线程通信 -> 画 UI

但是这整个链路实在是太长了,我们不想要 JIT

js业务 -> 编译 -> 字节码 -> 跑

对于 UI 来说,js runtime 的性能是不值钱的,因为 UI 的逻辑 90% 都是偏向于简单,不会出现太复杂的 js 代码

大家纷纷意识到 UI 的特点,都选择了 AOT 的路线,比如 flutter 和 dart

怎么说呢,如果你在阿里,那么无脑用 v8 还是可以说得过去的,毕竟里面有很多熟悉 v8 的人

但 v8 真的不咋地,不适合用来画 UI

AOT 和 wasm

我们既然砍掉了 v8,没了 js 引擎,那怎么办?跑二进制,大家可能马上就可以想到 wasm-like

为什么加一个 like,是因为我们只使用它的这种思路,我们使用 aot 的编译方式,一次性编译出来字节码,然后,然后就没有然后了

虽然是同样的思路,但目标不同

  1. 不在 web 端跑
  2. 只跑 js,不跑其他语言
  3. 性能无关

但是无论如何,js 引擎我们是不需要写了,只需要写一个 rust 版本的 wasm vm 就好了

而至于这个字节码怎么打包,完全可以移驾到 js 层

why not skia?

砍完了 v8,c++ 的部分基本上没了大头,但有个比较尴尬的问题是,skia 也是一个 c++ 库

我们的目标是全部都用 rust 实现,可以有 js 但是不能有 c++

skia 的 API 使用方式其实是和 canvas 神似的,我们完全是可以在 rust 上直接实现一套类似的 API

比如这个:servo/pathfinder

真特么刺激~其实是只是简单的 UI 绘制并不难,图形库的重点在于文字的渲染,需要做字体文件的 parser 和材质,这部分的工作量说实话还是蛮大的

fre

fre 是一个前端框架,以往都是将 vdom 渲染到 web 平台,调用 document 的 API

现在我们想让它产生一个指令集,然后画到 rust 端的 canvas 上

整体思路和 html2canvas 差不多

但有一点需要注意,虽然 fre 是一个 immediate mode 的框架,但是我们产生的 diff 需要局部的重绘 canvas,所以这个和 fre 的 diff 也有一些关系,我们 diff 的结果可能不再是 dom 节点级别了

但是我不管,这总归是 js 的事情,只要是 js 的事,那就不叫事!

总结

我们这篇文章,主要是探讨,只使用 rust,有没有可能实现一个 flutter

我们砍掉了 v8 砍掉了 skia,然后从 deno 和 wasm 借鉴思路,最终,画了个饼:

37085e014f2f12e777a2151567b6ce7d.png

首先理论上是完全可以的,与此同时,这每一个阶段,都很有意思

架构就是这样,来来回回就那么点东西,只是大家不同的认知不同的权衡,不断切换不同的组合而已……

以上,就是我所思考的全部啦

大家可能会问,为什么一定要执着于 rust 呢?我 c++ 那么多现成的 js 引擎,那么多现成图形库,要 aot 有 aot,要 canvas 有 canvas……

其实这个问题,去问 ry 更好些,这不是一个能不能实现功能的问题,这是一个方向问题

我个人比较喜欢探讨 rust 的可能性

它没有个能用的 js 引擎,它没有能用的 GUI 图形库,这就是 rust 啊,我们基于 rust 现有的生态去探讨某种可能性,远比 c++ 的方向有意思多了……

米娜再贱!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/121365
推荐阅读
相关标签
  

闽ICP备14008679号