Deletes the drifted Deeper dive section in REAMDE (#891)
Signed-off-by: Takeshi Yoneda <takeshi@tetrate.io>
This commit is contained in:
58
README.md
58
README.md
@@ -15,66 +15,10 @@ Import wazero and extend your Go application with code written in any language!
|
|||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
The best way to learn wazero is by trying one of our [examples](examples). The
|
The best way to learn wazero is by trying one of our [examples](examples/README.md). The
|
||||||
most [basic example](examples/basic) extends a Go application with an addition
|
most [basic example](examples/basic) extends a Go application with an addition
|
||||||
function defined in WebAssembly.
|
function defined in WebAssembly.
|
||||||
|
|
||||||
## Deeper dive
|
|
||||||
|
|
||||||
The former example is a pure function. While a good start, you probably are
|
|
||||||
wondering how to do something more realistic, like read a file. WebAssembly
|
|
||||||
Modules (Wasm) are sandboxed similar to containers. They can't read anything
|
|
||||||
on your machine unless you explicitly allow it.
|
|
||||||
|
|
||||||
The WebAssembly Core Specification is a standard, governed by W3C process, but
|
|
||||||
it has no scope to specify how system resources like files are accessed.
|
|
||||||
Instead, WebAssembly defines "host functions" and the signatures they can use.
|
|
||||||
In wazero, "host functions" are written in Go, and let you do anything
|
|
||||||
including access files. The main constraint is that WebAssembly only allows
|
|
||||||
numeric types. wazero includes [imports](imports) for common languages and
|
|
||||||
compiler toolchains.
|
|
||||||
|
|
||||||
For example, you can grant WebAssembly code access to your console by exporting
|
|
||||||
a function written in Go. The below function can be imported into standard
|
|
||||||
WebAssembly as the module "env" and the function name "log_i32".
|
|
||||||
```go
|
|
||||||
_, err := r.NewHostModuleBuilder("env").
|
|
||||||
ExportFunction("log_i32", func(v uint32) {
|
|
||||||
fmt.Println("log_i32 >>", v)
|
|
||||||
}).
|
|
||||||
Instantiate(ctx, r)
|
|
||||||
if err != nil {
|
|
||||||
log.Panicln(err)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
The WebAssembly community has [subgroups][4] which maintain work that may not
|
|
||||||
result in a Web Standard. One such group is the WebAssembly System Interface
|
|
||||||
([WASI][5]), which defines functions similar to Go's [x/sys/unix][6].
|
|
||||||
|
|
||||||
The [wasi_snapshot_preview1][13] tag of WASI is widely implemented, so wazero
|
|
||||||
bundles an implementation. That way, you don't have to write these functions.
|
|
||||||
|
|
||||||
For example, here's how you can allow WebAssembly modules to read
|
|
||||||
"/work/home/a.txt" as "/a.txt" or "./a.txt" as well the system clock:
|
|
||||||
```go
|
|
||||||
_, err := wasi_snapshot_preview1.Instantiate(ctx, r)
|
|
||||||
if err != nil {
|
|
||||||
log.Panicln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
config := wazero.NewModuleConfig().
|
|
||||||
WithFS(os.DirFS("/work/home")). // instead of no file system
|
|
||||||
WithSysWalltime().WithSysNanotime() // instead of fake time
|
|
||||||
|
|
||||||
module, err := r.InstantiateModule(ctx, compiled, config)
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
While we hope this deeper dive was useful, we also provide [examples](examples)
|
|
||||||
to elaborate each point. Please try these before raising usage questions as
|
|
||||||
they may answer them for you!
|
|
||||||
|
|
||||||
## Runtime
|
## Runtime
|
||||||
|
|
||||||
There are two runtime configurations supported in wazero: _Compiler_ is default:
|
There are two runtime configurations supported in wazero: _Compiler_ is default:
|
||||||
|
|||||||
Reference in New Issue
Block a user