Encantis is a new programming language aimed at being wasm native, but much easier to work with than something like wat
syntax. It does this in 2 main ways:
Add a robust type system on top of the primitive types in Wasm native. This allows for vectors, null-terminated arrays, structs, etc.
Use more traditional syntax over s-expressions including infix syntax for most expressions.
Also while being wasm native, it will ship an optional bytecode interpreter for embedded applications where wasm is a little too heavy and you want some syscalls to be inline opcodes in the bytecode for maximum performance!
(module
;; Import the required fd_write WASI function which will write the given io vectors to stdout
;; The function signature for fd_write is:
;; (File Descriptor, *iovs, iovs_len, nwritten) -> Returns number of bytes written
;; (import "wasi_unstable" "fd_write" (func $fd_write (param i32 i32 i32 i32) (result i32)))
(import "wasi_snapshot_preview1" "fd_write" (func $fd_write (param i32 i32 i32 i32) (result i32)))
(memory 1)
(export "memory" (memory 0))
(data (i32.const 0) "\08\00\00\00\0c\00\00\00hello world\n")
(func $main (export "_start")
(call $fd_write
(i32.const 1) ;; file_descriptor - 1 for stdout
(i32.const 0) ;; *iovs - The pointer to the iov array, which is stored at memory location 0
(i32.const 1) ;; iovs_len - We're printing 1 string stored in an iov - so one.
(i32.const 20) ;; nwritten - A place in memory to store the number of bytes written
)
drop ;; Discard the number of bytes written from the top of the stack
)
)
Consider this wat module above. This is the most minimal way to implement hello world when using the wasi ABI. In Encantis it would look like the following:
import "wasi_snapshot_preview1" (
"fd_write" func fd-write (fd:u32 iovec:[[u8]] outsize:*u32) -> result:i32
)
define stdout:i32 = 1
define iovec:[[u8]] = (message 1)
export "_start"
func ()
fd-write(stdout iovec outsize)
end
export "memory"
memory 1
data 0 (
message -> "Hello World\n":[u8]
out-size -> u32
)
There is more to come, but this is just a teaser and a test of this blogging platform.