Renderingen-US

WebAssembly text

WAT emission from the same MIR.

Part of the MIR lane. Every panel below is compiler output.

How to read it#

A stack machine, so the arithmetic reads inside out. Useful as a check on what actually crosses into a sandboxed runtime.

Typed tensors#

Builds two shaped matrices, multiplies them, and reduces the product to a scalar. Exercises shape-bearing types and a reduction.

Faber source

reader locale
faber format --locale en — English reader surface
main {
    const list<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    const list<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    const tensor<f32, []> seed  vacua
    const tensor<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    const tensor<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    const tensor<f32, [2, 4]> product  a.matmul(b)
    const f32 mean  product.media()
    print mean
}
faber format --locale la — canonical Faber
incipit {
    fixum lista<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    fixum lista<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    fixum tensor<f32, []> seed  vacua
    fixum tensor<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    fixum tensor<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    fixum tensor<f32, [2, 4]> product  a.matmul(b)
    fixum f32 mean  product.media()
    nota mean
}
faber format --locale th-TH — Thai
เริ่ม {
    คงที่ รายการ<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    คงที่ รายการ<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    คงที่ เทนเซอร์<f32, []> seed  เซตว่าง
    คงที่ เทนเซอร์<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    คงที่ เทนเซอร์<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    คงที่ เทนเซอร์<f32, [2, 4]> product  a.matmul(b)
    คงที่ f32 mean  product.media()
    บันทึก mean
}
faber format --locale zh-Hans — Simplified Chinese
入口 {
    常量 列表<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    常量 列表<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    常量 张量<f32, []> seed  空集
    常量 张量<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    常量 张量<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    常量 张量<f32, [2, 4]> product  a.matmul(b)
    常量 f32 mean  product.media()
    显示 mean
}
faber format --locale zh-Hant — Traditional Chinese
入口 {
    定值 列表<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    定值 列表<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    定值 張量<f32, []> seed  空集
    定值 張量<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    定值 張量<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    定值 張量<f32, [2, 4]> product  a.matmul(b)
    定值 f32 mean  product.media()
    註記 mean
}
faber format --locale vi — Vietnamese
bắt_đầu {
    hằng danh_sách<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    hằng danh_sách<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    hằng ten_xo<f32, []> seed  tập_rỗng
    hằng ten_xo<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    hằng ten_xo<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    hằng ten_xo<f32, [2, 4]> product  a.matmul(b)
    hằng f32 mean  product.media()
    ghi_chú mean
}
faber format --locale ar — Arabic
بداية {
    ثابت قائمة<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    ثابت قائمة<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    ثابت موتر<f32, []> seed  فارغ
    ثابت موتر<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    ثابت موتر<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    ثابت موتر<f32, [2, 4]> product  a.matmul(b)
    ثابت f32 mean  product.media()
    اعرض mean
}
faber format --locale hi — Hindi
आरंभ {
    स्थिर सूची<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    स्थिर सूची<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    स्थिर टेंसर<f32, []> seed  खाली
    स्थिर टेंसर<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    स्थिर टेंसर<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    स्थिर टेंसर<f32, [2, 4]> product  a.matmul(b)
    स्थिर f32 mean  product.media()
    दिखाओ mean
}

WebAssembly text — 10 lines in, 104 out (10.4×)

