Rust,Serde 是事实上的标准,
因为 Rust 的 Enum 支持嵌套
因此还能
处理前面
说到的多类型问题,使得它
乃至还能像做到 Node 那样不需要定义类型,只用 serde_json::Value 就能解析。
Go,官方有
供给 JSON 解析库,但 Go 语法强制
需求首字母大写的字段
才可公开,而 JSON 中没人会把字段名首字母大写,
因此在 Go 中就得写成类似 Name string json:"name"的形式,
引起比其它语言麻烦。
Java,Jackson 是事实上的标准,但官方文档很少,全靠第三方文档学习,每次遇到问题我都靠搜索。
Kotlin,
因为有 data class 且自带 JSON 解析库,
因此呢代码比较简洁。
因此结论是:Node 最好,其次是 Rust,接下来是 Kotlin,而后是 Java,最后是 Go 写起来最麻烦。
数据查找
专业低代码平台一般支持连接用户自己的数据库,此时就需要对应的数据库驱动,在这方面 JDBC 优良显著,所有数据库厂商都会供给 JDBC 驱动,基于 JDBC 能够容易抹平数据库差异,例如获取表结构信息等不需要查阅各个数据库的 INFORMATION_SCHEMA 结构或特殊的 SQL 语句。
整理了一下日前数据库驱动支持状况,其中国产数据库的选自墨天轮 Top 10 中非 MySQL 和 Postgres 兼容的数据库:
能够看到大部分语言都无官方驱动,而社区驱动一般仅有一个人研发,因此呢在这方面 JDBC 有巨大护城河,接下来稍微好点便是 Node,有许多官方驱动,非官方的驱动咱们用过亦很稳定。
然而 Node 无 JDBC 这一层抽象,引起非常多驱动表现不一致,例如预编译语句 PreparedStatement,在 JDBC 统一运用 ? 来声明变量,但在 Node 的各样驱动中有五花八门的实现:
除此之外更上层的基本设备还有连接池管理等,在 Java 下有比较成熟的方法,而其它语言都比较初级。
因此呢在数据查找这方面 Java/Kotlin 是最好选取,其次是 Node,接下来是 Go 有少许几个官方驱动,而 Rust 无任何官方驱动,质量难以保准。
另一你可能会想非常多数据库都供给了 C 语言驱动,Rust 直接经过 FFI 用不就行了么?答案是没那样简单,由于 Rust 下日前流行 Web 框架都是异步的,而 C 语言驱动是同步的会引起线程卡住,因此 Rust 中比较流行的 SQL 执行器 sqlx 乃至自己实现了 MySQL 和 Postgres 的连接协议,引起研发成本很高,因此她们还打算将 MSSQL 和 Oracle 等重要数据库的支持放在商场版本中。
JavaScript 引擎
在低代码平台中为了让用户实现更灵活的功能,一般需要支持自定义代码,这个代码一般是 JavaScript,因此呢低代码平台后端需要包括 JavaScript 引擎。
JavaScript 引擎日前能选的就仅有四种方法:
因此区别语言下的状况如下:
Rust,Rust 的 FFI 虽然
无 Zig 那样直接,但
亦是这几个语言中支持最好的
Rusty V8,Deno 团队
守护的,活跃度较高。
javascriptcore,Tauri 团队
守护的,活跃度
通常。
Boa,纯 Rust 实现的 JavaScript 解释器,
日前还不成熟
Go,
因为 Go 的 CGO 有不小性能损耗,
引起这方面的库不多
亦不怎么活跃
v8go,两年没怎么更新了。
otto,纯 Go 实现的 JavaScript 解释器,不支持 ES6,正则
运用 re2
引起和 JavaScript 规范不一致,用不了。
Java,Java 生态下
大众为了跨平台都不
爱好用原生库,
因此类似 J2V8 这种库很少有人用,但 Java 下有成熟的 JavaScript 引擎实现:
Nashorn,JDK 8 中内置的 JavaScript 引擎,只支持 ES5 并在 JDK 15 中删除了。
graaljs,GraalVM 中
供给的引擎,
亦能运行在 JDK 11 中,支持不少最新的 JavaScript 语法,
日前最
举荐运用这个。
Rhino,Mozilla
研发的 JavaScript 引擎,从 1999 年
起始就有了,支持部分 ES6 语法,市值超过 1400 亿的低代码平台 ServiceNow
便是运用它,
倘若想支持 JDK8 又想有
有些 ES6 语法,这个是
独一选取,但缺点是性能较差。
Node,前面
说到了
重点问题是安全
危害,
例如早起
咱们运用过 vm2,但它后来遇到一个安全漏洞
没法处理,
此刻举荐用 isolated-vm,但
亦可能有一天这个
亦没法用了。
整体来讲在 JavaScript 引擎方面 Node 最有优良但有危害,其次是 Java,Rust 亦能用,Go 基本没法用。
表达式引擎
在低代码制品中有时需要有些简单的要求判断或计算,例如下面的场景:
在流程中判断金额大于多少且级别
少于多少。
进行公式计算,
例如计算毛利率之类的,类似 Excel 中的公式。
第1种状况能够经过可视化界面例如 amis 的要求组合来实现,但第二种用界面就不太合适了,比起可视化,数学公式写起来更直观。
因此呢低代码制品的后端需要实现一个表达式引擎,这个引擎虽然用前面的 JavaScript 引擎亦能部分实现,但为何不直接运用 JavaScript 引擎?重点有以下几方面原由:
实现表达式引擎的核心由两部分构成:语法解析、实现内置函数。
其中实现内置函数比较简单,因此重点难点是语法解析,语法解析能够手动实现或运用工具自动生成代码。
手动实现虽然看起来繁杂,但倘若认识了类似 Top Down Operator Precedence 的原理其实并不难,不外因为大部分人来讲有工具还是更方便点,因此呢接下来重点分析区别语言下运用第三库或工具实现表达式引擎的思路:
Rust
现成的:零星找到几个但看起来都不成熟
解析工具:
能够用 lalrpop 或 pest,没
实质用个不确定成熟度
Go
现成的:Expr 和 Cel 等
解析工具:
能够运用 ANTLR 或 peg,但不确定成熟度
Java
现成的:非常多,
能够参考
这儿,值得一提的是 Spring 内置的 SpEL,代码质量高,还支持转成字节码来
提高性能
解析工具:ANTLR,非常成熟,官方示例中有
海量实现可供参考
Node
现成的:
无很著名的,大概是
由于 Node 这种动态语言
能够直接用 eval 执行,用不上
解析工具:有
非常多,除了 ANTLR 这种生成代码的方式,还有 Chevrotain 这种动态解析,成熟度比较高
整体来讲倘若你晓得怎么手写解析,这几个语言区别不大,但倘若不晓得怎么写解析,用现成的话 Java 最成熟,Go 其次,解析工具的话 Node 和 Rust 亦都有,而 Node 中的相对成熟点,不外学 Rust 的人均大神,因此呢应该写个解析难度不大,能够参考这儿。
规律编排
规律编排能够用来实现简单的后端业务规律,使得完全不写代码就能完成业务规律研发,因此呢是低代码平台中的重要功能。
实现规律编排需要实现两种类型的节点:
持有了这些节点后,许多简单的业务规律就能完全经过可视化的方式实现。
在有 GC 的语言中实现这个功能不难,但 Rust 会有点问题,由于它无 GC,仅有引用计数机制,而这些节点底层数据结构一般是树或图,为了方便操作一般会有相互引用的状况,例如引用父级节点,在 Rust 下需要运用 Weak 引用来避免内存没法释放,或运用 arena 这种古老的内存池技术。
另一这部分触及到数据库和 HTTP 这些外边请求,倘若想要用异步机制来提高并发性能,例如接口可能是下载个大文件,此时 Node 和 Go 就比 Java 更有优良,Java 响应式代码写起来太难懂了,而 Kotlin 有协程相对好点。
整体来讲这几个语言我更倾向于用 Node 实现这个功能,不外低代码平台一般不需要太高并发,运用 Java 实现问题亦不大,但 Rust 下要实现这个功能会相对更繁杂。
流程引擎
流程引擎和规律编排看起很类似,有部分低代码制品中还将这两部分合并了,流程引擎和规律编排有个最大区别是流程引擎有些特殊的流转功能,例如:
倘若审批人是自己就自动跳过
多人审批是只要一个
经过就行还是必须
所有
回退是要回到上个节点还是最初节点
流程引擎的数据存储更适合用图来暗示,还经常要找父节点,因此呢容易形成循环引用,引起 Rust 下编写起来更加繁琐。
可选方法
综合各个语言下的优缺点,日前可选方法有:
Java/Kotlin
上面所有功能 Java 都能胜任,
况且是
独一支持所有国产数据库的
方法,
重点缺点是内存占用比
很强,异步编写麻烦。
Kotlin 虽然对异步有更好支持,但
日前服务端很少人
运用。
Node
仅次于 Java 的
方法,除了国产数据库之外都能胜任,
况且很容易实现异步 IO,
重点缺点是性能相对较差。
Java + Node
结合这两个语言的特点
同期运用,数据部分用 Java,异步及 JSON 处理用 Node,缺点是有通讯代价。
Rust + Java
Rust 在数据库方面还不成熟,需要
协同 Java
运用,优点是性能和内存占用都是最好,但 Rust
研发业务
规律实现成本较高。
Go + Java
Go 在数据
查找、JavaScript 引擎方面不太适合,需要
协同 Java
运用,这个
方法整体优点是比 Rust 简单
非常多。
倘若不思虑团队成员熟练状况,让我选取的话,我个人倾向于 Node+Kotlin 或 Rust+Kotlin。
选取 Kotlin 的重点思虑是国内广泛运用的 JDK 8,而 Java 8 缺少非常多重要特性,代码写起来冗余,Kotlin 丰富的语法能够大幅简化,它的缺点是有许多容易引起其他人看不懂的写法,多人研发时需要禁止炫技。
Rust 虽然上手门槛高,但它有个独特优良,便是能容易嵌入到其它语言中,倘若想做低代码平台基本设备,让底层能力能够供给给各样语言运用,除了 C/C++ 之外 Rust 便是日前独一成熟靠谱的语言,其它都差得更远,例如 Zig 虽然语法简洁,但它做不到内存安全,更易运行时出报错。返回搜狐,查看更加多