First slice of the native-codegen tier. A new standalone module, src/jolt/ cgen.janet, that translates a numeric-leaf fn (numeric in/out, body uses only native-op arithmetic + loop/recur/if/let/do) to a Janet native C module: params unboxed to C doubles at entry, loop/recur lowered to a while loop, reboxed at return. compile-fn runs cc and loads the .so via the native builtin, returning a cfunction; it returns nil for non-candidates or when the toolchain is absent. count-point compiles and matches the bytecode fn across the mandelbrot grid (test/integration/cgen-test.janet, which skips the behavioral leg where cc/janet.h are missing). Nothing wires this into the default compile path yet — detecting hot fns and installing the C version onto the var cell is the next step. See docs/foundational-runtime-lever1-native-codegen.md for the ceiling (native-C ~18-22x faster than bytecode, edges out JVM) and the leaf-first rule. Co-authored-by: Yogthos <yogthos@gmail.com>
15 lines
691 B
Text
15 lines
691 B
Text
# Dump the analyzed IR (not emitted Janet) for count-point, so the C emitter can
|
|
# be written against the real node shapes. jolt-ihdp.
|
|
(import ../../src/jolt/api :as api)
|
|
(import ../../src/jolt/backend :as backend)
|
|
(import ../../src/jolt/reader :as reader)
|
|
|
|
(def ctx (api/init-cached {:compile? true}))
|
|
(put (ctx :env) :direct-linking? true)
|
|
(put (ctx :env) :inline? true)
|
|
(api/eval-string ctx "(ns mandelbrot)")
|
|
|
|
(def src "(defn count-point [cr ci cap] (loop [i 0 zr 0.0 zi 0.0] (if (or (>= i cap) (> (+ (* zr zr) (* zi zi)) 4.0)) i (recur (inc i) (+ (- (* zr zr) (* zi zi)) cr) (+ (* 2.0 (* zr zi)) ci)))))")
|
|
|
|
(def ir (backend/analyze-form ctx (reader/parse-string src)))
|
|
(printf "%P" ir)
|