Tech

‘Compile and Run C in JavaScript’, Promises Bun

• Bookmarks: 2


The JavaScript runtime Bun is a Node.js/Deno alternative (that’s also a bundler/test runner/package manager).

And Bun 1.1.28 now includes experimental support for “>compiling and running native C from JavaScript, according to this report from The New Stack:

“From compression to cryptography to networking to the web browser you’re reading this on, the world runs on C,” wrote Jarred Sumner, creator of Bun. “If it’s not written in C, it speaks the C ABI (C++, Rust, Zig, etc.) and is available as a C library. C and the C ABI are the past, present, and future of systems programming.” This is a low-boilerplate way to use C libraries and system libraries from JavaScript, he said, adding that this feature allows the same project that runs JavaScript to also run C without a separate build step… “It’s good for glue code that binds C or C-like libraries to JavaScript. Sometimes, you want to use a C library or system API from JavaScript, and that library was never meant to be used from JavaScript,” Sumner added.

It’s currently possible to achieve this by compiling to WebAssembly or writing a N-API (napi) addon or V8 C++ API library addon, the team explained. But both are suboptimal… WebAssembly can do this but its isolated memory model comes with serious tradeoffs, the team wrote, including an inability to make system calls and a requirement to clone everything. “Modern processors support about 280 TB of addressable memory (48 bits). WebAssembly is 32-bit and can only access its own memory,” Sumner wrote. “That means by default, passing strings and binary data JavaScript WebAssembly must clone every time. For many projects, this negates any performance gain from leveraging WebAssembly.”

The latest version of Bun, released Friday, builds on this by adding N-API (nap) support to cc [Bun’s C compiler, which uses TinyCC to compile the C code]. “This makes it easier to return JavaScript strings, objects, arrays and other non-primitive values from C code,” wrote Sumner. “You can continue to use types like int, float, double to send & receive primitive values from C code, but now you can also use N-API types! Also, this works when using dlopen to load shared libraries with bun:ffi (such as Rust or C++ libraries with C ABI exports)….

“TinyCC compiles to decently performant C, but it won’t do advanced optimizations that Clang or GCC does like autovectorization or very specialized CPU instructions,” Sumner wrote. “You probably won’t get much of a performance gain from micro-optimizing small parts of your codebase through C, but happy to be proven wrong!”

This post was originally published on this site

2 recommended
0 views
bookmark icon