HAL vs Graph can be viewed more generally as: When modeling “computation,” do we use - Shallow Embedding (write it directly in the host language), or - Deep Embedding (encode it as a data structure)? 🧵
From shallow → deep, there are several design points: 1. Direct implementation in Rust / C++ 2. Embedded DSL inside the host language 3. A brand-new specialized language Each step trades convenience for structure and analyzability.
In ZK, it’s not enough to run a computation — we must also translate it into constraints. So most proving systems already lean toward (2) or (3): - Circom, PIL/PIL2 → custom constraint languages + compilers - Plonky2 → each gate defines multiple semantic functions
Plonky3 goes further with the AirBuilder trait: the same code can evaluate witnesses, compute verifier residuals, and dump constraint polynomials. Many zkVMs (SP1, Hypercube, OpenVM) adopt Plonky3; Zisk is based on PIL2. This shows a clear trend toward deep, graph-like representations of computation.
1.79K