前言的前言
最近私下做了好一阵子的项目 UltraFunction
,以至于好久没更新过博客了(白天工作太忙了),特此过来总结一番。
估摸着算了一下,这个项目从 2024/8/29 开始构建项目,到如今也快 2 个月了,中间发生了不少难题,都一一解决,为了自己的热爱(屹立不倒)
在此感谢参与项目的所有人🙏🏻
网址: https://ultrafunction.domcer.com/
Wiki: https://ultrafunction.domcer.com/wiki
Discord: https://discord.gg/2YZuDJwpMX
Email: admin@domcer.com
QQ: 217934413
SpigotMC: https://www.spigotmc.org/resources/%E2%AD%90ultrafunction-low-code-development-platforms-1-8-1-21.120276/
前言
感觉国内貌似对低代码平台不感兴趣,在当前公司,也曾有过低代码平台(对于前端),当时闹得风风火火,领导都很看中。节后开发组的人就不见了踪影。(3名前端主力,听说都被优化了,我是当时支持的后端,瑟瑟发抖)
在国外经常刷到一些视频,说一群孩子使用 iPad 做一些好玩的东西(应该很多年了),感觉国外一直都很力推技术教育,常常在孩子最具有创造力和想象力的年龄,去深挖他们的潜力。而国内貌似就没有这些内容了,甚至很难推进。24年有幸被网易邀请到上海喝茶聊天,我就提过少儿教育这类的事情,他们的回复的大概意思是,国内政府很难说通,很难办,如果在大学应该还好。可是我想说,如果到大学,他还真的会对这些感兴趣吗?
这是一个什么项目
Wiki: [这个项目致力于简化 Minecraft 插件的创建过程,通过低代码平台,让用户轻松生成自定义逻辑数据包插件。无需任何编程基础,只需选择预定好的模块,并配置相关行为,即可实现独特的游戏功能。无论是添加新的游戏机制,还是打造个性化的互动体验,我们的工具都能满足大部分的需求。直观的界面和强大的自定义选项,让每一位 Minecraft 爱好者都能轻松实现创意,提升游戏乐趣,快来打造属于您的专属世界吧!]
说白了就是一个可以通过拖拽积木块的方式,来达到自己的逻辑行为。帮助那些不会写代码,但是想要做游戏内逻辑行为的玩家,提供一个社区、平台,帮助他们完成想要做的事情。
名字和LOGO的来源
对于定义这个项目,其实也想了一些时间,最终定下了 UltraFunction,这个不仅仅只有直译的 极致功能/极致方法,也有英文可拆解的 Ultra Fun(有趣)ction,让大家在使用这个平台的时候,更多感受到的是一种乐趣。
关于技术选型和架构
关于前端
前端共有 2 个部分:官网页面、画布编辑
官网页面采用的是 Vue
画布编辑使用的是 Google Blockly:[Blockly 是 Google 推出的一款可视化编程编辑器,使用拖放块。它是为全球最受欢迎的编程教育计划提供支持的引擎。]
因为我并不是做前端的,所以一些细节我也没办法讲述太多。。。
关于后端
后端共有 3 个部分:平台业务层、核心执行层、插件处理层
- 平台业务层:采用 SpringBoot + MySQL 的设计,对平台的业务进行处理,包括但不限于(用户账号功能、工作台管理功能、文件触发器编辑功能等)
- 核心执行层:采用 antlr 定义自己的领域语言(DSL),对接前端的 Blockly,通过积木块生成 DSL 内容
- 插件处理层:使用 Bukkit 包进行开发,对文件、事件等进行统一分发和处理
为什么选择 antlr
性能实测
- 每次都经过compile: 一组包含20条语句的代码块,有20个入参数与2个出参。每次执行都经过输入、编译、执行、输出四个步骤。循环执行1000000万次,时间是122212ms,平均每条执行时间0.12ms
- 每次不经过compile: 一组包含20条语句的代码块,有20个入参数与2个出参。每次执行都经过输入、执行、输出三个步骤。循环执行1000000万次,时间是6151ms,平均每条执行时间0.006ms
所以,可以将即将执行的代码块进行预编译,存储到缓存内,每次取其中的 ParserTree
直接运行
高性能原理分析
模块 | 原理 |
---|---|
antlr4词法匹配 | DFA |
antlr4语法匹配 | Adative LL() |
词法分析(Lexical Analysis)
- 词法分析器(Lexer)将输入的字符流分割成令牌(Tokens)。这一步类似于正则表达式的匹配,但ANTLR4使用的是其自己的模式匹配算法。
- 词法分析器规则(Lexer rules)可以用类似正则表达式的语法来定义,但它们不是直接使用正则表达式库来实现的,而是ANTLR4自身的匹配机制。
语法分析(Parsing)
- 语法分析器(Parser)根据定义的文法规则(Grammar rules)将令牌流解析成语法树(Parse Tree)。
- 语法分析使用的是一种叫做LL()的解析算法,这是一种自顶向下的解析算法,能够处理许多上下文无关文法。由于不进行回溯,LL 解析器通常比较高效,特别是在处理适合 LL(1) 或 LL() 的文法时
流程图
- 在平台上,用户需要对自己的文件进行编辑,最终前端的 schema 与 后端的 expression (DSL)均会保存在云端
- 通过构建文件,会生成一个
xxx.ultrafunction
文件 - 放入服务端内,UltraFunction 会加载这个数据文件,并且预编译里面的内容,存入到缓存内
- 等待事件监听器的分发,当触发某个事件后,即开始运行缓存内的语法
后话
目前市场上已有太多各种功能的插件了,当时没做项目之前的想法微乎其微,认为做任何功能的插件都有很多竞争对手,并且赛道上已经有太多人了,目前没有什么新颖的点。倒不如开发一个低代码平台,让用户发挥自己的想象,随便配置。
我仍记得好几年之前,有个网站也做了个类似的低代码平台,但是我当时还小,用不懂,而且没有一个稳定的社区平台。所以在我们开创这个项目的时候,主打的就是社交媒体,完善帮助文档,让用户可以在任何地方都能联系到我们。给予用户帮助显然成本是很高的,但是这可以帮助项目持久的运营下去。