#帮助 #链接 #运行时 #go #abi #olin

libcwa

一个小型运行时库,用于帮助与CommonWA链接的程序。这仅在Olin内部wasm32-unknown-unknown目标下真正有用。

1个不稳定版本

使用旧的Rust 2015

0.1.0 2018年9月9日

679WebAssembly

MIT 许可证

12KB
308

olin

Actions Status Go Report Card GoDoc powered by WebAssembly

Olin类似于WebAssembly的JVM。它使用一组函数将WebAssembly包装起来以访问外部世界,并跟踪诸如已使用多少指令、执行了多少系统调用以及使用了多少内存等信息。这有助于代码分析。

要查看Olin的实际效果,请点击此处

背景

我经常需要编写基本上永远等待以确保事情被放在正确的位置,然后正确运行代码作为响应的应用程序。我必须确保这些事情被放在正确的位置,并且为每个相关服务运行正确的版本。这并不容易扩展,更不用说很难保证安全。随着时间的推移和事物的发展,会导致大量的重复基础设施。此外,添加跟踪、指标和日志聚合。

我想改变这一点。

我想创建一个类似于Google Cloud FunctionsAWS Lambda 的指令性环境,由持久消息队列支持,并且将处理程序编译为WebAssembly以确保向前兼容性。因此,涉及的ABI将进行版本控制、文档化和测试。最终可能需要并行维护多个ABI,因此可能最好从一开始就适应这一点。

我预计这个项目将持续数十年。我希望今天上传的二进制模块在5年后仍然可以使用,前提是其模块外部的依赖项仍然有效。

博客文章

在提问或在此早期阶段使用Olin之前,我请求您阅读这些概述此项目目的和一些其他我针对该主题进行的讨论的博客文章

这些将解释这里还没有涵盖的很多东西。

支持的ABI

通用WebAssembly

Olin 支持链接到 Common WebAssembly 规范的二进制文件。更多信息,请参阅 cmd/cwa 下的测试。目前 Common WebAssembly 比较基础,但同时也是针对 Common Webassembly 的测试最多的。Common WebAssembly 规范的测试可以在 这里 找到。

Go

Olin 还包括对由 Go 1.12 的 WebAssembly 支持 创建的 WebAssembly 模块的运行支持。它使用 wasmgo ABI 包来执行某些操作。目前这非常基础,但将来应该可以扩展到更多功能。

例如

// +build js,wasm ignore
// hello_world.go

package main

func main() {
	println("Hello, world!")
}

当按这种方式编译时

$ GOARCH=wasm GOOS=js go1.12.1 build -o hello_world.wasm hello_world.go

使用测试模拟器运行时会产生以下输出

=== RUN   TestWasmGo/github.com/Xe/olin/internal/abi/wasmgo.testHelloWorld
Hello, world!
--- PASS: TestWasmGo (1.66s)
    --- PASS: TestWasmGo/github.com/Xe/olin/internal/abi/wasmgo.testHelloWorld (1.66s)

目前 Go 二进制文件无法与 Dagger ABI 交互。有关解决此问题的解决方案,已有一个 问题 正在跟踪。

未来的帖子将包含更多关于在 Olin 上使用 Go 的细节。

在底层,Olin 实现的 Go ABI 目前使用 Dagger。

项目元数据

要关注该项目,请在此处查看 GitHub 页面。要在 Slack 上讨论,请加入 Go 社区 Slack 并加入 #olin

依赖项

~1MB
~18K SLoC