PowerBuilder现代编程方法X11:PB程序完全跨平台方案
PB可能要支持Windows、macOS、Linux、iOS、Android与鸿蒙操作系统和X86、ARM、RISC-V与国产龙芯CPU的原生应用了!
PowerBuilder现代编程方法X11:PB程序完全跨平台方案
前言
《PowerBuilder编程新思维》在写到了WebUI后,陷入了沉寂。
原因是我对PB发展的下一代技术方案不太满意,越是对未来的走向不清晰,就越是没有动力补全现有的方案,生怕一不小心走岔路。
这段时间,我反复思考可行的技术方案,也做了大量的尝试项目,但都废弃了,文章也写了有快二十篇没有发表。
终于有一天我读到了这一篇《Htmx意外走红,我们从React“退回去”后:代码行数减少 67%,JS 依赖项从 255 下降到 9》
我意识到,不是Web前端的发展有什么问题,而是已经到了抛弃Web前端的时候了。
抛弃Web前端
一直以来,我都认为PB的下一代是Web化,主要是DataWindow的Web化,后端主导的技术潮流已经不适应未来的发展。
但是事实上,Web技术虽然不断发展,但是Web本身的问题却层出不穷。生产力不断提升,生态不断完善,可是探索却总是碰壁。
Htmx给我提了个醒,应该重回后端主导的前端框架这个思路上来,抛弃前端框架。
我们知道,Web发展的初期,是没有前端应用的。Web2.0开始,前端不断发展。给了我们太多的选择,越是想偷懒,就越是被前端束缚。
特别是PB这样“古老”的工具,理念上同前端是天然对立的,放弃前端才是最好的出路。
前端主导的后端框架
本来PB下一代开发解决方案PbXds(neXt-generation Development Solution)是基于前端主导的思路。
修改前的方案参见《PowerBuilder编程新思维10.5:外传2(PowerPlume下一代解决方案)》
将PB程序编译为JS,使用React前端框架,部分使用本地接口的程序运行在后端,可以选择编译成Golang。
那么区分前端还是后端代码就成了一个有困难的任务,必须人工的参与,自动生成是不可靠的。
纠结完前后端的问题之后,又有了前端兼容性的纠结,特别是如果想跨平台,Sciter的兼容性就成了最恐怖的事情。
就算准备使用tauri之类的框架解决跨平台的问题,并且放弃掉许多平台的兼容性,但还是有个问题悬在心头——安全性。
安全一直以来都是PB的核心弱点问题,如果安全性得不到保障,又有几个人会来用你这个“下一代”?
Web天然没有什么秘密,如果要增强这个安全性,势必要加强后端的强度,人工的投入又是一个无底洞。
后端主导的前端框架
如果思路换成后端主导,将PbXds WebUI方案升级为PbXds Multiplatform多平台方案。
那么PbXds编译器只需输出Golang代码即可,无需输出js,相应的PbXmp运行时也只需Golang版本而无需js版本。
数据窗口暂定为后端输出,也就是PbXmp部分输出,而无需另行开发。PbXsf也会并入PbXmp。
最终只需PbXds原有内容的三分之一即可。
首先,逻辑代码全部采用后端Golang,安全性能得到很好保证。
然后,前端完全没有逻辑代码,所以也不存在源码前后端选择与环境适配的问题。
最后,仅有的前端代码由后端PbXmp产生,可以动态调整输出,兼容性完全不是问题。
这样,PbXds不仅没有原方案的三大主要问题,而且内容也精简到了三分之一,非常Nice。
新的技术方案
新的方案中,前端可以直接使用Htmx或者其定制版本。
后端直接使用桥接或者Web框架Iris和Gin。编译器由输出JS,换成输出Golang。
除了直接部署为Web服务,还可以编译为跨平台本地应用。
应用由内嵌浏览器显示界面,这样在打印,本地设备IO,读取UKey等等方面比纯Web应用有更好的使用体验。
内嵌浏览器框架可以采用 Webview(golang)
这个项目类似于Rust的tauri,不过更早,如果不是取名太过奇葩(搜都搜不到),说不定早火了。
另外可以采用Sciter
不过由于Sciter的兼容性堪忧,所以不会作为主要方案,只会作为跨平台应用的可选框架,应对支持XP之类的特殊需求。
跨平台技术方案:PbXds WebUI升级为PbXds Multiplatform
PbXds(golang)+PbXmp(golang) + Webview(golang)+ Htmx(JavaScript)
方案涉及的问题解答
一、这个PbXds Multiplatform方案不就是Web混合应用吗?值得吹吗?
Web混合应用过往表现并不优秀,主要的问题是界面卡顿,但Htmx方案不存在JS逻辑,JS大小不会随代码增大。
从而规避了前端框架的最大弊端——首屏显示问题,显示性能也会随之有非常大的提升。
安装包的太大的问题也被Webview解决,最后一些老旧系统问题也可以通过适配到Sciter解决。
二、这个Golang应用框架和PB有啥关系?
PB的用户这些年相对稳定,源码积累还是很深的,这些都是资产。
PB的特点在于快速开发,IDE和DW都是法宝,可以提升开发效率,尽可能的利用。
DataWindow实际上是早期的ORM,很优秀的机制,最好支持动态DW的功能,作为视图功能的补充。
与同享的EXTPB.NET类似,充分利用DataWindow控件的强大功能,与之不同的是采用自绘DataWindow。
三、为什么不选择Rust语言?
事实上,Golang和Rust是仅有的可以选择两种现代编程语言,不仅可以跨平台,而且生态也非常成熟。
Dart、Swift、Kotlin等语言都有弱点,不在选择之列。
Golang比Rust简单一点,更重要的是与Pb比较而言,更“原始”一些,沟通转换没有太大的代沟。
还有Golang已经支持大多数操作系统平台和大多数CPU架构,已在 1.19 版本原生支持龙芯 LoongArch 架构。
当然如果有可能,支持Rust也在考虑之列。
四、为什么不直接用DirectUI?
DirectUI库主要在国内流行,无论Duilib、DuiVision、Soui、REDM都不跨平台。
而国内的国产系统国产软件的替代大潮已经箭在弦上,不得不发了,跨平台是第一需求,国产CPU支持也是关键。
Dui的跨平台基础库也在研究中,毕竟还需时日,如果设计得当,直接替换PbXmp就可以了。
五、还有没有其它的UI方案?
有,但是都有一定的局限性,比如:
TCL/TK,这是最老牌的UI,应用非常广,但是由于TCL语言太过古老,选择的人不多;
LIBUI,这是一个C语言UI库,在各个平台选用原生控件,但界面不够现代;
QT,非常强大的跨平台UI,但是许可比较迷,一直广受诟病,另一个缺点是比较臃肿;
方案快速验证演示
虽然我的思路看起来没有什么问题,但是还是需要跑通整个链条来证明思路没有错误和大的障碍。
所以实现了一个《PbXds Multiplatform快速验证程序》,内容不多,仅供参考。
PbXds.go(Compiler from pb to golang)
PbXmp.go(Multiplatfrom Framework for golang)
- PbXmp application object (AdapterControllerServer/Client)
- PbXmp window object (AdapterPresenterWeb/Sciter/Dui)
- PbXmp database object (AdapterDatabaseMSSQL/MySQL/Oracle/PostgreSQL)
PB可能真的要支持Windows、macOS、Linux、iOS、Android与鸿蒙操作系统和X86、ARM、RISC-V与国产龙芯CPU的原生应用了!
(由于群里熊猫兄的催更,还没有完成就提前发布,所以暂时没有源码下载)
<本节完>
PowerBuilder现代编程方法X11:PB程序完全跨平台方案的更多相关文章
- PB程序“无法启动此程序,因为计算机中丢失PBvm90.dll。尝试重新安装该程序以解决此问题”的解决方法
因为有计算机自考科目,要求使用PB程序做一个管理系统.昨天刚安装好了PB程序,今天使用的时候,当我打开一个PB程序时,出现了"无法启动此程序,因为计算机中丢失PBvm90.dll.尝试重新安 ...
- 不用VS,使用NET 7.0 SDK (v7.0.101)编程c#控制台应用程序方法
摘要:如果没有vs环境,也可以编程c#控制台应用程序学习c#,方法步骤有下面几个步骤. 1.下载NET 7.0 SDK (v7.0.101)安装 网址https://dotnet.microsoft. ...
- Atitit 编程语言编程方法的进化演进 sp COP ,AOP ,SOP
Atitit 编程语言编程方法的进化演进 sp COP ,AOP ,SOP 1.1. Sp oop>>COP ,AOP ,SOP1 1.2. Sp oop 结构化方法SP(Stru ...
- 学习linux/unix编程方法的建议(转)
假设你是计算机科班出身,计算机系的基本课程如数据结构.操作系统.体系结构.编译原理.计算机网络你全修过 我想大概可以分为4个阶段,水平从低到高从安装使用=>linux常用命令=>linux ...
- paip.函数式编程方法概述以及总结
paip.函数式编程方法概述以及总结 1 函数式编程:函数式风格..很多命令式语言里支持函数式编程风格 1.1 起源 (图灵机,Lisp机器, 神经网络计算机) 1.2 函 ...
- 你所必须掌握的三种异步编程方法callbacks,listeners,promise
目录: 前言 Callbacks Listeners Promise 前言 coder都知道,javascript语言运行环境是单线程的,这意味着任何两行代码都不能同时运行.多任务同时进行时,实质上形 ...
- C# 异步编程2 EAP 异步程序开发
在前面一篇博文记录了C# APM异步编程的知识,今天再来分享一下EAP(基于事件的异步编程模式)异步编程的知识.后面会继续奉上TPL任务并行库的知识,喜欢的朋友请持续关注哦. EAP异步编程算是C#对 ...
- Studio 5000编程:一种累计时间的编程方法
前言:在很多项目中,需要累计设备的运行.停机.故障时间,当然实现该功能的编程方法也是多种多样,各有千秋,不过有的方法累计误差会越来越大,比如:在连续任务里用定时器来累计时间,就存在一定的误差.本文分享 ...
- 实验十五 GUI编程练习与应用程序部署
实验十五 GUI编程练习与应用程序部署 实验时间 2018-12-6 一:理论部分 1.Java 程序的打包:编译完成后,程序员将.class 文件压缩打包为 .jar 文件后,GUI 界面序就可以 ...
- C#网络编程TCP通信实例程序简单设计
C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...
随机推荐
- 记录freeswitch的一个2833问题
概述 freeswitch是一款简单好用的VOIP开源软交换平台. 运营商内部新老系统混用,互联互通的问题较多,其中以DTMF码的问题最多,花样也多. 环境 CentOS 7.9 freeswitch ...
- 从需求角度介绍PasteSpider(K8S平替部署工具适合于任何开发语言)
你是否被K8S的强大而吸引,我相信一部分人是被那复杂的配置和各种专业知识而劝退,应该还有一部分人是因为K8S太吃资源而放手! 这里介绍一款平替工具PasteSpider,PasteSpider是一款使 ...
- Django与前端框架协作开发实战:高效构建现代Web应用
title: Django与前端框架协作开发实战:高效构建现代Web应用 date: 2024/5/22 20:07:47 updated: 2024/5/22 20:07:47 categories ...
- 设置MySQL数据库的远程连接权限
解决方案 在服务器上登录数据库,然后执行如下授权SQL语句.该授权SQL语句的含义为root用户可用任何IP地址登录数据库,操作任何数据库中的任何对象. GRANT ALL PRIVILEGES ...
- TS码流解析(三)PES
我们常说的音视频数据流在TS中被称为Elementary Stream(ES),也称为原始码流(裸流).ES流本身不含有传输所需的所有信息,为了在传输过程中同时携带PTS(Presentation T ...
- 彻底搞清楚vue3的defineExpose宏函数是如何暴露方法给父组件使用
前言 众所周知,当子组件使用setup后,父组件就不能像vue2那样直接就可以访问子组件内的属性和方法.这个时候就需要在子组件内使用defineExpose宏函数来指定想要暴露出去的属性和方法.这篇文 ...
- js 判断手机号格式
大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...
- python相关常见安装问题
1 Centos7安装pip 参考链接:centos7 pip升级 - fuhaizi - 博客园 (cnblogs.com) Centos7默认pip版本: 使用默认pip版本安装numpy库,会报 ...
- Linux扩展篇-shell编程(三)-shell运算符
基本语法: 格式一 expr +. -. \*./. %(加.减.乘.除.求余) 格式二 "$((运算式))"或者"$[运算式]" 基本运算符 Shell 和其 ...
- 什么是JDBC,在上面时候会用到它?
JDBC的全称是Java DataBase Connection,也就是Java数据库连接,我们可以用它来操作关系型数据库.JDBC接口及相关类在java.sql包和javax.sql包里.我们可以用 ...