2 个不稳定版本
0.3.0 | 2020 年 8 月 7 日 |
---|---|
0.1.0 | 2018 年 9 月 9 日 |
#426 在 WebAssembly
22KB
464 行
olin
奥林就像 WebAssembly 的 JVM。它使用一组函数包装 WebAssembly,以访问外部世界,并跟踪诸如使用了多少条指令、执行了多少系统调用以及使用了多少内存等信息。这有助于分析代码。
要查看奥林的工作情况,请点击 这里。
背景
我经常需要编写一些应用程序,这些应用程序基本上要永远等待以确保将事物放置在正确的位置,然后运行正确的代码作为响应。然后我必须确保这些事物被放在正确的位置,并且为每个相关服务运行正确的版本。这不太容易扩展,更不用说很难保证了。随着时间的推移,这会导致大量重复的基础设施,并且随着事物的发展。不用说,还要添加跟踪、指标和日志聚合。
我想改变这一点。
我想创建一个类似于 Google Cloud Functions 或 AWS Lambda 的规范环境,由持久性消息队列支持,并将处理程序编译成 WebAssembly 以确保向前兼容性。因此,涉及的 ABI 将进行版本控制、文档化和测试。最终可能需要并行维护多个 ABI,因此可能最好从一开始就适应这一点。
我预计这个项目将持续几十年。我希望今天上传的二进制模块在 5 年后仍然可以使用,前提是模块外的依赖项仍然工作。
博客文章
在提出问题或在此早期状态下使用 Olin 之前,请务必阅读这些博客文章,概述此项目的目的以及我针对该主题的一些其他讨论
- https://christine.website/blog/olin-1-why-09-1-2018
- https://christine.website/blog/olin-2-the-future-09-5-2018
这些将解释这里尚未涵盖的许多内容。
支持的 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。
项目元数据
依赖关系
~2.5MB
~37K SLoC