;; Generated by radix MIR WASM text probe - experimental artifact.
(module
    (import "faber_rt_v1" "__faber_rt_v1_array_new" (func $__faber_rt_v1_array_new__construct (param i32) (result i32)))
    (import "faber_rt_v1" "__faber_rt_v1_array_push" (func $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (param i32 i64) (result i32)))
    (import "faber_rt_v1" "__faber_rt_v1_tensor_new" (func $__faber_rt_v1_tensor_new__construct (param i32) (result i32)))
    (import "faber_rt_v1" "__faber_rt_v1_tensor_from_flat" (func $__faber_rt_v1_tensor_from_flat__tensor_from_flat_3_aggregate_aggregate_aggregate_to_aggregate (param i32 i32 i32) (result i32)))
    (import "faber_rt_v1" "__faber_rt_v1_tensor_matmul" (func $__faber_rt_v1_tensor_matmul__tensor_matmul_2_aggregate_aggregate_to_aggregate (param i32 i32) (result i32)))
    (import "faber_rt_v1" "__faber_rt_v1_tensor_mean" (func $__faber_rt_v1_tensor_mean__tensor_mean_1_aggregate_to_f64 (param i32) (result f64)))
    (import "faber_rt_v1" "__faber_rt_v1_diagnostic_nota_f64" (func $__faber_rt_v1_diagnostic_nota_f64 (param f64)))
    (func $incipit (export "incipit")
          (local $l0 i32)
          (local $l1 i32)
          (local $l2 i32)
          (local $l3 i32)
          (local $l4 i32)
          (local $l5 i32)
          (local $l6 f64)
          (local $t0 f64)
          (local $t1 f64)
          (local $t2 f64)
          (local $t3 f64)
          (local $t4 f64)
          (local $t5 f64)
          (local $t6 i32)
          (local $t7 f64)
          (local $t8 f64)
          (local $t9 f64)
          (local $t10 f64)
          (local $t11 f64)
          (local $t12 f64)
          (local $t13 f64)
          (local $t14 f64)
          (local $t15 f64)
          (local $t16 f64)
          (local $t17 f64)
          (local $t18 f64)
          (local $t19 i32)
          (local $t20 i32)
          (local $t21 i32)
          (local $t22 i32)
          (local $t23 i32)
          (local $t24 i32)
          (local $t25 i32)
          (local $t26 f64)
          (local.set $t0 (f64.const 1.0))
          (local.set $t1 (f64.const 2.0))
          (local.set $t2 (f64.const 3.0))
          (local.set $t3 (f64.const 4.0))
          (local.set $t4 (f64.const 5.0))
          (local.set $t5 (f64.const 6.0))
          (local.set $t6 (call $__faber_rt_v1_array_new__construct (i32.const 6)))
          (local.set $t6 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t6) (i64.reinterpret_f64 (local.get $t0))))
          (local.set $t6 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t6) (i64.reinterpret_f64 (local.get $t1))))
          (local.set $t6 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t6) (i64.reinterpret_f64 (local.get $t2))))
          (local.set $t6 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t6) (i64.reinterpret_f64 (local.get $t3))))
          (local.set $t6 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t6) (i64.reinterpret_f64 (local.get $t4))))
          (local.set $t6 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t6) (i64.reinterpret_f64 (local.get $t5))))
          (local.set $l0 (local.get $t6))
          (local.set $t7 (f64.const 1.0))
          (local.set $t8 (f64.const 2.0))
          (local.set $t9 (f64.const 3.0))
          (local.set $t10 (f64.const 4.0))
          (local.set $t11 (f64.const 5.0))
          (local.set $t12 (f64.const 6.0))
          (local.set $t13 (f64.const 7.0))
          (local.set $t14 (f64.const 8.0))
          (local.set $t15 (f64.const 9.0))
          (local.set $t16 (f64.const 10.0))
          (local.set $t17 (f64.const 11.0))
          (local.set $t18 (f64.const 12.0))
          (local.set $t19 (call $__faber_rt_v1_array_new__construct (i32.const 6)))
          (local.set $t19 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t19) (i64.reinterpret_f64 (local.get $t7))))
          (local.set $t19 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t19) (i64.reinterpret_f64 (local.get $t8))))
          (local.set $t19 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t19) (i64.reinterpret_f64 (local.get $t9))))
          (local.set $t19 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t19) (i64.reinterpret_f64 (local.get $t10))))
          (local.set $t19 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t19) (i64.reinterpret_f64 (local.get $t11))))
          (local.set $t19 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t19) (i64.reinterpret_f64 (local.get $t12))))
          (local.set $t19 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t19) (i64.reinterpret_f64 (local.get $t13))))
          (local.set $t19 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t19) (i64.reinterpret_f64 (local.get $t14))))
          (local.set $t19 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t19) (i64.reinterpret_f64 (local.get $t15))))
          (local.set $t19 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t19) (i64.reinterpret_f64 (local.get $t16))))
          (local.set $t19 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t19) (i64.reinterpret_f64 (local.get $t17))))
          (local.set $t19 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t19) (i64.reinterpret_f64 (local.get $t18))))
          (local.set $l1 (local.get $t19))
          (local.set $t20 (call $__faber_rt_v1_tensor_new__construct (i32.const 6)))
          (local.set $l2 (local.get $t20))
          (local.set $t21 (call $__faber_rt_v1_array_new__construct (i32.const 4)))
          (local.set $t21 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t21) (i64.const 2)))
          (local.set $t21 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t21) (i64.const 3)))
          (local.set $t22 (call $__faber_rt_v1_tensor_from_flat__tensor_from_flat_3_aggregate_aggregate_aggregate_to_aggregate (local.get $l2) (local.get $l0) (local.get $t21)))
          (local.set $l3 (local.get $t22))
          (local.set $t23 (call $__faber_rt_v1_array_new__construct (i32.const 4)))
          (local.set $t23 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t23) (i64.const 3)))
          (local.set $t23 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t23) (i64.const 4)))
          (local.set $t24 (call $__faber_rt_v1_tensor_from_flat__tensor_from_flat_3_aggregate_aggregate_aggregate_to_aggregate (local.get $l2) (local.get $l1) (local.get $t23)))
          (local.set $l4 (local.get $t24))
          (local.set $t25 (call $__faber_rt_v1_tensor_matmul__tensor_matmul_2_aggregate_aggregate_to_aggregate (local.get $l3) (local.get $l4)))
          (local.set $l5 (local.get $t25))
          (local.set $t26 (call $__faber_rt_v1_tensor_mean__tensor_mean_1_aggregate_to_f64 (local.get $l5)))
          (local.set $l6 (local.get $t26))
          (call $__faber_rt_v1_diagnostic_nota_f64 (local.get $l6))
          (return)
    )
)

