大模型时代,还需要跨端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、输出到控制台(终端)之前的汉字不是乱码,针对此种情况如下设置 原因…

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的基本操作,为了进一步巩固知识和便于包装简历,决定找个唬人一点的项目练练手。 ————…

[读论文]Transformers are SSMs

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

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

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

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

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

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

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

pytorch的基本使用(上)

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

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

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

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

TCP建立和断开连接的过程(三次握手和四次挥手) TCP通信的过程: 问题:tcp是如何保证数据在客户端和服务端之间通信传输的? 分为三个步骤:三次握手,传输数据确认,四次挥手。三次握手…

react的解构赋值

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

OpenCV距离变换函数distanceTransform的使用

操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:Visual Studio Code编程语言:C11 功能描述 distanceTransform是OpenCV库中的一个非常有用的函数,主要用于计算图像中每个像素到最近的背景(通常是非零像素到零像素&…

tkinter-TinUI-xml实战(12)pip可视化管理器

引言 pip命令行工具在平常使用方面确实足够简单,本项目只是作为TinUI多界面开发的示例。 当然,总有人想用GUI版pip,实际上也有。不过现在,我们就来手搓一个基于python和TinUI(tkinter)的pip可视化管理器。…

数据结构——考研笔记(二)线性表的定义和线性表之顺序表

文章目录 二、线性表2.1 定义、基本操作2.1.1 知识总览2.1.2 线性表的定义2.1.3 线性表的基本操作2.1.4 知识回顾与重要考点 2.2 顺序表2.2.1 知识总览2.2.2 顺序表的定义2.2.3 顺序表的实现——静态分配2.2.4 顺序表的实现——动态分配2.2.5 知识回顾与重要考点2.2.6 顺序表的…

【分库】分库的设计与原则、数据分片策略、垂直分库与水平分库、数据库引擎选择与配置优化

目录 引言 分库设计原则 数据分片策略的选择 垂直分库 vs 水平分库的比较 数据库引擎选择与配置优化 引言 在面对日益增长的数据量和不断升级的业务需求时,传统的单体数据库架构往往难以应对高并发、大数据量带来的性能瓶颈。为了突破这些限制,分库…

godis源码分析——database存储核心1

前言 redis的核心是数据的快速存储,下面就来分析一下godis的底层存储是如何实现,先分析单机服务。 此文采用抓大放小原则,先大的流程方向,再抓细节。 流程图 源码分析 现在以客户端连接,并发起set key val命令为例…

vue3中谷歌地图+外网申请-原生-实现地址输入搜索+点击地图获取地址回显 +获取国外的geoJson实现省市区级联选择

一. 效果&#xff1a;输入后显示相关的地址列表&#xff0c;选中后出现标示图标和居中定位 1.初始化谷歌地图 在index.html加上谷歌api请求库 <script src"https://maps.googleapis.com/maps/api/js?key申请到的谷歌地图密钥&vweekly&librariesgeometry,place…