大模型时代,还需要跨端framework吗?
跨端
在我近十年的大前端从业经验中,有一半是在和flutter/rn打交道。虽然,flutter和rn官方和社区已经在非常努力的优化、填坑了,但是这两者的坑还是远远高于原生开发。
但是,在锁表的大周期下,华为带着鸿蒙来了,给水深火热的客户端开发带来了新的降温神器:乍一看,鸿蒙是带来了更多的开发需求。但时间拉长,在成本的驱使下,大量中小厂的客户端要不然更快的被完整放弃,要不然科技以套壳为本,客户端最终会落到更加边缘的窘境。当然,跨端很可能会是救客户端于水火的最后稻草,或者跨端真的还需要吗?
为什么要跨端
跨端能带来什么?无非是几个优点:开发效率、多端一致性和动态化(部分多端才有),当然对于大厂来说,跨端还能带来前所未有的可控性,毕竟整个framework层都是打到app里的,可以自主修改的,统一的代码。
前两者都是由单点开发,多点运行带来的。动态化和可控性则是不同framework各有千秋,即便没有跨端,也有很多办法达成(只不过,因为跨端有前两个好处,各家做动态化的时候通常会魔改rn)。
跨端的问题是什么?不同方案问题不尽一致,但是跑不出性能、与原生交互能力、系统特性追随速度等核心痛点。
在没有大模型之前,跨端的评价大概率是正向的,毕竟又贵又慢的客户端是生产成本上极为显眼的组成项。
怎么跨端
跨端无非是几个层面的adapter:
- 语言:首先是开发时统一到一个中间语言上,无非是kotlin、js、dart还是别的。运行时的分野比较大,传统的走集成一个vm(或者调用系统的),KMM则是直接在编译时编译成对应平台原生代码。对于KMM来说,需要用Expectations与Actualizations来抹平语言层面的差异。这是一个专家枚举差异的过程。
- 框架:通常也是有一个中间层定义,module、channel、jsbridge、expectations都是一样的逻辑。对原生依赖越小,这部分的风险和成本都越小,但是都少不了。这也是一个专家枚举差异的过程。
- UI:无非是自己画和用系统画,自己画集成困难一致性好,用系统一致性差集成好,但都有明显短板。性能上的劣势也多由此带来。这里不太是枚举差异,而是重新定义dsl。
新办法
从上面的分析来说,跨端永远是用用户体验换开发效率的一个妥协选择。随着设备性能提升和框架能力增强(不过最近感觉每一个跨端框架都在雕花而不是想办法解决最要紧的问题),用户体验的损失会越来越小。但是,用户体验永远是有损失的。那么,有什么别的办法吗?统一架构+大模型翻译可能是一个方向。(我曾经有一段时间对llvm翻译多端跃跃欲试,最终因为ast实在太复杂放弃了)
首先,要统一多端的架构,不论是基础的in-house能力还是上层的业务设计逻辑都需要思路一致。
基础能力需要保证层级、可见性、接口风格和参数尽可能一致。此时,大模型翻译需要的特殊上下文是最少的,prompt也不需要特殊说明什么,让模型自己去做语义翻译就行了。可以认为用不同语言构建一个相同的基础能力语义化DSL。
业务设计就更重要一些,毕竟底层方法调用只是简单的fix build,而业务是真的要让翻译完的逻辑完全一致的。之前写过的一个文章里也主要是絮絮叨叨的说这个问题。
架构搞完之后,有一个重要的SOP:翻译后的代码,仅允许修改以保证运行,不能人工迭代。因为,要保证迭代时一直能做到生成+fix build,一旦放开人工修改的口子,后续的分叉会来的非常快,迅速打破模型上下文的限制,让翻译极为困难。
一次尝试
之所以敢说这个新办法,是因为我真的尝试了一次。
功能相对简单:网页内容的分享,从flutter迁回原生实现。有7种分享入口,4个jsbridge。但涉及到了UI、逻辑和框架差异,能很好的验证我的想法。
UI
翻译水平并不好,原因有几个:
- UI比较简单,懒得优化prompt,优化prompt的时间足够我自己fix了
- 老代码业务和UI耦合非常严重,模型很容易lost
- 没充值ChatGPT,只是嫖了公司的openai api,缺乏ChatGPT产品化的各种优化
按之前的经验,好好调一下prompt,用figmaToCode生成的无业务逻辑的纯UI代码,翻译可以做到基本可用。组件和不知道的方法,通过prompt能自动加上fixme,方便快速修复。不过ChatGPT写snapkit edge加不全的毛病还是一如既往。
逻辑
逻辑部分可以分为几个部分:核心业务逻辑、数据层逻辑、对外交互。
核心业务逻辑
使用原教旨(但手写)的状态机来表达。先写的kotlin,用enum表达状态,每个状态有moveIn和moveOut两个可以复写的方法。核心业务逻辑由state流转表达。
这部分翻译起来非常快,正确率也很好。但swift的enum并不支持复写方法,生成后的代码有大量的switch-case,只能手动将结构改成enum->concrete operator的映射关系。这种简单跨模式的翻译是需要给出few shot example的。
数据层逻辑
这里的数据层其实很简单,主要是解析jsbridge的数据和网络请求,并没有什么了不得的数据层逻辑。
这部分需要稍微在prompt里面说明一下具体的库。因为安卓有livedata、retrofit、rxjava、gson,swift则选择了alamofire、rxswift、rxalamofire、swiftjson,告诉模型用什么库能极大的降低修改成本。
对外交互
一个是分享接口绑定,另一个是事件绑定。
分享接口由于是现成接口,并没有用到翻译,一行代码自己写的。
事件绑定也是需要说明使用rxgesture,不得不吐槽一下iOS倒霉的事件绑定方式。这里的翻译都漏掉了filter掉首个事件,需要特殊prompt。
结论
最大的问题还是出现在UI上,而UI的复原是对平台知识要求最高的部分。还是期待有人用langchain的figma document做一个完备的方案(为啥这个api在docs上找不到了)。
另一个问题是swift/oc这种奇异且不稳定的语法,带来了很多fix build的工作,而且xcode实在难用。如果用idea全家桶再买上copilot,体验能提升一个量级。
这个方案还是需要双端都略懂的开发结对工作。整体双端知识的要求很低,有个半年工作经验就差不多了。开发效率和一致性介于需要native module的rn和纯flutter之间,用户体验是可达到的最高。人员吃紧的团队内是值得推广的。
相关文章:
大模型时代,还需要跨端framework吗?
跨端 在我近十年的大前端从业经验中,有一半是在和flutter/rn打交道。虽然,flutter和rn官方和社区已经在非常努力的优化、填坑了,但是这两者的坑还是远远高于原生开发。 但是,在锁表的大周期下,华为带着鸿蒙来了&#…...
ASP.NET Core----基础学习05----将数据传递给视图文件的五种情况
文章目录 1. 类型一:使用ViewData将数据传递给视图文件(默认视图文件)2. 类型二:自定义选择视图文件 并传递ViewData数据3. 类型三:使用ViewBag将数据传递给视图文件4. 类型四:在视图文件中使用model转化为…...
Flutter实现局部刷新的几种方式
目录 前言 1.局部刷新的重要性 1.概念 2.重要性 2.局部刷新实现的几种方式 1.使用setState方法进行局部刷新 2.使用StatefulWidget和InheritedWidget局部刷新UI 3.ValueNotifier和ValueListenableBuilder 4.StreamBuilder 5.Provider 6.GetX 7.使用GlobalKey 前言 …...
力扣题解(回文子串)
647. 回文子串 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 思路: 首先,本题要求的是数目,而且不要求没…...
对数的基本概念
概念 在数学中,对数是对求幂的逆运算,正如除法是乘法的倒数,反之亦然。这意味着一个数字的对数是必须产生过另一个固定数字(基数)的指数 如果a的x次方等于N(a > 0, 且a不等于1),那么数x叫做以a为底N的…...
C双指针滑动窗口算法
这也许是双指针技巧的最⾼境界了,如果掌握了此算法,可以解决⼀⼤类⼦字符串匹配的问题 原理 1、我们在字符串 S 中使⽤双指针中的左右指针技巧,初始化 left right 0,把索引闭区间 [left, right] 称为⼀个「窗⼝」。 2、我们先…...
WPF学习(6) -- WPF命令和通知
一 、WPF命令 1.ICommand代码 创建一个文件夹和文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input;namespace 学习.Command {public class MyCommand : ICommand{Acti…...
升级到LVGL9的一些变化(后续发现再补充)
目录 一、主要内容 二、新增内容 三、常规API变化 四、Display API(显示API) 五、其他 最近在将LVGL8的demo代码升级到LVGL9,带来不小的变化 ,收集网上的一些内容,整理如下: 一、主要内容 二、新增内容 三、常规API变化 四、Display API(显示API)...
当在多线程环境中使用 C++进行编程时,怎样确保线程安全以及如何处理线程之间的同步和通信?
在C中确保线程安全性和处理线程之间的同步和通信有多种方法。下面是一些常用的技术和技巧: 互斥锁:使用互斥锁可以确保只有一个线程可以访问共享资源。在访问共享资源之前获取锁,在完成后释放锁。这可以防止多个线程同时访问同一份数据&#…...
博物馆地图导航系统:高精度地图引擎与AR/VR融合,实现博物馆数字化转型
在人民日益追求精神文化的时代下,博物馆作为传承与展示人类文明的璀璨殿堂,其重要性不言而喻。然而,随着博物馆规模的不断扩大和藏品种类的日益丰富,游客在享受知识盛宴的同时,也面临着“迷路”与“错过”的困扰。博物…...
liunx作业笔记1
一、选择题(每小题2分,共20分) 1、下列变量命名为Shell中无效变量名的是( D ) A、v_ar1 B、var1 C、_var D、*var 变量名以字母开头,包含下划线和数字。 2、关于expr命令的使用下列命令中得数不等于…...
大话C语言:第31篇 指针和数组的关系
数组在内存中是连续存放的,其名称代表了数组首元素的首地址,该地址是常量, 也就是一个指向数组首元素的指针。因此,指针和数组有着密切的关系: 可以使用指针来访问和操作数组中的元素。通过指针的算术运算,…...
Mysql-索引应用
目录 索引应用 MySQL有哪些索引? 普通索引和唯一索引有什么区别? 哪个更新性能更好? 、 聚簇索引的主键索引怎么设置? 追问:假如你不设置会怎么样? 我们一般选择什么样的字段来建立索引? 索引越多越好吗? 索引怎么优化? (覆盖索引优化、防止索引失效、…...
Facebook 开源计算机视觉 (CV) 和 增强现实 (AR) 框架 Ocean
Ocean 是一个独立于平台的框架,支持所有主要操作系统,包括 iOS、Android、Quest、macOS、Windows 和 Linux。它旨在彻底改变计算机视觉和混合现实应用程序的开发。 Ocean 主要使用 C 编写,包括计算机视觉、几何、媒体处理、网络和渲染&#x…...
【接口自动化_13课_接口自动化总结】
一、自我介绍 二、项目介绍 自己的职责、项目流程 1)功能测试,怎么设计用例的--测试策略 2)功能测试为什么还有代码实现,能用工具实现,为什么还用代码实现。 基本情况 项目名称:项目类型:项目测试人员…...
安防管理平台LntonCVS视频汇聚融合云平台智慧火电厂安全生产管理应用方案
中国的电力产业作为国民经济发展的重要能源支柱,被视为国民经济的基础产业之一。目前,我国主要依赖火力发电,主要燃料包括煤炭、石油和天然气等,通过燃烧转化为动能,再转变为电能输送至全国各地。火力发电量占全国发电…...
【Web性能优化】在Vue项目中使用defer优化白屏,秒加载!
历史小剧场 相对而言,流芳千古的钱谦益先生,就有点儿区别了,除了家产外,也很能挣钱(怎么来的就别说了),经常出没红灯区,六十岁多了,还娶了柳如是,明朝亡时&am…...
springboot上传图片
前端的name的值必须要和后端的MultipartFile 形参名一致 存储本地...
python入门:python及PyCharm安装
前言 我们将详细介绍如何在系统上安装Python及使用PyCharm创建项目的具体流程。Python是一种广泛应用的编程语言,其简单易学的特点使其成为初学者的首选。而PyCharm则是一个功能强大的Python IDE,可以极大地提高开发效率。通过本文,你将学会…...
链接追踪系列-04.linux服务器docker安装elk
[rootVM-24-17-centos ~]# cat /proc/sys/vm/max_map_count 65530 [rootVM-24-17-centos ~]# sysctl -w vm.max_map_count262144 vm.max_map_count 262144 #先创建出相应目录:/opt/dockerV/es/…docker run -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -d -p 92…...
魔兽争霸3终极优化指南:5分钟解决画面拉伸与帧率限制难题
魔兽争霸3终极优化指南:5分钟解决画面拉伸与帧率限制难题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏魔兽争霸3在现代电…...
聚合芘环石墨炔:机器学习模拟揭示新型二维碳负极材料的储锂潜力
1. 项目概述:从石墨烯到PolyPyGY,二维碳负极材料的进阶之路在锂离子电池这个已经相当成熟的领域里,负极材料的创新一直是推动能量密度和功率密度突破的关键。从早期的石墨,到后来的硅基材料,再到如今备受瞩目的二维材料…...
Grafana k6性能工程实践:从压测工具到CI/CD原生可观测性基础设施
1. 这不是又一个“压测脚本包装器”,而是性能工程的基础设施重构Grafana k6——这个名字刚出现时,我第一反应是:又一个基于Node.js封装的轻量级压测工具?毕竟JMeter、Locust、Artillery都走过类似路径。但真正把它跑通第一个真实业…...
非欧几里得机器学习:流形与拓扑结构下的回归与嵌入方法
1. 项目概述:当数据不再“平直” 在机器学习的日常实践中,我们习惯于将数据点视为高维欧几里得空间(即我们熟悉的“平直”空间,如二维平面、三维空间)中的向量。线性回归、主成分分析(PCA)乃至大…...
C51启动代码解析:复位向量与硬件初始化关键
1. C51启动代码解析:为什么复位向量不直接跳转到C代码?在Keil C51开发环境中,很多开发者第一次单步调试时会发现一个奇怪现象:明明项目全部用C语言编写,但芯片复位后PC指针并没有直接跳转到main函数,而是先…...
Edge Impulse:一站式TinyML MLOps平台,破解嵌入式AI开发难题
1. 项目概述:为什么我们需要一个面向TinyML的MLOps平台?如果你尝试过在Arduino、树莓派Pico或者ESP32这类微控制器上跑一个简单的图像分类模型,你大概会立刻理解那种“寸土寸金”的感觉。内存以KB计,算力以MHz计,存储空…...
别再只跑代码了!用泰坦尼克号数据集,手把手教你从EDA到模型调优的完整数据分析实战
从数据洞察到模型优化:泰坦尼克号生存预测的深度实践指南 如果你已经能够熟练运行数据分析代码,却依然对项目全流程缺乏系统性认知,这篇文章将带你超越基础操作,深入理解数据分析的完整闭环。我们将以经典的泰坦尼克号数据集为例&…...
如何用OpenSpeedy实现单机游戏5倍速运行:完整免费加速教程
如何用OpenSpeedy实现单机游戏5倍速运行:完整免费加速教程 【免费下载链接】OpenSpeedy 🎮 An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 还在为游戏卡顿和漫长的等待时间烦恼吗?Ope…...
线性化多噪声训练:提升混沌系统长期预测稳定性的正则化技术
1. 项目概述:当机器学习遇上混沌,如何让预测“长治久安”?在天气预报、气候模拟乃至金融市场分析中,我们常常需要面对一类“混沌系统”。这类系统的特点是,其短期行为虽然遵循确定的规律,但长期演化对初始条…...
云服务器Nginx静态网站首屏慢的四层根因与优化方案
1. 为什么明明用了Nginx,静态网站首屏加载却要3秒以上?你有没有遇到过这种情况:在云服务器上用Nginx部署了一个纯HTMLCSSJS的静态站点,连数据库都不用,理论上应该毫秒级响应——结果打开首页,F12 Network面…...
