#syscalls #profiling #memory #instructions #targeting #run-time

nightly bin+lib olin

一个小型运行时库,用于帮助针对 Olin 的 CommonWA 链接的程序。这仅在 wasm32-unknown-unknown 目标上才有用。

2 个不稳定版本

0.3.0 2020 年 8 月 7 日
0.1.0 2018 年 9 月 9 日

#426WebAssembly

MIT 许可证

22KB
464

olin

Actions Status Go Report Card GoDoc powered by WebAssembly

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

要查看奥林的工作情况,请点击 这里

背景

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

我想改变这一点。

我想创建一个类似于 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

依赖关系

~2.5MB
~37K SLoC