[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-webassembly-to-c-rivals-native-runtimes-2026-en":3,"article-related-webassembly-to-c-rivals-native-runtimes-2026-en":30,"series-research-3765fb1b-e8c7-4e81-8ed0-24a1a67e2928":75},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":22,"views":26,"created_at":27,"published_at":28,"topic_cluster_id":29},"3765fb1b-e8c7-4e81-8ed0-24a1a67e2928","webassembly-to-c-rivals-native-runtimes-2026-en","WebAssembly-to-C still rivals native runtimes in 2026","\u003Cp data-speakable=\"summary\">WebAssembly-to-C still matches top runtimes on 2026 libsodium benchmarks.\u003C\u002Fp>\u003Cp>Frank DENIS ran a fresh 2026 \u003Ca href=\"\u002Ftag\u002Fbenchmark\">benchmark\u003C\u002Fa> and found that compiling WebAssembly to C can still keep up with dedicated runtimes on real code. The surprising part is that this held even after WebAssembly runtimes got better compilers, better lowering, and wider instruction support.\u003C\u002Fp>\u003Cp>That result comes from a specific setup: \u003Ca href=\"https:\u002F\u002F00f.net\u002F\" target=\"_blank\" rel=\"noopener\">Frank DENIS\u003C\u002Fa> compared \u003Ca href=\"https:\u002F\u002Fwasmer.io\u002F\" target=\"_blank\" rel=\"noopener\">Wasmer\u003C\u002Fa> 7.1.0, \u003Ca href=\"https:\u002F\u002Fwasmtime.dev\u002F\" target=\"_blank\" rel=\"noopener\">Wasmtime\u003C\u002Fa> 46.0.0, and \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FWebAssembly\u002Fwabt\" target=\"_blank\" rel=\"noopener\">WABT\u003C\u002Fa>’s \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FWebAssembly\u002Fwabt\u002Ftree\u002Fmain\u002Fwasm2c\" target=\"_blank\" rel=\"noopener\">wasm2c\u003C\u002Fa> path on the same libsodium benchmark suite. He also added support for the wide arithmetic proposal in his wasm2c fork, then built the generated C with \u003Ca href=\"https:\u002F\u002Fziglang.org\u002F\" target=\"_blank\" rel=\"noopener\">zig cc\u003C\u002Fa> using -O3 -march=native.\u003C\u002Fp>\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Item\u003C\u002Fth>\u003Cth>Value\u003C\u002Fth>\u003Cth>Why it matters\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>Wasmer version\u003C\u002Ftd>\u003Ctd>7.1.0\u003C\u002Ftd>\u003Ctd>One of the comparison runtimes\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Wasmtime version\u003C\u002Ftd>\u003Ctd>46.0.0\u003C\u002Ftd>\u003Ctd>Another comparison runtime\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Build flags\u003C\u002Ftd>\u003Ctd>lime1 + simd128 + wide_arithmetic\u003C\u002Ftd>\u003Ctd>Feature set used for every build\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Compiler\u003C\u002Ftd>\u003Ctd>zig cc -O3 -march=native\u003C\u002Ftd>\u003Ctd>Native C compilation path\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Runtime memory sampling\u003C\u002Ftd>\u003Ctd>15 runs, median RSS\u003C\u002Ftd>\u003Ctd>How memory usage was measured\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003Ch2>The benchmark result that changed the argument\u003C\u002Fh2>\u003Cp>DENIS said he expected the case for WebAssembly-to-C to weaken over time. That seemed reasonable. Runtime engines keep improving, and modern JITs have more room to optimize than a simple transpiler can.\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1783647172944-iwzp.png\" alt=\"WebAssembly-to-C still rivals native runtimes in 2026\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>The 2026 numbers pushed the other way. On the benchmark he used, the wasm2c path performed very well and beat the newer runtimes once wide arithmetic was in play. In his write-up, the median was a tie with Wasmer, while wasm2c used 0.887x as much time as Wasmer on the geomean and 0.814x as much as Wasmtime.\u003C\u002Fp>\u003Cul>\u003Cli>Median result: tied with Wasmer\u003C\u002Fli>\u003Cli>Geomean runtime: wasm2c at 0.887x Wasmer\u003C\u002Fli>\u003Cli>Geomean runtime: wasm2c at 0.814x Wasmtime\u003C\u002Fli>\u003Cli>Benchmark target: libsodium\u003C\u002Fli>\u003C\u002Ful>\u003Cp>That is a useful reminder for anyone who treats “runtime” as the default answer. If the WebAssembly module is known ahead of time, and if you can precompile it, a normal native compiler can still do a very good job on the generated C.\u003C\u002Fp>\u003Ch2>Why the C path still works\u003C\u002Fh2>\u003Cp>The big reason is simple: the output is ordinary C. That means the final codegen step is handled by a mature native compiler, not by a small custom backend. DENIS also notes that the wide arithmetic implementation in wasm2c was surprisingly easy to add, relying on compiler carry intrinsics and C’s 128-bit integer type.\u003C\u002Fp>\u003Cp>There is also an operational upside. A WebAssembly runtime brings engine code, startup state, and JIT machinery into the process. A C-compiled module does not. DENIS measured peak resident set size with \u003Ccode>\u002Fusr\u002Fbin\u002Ftime -v\u003C\u002Fcode> and found that most of the runtime footprint is fixed engine overhead, while the module itself is cheap.\u003C\u002Fp>\u003Cblockquote>“The best WebAssembly runtime may still be no runtime at all.” — Frank DENIS\u003C\u002Fblockquote>\u003Cp>That quote is the whole thesis in one line. If you already have the module and you do not need runtime services, the extra layer may be more machinery than value.\u003C\u002Fp>\u003Ch2>Memory matters more than people admit\u003C\u002Fh2>\u003Cp>DENIS used cold process RSS, measured as the median of fifteen runs, to compare memory use. He also points out that some of the cost from Wasmer and Wasmtime can be amortized if a service keeps the engine warm and runs many modules or many calls. For one-shot jobs, though, cold-start overhead matters a lot.\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1783647172013-djvh.png\" alt=\"WebAssembly-to-C still rivals native runtimes in 2026\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>That distinction is why these results should be read carefully. A runtime can be the right call in a server that keeps a process alive for hours. A precompiled C path can win in batch jobs, short-lived CLI tools, and deployment environments where shipping an engine is awkward.\u003C\u002Fp>\u003Cul>\u003Cli>Measurement method: cold RSS from \u003Ccode>\u002Fusr\u002Fbin\u002Ftime -v\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>Run count: 15 per configuration\u003C\u002Fli>\u003Cli>Module memory cap: 64 MiB maximum linear memory\u003C\u002Fli>\u003Cli>Overhead source: engine executable plus startup state\u003C\u002Fli>\u003C\u002Ful>\u003Cp>In other words, the benchmark is not saying runtimes are bad. It is saying the economics change once startup and engine size enter the picture.\u003C\u002Fp>\u003Ch2>What this means for deployment choices\u003C\u002Fh2>\u003Cp>WebAssembly-to-C also changes the deployment target. The destination machine no longer needs a WebAssembly runtime. It needs a C compiler and enough libc support for the module’s imports. That makes the output portable in a very old-fashioned, very practical way.\u003C\u002Fp>\u003Cp>DENIS also points out that the compiler is now a choice. You can use \u003Ca href=\"https:\u002F\u002Fclang.llvm.org\u002F\" target=\"_blank\" rel=\"noopener\">clang\u003C\u002Fa> or \u003Ca href=\"https:\u002F\u002Fgcc.gnu.org\u002F\" target=\"_blank\" rel=\"noopener\">GCC\u003C\u002Fa>, or you can pick a toolchain with a different trust model. He mentions \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FPLSysSec\u002FFil-C\" target=\"_blank\" rel=\"noopener\">Fil-C\u003C\u002Fa> for memory safety on wasm64 or wasm32 without depending on virtual-memory guard pages, and \u003Ca href=\"https:\u002F\u002Fcompcert.org\u002F\" target=\"_blank\" rel=\"noopener\">CompCert\u003C\u002Fa> for verified code generation.\u003C\u002Fp>\u003Cp>That flexibility is a real advantage. A dedicated runtime gives you one execution model. WebAssembly-to-C lets you choose the compiler and, by extension, the tradeoff you want between speed, safety, and assurance.\u003C\u002Fp>\u003Ch2>Where Wasmer and Wasmtime still win\u003C\u002Fh2>\u003Cp>This is also where the article gets more nuanced. DENIS is clear that WebAssembly-to-C is the wrong answer for dynamic loading of untrusted code, runtime policy enforcement, preemption, fuel metering, component-model machinery, or multi-tenant execution on one shared engine.\u003C\u002Fp>\u003Cp>He also gives credit where it is due. \u003Ca href=\"https:\u002F\u002Fwasmer.io\u002F\" target=\"_blank\" rel=\"noopener\">Wasmer\u003C\u002Fa> implements \u003Ca href=\"https:\u002F\u002Fwasix.org\u002F\" target=\"_blank\" rel=\"noopener\">WASIX\u003C\u002Fa>, which fills in many POSIX-shaped gaps that plain WASI still leaves open. If your goal is to run existing applications with fewer rewrites, that is a much more direct path than transpiling to C.\u003C\u002Fp>\u003Cp>\u003Ca href=\"https:\u002F\u002Fwasmtime.dev\u002F\" target=\"_blank\" rel=\"noopener\">Wasmtime\u003C\u002Fa> also matters because of the \u003Ca href=\"https:\u002F\u002Fcomponent-model.bytecodealliance.org\u002F\" target=\"_blank\" rel=\"noopener\">Component Model\u003C\u002Fa>, which gives WebAssembly pieces typed boundaries for composition. DENIS says a similar effect might be possible by compiling components separately to C, but he did not explore that deeply.\u003C\u002Fp>\u003Cp>That leaves a pretty clear split. Use a runtime when you need runtime services. Use WebAssembly-to-C when you control the module, can precompile it, and want the smallest possible execution stack.\u003C\u002Fp>\u003Cul>\u003Cli>Best fit for runtimes: untrusted code, policy, fuel, multi-tenant hosting\u003C\u002Fli>\u003Cli>Best fit for WebAssembly-to-C: controlled modules, precompilation, short-lived jobs\u003C\u002Fli>\u003Cli>Wasmer strength: WASIX support for POSIX-like workloads\u003C\u002Fli>\u003Cli>Wasmtime strength: Component Model support for typed composition\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>The practical takeaway for engineers\u003C\u002Fh2>\u003Cp>The real lesson here is that WebAssembly has grown in two directions at once. Runtime engines got better, but the “compile to C first” path did not fall behind as much as many people assumed. Once wide arithmetic landed, it remained competitive on a benchmark that matters to systems programmers: cryptographic code with real performance pressure.\u003C\u002Fp>\u003Cp>If you are shipping WebAssembly today, the best default is still not a slogan. It depends on whether you need an engine, whether you trust the code, and whether the module must run unchanged across hosts. If those answers are yes, use a runtime. If they are no, WebAssembly-to-C is still a very serious option.\u003C\u002Fp>\u003Cp>The next question worth asking is simple: how much of your WebAssembly workload actually needs a runtime once wide arithmetic, component splitting, and modern C toolchains are all on the table?\u003C\u002Fp>","Frank DENIS found WebAssembly-to-C still matches top runtimes on 2026 libsodium tests, even after new wide arithmetic support.","00f.net","https:\u002F\u002F00f.net\u002F2026\u002F07\u002F08\u002Fwebassembly-compilation-to-c-2026\u002F",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1783647172944-iwzp.png","research","en","a5119837-3405-44e3-86fd-cf3923096cb2",[17,18,19,20,21],"WebAssembly","wasm2c","Wasmer","Wasmtime","wide arithmetic",[23,24,25],"WebAssembly-to-C stayed competitive in 2026 libsodium benchmarks.","Wide arithmetic support helped the C path keep pace with newer runtimes.","Runtimes still win when you need policy, untrusted code handling, or shared engines.",0,"2026-07-10T01:32:31.743111+00:00","2026-07-10T01:32:31.728+00:00","a05b7d65-23f1-49e0-9e2a-71b461101ffe",{"tags":31,"relatedLang":34,"relatedPosts":38},[32],{"name":17,"slug":33},"webassembly",{"id":15,"slug":35,"title":36,"language":37},"webassembly-to-c-rivals-native-runtimes-2026-zh","WebAssembly-to-C 仍能打平原生執行環境","zh",[39,45,51,57,63,69],{"id":40,"slug":41,"title":42,"cover_image":43,"image_url":43,"created_at":44,"category":13},"33f88b8e-fd6e-420a-ae8b-b9de233bd21a","benchmark-scientific-lineage-reasoning-en","A benchmark for scientific lineage reasoning","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1783666981421-g2bc.png","2026-07-10T07:02:31.872812+00:00",{"id":46,"slug":47,"title":48,"cover_image":49,"image_url":49,"created_at":50,"category":13},"e8326fca-5817-4d2f-b3f9-43779d943062","opencof-video-generation-reasoning-en","OpenCoF teaches video models to reason frame by frame","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1783665178016-wfa8.png","2026-07-10T06:32:30.017939+00:00",{"id":52,"slug":53,"title":54,"cover_image":55,"image_url":55,"created_at":56,"category":13},"4a98973e-5862-4442-99cd-77f0a3ef5278","uniclawbench-proactive-agents-live-tasks-en","UniClawBench tests proactive agents in live tasks","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1783663374603-pddc.png","2026-07-10T06:02:25.035334+00:00",{"id":58,"slug":59,"title":60,"cover_image":61,"image_url":61,"created_at":62,"category":13},"1d12c9dd-2014-4589-b546-49d7aaafd56c","analysis-driven-transformer-linearization-en","How to Linearize Transformers Without Losing Quality","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1783580573147-nkcg.png","2026-07-09T07:02:26.831218+00:00",{"id":64,"slug":65,"title":66,"cover_image":67,"image_url":67,"created_at":68,"category":13},"5d1770de-d17d-455a-a593-301ee0974526","co-lmlm-continuous-query-limited-memory-models-en","Co-LMLM lets LMs query knowledge continuously","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1783578777528-m5x6.png","2026-07-09T06:32:31.072331+00:00",{"id":70,"slug":71,"title":72,"cover_image":73,"image_url":73,"created_at":74,"category":13},"5f612e85-468e-477b-a91e-3daf23da2e6d","scireasoner-structure-property-reasoning-en","SciReasoner makes structure readable to AI","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1783576972706-me8v.png","2026-07-09T06:02:31.433838+00:00",[76,81,86,91,96,101,106,111,116,121],{"id":77,"slug":78,"title":79,"created_at":80},"a2715e72-1fe8-41b3-abb1-d0cf1f710189","ai-predictions-2026-big-changes-en","AI Predictions for 2026: Brace for Big Changes","2026-03-26T01:25:07.788356+00:00",{"id":82,"slug":83,"title":84,"created_at":85},"8404bd7b-4c2f-4109-9ec4-baf29d88af2b","ml-papers-of-the-week-github-research-desk-en","ML Papers of the Week Turns GitHub Into a Research Desk","2026-03-27T01:11:39.480259+00:00",{"id":87,"slug":88,"title":89,"created_at":90},"87897a94-8065-4464-a016-1f23e89e17cc","ai-ml-conferences-to-watch-in-2026-en","AI\u002FML Conferences to Watch in 2026","2026-03-27T01:51:54.184108+00:00",{"id":92,"slug":93,"title":94,"created_at":95},"6f1987cf-25f3-47a4-b3e6-db0997695be8","openclaw-agents-manipulated-self-sabotage-en","OpenClaw Agents Can Be Manipulated Into Failure","2026-03-28T03:03:18.899465+00:00",{"id":97,"slug":98,"title":99,"created_at":100},"a53571ad-735a-4178-9f93-cb09b699d99c","vega-driving-language-instructions-en","Vega: Driving with Natural Language Instructions","2026-03-28T14:54:04.698882+00:00",{"id":102,"slug":103,"title":104,"created_at":105},"a34581d6-f36e-46da-88bb-582fb3e7425c","personalizing-autonomous-driving-styles-en","Drive My Way: Personalizing Autonomous Driving Styles","2026-03-28T14:54:26.148181+00:00",{"id":107,"slug":108,"title":109,"created_at":110},"2bc1ad7f-26ce-4f02-9885-803b35fd229d","training-knowledge-bases-writeback-rag-en","Training Knowledge Bases with WriteBack-RAG","2026-03-28T14:54:45.643433+00:00",{"id":112,"slug":113,"title":114,"created_at":115},"71adc507-3c54-4605-bbe2-c966acd6187e","packforcing-long-video-generation-en","PackForcing: Efficient Long-Video Generation Method","2026-03-28T14:55:02.646943+00:00",{"id":117,"slug":118,"title":119,"created_at":120},"675942ef-b9ec-4c5f-a997-381250b6eacb","pixelsmile-facial-expression-editing-en","PixelSmile Framework Enhances Facial Expression Editing","2026-03-28T14:55:20.633463+00:00",{"id":122,"slug":123,"title":124,"created_at":125},"6954fa2b-8b66-4839-884b-e46f89fa1bc3","adaptive-block-scaled-data-types-en","IF4: Smarter 4-Bit Quantization That Adapts to Your Data","2026-03-31T06:00:36.65963+00:00"]