[HN Gopher] c4wa - C compiler for Web Assembly
___________________________________________________________________
c4wa - C compiler for Web Assembly
Author : 90s_dev
Score : 82 points
Date : 2025-06-24 15:52 UTC (4 days ago)
(HTM) web link (github.com)
(TXT) w3m dump (github.com)
| comex wrote:
| In the comparison with Emscripten using wasm-decompile [1], the
| author appears to have forgotten to turn on optimization. Yes, if
| you run emcc with no -O option then you will get extremely bad
| generated code quality, similar to most C compilers. Add -O and
| you get nice and tight code similar to what c4wa outputs.
|
| [1]
| https://github.com/kign/c4wa/blob/master/etc/doc/comparison....
| soegaard wrote:
| I think, the author's goal was to produce wasm-code that had
| the same structure as the original C. Thus it makes sense to
| turn off the advanced optimizations.
| lioeters wrote:
| > c4wa needs Java 11 or above
|
| It sounded good until this part. Would have been nice if it were
| written in the subset of C that it supports, so it could compile
| the compiler to Wasm.
| apitman wrote:
| This is actually pretty compelling to me. I think the more
| support for freestanding wasm modules the better.
|
| I'm working on a custom wasm app runtime and I don't want to have
| to implement the entire API surface of Emscripten or WASI. The
| new component model is even more complex. I wish there was more
| tooling available for using C/Rust stdlib functions for things
| like reading files or opening a socket, but being able to define
| your own API to handle the actually operations in the host/module
| interface.
| pyrolistical wrote:
| Zig can also compile to free standing wasm
| jeden wrote:
| any example? I search wasm without js.
| whitehexagon wrote:
| I noticed this question yesterday, which includes the changed
| build options for freestanding.
|
| https://ziggit.dev/t/wasm-index-out-of-bounds-only-in-
| debug-...
| pyrolistical wrote:
| https://github.com/Pyrolistical/zig-wasm-canvas
| Anduia wrote:
| Last commit on Jan 29, 2022
| s-macke wrote:
| clang can compile into wasm pretty well via the
|
| --target=wasm32
|
| option. It creates small binaries. My 16-Bit x86 emulator with
| BIOS and DOS emulation is under 100kB [0].
|
| [0] https://github.com/s-macke/FSHistory
| ncruces wrote:
| And if you need parts of libc, you can use something like the
| below, for something more minimal than musl:
| https://github.com/Photosounder/MinQND-libc
|
| Personally, although I do use wasi-sdk (clang) and the
| wasm32-unknown-wasi triple, the result can be basically free-
| standing, depending on what flags you use.
|
| As a sibling post said, optimization matters, and using wasm-
| ctor-eval and wasm-opt also helps. But it's useful to keep full
| C semantics.
| s-macke wrote:
| Thanks. This is awesome. For the emulator I wrote my own 200
| line libc implementation with a five line malloc routine [0].
| Nice to see another implementation, which does a little bit
| more.
|
| [0] https://github.com/s-macke/FSHistory/tree/master/src/wasm
| _li...
| apitman wrote:
| > Personally, although I do use wasi-sdk (clang) and the
| wasm32-unknown-wasi triple, the result can be basically free-
| standing, depending on what flags you use.
|
| This is what I've been doing for my little non-WASI runtime.
| For my minimal programs I find only a few wasi exports are
| required, which don't appear to actually be used and I just
| stub them out. Would love to figure out how to get rid of the
| code depending on them entirely but it's lower priority.
| apitman wrote:
| That emulator is awesome. Especially cool about the easter egg.
|
| I've seen a few of these WASM emulators and fantasy consoles,
| but they all seem to be focused on games. Are you aware of any
| that are designed to run normal GUI apps?
| 90s_dev wrote:
| I tried for a few days to embed clang as a lib just to get it
| to compile to wasm and got _so close_ and I might pick that
| project up again because I think it would be a really exciting
| and fun app.
| teo_zero wrote:
| > here are some of the most commonly used features of C language
| NOT supported by c4wa. > [...] Almost all new features introduced
| in C99
|
| At least, it doesn't require K&R syntax for functions!
| b0a04gl wrote:
| one wierd connection i realised later now, > volatile in c was
| for blocking reorders, forcing real mem reads, esp mmio or sync
| operations. wasm runs singlethreaded, no fences unless you go
| atomic. so compiler keeps volatile loads yeah, but wasm runtime
| ain't bound to order. it runs but doesn't mean anything.
| semantics gone. still compiles
| keysdev wrote:
| > It's really, really difficult to recognize out original logic
| here. Among other things, whereas our original C code only has 2
| local variables, this version has 29, not counting module-level
| globals.
|
| Isnt that quite common now with machine generated code. Look at
| nim clientside js, I dear any js dev to try to navigate that.
|
| The point is should we just trust the machine generated as it is
| and hope that the compiler/bundler just did a correct job, or
| just write clean and simple code
___________________________________________________________________
(page generated 2025-06-28 23:02 UTC)