Thanks a lot for the detailed reply.
You’re right that the Yul boundary is the most stable and well-defined part of the pipeline right now, and that’s exactly why I’ve been building on top of it.
Ora already makes heavy use of the Yul pipeline — the current architecture follows:
Ora → MLIR → Yul → Bytecode
This means Yul plays a central role in my compiler backend. Ora lowers its own MLIR into canonical Yul, and then depends on Solidity’s Yul optimizer and codegen to produce verified EVM bytecode. It’s a tight integration, but it also means we need consistent, reliable access to the Yul pipeline.
Even so, for Ora to use Yul as a backend today, I still need to compile and bundle the entire solc stack. That’s workable, but quite heavy for a language project — especially since Zig already provides a powerful build system and seamless C interop. Other languages don’t necessarily have that infrastructure, which makes integration even harder.
A stateless C-level interface around the Yul pipeline (or YulStack) would be a great step forward. It would allow compilers written in Zig, C++, or even Go to directly emit and optimize Yul without depending on the full Solidity build or CLI process. That would dramatically lower the barrier for experimental frontends.
This is the classic case of “don’t reinvent the wheel” — C should be the default interface layer for compiler interoperability.
My main concern isn’t just about opacity; it’s about ecosystem scope. Yul has organically become the de facto IR for the EVM, and I think it would benefit everyone if it stayed that way. If the compiler split between Classic and Core Solidity deepens, I worry Yul might become increasingly enshrined within Solidity itself, making it harder for external projects to reuse or contribute to it as a shared, language-agnostic component.
From my perspective, Yul should evolve as a stable, verifiable, and shared IR across the EVM ecosystem — one that Solidity, Vyper (even if they don’t currently use it), Ora, and future compilers can all target with confidence.
I’d be happy to collaborate or help test a C-level interface proposal when the time comes. The approach you described with typed component boundaries and swappable interfaces aligns very closely with how Ora’s pipeline is structured internally, so integration or prototyping would be straightforward on my end.
For this discussion, I’m using the terms Yul and IR interchangeably.