The error channel#

A function that may fail, and a caller that catches. Shows how the channel becomes each target's own error idiom.

WebAssembly text does not lower this scenario. That is a measured gap, not an omission — the emitter rejects it rather than producing something that would not run.

Collections and iteration#

A list folded to a total with itera ex. The plainest possible read on how loops lower.

Faber source

reader locale
faber format --locale en — English reader surface
fn summa(list<int> numeri)  int {
    var int total  0
    for from numeri const n {
        total  total + n
    }
    return total
}

main {
    const list<int> valores  [1, 2, 3, 4, 5]
    print summa(valores)
}
faber format --locale la — canonical Faber
functio summa(lista<numerus> numeri)  numerus {
    varia numerus total  0
    itera ex numeri fixum n {
        total  total + n
    }
    redde total
}

incipit {
    fixum lista<numerus> valores  [1, 2, 3, 4, 5]
    nota summa(valores)
}
faber format --locale th-TH — Thai
ฟังก์ชัน summa(รายการ<จำนวน> numeri)  จำนวน {
    แปร จำนวน total  0
    วน ออก numeri คงที่ n {
        total  total + n
    }
    คืน total
}

เริ่ม {
    คงที่ รายการ<จำนวน> valores  [1, 2, 3, 4, 5]
    บันทึก summa(valores)
}
faber format --locale zh-Hans — Simplified Chinese
函数 summa(列表<整数> numeri)  整数 {
    变量 整数 total  0
    遍历 取自 numeri 常量 n {
        total  total + n
    }
    返回 total
}

入口 {
    常量 列表<整数> valores  [1, 2, 3, 4, 5]
    显示 summa(valores)
}
faber format --locale zh-Hant — Traditional Chinese
函式 summa(列表<整數> numeri)  整數 {
    變值 整數 total  0
    遍歷 取自 numeri 定值 n {
        total  total + n
    }
    傳回 total
}

入口 {
    定值 列表<整數> valores  [1, 2, 3, 4, 5]
    註記 summa(valores)
}
faber format --locale vi — Vietnamese
hàm summa(danh_sách<số> numeri)  số {
    biến số total  0
    lặp từ numeri hằng n {
        total  total + n
    }
    trả total
}

bắt_đầu {
    hằng danh_sách<số> valores  [1, 2, 3, 4, 5]
    ghi_chú summa(valores)
}
faber format --locale ar — Arabic
دالة summa(قائمة<عدد> numeri)  عدد {
    متغير عدد total  0
    كرر من numeri ثابت n {
        total  total + n
    }
    أعد total
}

بداية {
    ثابت قائمة<عدد> valores  [1, 2, 3, 4, 5]
    اعرض summa(valores)
}
faber format --locale hi — Hindi
फलन summa(सूची<संख्या> numeri)  संख्या {
    चर संख्या total  0
    दोहराओ सेवन numeri स्थिर n {
        total  total + n
    }
    लौटाओ total
}

