12 ms·
Aro – Zig's new C compiler
- hfjke 2y ago[dead]
- Y_Y 2y agoIt would be interesting to see how well it optimizes compared to the established players. The fact that it handles C23 and common GNU extensions is already impressive.
- MaxBarraclough 2y agoI agree it does seem very impressive. My first thought was that they must be using LLVM for the backend, but it looks like no, it's fully 'self-contained'.
- samatman 2y agoEliminating the dependency on LLVM is a major focus for the language team, and a big part of why Aro exists. Note that it's the dependency which is being eliminated: it will remain possible to use LLVM as a back end, and to compile Zig and C together without using Aro to translate the C into Zig. If I'm understanding the roadmap correctly, the C headers needed to link a C library with Zig code will be translated into Zig, but doing so with the actual .c files will be optional.
- sirwhinesalot 2y agoVery nice, honestly the tooling around Zig is even more impressive than the language itself.
- Validark 2y agoThe language itself is the reason the tooling exists though, because it attracts a certain kind of developer that probably would not have done the same kind of work for other languages.
- fuzztester 2y agowhat kind of developer is that? interested to know. I have a lot of prior C usage background, including for nontrivial stuff, including a product, although it has been a while since I used it. and I am checking out zig as one of my next languages to learn in the C-like / systems programming area.
- geodel 2y agoI think it is logistics, infrastructure oriented vs language feature oriented. Looking at current PL landscape Go, Zig appears to be infrastructure oriented languages where features are just enough to keep infrastructure super fast. Whereas most other languages like Rust, Kotlin and so many more feature oriented if compiler gets fast, runtimes get better its nice but they'd rather work on long list of modern language features. To be honest PL market feels similar to consumer market where gadgets with myriad smart features sell more than plain but solid machines.
- fuzztester 2y agomakes sense. not too different from the market for operating systems or enterprise software. both suffer from the same malady. we need a remedy. :)
- lambdaone 2y agoZig is amazing. What started as a one-man project is becoming a mature software ecosystem capable of standing on its own as a peer with the major languages.
- squarefoot 2y agoIt appears to me it could become the low level language of choice for small embedded systems in contexts where Lua or MicroPython couldn't fit the bill performance-wise and one wants something higher level than C. Ditto for Nim and Crystal.
- Drygord 2y agoIt’s constraints on memory management basically will never allow that to happen. It lures people in with “use any allocator you want”! Which only appears as freedom of choice when reality it’s locking the user into the same paradigm of memory management that has given C a bad name to begin with.
- throwawaymaths 2y ago1/3 of the problem with c memory management is null unsafely, not a problem in zig. 1/3 more is conflating arrays with single item pointers. Also not a problem with zig. The only memory management "issue" with zig is lack of temporal memory safety.
- Drygord 2y ago[dead]
- geon 2y agoOn embedded systems you probably shouldn’t allocate at all.
- akkad33 2y agoWhy is zig amazing? Could you elaborate a bit
- janice1999 2y agoThere's doesn't appear to a whole lot of comments or documentation in the code. Is this normal for Zig projects? Does it have an equivalent of Sphinx to build docs from code?
- slowmovintarget 2y agoI'm not all that familiar with the Zig tool chain. Am I understanding correctly that this is a regular C compiler used as a component of the Zig compiler chain allowing compilation of C files alongside Zig? Or does Zig generate C and therefore need a C compiler under the hood? Looking at the documentation suggests it is the former, not the latter.
- anonymoushn 2y agoIt says it's a C frontend for `zig translate-c` which translates C code to Zig code. `zig translate-c` is not required for most Zig projects or even for most Zig projects that interop with C.
- slowmovintarget 2y agoThank you. I also started reading through the Zig overview [1] and near the end of that document it says this: "Not only can Zig compile C code, but there is a very good reason to use Zig as a C compiler: Zig ships with libc." From the doc, IIUC, compilation of header files and other C code allows Zig to do direct interop with no intermediaries. Seems useful. [1] https://ziglang.org/learn/overview/ https://ziglang.org/learn/overview/
- 3836293648 2y agoThat's just wrapping clang. They're working on replacing it
- Laremere 2y agotranslate-c is not required for compiling pure Zig code. However, the plan is to remove the "@cImport" built in. So if your project is importing a c header, in the future you'll add build step translating it from c to Zig, and then you import it into your Zig code as a module.
- fuzztester 2y agowhat is the reason for this change? zig less than newbie here. I've only just recently started reading the zig overview, although I have been reading hn posts about zig with interest for some time.
- WalterBright 2y agoThe dlang D compiler includes a full C compiler, so you can mix and match C and D code. You can import C code from D, and D code from C. dmd hello.c ./hello hello world This helps enormously in binding to existing C libraries.
- brabel 2y agoIs it possible to do what Zig does and cross compile to any OS/arch, from any OS/arch? Last I tried, I found some compiler options and commands to do it, but they were badly explained, I tried for hours and it just didn't work at all, so I gave up.
- WalterBright 2y agoThe dmd D compiler can cross-compile to any of the targets that it supports. I use it all the time to develop on other platforms. I am currently adding AArch64 support to DMD's code generator. dmd doesn't run on my Raspberry Pi (yet!), so I use sshfs to access the Pi's filesystem from Ubuntu, compile programs on Ubuntu, transfer the .o file to the Pi, link it on the Pi, and run it on the Pi. I'm sorry you're having trouble with this, so I recommend posting on the D forums, and people are there to help! https://forum.dlang.org/ https://forum.dlang.org/
- wyldfire 2y agoThe grandparent post refers to the fact that Zig ships with C, C++ library source that it lazily cross-builds (at least for linux, I don't recall how it solves this problem for macOS or windows). And possibly it uses lld too? Since Zig ships with these, it makes the whole cross-build experience much smoother and less dependent on whether your host OS distribution includes packages for your desired target OS/architecture.
- brabel 2y agoExactly. Zig tooling includes a linker, and that's also cross-platform. Zig can generate actual runnable executables that run anywhere from a single machine. As far as I can tell, D's DMD can cross compile but not link. I probably missed that before (actually, I think I was trying with LDC, I found the page where they document the process while searching for it just now: https://wiki.dlang.org/Cross-compiling_with_LDC https://wiki.dlang.org/Cross-compiling_with_LDC if you try those options, nothing works, at least from MacOS). I just tried and this only works with the -c option (compile, but not link): dmd -os=linux -c source/app.d Without `-c`: ``` Error: linker exited with status 1 cc app.o -o app -m64 -Xlinker -no_compact_unwind -L/Users/me/dlang/dmd-2.109.1/osx/bin/../lib -Xlinker -Bstatic -lphobos2 -Xlinker -Bdynamic -lpthread -lm (dmd-2.109.1) ``` I am sure Walter knows how to compile on one machine, then go to another machine and do the linking or whatever is needed. I know nothing about those, but with Zig I need not know anything other than which flag to use to cross compile. It's a huge difference. D should do that, otherwise it's just not competitive for people like me (I am just an average joe programmer who knows how to write code but has very little interest in learning how linkers work).
- livrem 2y agoIs this part of the long-term plan for zig to get rid of the dependency on clang/llvm? https://github.com/ziglang/zig/issues/16270 https://github.com/ziglang/zig/issues/16270
- Laremere 2y agoYes.
- brabel 2y agoDoes Zig already compile without LLVM, even if not by default? Also, do you know when the changes Andrew mentioned in his "Data Oriented Design" are going to be released in the zig compiler? I would expect that when both of the above are done, compiling Zig will be really, really fast compared to anything we currently have.
- samatman 2y agoIt's the major area of focus right now. You can track the issues with this tag/link if you'd like: https://github.com/ziglang/zig/issues?q=is%3Aissue+is%3Aopen+label%3Abackend-self-hosted+ https://github.com/ziglang/zig/issues?q=is%3Aissue+is%3Aopen...
- Laremere 2y agoThe Zig compiler has used Data Oriented Design for a long time, so any recent version has that, yes. The most substantial part of running the compiler right now is LLVM, hence the focus to provide an alternative. The other big focus right now is incremental compilation, which will make recompilations very fast.
- brabel 2y agoThe talk I am referring to is from 2024 and shows some metrics improving by 30% or more. And Andrew said that's not yet shipped: https://www.youtube.com/watch?v=IroPQ150F6c https://www.youtube.com/watch?v=IroPQ150F6c So, are you sure about that?? EDIT: ok, the talk was uploaded just last week, but someone in the comments clarified that: > The original talk is from 2021.. Thank you for reuploading. I feel stupid now :/
- AndyKelley 2y agoI don't think it's accurate to call it "Zig's". This is an independent project started by Veikka Tuominen, a Zig core team member, but it's not owned or managed by ZSF in any way. It's Veikka's project. Don't take that away from him!
- fuzztester 2y agothanks for clarifying. I was wondering why it was under a different github site.
- wyldfire 2y agoIs it intended/desired for Zig to use it in lieu of libclang at some point?
- TUSF 2y agoYes. In fact, Aro is already in the main Zig compiler's repo, although currently I don't think it actually does any compilation of C (unless you explicitly disable LLVM) and is mostly used for Zig's "translate-c" functionality, last I checked.
- ksec 2y agoEven the about section on Github is "A C compiler written in Zig". This goes against the guideline of Editorialise the headline.
- underdeserver 2y agoYep. @dang, per HN guidelines the title should be updated to "A C compiler written in Zig"
- deleted 2y ago[deleted]
- tiffanyh 2y agoThe ReadMe is quite lacking … - why create a competing front end to Zig? - what problems is it solving? - what’s different than the official Zig frontend? Etc
- laserbeam 2y agoA lot of the work happening in Zig includes experiments which may or may not end up kept long term. What this would solve: compile C without requiring LLVM. The plan in the community is to have LLVM as an optional dependency, and not required by default.
- dist1ll 2y agoIt seems like I can't include standard header files, so it can't compile a common hello world. I guess that'd be useful to mention on the README, or maybe I'm doing something wrong? main.c:1:10: fatal error: 'stdio.h' not found #include <stdio.h> It'd be nice if header inclusion, and -l options work. This would allow benchmarking Aro against some other compilers on a wide range of C files. Usually sqlite3.c is my first go-to for stress-testing C compilers.
- defen 2y agoSystem header search paths are only implemented on Linux currently. You should be able to parse sqlite3.c on Linux with arocc -fsyntax-only -Wno-unknown-attributes sqlite3.c
- fefe23 2y agoWait, so you still need zig, and zig still needs LLVM. If you have LLVM, you have clang. What is the value proposition of this compiler, then?
- defen 2y agoThe Zig self-hosted x86 backend is nearly complete (and is already capable of building the Zig compiler itself). So it's part of the path toward not needing LLVM or clang at all.
- jedisct1 2y agoclang (just the C frontend, not talking about the backend, not clang++) is an old code base. It's become very complicated to understand, maintain and extend. Zig helps a lot, but in comparison, Aro is small, and simple to understand and maintain.
- Jarred 2y agoOne of the features missing in bun:ffi is inferring types for symbols from header files. This would let you import C libraries in JavaScript/TypeScript directly, without having to configure bindings. We embed TinyCC for FFI, but TinyCC doesn't expose a way to read the types for exported symbols. Currently, it looks like this: import { dlopen, FFIType, suffix } from "bun:ffi"; // `suffix` is either "dylib", "so", or "dll" depending on the platform // you don't have to use "suffix", it's just there for convenience const path = `libsqlite3.${suffix}`; const { symbols: { sqlite3_libversion, // the function to call }, } = dlopen( path, // a library name or file path { sqlite3_libversion: { // no arguments, returns a string args: [], returns: FFIType.cstring, }, }, ); console.log(`SQLite 3 version: ${sqlite3_libversion()}`); It would be nicer if it was something like this: import {sqlite3_libversion as version} from "sqlite3.h" with {lib: "sqlite3"}; console.log(`SQLite 3 version: ${version()}`); Would love to use Aro to do this in the future
- grahamjameson 2y agoPerhaps a middle-of-the-road approach would be to use inline C like LuaJIT's FFI does? For instance: new_clib("/system/lib64/liblog.so", "log") ffi.cdef[[int __android_log_print(int priority, const char *tag, const char *msg);]] ffi.log.__android_log_print(5, "TEST_TAG", "Hello from FFI") I can't say I'm familiar with Bun, but I've used a similar syntax to the example you provided of the current Bun syntax when working with Frida (https://frida.re https://frida.re). I agree it leaves something to be desired and indeed it would be cool if Aro could do this in the future.
- mananaysiempre 2y agoLuaJIT spends about 2000 lines[1] on its C parser which even includes a limited expression evaluator, though not a preprocessor. My experience suggests explicit memory management could add half again that (LuaJIT’s piggybacks on its GC), and writing one is something like a month of work even if you know exactly what you’re doing (I didn’t), but in any case it’s not a monumental task. [1] https://repo.or.cz/luajit-2.0.git/blob/HEAD:/src/lj_cparse.c https://repo.or.cz/luajit-2.0.git/blob/HEAD:/src/lj_cparse.c
- ilayn 2y agoI hope Zig adds complex numbers before it is too late. It's a pity that they did not steal array syntax and slices from Fortran/Numpy.
- flohofwoe 2y agoI'm curious, what use cases do you have for complex numbers that couldn't be provided in a 3rd party library or maybe even the stdlib?
- ilayn 2y agoYou are essentially necromancing the ISO C99 discussion that happened already. Here is an answer that, after 25 years, is still wrong https://learn.microsoft.com/en-us/cpp/c-runtime-library/complex-math-support?view=msvc-170 https://learn.microsoft.com/en-us/cpp/c-runtime-library/comp...
- flohofwoe 2y agoThat doesn't tell me much about the usage scenario of complex numbers that would justify adding native support in programming languages. As a sibling comment said, builtin vector and matrix types (up to 4 dimensions) would probably be more useful.
- ilayn 2y agoI'll paste the same comment here as I did in the sibling; Why should complex numbers need justification? If you need to do serious computation, you need them. If you say Zig is not for number crunching which Java explicitly decided then fine otherwise searching for a reason for complex number tells me that you don't do any numerical programming which is fine but asking for justification makes no sense. Why is any other thing in the language justified?
- geon 2y agoWhy would complex numbers in particular deserve to be a native type? What about quaternions, or vectors and matrices of sizes 2-4 at least? Is there any real advantage over just using a struct? Would MultiArrayList help with performance for complex numbers and vectors?