ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Kaitai Struct Compiler 双平台架构解析:JVM 与 Scala.js 如何共享核心代码,一次构建发布到 Maven 与 npm

Kaitai Struct Compiler 双平台架构解析:JVM 与 Scala.js 如何共享核心代码,一次构建发布到 Maven 与 npm Kaitai Struct Compiler 双平台架构解析JVM 与 Scala.js 如何共享核心代码一次构建发布到 Maven 与 npm【免费下载链接】kaitai_struct_compilerKaitai Struct: compiler to translate .ksy .cpp / .cs / .dot / .go / .java / .js / .lua / .nim / .php / .pm / .py / .rb / .rs项目地址: https://gitcode.com/gh_mirrors/ka/kaitai_struct_compilerKaitai Struct Compiler 是 Kaitai Struct 项目的官方参考编译器用 Scala 编写把声明式的.ksy二进制格式描述文件编译成 C、Java、Python、Go 等 13 种语言的解析器源码。它采用 JVM 与 Scala.js 双平台架构核心代码在 shared 目录共享同一份源码分别发布到 Maven Central 和 npm实现“一次开发、双渠道分发”。本文带你快速看懂这套架构的来龙去脉。为什么一个编译器要跑在两个平台上Kaitai Struct 的定位是“一次描述、处处解析”你用 YAML 风格的.ksy文件描述二进制结构编译器生成可读性很好的解析器代码。为了覆盖不同场景官方让编译器同时活在两个世界平台运行环境面向用户交付形式JVM桌面 / 服务器 CLI命令行开发者ksc可执行工具Debian、Windows 安装包Scala.jsNode.js / 浏览器工具与 IDE 开发者npm 包kaitai-struct-compiler提供程序化 API桌面端用户习惯ksc -t python xxx.ksy这样的命令行体验而 Web IDE 和第三方工具则需要一个能直接嵌入 JavaScript 工程的编译器对象。两条产品线的需求不同但编译逻辑必须完全一致——这正是共享代码架构要解决的问题。sbt crossProject一份核心代码两个编译目标 ️整个工程由 sbt 管理根构建文件 build.sbt 中只定义了一个交叉项目同时启用 JVM 与 JS 两个平台lazy val compiler crossProject(JSPlatform, JVMPlatform) .in(file(.)). enablePlugins(JavaAppPackaging)配合 project/plugins.sbt 中的sbt-scalajs与sbt-scalajs-crossproject插件sbt 会把shared/源码同时编译到两个目标并自动派生出compilerJVM和compilerJS两个子项目根项目聚合二者统一构建。交叉依赖也靠%%%语法自动适配平台如 scopt、fastparse而纯 JVM 依赖snakeyaml、scalatest只在jvmSettings中声明——测试套件就放在jvm/src/test/下统一在 JVM 上运行。共享核心.ksy 编译管线全部在 shared 目录 所有平台无关的逻辑都收敛在shared/src/main/scala/io/kaitai/struct/中按职责分层format/.ksy的语法模型ClassSpec、MemberSpec、KSVersion等precompile/预编译步骤——类型解析ResolveTypes、父子类型推导ParentTypes、序列尺寸计算CalculateSeqSizes、编码名规范化等languages/13 个目标语言编译器JavaCompiler、CppCompiler、PythonCompiler……translators/表达式 AST 到各语言语法树的翻译器编译入口是 Main.scala 中的importAndPrecompile→precompile→compile三段式管线。JVM 与 JS 两个入口最终都调用同一个Main.compile保证两端生成的解析器代码一字不差。平台差异层CLI 入口 vs 浏览器 API 差异被刻意压缩到最薄的“适配层”各自只实现自己平台的 I/O关注点JVM 实现Scala.js 实现程序入口jvm/src/main/scala/io/kaitai/struct/JavaMain.scalascopt 解析命令行js/src/main/scala/io/kaitai/struct/MainJs.scalaJSExportTopLevel暴露MainJs对象输入方式直接读本地.ksy文件snakeyaml 解析支持KSPATH环境变量与安装目录formats/自动发现接收调用方已解析好的 YAML JS 对象import 解析同步读文件系统JavaClassSpecs异步 Promise 回调JavaScriptClassSpecs委托importYaml输出方式直接写文件到磁盘返回文件名 → 内容的字典交给调用方平台差异垫片Platform.scala使用Locale.ROOT做大小写转换同目录Platform.scala用toUpperCase对齐行为JS 侧的关键代码在js/src/main/scala/io/kaitai/struct/format/JavaScriptKSYParser.scala把 JS 对象递归转成 Scala 结构后就完全复用了共享管线的ClassSpec.fromYaml。双渠道发布Maven Central 与 npm 的打包细节 Maven 侧publishMavenStyle : true组织为io.kaitai坐标即io.kaitai:kaitai-struct-compiler_2.13。构建时通过generateVersionTask把版本号、Git 提交信息写入生成源码Version.scala发布前还要求环境变量KAITAI_STRUCT_VERSION与build.sbt中的版本严格匹配防止误发。npm 侧js/package.json定义了包元信息包名kaitai-struct-compiler版本占位符由构建覆写。build.sbt 中的两个自定义任务完成封装buildNpmJsFile把 Scala.js 的 fastLinkJS 产物包一层 UMD/AMD 导出Node、浏览器全局变量、AMD 加载器都能用buildNpmPackage拷贝 LICENSE 与 README把0.12-SNAPSHOT改写成0.12.0-SNAPSHOT这样的合法 npm 语义化版本。npm 上同时维护latest稳定版与next跟随 master 的快照版两个标签方便工具链尝鲜。新手上手三种体验方式 ✅命令行在发行版软件源或安装包管理器中安装 Kaitai Struct Compiler即可使用ksc命令npm 集成npm install kaitai-struct-compiler然后compiler.compile(python, ksyYaml, importer, false)一行拿到全部生成文件注意 0.11.0 起 API 从构造函数改为对象方法Web IDE在浏览器中直接试用 Kaitai Struct Web IDE背后驱动的就是这份 Scala.js 编译器。想参与开发的话克隆仓库git clone https://gitcode.com/gh_mirrors/ka/kaitai_struct_compiler用 sbt 构建即可同时产出 JVM 与 JS 两个产物。小结 Kaitai Struct Compiler 的双平台架构给跨平台 Scala 项目提供了一个干净范本核心逻辑放 shared、I/O 适配放 jvm/js、发布配置各归 Maven 与 npm。一份.ksy编译管线桌面 CLI 与 Web 工具共享行为永远一致——这正是它作为官方参考编译器能够长期稳定演进的关键。【免费下载链接】kaitai_struct_compilerKaitai Struct: compiler to translate .ksy .cpp / .cs / .dot / .go / .java / .js / .lua / .nim / .php / .pm / .py / .rb / .rs项目地址: https://gitcode.com/gh_mirrors/ka/kaitai_struct_compiler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表