关于Moonbit-native方向的一点的畅想,望批评

首先叠甲,我支持现有 moonbit-native 存在的意义。
该话题只是讨论是关于 --target=X(native-lang) 的一些额外的畅想。
Moonbit的语言架构非常优秀,这是客观领先其它现代化语言的条件,并且它足够纯、也这正式因为这个基础,我才有这些畅想:

经历过 kotlin-native 的折磨,我和我的团队觉得,我们需要 --target=kotlin、–target=swift、-- target=ets 这样的编译器(甚至可以允许社区自己开发target插件),而不是像现有的 compose-multiplatform 一样,直接输出类似 --target=iosArm64 这样的平台二进制。

  1. 因为现在的Native-UI越来越多的使用声明式,就像 Compose、SwiftUI、ArkUI。而 Compose-Multiplatform、Flutter 本质上是面向一个画布在做多平台开发,在与 PlatformView 混合渲染时,需要解决大量的互操作性问题,并且无法规避性能妥协。
  2. 以 Flutter 为例,画布归根结底是画布,团队需要投入大量成本去模拟平台UI,这对于开发者来说也许是好事,但对于维护团队来说,可能也是一个问题。

如果我们真的有了 --target=X(native-lang) ,意味着moonbit能直接输出kotlin、swift、ets、dart,在ffi的加持下,意味着我可以通过ffi,来直接产出 jectpack-compose、swiftui、arkui、flutter 的代码,那我很乐意把我们的代码资产做迁移。因为这里好处是非常诱人的:

  1. 那么首先,生态问题就无需顾虑,就像当初kotlin寄生在java上一样,这种迁移是平滑的,收益是立竿见影的。
  2. 其次,是性能上也无需顾虑,像上文提到的GUI开发,跨平台的Native-GUI开放方案,需要维护团队自己去优化性能。而如果是直接变异成目标语言,至少原理上可比compose-multiplatform、flutter、arkui-x诱惑力大多了,吃的可都是官方平台的优化(特别是现在的ArkUI,不允许命令式的去做UI开发,社区里出现了各种奇葩方案,或者不得不考虑flutter这种画布方案,但这也就失去了ArkUI的优势)

不过,这里的存在的问题远比想象的复杂。比如每一种语言的多线程模型是不一样的,但我想,moonbit足够纯,也许也不是问题。
何况,这个方向就是要面对这些客观情况,至少我和我的团队是愿意去为这些收益去面对这些取舍的。

3 个赞

MoonBit 未来是否考虑,后期如果编译器完整开源了,让某一层 IR 相对稳定,允许社区开发 xxlang_of_moonbit, 类似于 Js_of_ocaml, Wasm_of_ocaml

我个人理解哈 这不就是类似kotlin做的工作之一吗?通过kotlin k2 compiler 编译成fir前端表示,在转成kotlin ir 解析ir从而输出各个平台的代码,甚至是字节码。kmp就是如此,操作也是通过上述翻译的方式,实现处目标平台代码,底层都是通过skia进行渲染 。

k2这套逻辑,只是手段,不是目的。何况它还需要包含自己的runtime。

反之,像uniapp-x将一个ts子集编译成多平台语言。这个更像是我所表述的

那就是要涉及ast了,这块太过复杂和折磨了。只要有人愿意用moonbit ast来转成对应平台的代码,那都是能实现的

kotlin也有对应的ast,但是不完善,开源的就有,我看了下源码表示很折磨人,太过复杂了,感觉跟kotlin compiler 这部分一样复杂

不现实,搞这个属于脏活累活,有茫茫多的坑,对于新团队新语言来说最好不要碰。
我始终认为一个编程语言要成功,需要一个主力领域,mbt最好选择一个端发力,再去扩展边界。
mbt坚持只要pure的话,我不是很看好,纯计算部分事实上没有想象中场景多,更多的场景仍然是和runtime的交互,FFI能力有限限制太多只是兜底方案。
我觉得专注 native 和 wasm 就行,“本语言”的生态才是最重要的,各种绑定迁移其他语言的生态都会大幅增加工具链的复杂度,会很难用。

1 个赞