Asmble完全指南如何将WebAssembly无缝编译到JVM平台【免费下载链接】asmbleCompile WebAssembly to JVM and other WASM tools项目地址: https://gitcode.com/gh_mirrors/as/asmbleAsmble是一款强大的编译器能够将WebAssembly代码编译为JVM字节码同时包含解释器和用于从命令行及JVM语言处理WASM代码的实用工具。本文将为你提供一份全面的Asmble使用指南帮助你快速掌握如何将WebAssembly无缝编译到JVM平台。 Asmble核心功能解析Asmble作为一款专业的WebAssembly到JVM编译器具备以下核心功能WASM到JVM字节码编译无需运行时支持直接将WebAssembly代码转换为高效的JVM字节码WASM解释器支持单指令级别的逐步执行方便调试和学习格式转换工具在WASM二进制格式、文本格式和AST之间进行灵活转换程序化JVM库用Kotlin编写可轻松集成到所有JVM语言项目中丰富示例展示如何通过WASM在JVM上使用其他语言如Rust编写的代码具体示例可参考examples目录 快速入门编译并运行你的第一个WASM程序WebAssembly本身不包含打印到标准输出或其他外部平台功能的例程。本示例将使用spec中的测试工具。确保已安装Java 8。步骤1准备环境从releases区域下载最新的TAR/ZIP文件并将其解压到asmble/目录。步骤2创建WASM程序WebAssembly代码可以是二进制文件即.wasm文件或文本文件即.wast文件。以下代码从测试工具导入print函数然后创建一个调用print输出整数70的函数并将其设置为模块初始化时调用(module (import spectest print_i32 (func $print (param i32))) (func $print70 (call $print (i32.const 70))) (start $print70) )将此代码保存为print-70.wast。步骤3运行程序执行以下命令运行程序./asmble/bin/asmble run -testharness print-70.wast运行结果将显示70 : i32这是测试工具打印整数的方式。有关更多示例请参见examples目录。 Asmble命令行使用详解假设已安装Java 8下载最新release并解压。asmble命令位于asmble/bin文件夹中。Asmble提供多个命令执行不带命令的asmble即可查看Usage: COMMAND options... Commands: compile - Compile WebAssembly to class file help - Show command help invoke - Invoke WebAssembly function run - Run WebAssembly script commands translate - Translate WebAssembly from one form to another For detailed command info, use: help COMMAND 编译命令将WASM转换为类文件运行asmble help compile可查看编译命令详情Command: compile Description: Compile WebAssembly to class file Usage: compile inFile [-format inFormat] outClass [-out outFile] Args: inFile - The wast or wasm WebAssembly file name. Can be -- to read from stdin. Required. -format inFormat - Either wast or wasm to describe format. Optional, default: use file extension -log logLevel - One of: trace, debug, info, warn, error, off. Optional, default: warn outClass - The fully qualified class name. Required. -out outFile - The file name to output to. Can be -- to write to stdout. Optional, default: outClass.class此命令用于将WebAssembly编译为类文件。编译结果将是一个包含JVM字节码的.class文件。注意类文件不需要运行时支持它们是自包含的。▶️ 调用命令执行WASM函数运行asmble help invoke可查看调用命令详情Command: invoke Description: Invoke WebAssembly function Usage: invoke [-in inFile]... [-reg registration]... [-mod module] [export] [arg]...此命令可以运行WebAssembly代码包括已编译的.class文件。例如将以下WebAssembly代码保存为add-20.wast(module (func (export doAdd) (param $i i32) (result i32) (i32.add (get_local 0) (i32.const 20)) ) )可通过以下命令调用并查看结果asmble invoke -res -in add-20.wast doAdd 100这将输出120。也可以先编译asmble compile add-20.wast MyClass现在生成了MyClass.class文件。由于它不导入任何内容因此有一个无参构造函数可以这样调用asmble invoke -res -in MyClass.class -reg myModMyClass -mod myMod doAdd 100 转换命令在不同WASM格式间转换运行asmble help translate可查看转换命令详情Command: translate Description: Translate WebAssembly from one form to another Usage: translate inFile [-in inFormat] [outFile] [-out outFormat]Asmble可以将.wasm文件转换为.wast反之亦然。它也可以将.wast转换为.wast这很有用因为它可以解析所有名称并创建更原始但确定性且有时更易读的.wast。️ 程序化使用在JVM项目中集成AsmbleAsmble用Kotlin编写但由于Kotlin是传统Java的薄层包装因此可以很容易地在所有JVM语言中使用。添加依赖编译器和注解已部署到Maven Central。可以通过以下Gradle依赖项添加编译器compile com.github.cretz.asmble:asmble-compiler:0.3.0编译后的代码没有运行时要求。如果需要反射注解可以添加注解库依赖compile com.github.cretz.asmble:asmble-annotations:0.3.0关键类和包以下是一些有用的类和包asmble.ast.Node- 所有WebAssembly AST节点作为静态内部类asmble.cli- CLI的所有代码asmble.compile.jvm.AstToAsm- 将AST模块转换为ASM ClassNode的入口点asmble.compile.jvm.Mem- 可实现以更改内存处理方式的接口当前同一包中的ByteBufferMem是唯一实现它会生成ByteBufferFuncBuilder- WASM指令到JVM指令转换的主要实现位置asmble.io- 用于在ast节点、字节即wasm、sexprs即wast和字符串之间进行转换的类asmble.run.jvm- 用于在JVM上运行WASM代码的工具特别是有助于链接的ScriptContextasmble.run.jvm.interpret- 可以一次性运行WASM或允许单指令逐步执行的解释器 编译细节WASM如何转换为JVM字节码Asmble尽力将WASM操作编译为JVM字节码同时将开销降至最低。每个模块表示为单个类。内存处理内存在构造函数中构建或接受并存储在字段中。当前实现使用ByteBuffer。由于ByteBuffer不能动态增长因此最大内存是绝对最大值即使有可通过grow_memory调整的限制。内存的任何数据都在构造函数中设置。函数调用普通call操作根据是否为导入而执行不同的操作。如果是导入则从字段中检索MethodHandle并通过invokeExact调用。否则执行正常的invokevirtual来调用本地方法。call_indirect通过JVM上的invokedynamic完成。具体来说invokedynamic指定我们创建的合成引导方法。它对该引导方法进行一次性调用以获得将来可以调用的MethodHandle。类型转换WebAssembly有4种类型i32、i64、f32和f64。这些分别直接转换为int、long、float和double。控制流操作诸如unreachable会抛出异常之类的操作大多按预期运行。分支和循环通过跳转处理。幸运的是br_table跳转直接转换为JVM表切换这使它们非常快。⚠️ 注意事项和限制以下是WebAssembly和JVM之间存在一些阻抗不匹配的性能和实现问题WebAssembly有一个很好的字节数组数据部分而JVM没有。目前我们使用单字节字符字符串常量即ISO-8859字符集。JVM不保证像WebAssembly那样保留NaN浮点表示上的尾随位。JVM需要严格的堆栈管理编译器编写者应在执行无条件跳转之前弹出不需要的内容。WebAssembly要求运行时在无条件跳转之前丢弃未使用的堆栈项因此我们必须处理这一点。内存和表都有最大容量和初始容量。虽然内存使用具有这些概念的ByteBuffer即capacity和limit但表使用仅具有初始容量的数组。 常见问题解答问为什么开发Asmble答我喜欢编写编译器并且需要一个足够大的项目来很好地学习Kotlin以便对其做出合理的判断。我还想熟悉WebAssembly。我对这个项目没有真正的商业兴趣因此不能保证它会永远得到维护。问它能在Android上运行吗答我没有调查过。但我确实使用invokedynamic和MethodHandle因此它需要是现代版本的Android。我假设运行时和编译时代码都可能在那里运行。欢迎实验反馈。问JVM到WASM呢答这不是该项目的近期目标至少在WASM GC提案被接受之前不是。同时可以关注https://github.com/konsoletyper/teavm。问那么我可以通过Emscripten编译C代码并让它通过这个在JVM上运行吗答是的但需要一些工作。WebAssembly缺少任何类型的标准库。因此Emscripten会将其嵌入或从平台导入不确定哪个/哪里我还没有调查。为JVM构建一个Emscripten知道的libc之类的东西可能是一个有价值的项目。 总结Asmble为WebAssembly到JVM平台的编译提供了一个强大而灵活的解决方案。无论是通过命令行工具快速转换和运行WASM代码还是在JVM项目中程序化集成Asmble库都能轻松实现WebAssembly与JVM平台的无缝对接。通过本指南你已经了解了Asmble的核心功能、使用方法和内部工作原理。现在你可以开始探索如何利用Asmble将WebAssembly代码带入JVM生态系统开启跨平台开发的新可能要开始使用Asmble请克隆仓库git clone --recursive https://gitcode.com/gh_mirrors/as/asmble【免费下载链接】asmbleCompile WebAssembly to JVM and other WASM tools项目地址: https://gitcode.com/gh_mirrors/as/asmble创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考