大模型时代,还需要跨端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之间,用户体验是可达到的最高。人员吃紧的团队内是值得推广的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/871518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于复旦微JFMQL100TAI的全国产化FPGA+AI人工智能异构计算平台,兼容XC7Z045-2FFG900I

基于上海复旦微电子FMQL45T900的全国产化ARM核心板。该核心板将复旦微的FMQL45T900(与XILINX的XC7Z045-2FFG900I兼容)的最小系统集成在了一个87*117mm的核心板上,可以作为一个核心模块,进行功能性扩展,能够快速的搭建起…

springboot大学校园二手书交易APP

摘 要 在数字化与移动互联网迅猛发展的今天,人们对于图书的需求与消费方式也在悄然改变。为了满足广大读者对图书的热爱与追求,我们倾力打造了一款基于Android平台的图书交易APP。这款APP不仅汇聚了海量的图书资源,提供了便捷的交易平台&…

【产品经理】WMS多仓调拨转移说明

对于仓储管理来说,越来越多企业开始应用WMS进行系统化的管理,以提升仓库的作业效率。本文作者从业务流程和基础功能两个方面展开介绍,希望对你有帮助。 一、业务流程 。在线下业务流程拓展,仓库不断增多的过程中,由于…

vscode终端(控制台打印乱码)

乱码出现的两种可能(重点是下面标题2) 1、文件中的汉字本来就是乱码,输出到控制台(终端)那就当然是乱码 在vscode中设置文件的编码格式为UTF-8, 2、输出到控制台(终端)之前的汉字不是乱码,针对此种情况如下设置 原因…

k8s资源管理中request和limit的区别

在 Kubernetes(K8s)中,request和limit是两个重要的概念,用于控制和管理容器的资源使用。 Request(请求): request定义了容器启动时需要保证的最小资源量。这表示Kubernetes在调度Pod到节点时&a…

用“坦克”来更形象的理解面向对象编程的类的访问权限

我们可以 把私有变量比喻为坦克里面的人,把公共方法比作是驾驶室的门,然后把其他的代码比喻为 子弹,坦克就是一个封装,来保护人 这个比喻非常形象,它很好地解释了封装的概念和它在面向对象编程中的作用。下面我将根据你…

如何隐藏 Ubuntu 顶部状态栏

如何隐藏 Ubuntu 顶部状态栏 Chapter1 如何隐藏 Ubuntu 顶部状态栏Chapter2 Ubuntu增大屏幕可用面积之——自动隐藏顶部状态栏Chapter3 Ubuntu18.04隐藏顶栏与侧栏 Chapter1 如何隐藏 Ubuntu 顶部状态栏 https://www.sysgeek.cn/hide-top-bar-ubuntu/ 准备工作:安…

GuLi商城-商品服务-API-品牌管理-JSR303分组校验

注解:@Validated 实体类: package com.nanjing.gulimall.product.entity;import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.nanjing.common.valid.ListValue; import com.nanjing.common.valid.Updat…

【Python学习笔记】Optuna + Transformer B站视频实践

【Python学习笔记】Optuna Transformer 实践 背景前摇(省流可不看): 之前以泰坦尼克号数据集为案例,学习了Optuna的基本操作,为了进一步巩固知识和便于包装简历,决定找个唬人一点的项目练练手。 ————…

conda激活的虚拟环境的python版本不对应

这个大坑,要看看虚拟环境下envs下有没有bin文件夹 python -Vecho $PATH镜像源的问题,参考

Day20—Scrapy与Redis的分布式爬取

分布式爬虫能够利用多台机器的计算能力,同时进行数据的抓取工作,这不仅可以显著提高爬取效率,还可以在面对大规模数据抓取任务时,提供更好的扩展性和稳定性。Scrapy-Redis是一个将Scrapy与Redis结合使用的库,它允许Scrapy爬虫将待爬取的URL和待处理的数据存储在Redis中,从…

Unity脚步.txt

private void OnGUI(){if (GUILayout.Button("test")){}}获取下级物体GameObject spawnList new GameObject[transform.childCount]; // 创建一个敌人生成器 链表for (int i 0; i < spawnList.Length; i){spawnList[i] transform.GetChild(i).gameObject;}、、…

[读论文]Transformers are SSMs

Notation T T T: Sequence length/ time length $$: 摘要 虽然transformer一直是深度学习在语言建模方面成功的主要架构&#xff0c;但状态空间模型(ssm)&#xff0c;如Mamba&#xff0c;最近被证明在中小规模上与transformer相匹配或优于transformer。这些模型族实际上是非常…

数据结构(4.1)——串的存储结构

串的顺序存储 串&#xff08;String&#xff09;的顺序存储是指使用一段连续的存储单元来存储字符串中的字符。 计算串的长度 静态存储(定长顺序存储) #define MAXLEN 255//预定义最大串为255typedef struct {char ch[MAXLEN];//每个分量存储一个字符int length;//串的实际长…

子进程继承父进程文件描述符导致父进程打开设备文件失败

开发过程中有时会遇到需要在程序中执行三方程序或者shell脚本&#xff0c;一般会通过system(), popen(), exec簇来完成该功能。我们知道以上方法会通过fork创建子进程后在子进程中执行相应指令。如图1为某个示例流程&#xff0c;具体的程序执行流程如图2所示&#xff0c;线程my…

计算机图形学入门28:相机、透镜和光场

1.前言 相机(Cameras)、透镜(Lenses)和光场(Light Fields)都是图形学中重要的组成部分。在之前的学习中&#xff0c;都是默认它们的存在&#xff0c;所以现在也需要单独拿出来学习下。 2.成像方法 计算机图形学有两种成像方法&#xff0c;即合成(Synthesis)和捕捉(Capture)。前…

pytorch的基本使用(上)

目录 一、安装pytorch1、用conda指令创建一个pytorch的环境2、安装pytorch&#xff08;无独显&#xff09; 二、编译器选择1、pycharm&#xff08;1&#xff09;安装pycharm&#xff08;2&#xff09;选择编译器&#xff08;3&#xff09;检测能否正常运行小技巧 pycharm 的创建…

【linux】解决报错:Network error: Connection refused

【linux】解决报错&#xff1a;Network error: Connection refused 【创作不易&#xff0c;求点赞关注收藏】&#x1f600; 一、问题描述 我现在使用MobaTerm远程连接服务器&#xff0c;但是出现了Network error: Connection refused报错&#xff0c;可能是我原先设置了一些…

计网-三次握手和四次挥手

TCP建立和断开连接的过程&#xff08;三次握手和四次挥手&#xff09; TCP通信的过程&#xff1a; 问题&#xff1a;tcp是如何保证数据在客户端和服务端之间通信传输的&#xff1f; 分为三个步骤&#xff1a;三次握手&#xff0c;传输数据确认&#xff0c;四次挥手。三次握手…

react的解构赋值

我最近在用react讨生活。我的感觉&#xff0c;react开发效率不高。这当然应该是我还不熟悉react的缘故。但是&#xff0c;在阅读react代码过程中&#xff0c;其中一个容易困惑的地方是它到处充斥着的解构赋值。当然了&#xff0c;解构赋值并不是React特有的功能&#xff0c;而是…