आरंभ {
    स्थिर सूची<संख्या> valores  [1, 2, 3, 4, 5]
    दिखाओ summa(valores)
}

WebAssembly text — 12 lines in, 87 out (7.2×)

;; Generated by radix MIR WASM text probe - experimental artifact.
(module
    (import "faber_rt_v1" "__faber_rt_v1_array_new" (func $__faber_rt_v1_array_new__construct (param i32) (result i32)))
    (import "faber_rt_v1" "__faber_rt_v1_array_push" (func $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (param i32 i64) (result i32)))
    (import "faber_rt_v1" "__faber_rt_v1_array_get" (func $__faber_rt_v1_array_get__index_2_aggregate_i64_to_i64 (param i32 i64) (result i64)))
    (import "faber_rt_v1" "__faber_rt_v1_array_length" (func $__faber_rt_v1_array_length__length_1_aggregate_to_i64 (param i32) (result i64)))
    (import "faber_rt_v1" "__faber_rt_v1_diagnostic_nota_i64" (func $__faber_rt_v1_diagnostic_nota_i64 (param i64)))
    (func $summa (export "summa") (param $l0 i32) (result i64)
          (local $l1 i64)
          (local $l2 i64)
          (local $l3 i64)
          (local $t0 i64)
          (local $t1 i32)
          (local $t2 i64)
          (local $t3 i64)
          (local $p0 i32)
          (local.set $p0 (i32.const 0))
          (loop $dispatch
              (if (i32.eq (local.get $p0) (i32.const 0))
                  (then
                      (local.set $l1 (i64.const 0))
                      (local.set $l2 (i64.const 0))
                      (local.set $t0 (call $__faber_rt_v1_array_length__length_1_aggregate_to_i64 (local.get $l0)))
                      (local.set $p0 (i32.const 1))
                      (br $dispatch)
                  )
              )
              (if (i32.eq (local.get $p0) (i32.const 1))
                  (then
                      ;; v2 = (i64.lt_s (local.get $l2) (local.get $t0))
                      (local.set $t1 (i64.lt_s (local.get $l2) (local.get $t0)))
                      (if (local.get $t1)
                          (then
                              (local.set $p0 (i32.const 2))
                              (br $dispatch)
                          )
                          (else
                              (local.set $p0 (i32.const 4))
                              (br $dispatch)
                          )
                      )
                  )
              )
              (if (i32.eq (local.get $p0) (i32.const 2))
                  (then
                      (local.set $l3 (call $__faber_rt_v1_array_get__index_2_aggregate_i64_to_i64 (local.get $l0) (local.get $l2)))
                      ;; v4 = (i64.add (local.get $l1) (local.get $l3))
                      (local.set $t2 (i64.add (local.get $l1) (local.get $l3)))
                      (local.set $l1 (local.get $t2))
                      (local.set $p0 (i32.const 3))
                      (br $dispatch)
                  )
              )
              (if (i32.eq (local.get $p0) (i32.const 3))
                  (then
                      ;; v6 = (i64.add (local.get $l2) (i64.const 1))
                      (local.set $t3 (i64.add (local.get $l2) (i64.const 1)))
                      (local.set $l2 (local.get $t3))
                      (local.set $p0 (i32.const 1))
                      (br $dispatch)
                  )
              )
              (if (i32.eq (local.get $p0) (i32.const 4))
                  (then
                      (return (local.get $l1))
                  )
              )
              (unreachable)
          )
          (unreachable)
    )
    (func $incipit (export "incipit")
          (local $l0 i32)
          (local $t0 i32)
          (local $t1 i64)
          (local.set $t0 (call $__faber_rt_v1_array_new__construct (i32.const 4)))
          (local.set $t0 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t0) (i64.const 1)))
          (local.set $t0 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t0) (i64.const 2)))
          (local.set $t0 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t0) (i64.const 3)))
          (local.set $t0 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t0) (i64.const 4)))
          (local.set $t0 (call $__faber_rt_v1_array_push__construct_2_aggregate_i64_to_aggregate (local.get $t0) (i64.const 5)))
          (local.set $l0 (local.get $t0))
          (local.set $t1 (call $summa (local.get $l0)))
          (call $__faber_rt_v1_diagnostic_nota_i64 (local.get $t1))
          (return)
    )
)

---

All lanes · Measured support per term