[HN Gopher] Zig self hosted compiler is now capable of building ... ___________________________________________________________________ Zig self hosted compiler is now capable of building itself Author : marcthe12 Score : 576 points Date : 2022-04-16 13:11 UTC (9 hours ago) (HTM) web link (github.com) (TXT) w3m dump (github.com) | vonwoodson wrote: | For great justice | einpoklum wrote: | Zig move zig... | orblivion wrote: | Probably a stupid question, but is LLVM a sort of cheat for "self | compiling"? Shouldn't you need to compile LLVM as well? | dundarious wrote: | They're working towards having native backends for x86-64, | aarch64, etc., that are all written in Zig, making LLVM an | optional dependency, and eliminating literally all uses of non- | Zig code (including no mandatory use of C standard library, for | example) for those builds. | https://news.ycombinator.com/item?id=31052234 | | I'm assuming these will primarily be for super fast debug | builds (at least to start), and LLVM (and maybe C backend too) | will still be the favored backend(s) for release builds. | okareaman wrote: | It used to be the case that a compiler compiled itself to bare | metal machine instructions, but now with so many cpu | instruction set targets that's no longer the case. LLVM uses an | intermediate language like an assemby language. Another way to | look at it is the TypeScript compiler compiles itself which is | written in TypeScript but the intermediate language is | JavaScript. V8 handles the translation of JavaScript to machine | code, similar to LLVM translating LLVM IR to machine code | orblivion wrote: | Okay, so we're treating LLVM intermediate language or | javascript as if "assembly" in the bare metal days. Makes | sense. | chrisseaton wrote: | > It used to be the case that a compiler compiled itself to | bare metal machine instructions, but now with so many cpu | instruction set targets that's no longer the case. | | Tons of compilers emit machine code. | okareaman wrote: | Sure, I didn't say they didn't. Are you refuting what I | said and implying that a compiler is not self-hosted if it | doesn't compile to machine code? | chrisseaton wrote: | > I didn't say they didn't | | You said 'that's no longer the case'. Isn't that the same | as saying they don't? | okareaman wrote: | In the context of the question, it is no longer the case | that a compiler has to compile to machine code to be | considered self-hosting. I thought this was clear, but I | guess it wasn't | fouronnes3 wrote: | Are there any languages out there that can _only_ be compiled by | a compiler written in their own language? Presumably because the | original pre-dogfood compiler stopped being maintained years ago. | So that if we somehow lost all binaries of the current compiler, | that language would effectively be lost? | amelius wrote: | If your language (call it X) can only be compiled by a compiler | written in X, then you can always create an X-to-C transpiler | (it doesn't need to be efficient, and it can even leak memory, | as long as it can complete the bootstrapping process). | dottedmag wrote: | C? | coder543 wrote: | A lot of popular C compilers are actually written (at least | partially) in C++ these days. | viraptor wrote: | You're commenting on an article about Zig which became self- | hosted and can compile C. (There's also lots of other C | compilers available) | dundarious wrote: | Zig compiles C/C++ by deferring the vast majority of the | work to libclang, which is written in C++. Also note Zig is | self-hosted _when using the LLVM backend_ , which means | deferring to C++ for much of the code generation. There is | no "end-to-end Zig" self-hosted compiler yet, because the | Zig native backends are not as near completion. See the | creator's comment about the breakdown: | https://news.ycombinator.com/item?id=31052234. (I'm excited | about this progress, so this is not meant as any kind of | knock on Zig, which I think is quite impressive) | | But you're right that C is not a good example. | [deleted] | richardfey wrote: | Most modern languages cannot be compiled anymore with their | original pre-dogfood compiler, but we have the sources of the | older versions so you can bootstrap them in a sequence. | skrebbel wrote: | TypeScript | retrac wrote: | The Haskell GHC compiler is written mostly in Haskell. Rust's | compiler is also written in Rust, these days. TypeScript's | compiler is in TypeScript. | | It's a pretty common state of affairs, actually. Often arises | out of the second or third implementation of the compiler being | _much_ better than the first attempts, probably coupled with | the momentum of people using the language who can contribute to | the tooling because it 's in the same language. | fasquoika wrote: | GHC is nearly impossible to bootstrap if you don't consider the | vendored transpiled C code to be source. Versions of GHC not | dependent on GHC were never public AFAIK. | | https://elephly.net/posts/2017-01-09-bootstrapping-haskell-p... | jonpalmisc wrote: | I think Zig's compatibility with C is such a valuable feature. | | I also wish we could rewrite everything in a modern language, but | the reality is that we can't and that if we could, it would take | a LONG time. The ability to start new projects, or extend | existing ones, with a modern and more ergonomic language--Zig-- | and be able to seamlessly work with C is incredible. | | I look forward to the self-hosted compiler being complete, and | hopefully a package manager in the future. I'd really like to | start using Zig for more projects. | jitl wrote: | Zig as the "Kotlin of C" makes it very appealing. Kotlin has | seen fantastic adoption in JVM projects because you can convert | files one at a time from .java to .kt, with only a modicum of | one-time build system shenanigans up front. Then your team can | gain experience gradually, fill in missing pieces like linters | over time, all without redesigning your software. | | What zig offers is even better - because zig included a CC, you | can actually reduce complexity with zig by getting a single | compiler version for all platforms, rather than a fixed zig + | each platform's cc. And with it, trivially easy cross-platform | builds - even with existing C code. That's cool! Go has | excellent cross-compilation, but Go with C, not so much. | | Rust is a powerful tool, but it's a complex ecosystem unto | itself - both conceptually and practically. It has great | interoperability frameworks, but the whole set of systems comes | at a substantial learning cost. Plus, porting an existing | software design to Rust can be a challenge. It's more like the | "scala of C" if we're trying to stretch the analogy past the | breaking point. | richardfey wrote: | The "Kotlin of C", what a beautiful metaphor! | pjmlp wrote: | Kotlin has seen fantastic adoption in Android projects, | because of the way Google pushes it, while stagnating Android | Java on purpose. | | On the JVM world not really. | | https://www.infoq.com/news/2022/03/jrebel-report-2022/ | exikyut wrote: | Huh. I read about this the other day as well - | https://news.ycombinator.com/item?id=30842602: | | > _If only [Oracle] hadn 't sued Google, Java would still | have been the pre-eminent language for Android development. | Sadly Android is stuck at legacy Java 8 permanently now. | So, modern Java is stuck as a server-side language with | dozens of competitors._ | | A reply argued that Android is on Java 11 now, and then you | noted (hi!) that it's "a subset". Huh. | | I'm trying to get a handle on understanding the | ramifications of the legal/licensing situation, and the | actual concrete impact on Java's use in Android. The | subject seems somewhat murky and opaque. Is there possibly | a high-level disambiguation about what's going on published | anywhere? | pjmlp wrote: | The set of Java 11 LTS features and standard library | missing from Android 13 is left as exercise for the | reader, they are relatively easy to find out, hence | subset. | | You can check the Javadoc for the standard library, and | the JVM specification. Then compare with DEX/ART and the | Android documentation for Java APIs. | holoduke wrote: | Are they pushing? Most documentation for Android dev is | still Java. Or by default Java. It's only the Intelij guys | pushing for Kotlin by creating a lockin in their IDE. One | reason I refuse to use it. | carstenhag wrote: | As an Android Dev: noone of us wants to do java projects | anymore. If we had support for some recent versions | maybe, but as it is, there's no going back. | | 0 of our recent or current projects still use java. | | Google is either moving/extending libs to natively | integrate with kotlin (numerous -ktx libs) or they are | kotlin-only (Compose) anyway. | | I don't really see the Jetbrains lock-in thing, because: | Android Studio is free, you can use any other IDE with | syntax highlighting and the terminal to run tests & to | compile. | | If you want to blame someone for locking in android devs | into Android Studio, it would be Google, because they | build the previews into Android Studio afaik. But you | would have the same criticism at Apple/XCode. Supporting | one IDE is already tough I guess. | pjmlp wrote: | You have missed all the Kotlin only Jetpack libraries, | NDK documentation now using Kotlin, Jetpack libraries | originally released in Java now rewritten in Kotlin. | | They are still using Android Java on the system layers, | because they aren't rewriting the whole stack. | | Even the update for Java 11 LTS subset on Android 13 is | mostly likely caused by the Java ecosystem moving | forward, than the willingness of Android team to support | anything other than what can be desugared into Java 8 / | DEX somehow. | | You are right in relation to JetBrains, they even | acknowledge it on their blog post introducing Kotlin. | | https://blog.jetbrains.com/kotlin/2011/08/why-jetbrains- | need... | | "And while the development tools for Kotlin itself are | going to be free and open-source, the support for the | enterprise development frameworks and tools will remain | part of IntelliJ IDEA Ultimate, the commercial version of | the IDE. And of course the framework support will be | fully integrated with Kotlin." | sedatk wrote: | > You have missed all the Kotlin only Jetpack libraries, | NDK documentation now using Kotlin, Jetpack libraries | originally released in Java now rewritten in Kotlin. | | Also, Oracle's lawsuit against Google for copying Java | APIs. | pjmlp wrote: | This doesn't compute, because Kotlin is heavily dependent | on the Java ecosystem, regardless how Google screw up Sun | and the Java community with their Android Java. | sedatk wrote: | I still see it as a passive aggressive move for Google to | get back at Oracle. They can't back away from Java API | completely but they can hurt Oracle by discrediting Java | language. | Grimburger wrote: | As someone not familiar with android development, this is | somewhat confusing because I always thought Google was | pushing dart/flutter for mobile these days? | | Or is it both at once? | jitl wrote: | Dart/Flutter is their React Native competitor. It's in | the same space as Xamarin - A secondary language and UI | toolkit who's selling point is rapid development for | multiple platforms. | | Kotlin is to Java (on Android) as Swift is to Objective-C | (on Apple) - the successor primary platform language. | Grimburger wrote: | Thanks, that's a solid summary. | | Feels like an environment that moves so quickly (to | someone like me anyway). Can barely keep up. | hota_mazi wrote: | Not sure where you got that impression from, the Android | team has never pushed, let alone mentioned, Dart/Flutter, | ever. All the Flutter advertising you hear is from the | Flutter team. | | Kotlin and Java are the main languages supported on | Android. | charcircuit wrote: | From talking to a Googler the reason why Google devotes | resources to Kotlin is that there was and still is a | large external demand from the Android development | community for Kotlin. | pjmlp wrote: | Kotlin adoption was triggered from inside, with some | anti-Java attitude. | | https://talkingkotlin.com/the-first-kotlin-commit-in- | android... | charcircuit wrote: | My information was from someone from the team working on | jetpack compose. So maybe the answer I was given comes | from a different context. | jitl wrote: | That poll pours a cold bucket of water on "fantastic | adoption" among all the respondents, but compare adoption | of Kotlin and Java releases after Kotlin's release. 1 in 6 | respondents using language versions after 2016 are using | Kotlin. I don't think that's too shabby. | pjmlp wrote: | Java is still Java, regardless of the version, otherwise | we should add Kotlin versions to the discussion as well. | Tozen wrote: | Zig is not the only one. Other newer languages like Vlang, | Odin, Rust, Nim... offer strong C interop. | jonpalmisc wrote: | Can't speak about the others, but Rust's C interop is nothing | like Zig's, not to mention that Zig can also compile C. | kristoff_it wrote: | > I also wish we could rewrite everything in a modern language, | but the reality is that we can't and that if we could, it would | take a LONG time. The ability to start new projects, or extend | existing ones, with a modern and more ergonomic language--Zig-- | and be able to seamlessly work with C is incredible. | | That's the Maintain it With Zig approach :^) | | https://kristoff.it/blog/maintain-it-with-zig/ | mlinksva wrote: | Sounds compelling. Is there a list of projects following this | advice anywhere? | randyrand wrote: | Andrew how will the self hosted compiler maintain a known trust | back to assembly? | | i.e how can someone look at a self hosted zig compiler and build | it themself from source, never needing to download blobs from the | internet? | | Otherwise you lose the ability to trust anything you build. | kristoff_it wrote: | Checkout the video Andrew linked in this thread. He talks about | this in detail. | amscanne wrote: | Zig specifics aside... build it from source using _what_? | Another compiler. Okay, so you can compile that one from | source. But what does that? _Another_ compiler. | | Unless you're recording memory contents and executing | instructions by hand, you've just discovered the Ken Thompson | hack. At some point the pragmatic thing is to trust some bits | from a trusted source (e.g. downloaded from an official repo w/ | a known cert, etc.). | chakkepolja wrote: | See https://dwheeler.com/trusting-trust/ | MichaelBurge wrote: | Rice's Theorem makes the Ken Thompson hack impossible in | general. He only executed his hack in a single short-term | demonstration against a specific target, but it's not | possible to make a "long-con" against an open-source project | with lots of activity and lots of people building it even if | you find a way to infect nearly all of those people. | randyrand wrote: | You just need 1 compiler written in assembly, and work your | way up from there. | | C17 -> assembly of your choice, written in assembly | | Zig -> C17 "transpiler", written in C17 | drfuchs wrote: | Why do you trust the assembler you got from somewhere any | more than a compiler? | randyrand wrote: | Because hand written assembly is readable! | pjmlp wrote: | It might be, but have you also validated the microcode | executing it? | | Or the Verilog/VHDL for the logic gates used by the CPU, | for that matter? | chongli wrote: | I believe GP used assembler to refer to the program which | reads your hand-written assembly and produces a binary. | That program was presumably given to you so you need to | trust it. | | No, the only way to solve this problem is to start with a | computer entirely devoid of code and bit-bang your | assembler into the machine with switches, the way the | first users of the MITS Altair did it. | ByteJockey wrote: | You can also bootstrap the way lisp did and write the | fist compiler in the language and get a bunch of grad | students to hand-compile it. | | But, yeah if you don't have a bunch of grad students at | the ready, an assembler hand-written in machine code is | the only option if you want to trust the entire stack. | Though I'm not sure what that would get you. I don't know | of any higher language compilers that are written | directly in assembly these days, so you'd never be able | to compile your C/C++ compiler. | chongli wrote: | There was a C compiler written in assembly posted on HN 4 | years ago [1]! | | So yeah, if you wanted to, you could bit-bang an | assembler capable of assembling a simple C compiler, then | in your simple subset of C you could implement a full C | compiler, and from there you can do anything you want! | | The grad student approach also sounds interesting. A | basic Lisp interpreter can easily fit on a single letter- | sized sheet of paper. A single person could hand-compile | that, it would just take longer. But, if you're living | alone in a cabin in the woods with your own hand-built | computer and a personal library of computer books in hard | copy, that would be a totally feasible project. | | [1] https://news.ycombinator.com/item?id=17851311 | ByteJockey wrote: | I wasn't aware that there were any existing C compilers | made in asm for modern architectures. I guess I shouldn't | be too surprised. | | That's cool, thanks for showing me. | mhh__ wrote: | D has a C compiler built-in now, I wonder if we could bootstrap | all the toolchain now. | ByteJockey wrote: | Don't most toolchains have a rather large C++ component? | | Just parsing C++ is a rather large undertaking (my | understanding is that it's syntax is turing complete). | mhh__ wrote: | So you start with a C++ compiler written in C. Hence | bootstrap, rather than compile from source. | ByteJockey wrote: | Oh, gotcha. Sorry, brain wasn't parsing right before the | coffee today. | cercatrova wrote: | I was thinking of learning Rust but it seems a bit overkill due | to manual memory management as compared to languages with similar | speed like Nim, Zig, and Crystal. How would one compare these | languages? | | Is it worth learning Rust or Zig and dealing with the borrow | checker or manual memory management in general, or are GC | languages like Nim or Crystal good enough? I'm not doing any | embedded programming by the way, just interested in command line | apps and their speed as compared to, say, TypeScript, which is | what I usually write command line apps in. | sanxiyn wrote: | Zig uses manual memory management too (even more manual than | Rust), so that's a bit strange question. | cercatrova wrote: | Interesting, based on their code samples it looked to me like | a GC language since (at least from what I saw) I didn't see | anything regarding memory management. | sanxiyn wrote: | I am not sure what code samples you looked at, but | https://ziglearn.org/chapter-2/ should give you an idea. | elcritch wrote: | It's easy, IMHO, to mistake Zig as a GC'ed language or more | broadly as a memory safe systems language. It's neither but | it is a nicer C. | zigger69 wrote: | It's really easy in Zig to be honest. Just put `defer | thing.deinit()` in the right scope and you're done. You gain | explicitness and know exactly what's going on in your Code. | Everything is obvious. That's the reason Zig is so incredible | simple and easy to read. Zig also has a GPA that will tell | you about memory leaks or anything. | pizza234 wrote: | > or are GC languages like Nim or Crystal good enough? | | Any programming language is good enough for their own use cases | :) It's a matter of understanding which the use cases are. | | I'm a big Rust fan, but I nonetheless believe that the use | cases for programming languages with manual memory management | are comparatively small, in particular, since GC has been | improved a lot in the last decade. | | For undecided people, I conventionally suggest Golang. Those | who at some point need deep control, will recognize it and | change accordingly. | fyzix wrote: | Nim strikes a great balance. No need for a low level language | for cli and general software. I liked crystal but the lack of | support on windows and lackluster dev experience made me stick | to Nim. | | Nim also can double as a web language by transpiling to JS. | nicoburns wrote: | If you're doing things like command-line apps you'll probably | find Rust much easier to work with than Zig. You can write | high-level code that looks basically like TypeScript in Rust, | whereas Zig is more manual. Nim and Crystal are easier from a | language perspective, but they have much smaller ecosystems. | lijogdfljk wrote: | It's funny i came to Rust from Go, Python, NodeJS, etc after a | combined .. 15 years or so. I've been using Rust full time | (work & home) for ~2 years now. | | Obviously i'm biased, but i quite enjoy it. I find i am more | efficient now than before, because it manages to give me the | ease of the "easier" languages quite often with a rich set of | tooling when i need to go deeper. | | Personally i feel the concern over the borrow checker is way | overblown. 95% of the time the borrow checker is very simple. | The common worst case i experience is "oh, i'm borrowing all of | `foo` when i really want `foo.bar` - which is quite easily | solved by borrowing just the `.bar` in a higher scope. | | The lifetime jazz is rarely even worth using when compared to | "easier" languages. Throw a reference count around the data and | you get similar behavior to that of them and you never had to | worry about a single lifetime. Same goes for clones/etc. | | I often advocate this. For beginners to use the language like | it was a GC'd language. A clone or reference count is often not | a big deal and can significantly simplify your life. Then, when | you're deeper into the language you can test the waters of | lifetimes. | | So yea. Your mileage will vary i'm sure. But i find Rust to be | closer to GC'd languages than actual manual languages, in UX at | least. You won't screw up and leak or introduce undefined | behavior, which is quite a big UX concern imo. | melony wrote: | The problem is that when lifetimes cause you problems, it can | force the entire feature development to stop until the | problem is fixed. There is no reasonable escape hatch or | alternative (clone doesn't always work). | klabb3 wrote: | +1. My programming style normally consists of trial-and- | error style prototyping for a couple of iterations, and | then later refining that into something that's solid and | robust. I find Rust's inofficial "prototyping mode" | difficult to combine with it's regular "production grade | mode" for practical purposes. | klabb3 wrote: | > Personally i feel the concern over the borrow checker is | way overblown. 95% of the time the borrow checker is very | simple. | | I have been using Rust professionally as well and had a | different experience. For anything singlethreaded I agree | with you. For any asynchronous behavior, whether it's threads | or async or callbacks, the borrow checker gets very stubborn. | As a response, people just Arc-Mutex everything, at which | point you might as well have used a GC language and saved | yourself the headache. | | However, enums with pattern matching and the trait system is | still unbeatable and I miss it in other languages. | capableweb wrote: | The perspective of someone who is learning Rust (but not | professionally) during the last few months. : | | - The borrow checker is one of the easier parts of Rust to | grok, it's just as you say, not that complicated in the end. | | - Traits are more annoying to understand and find in source | code when they can get added from anywhere, and suddenly you | code gets extra functionality, or it's missing the right one | unless you import the right crate but there is no "back- | reference" so you're not clear what crate the code actually | comes from. | | - Crates/libraries are harder to grok with their | mod.rs/lib.rs files and whatnot, in order to structure your | application over many files. | | - Macros are truly horrible in Rust, both to write and debug, | but then my only experience with macros are with Clojure, | where writing macros is basically just writing normal code | and works basically the same way | | - Compilation times when you start using it for larger | projects tend to be kind of awful. Some crates makes this | even worse (like tauri, bevy) and you need to be careful on | what you add as some can have a dramatic impact on | compilation speed | | - The async ecosystem is not as mature as it seems on first | look. I'm really looking forward to it all stabilizing in the | future. Some libraries support only sync code, others only | async but only via tokio, others using other async libraries. | Read somewhere that eventually it'll be possible to interop | between them, time will tell. | | - Control flow with Option/Result and everything that comes | with it is surprisingly nice and something I'm replicating | when using other languages (mainly a Clojure developer by | day) now. | | My development journey was PHP -> JavaScript -> Ruby -> | Golang -> Clojure with doing them all the capacity of | backend/frontend/infrastructure/everything in-between, | freelancing/consulting/working full-time at long term | companies, so take my perspective with that in mind. Rust | would be my first "low-level" language that I've used in | larger capacity. | bobajeff wrote: | That sounds like good advice. I'll keep that in mind next | time I attempt to use Rust on something. | pyjarrett wrote: | Ada is another option without a GC. I wrote a search tool for | large codebases with it (https://github.com/pyjarrett/septum), | and the easy and built-in tasking and pinning to CPUs allows | you to easily go wide if the problem you're solving supports | it. | | There's very little allocation since it supports returning VLAs | (like strings) from functions via a secondary stack. Its Alire | tool does the toolchain install and provides package | management, so trying the language out is super easy. I've done | a few bindings to things in C with it, which is ridiculously | easy. | throwaway239i3j wrote: | Of the ones you mentioned, Zig is the only one that has | explicit memory management. | | > Is it worth learning | | Languages are easy to pick up once you understand fundamentals. | The borrow checker is intuitive if you have an understanding of | stack frames, heap/data segment, references, moved types, | shared memory. | | You then should be asking "Is it worth using?", then evaluate | use cases.. pros/cons.. etc. | | For CLI, Rust is likely the easiest given it's macros, but if | you struggle with the borrow checker then it won't be. You will | be fighting the compiler instead of developing something. | | Depending what your CLI program is doing, you might want to | evaluate what libraries are available, how they handle I/O, and | parallelism. | | JavaScript has incredibly easy and fast concurrent I/O thanks | to libuv and v8. | travisgriggs wrote: | >> Is it worth learning | | > Languages are easy to pick up once you understand | fundamentals. The borrow checker is intuitive if you have an | understanding of stack frames, heap/data segment, references, | moved types, shared memory. | | I see this sentiment often. In the last 10 years, I have come | up a level in raw C, learned Kotlin, Swift, Python, | Elixir/Erlang, and a smattering of JavaScript, all coming | from a background that included Fortran and Smalltalk. | | My problem with the dialogue is what is meant by "learn." I | have architected, implemented, and maintain different | components of our products in all these languages currently. | I think that demonstrates I have "learned" these languages, | at least at this level of "picked up." But I can't write | Python the way Brett Canon does. Or Elixir the way Jose | Valium does. Or any of their peers. And in that regard I | still very much feel I have not "learned". | | I spent a couple days playing with Zig a month or so ago. I | became familiar with the way it worked. I could spend another | month or so in that phase, and then could probably | comfortably accomplish things with it. But I don't think I'd | feel like I'd "learned" it. | | It reminds me of my experience learning Norwegian. I lived in | Norway for 2 years and did my best to speak as much Norwegian | as I could. At six months I could definitely get by. At 13 | months, as I embraced the northern dialect, I was beginning | to surprise Norwegians that I was from the states. I started | dreaming in Norwegian at some point after that. But even at | 24 months, able to carry on a fluid conversation, I realized | I still could "learn" the language better than I currently | knew it. | | So I guess, it always seems there needs to be more context, | from both the asker and the answerer, when this "should I | learn X" discussion is had. Learning is not a merit badge. | mlindner wrote: | Memory has to be managed by something. The more decisions that | are made for you in how that happens the less flexibility there | is for certain situations. | cercatrova wrote: | Sure but my use cases would be stuff I'd normally write in | TypeScript or Python that already have garbage collection. | Like I said I'm not doing embedded programming so I don't | have too much of a need to manage memory. | | My question could be further constrained then to be, is | learning Rust or Zig despite its manual memory management | worth it for applications that are normally already garbage | collected in their current implementations? Or are languages | like Nim and Crystal enough? Does Rust and Zig have other | benefits despite manual memory management? | adgjlsfhk1 wrote: | imo, most code can do just fine with GC. modern GCs can be | relatively low overhead even with guaranteed small pauses | (10ms). furthermore, most code that can't handle pauses can | be written to not allocate any memory (so GC can be | temporarily turned off). as such, the only two places where | you need manual allocation are for OS development, and hard | real time requirements. | Comevius wrote: | When tail latency (high-percentile latency) is important | GC is not a good choice. Wait-free (threads progress | independently) concurrent algorithms also need wait-free | memory reclamation with bounded memory usage to be able | to guarantee progress. | | But most software are throughput-oriented. | pjmlp wrote: | Additionally, not all GCs are made alike, and languages | like D, F#, C#, Nim, Swift, among others, also offer | value types and manual memory management, if desired. | elcritch wrote: | Also Swift and Nim w/ ARC use reference counting, which | generally give much better latency and lower memory | overhead. Reference counting is part of the reason iOS | devices don't need as much RAM. | | Nim's ARC system also doesn't use atomic or locks which | means it's runtime overhead is very low. I use it | successfully on embedded devices for microsecond timed | events with no large tail latencies. | pjmlp wrote: | Reference counting is a GC algorithm. | | I wouldn't buy into much Apple marketing regarding its | performance though, | | https://github.com/ixy-languages/ixy-languages | | It makes sense in the context of tracing GC having been a | failure in Objective-C due to its C semantics, while | automating Cocoa's retain/release calls was much safer | approach. Swift naturally built on top of that due to | interoperability with Objective-C frameworks. | | Nim has taken other optimizations into consideration, | however only in the new ORC implementation. | | Still, all of them are much better than managing memory | manually. | elcritch wrote: | > I wouldn't buy into much Apple marketing regarding its | performance though, | | I wouldn't make claims on Swifts overall performance, but | just it's memory usage (really Obj-Cs) and particularly | for GUI development. Java's GCs have always been very | memory hungry, usually to the tune of 2x. Same with .Net. | Though to be fair Go's and Erlang's GCs have much better | memory footprints. Erlang's actor model benefits it | there. | | Agreed, they're all better than manual memory management. | MarcusE1W wrote: | The way you describe your use case I think you are fine | with a language with garbage collection like Nim (which has | has a syntax a bit like Python) or Crystal. I would also | throw Go in the ring or if you are interested to learn a | bit of functional programming then you also could look at | Ocaml. | | Zig has no garbage collection btw, but makes it easier than | C to handle that. Another language without garbage | collection that helps a lot to avoid memory issues is Ada | (Looks a bit like Pascal). So there are alternatives to | Rust. | mlindner wrote: | Rust's memory management is "manual" but it feels automatic | for most uses. | Starlevel001 wrote: | [deleted] | jgillich wrote: | I've found that Go is not elegant enough for me and Rust is too | difficult to write (I started using Rust in 2015 and after | years of trying I eventually realized Rust doesn't make sense | for most apps), so I'm all in on Crystal. Despite not having | much prior Ruby experience, I absolutely love the language. | zozbot234 wrote: | Modern Rust is much more straightforward than it was in 2015. | It's effectively two different languages, albeit maintaining | backward compatibility (i.e. code written for Rust 1.0 should | still compile today, with proper edition settings). | pizza234 wrote: | Crystal doesn't have built-in support for parallelism, let | alone production-grade support. This is a significant lack | for a modern language. | | For a language that is around 8 years old, this may be a | serious problem, since the surrounding ecosystem has been | probably written without parallelism in mind, and it may take | a very long time to be updated (if ever). | npn wrote: | > Crystal doesn't have built-in support for parallelism | | They do, but it is hidden inside a compiler flag, if you | compile your prject with `Dpreview_mt` then it will come | with multi-threaded support. This has been an experimental | feature for a few year though, and there is not much | improvement since it first got introduced. | | Personally I don't use crystal for this kind of feature, | and it runs stable enough when I use it for some cpu | intensive tasks when I rarely need it. | | Crystal really shines when you need something that you | usually write a python/ruby script to do, especially for | tasks that run for hours. Converting some script from ruby | to crystal and run it in production mode typically reduce | the time consumed to 1/5 or even 1/10 of the original | depends on the job. As someone who have to read gigabytes | of text files regularly, Crystal is currently the best one | for the task. | | The compilation time for released binary is something need | much improvement though. And I'm not sure if they can even | achieve incremental compilation. | sanxiyn wrote: | I use PyPy for such cases. Is Crystal better than PyPy? | npn wrote: | I think Crystal is better than Python in term of language | design. Unlike Ruby and Python that were way older, | crystal is relatively new, so they learned from other | languages mistake and try to improve it, result in a more | cleaner language. | | For the cases mentioned, I think crystal is immensely | helpful: - Reading/writing files are easy, usually a | single method will give you the result you want. - | Working with directories are nice, things like | `Dir.mkdir_p`, `Dir.each_child`, `File.exists?`... all | existed to make your life easier. - Like ruby, you can | invoke shell command easily using backticks - There are | some useful libraries to for console app, like `colorize` | or `option_parser`. Crystal is a battery included | language, so the standard library is filled with useful | libraries. - Working with lists and hashmaps is a breeze, | since the Enumerable and Iterable modules are filled with | useful methods, mostly inspired from ruby land. - | Concurrent is built in, so you can trivially write | performant IO-bounded tasks like web crawlers. | | For a project that made by a handful of people, I just | can't praise the dev team enough for making a language | this practical. | lijogdfljk wrote: | I second zozbot234's statement about it being far better than | it was in those days. | | The language team has done a great job rounding rough edges, | and this next roadmap is slated for even more polishing. They | heavily prioritize dev experience which is why i think people | like myself (a GC'd language person historically) use and | love Rust so much. | phendrenad2 wrote: | I recommend C. Once you get the hang of it, it's as fast as | writing Rust code (and you don't have to think about borrow | checks). | cercatrova wrote: | Yeah, I sure _love_ debugging segfaults. I 've used C before | and it was cool to learn but I haven't used it since. | phendrenad2 wrote: | Once you've used C enough, you get the skill to avoid | writing segfaults, and when a segfault happens, they're a | lot easier to debug. | | However, since you're just interested in writing a fast | command-line app, what about the JVM or .NET? Those have a | startup time issue, but once they're running they're very | fast, less than an order of magnitude slower than | C/Rust/Zig/etc. | zigger69 wrote: | Crystal: compilation speed is just too slow, sadly. Nim and | Zig: I'd definitely just go with Zig. It's an extremely simple | language, has no macros (but something much better than | macros), is explicit, and in the long run it's just going to be | worth it much more than Nim. | Tozen wrote: | Besides Rust and Zig, you might want to check out Vlang and | Odin, who are in the same category. | cercatrova wrote: | I remember reading a lot of controversy about V back when I | first heard about it so I decided not to look into it further | [0], but I'll take a look again. Odin looks interesting, Pony | does as well. | | [0] https://news.ycombinator.com/item?id=25511556 | ledgerdev wrote: | I have been thinking about creating a little higher level | language that targets server side web assembly. Zig looks very | attractive, but concerned with how to handle things like strings | and datetimes. | | How suitable is zig for such a task compared to say rust? | pacaro wrote: | I may be misunderstanding you, but it feels like strings and | datetimes are library related more than language related. | | I know that higher level languages will have primitives that | aim to represent strings, but if you need to get into the weeds | with Unicode then you'll be leaning on a library regardless | ledgerdev wrote: | > I may be misunderstanding you, but it feels like strings | and datetimes are library related more than language related. | | Yes would agree and see them as platform related. It's just | too large a task to create from scratch. Like say on JVM you | can compile to bytecode and have strings already built into | platform, and java.time, and ability to access an ecosystem | of libraries. | | With zig could one could use c or rust libraries? | Shadonototra wrote: | Best alternative to C, built with solid foundation to ensure fast | compile speed, fast iteration, and easy to maintain code | mlindner wrote: | I don't understand why people want fast compile speeds so much. | My day job is/was writing C on something that requires 30+ | minutes for one compilation run. It feels like people want fast | compilation speeds because they need to keep running their | software for some reason. | | Fast compilation speeds are a nice to have but basically | irrelevant for normal developing of software in my experience. | Comevius wrote: | Hot code reloading is nice to have, but incremental | compilation is essential. Your compiler has forsaken you if | you have to wait 30 minutes for changes to compile. | hu3 wrote: | Sorry I may have missed the sarcasm. | | Your day job project takes half an hour to compile and you | don't see the point in speeding that up? | mlindner wrote: | It wasn't sarcasm. My "irrelevant" point meant "it's | irrelevant for a factor in picking a language", as in "it | doesn't significantly contribute to whether a project is | possible in the long term". | | If compile times are longer you just compile less often and | write larger portions of code at a time and you generally | keep writing code while it compiles. | sanxiyn wrote: | GP did say it is a nice to have. | hu3 wrote: | But also said that it's basically irrelevant. Hence my | confusion. | kortex wrote: | The longer the delay between writing some chunk of code, and | executing it, the more valuable mental context is lost. I | find it way more productive to work in small chunks | iteratively, testing as I go along, rather than writing for a | long chunk of time, then running tests and figuring out what | bugs are making tests fail. | mlindner wrote: | I only compile a couple of times per day max usually. | Sometimes I won't compile at all in a day. | chrisseaton wrote: | Developers have to wait while your compiler runs. You're | paying your compiler at your engineer hourly rate, if you | like. That's very expensive! | jgod wrote: | Faster feedback loop is a much better development experience. | diosito wrote: | gautamcgoel wrote: | Quick question, which maybe someone here can answer: I noticed | that GitHub supports syntax highlighting in the Zig repo. How | does that work for a new language such as Zig? Can you somehow | upload a file which tells GitHub how you'd like programs written | in your language to be displayed? | aeldidi wrote: | I believe this is the syntax highlighter's repo: | https://github.com/github/linguist/blob/master/CONTRIBUTING.... | gautamcgoel wrote: | Thanks, this is what I was wondering! Seems a new language | needs to have 200 repos which use it before GitHub will | consider adding syntax highlighting for it.. | [deleted] | diosito wrote: | spicybright wrote: | A big achievement for any decently sized language. Nice work devs | :) | Shoop wrote: | For reference: | | Tracking issue for overall progress on the self-hosted compiler: | https://github.com/ziglang/zig/issues/89 | | Zig's New Relationship with LLVM: https://kristoff.it/blog/zig- | new-relationship-llvm/ | AndyKelley wrote: | Hello HN! Here is some context to decorate this announcement: | | The Zig self-hosted compiler codebase consists of 197,549 lines | of code. | | There are several different backends, each at varying levels of | completion. Here is how many behavior tests are passing: | LLVM: 1101/1138 (97%) WASM: 919/1138 (81%) | C: 740/1138 (65%) x86_64: 725/1138 (64%) | arm: 490/1138 (43%) aarch64: 411/1138 (36%) | | As you might guess, the one that this milestone is celebrating is | the LLVM backend, which is now able to compile the compiler | itself, despite 3% of the behavior tests not yet passing. | | The new compiler codebase, which is written in Zig instead of | C++, uses significantly less memory, and represents a modest | performance improvement. There are 5 more upcoming compiler | milestones which will have a more significant impact on | compilation speed. I talked about this in detail last weekend at | the Zig meetup in Milan, Italy[1]. | | There are 3 main things needed before we can ship this new | compiler to everyone. | | 1. bug fixes | | 2. improved compile errors | | 3. implement the remaining runtime safety checks | | If you're looking forward to giving it a spin, subscribe to [this | issue](https://github.com/ziglang/zig/issues/89) to be notified | when it is landed in master branch. | | Edit: The talk recording about upcoming compiler milestones is | uploaded now [1] | | [1]: https://www.youtube.com/watch?v=AqDdWEiSwMM | dleslie wrote: | Happy to see the C backend coming along. LLVM is a major | barrier to use on esoteric embedded devices. | sitkack wrote: | You can also target C through Wasm. | | https://github.com/WebAssembly/wabt/tree/main/wasm2c | exikyut wrote: | My genuine question is what sort of code-size and/or | performance impact the translation imposes. | | The simple example in the README.md seems straightforward | enough, but I wonder if there are any pathological | explosions in practice. | geophertz wrote: | > written in Zig instead of C++, uses significantly less | memory, and represents a modest performance improvement | | That's particularly interesting considering the rust compiler | in rust has never been as fast as the original OCaml one | sanxiyn wrote: | Well, OCaml Rust compiler also didn't use LLVM and used its | own lightweight code generator and I think self-hosted Rust | compiler frontend was in fact faster than OCaml Rust compiler | frontend. | parentheses wrote: | With both projects, how much of the improvement is simply | building for the second time? | sanxiyn wrote: | For Rust, I think improvement was almost entirely due to | LLVM producing faster code. That's not applicable to Zig | case, since both old and new compiler use LLVM. I don't | know enough about Zig to answer. | kibwen wrote: | The original OCaml compiler didn't have essentially any of | the static analysis that Rust would eventually be known for. | Rust in 2011 (when rustc bootstrapped) was dramatically | different from what would later stabilize in 2015. | est31 wrote: | I wonder how much this statement still holds. I've never used | the OCaml bootstrap compiler but performance wise, the rust | compiler has improved incredibly since the 1.0 release. | sanxiyn wrote: | An apple to apple comparison is impossible because rustboot | compiled a very different language. But I suspect suitably | updated rustboot would be still faster because compilation | time is dominated by LLVM. | pcwalton wrote: | Rustboot's code generator was generally slower than LLVM. | I think in some small test cases it might have been | faster, but when implementing stuff like structure copies | rustboot's codegen was horrendously slow because it would | overload the register allocator. | pcwalton wrote: | Huh? That's not true at all. It took over 30 minutes to | compile the self-hosted Rust compiler with the OCaml | compiler, when rustc was far smaller than it is today. | rustboot was agonizingly slow, and one of the main reasons | why I was so anxious to switch to rustc back in those days | was compilation speed. | | I was there and had to suffer through this more than | virtually anyone else :) | einpoklum wrote: | * What kind of tests are these "behavior test"? | | * Is that a list of compilation targets? | | * If not all behavior tests pass, does that not mean that the | compiler fails to compile programs correctly? | | Please indulge those of us who are not familiar with self- | hosting compiler engineering. | Spex_guy wrote: | > What kind of tests are these "behavior test"? | | Snippets of zig code that use language features and then make | sure those features did the right thing. You can find them | here: | https://github.com/ziglang/zig/tree/master/test/behavior | | > Is that a list of compilation targets? | | Mostly. Pedantically, it's a list of code generation | backends, each of which may have multiple compilation | targets. So for example the LLVM backend can target many | architectures. The ones that are architecture specific are | currently debug-only and cannot do optimization. | | > If not all behavior tests pass, does that not mean that the | compiler fails to compile programs correctly? | | Some tests are not passing because they cause an incorrect | compile error, others compile but have incorrect behavior | (miscompilation). Don't use Zig in production yet ;) | | (edit: fix formatting) | icsa wrote: | > uses significantly less memory, and represents a modest | performance improvement. | | The reduced memory has significant value. Being able to do the | same build on less expensive hardware or do more with the same | hardware is a significant financial performance improvement | joshbaptiste wrote: | yup 18x memory reduction improvement 8.5GB -> 0.5GB according | to the vid.. | riffraff wrote: | it's so surprising to hear there was a Zig Meetup in Milan, I'd | not expect a large enough community to exist there, pretty | cool! | vanderZwan wrote: | Probably a significant chunk of the larger European community | was represented there too - don't forget that traveling to EU | countries is relatively easy for EU citizens | erwincoumans wrote: | Congratulations with the milestone! | | Does using Zig over C++ lead to "less memory, and represents a | modest performance"? Or was the C++ implementation a bit | sloppy? (lacking data oriented design for instance) | | Also, what specifically are you most excited using Zig for? | AndyKelley wrote: | Thanks :) | | The new Zig implementation is certainly more well designed | than the C++ implementation, for several reasons: | | * It's the second implementation of the language | | * It did not have to survive as much evolution and language | churn | | * I leveled up as a programmer over the last 7 years | | * The Zig language safety and debugging features make it | possible to do things I would never dream of attempting in | C++ for fear of footguns. A lot of the data-oriented design | stuff, for example, makes use of untagged unions, which are | nightmarish to debug in C++ but trivial in Zig. In C++, | accessing the wrong union field means you later end up trying | to figure out where your memory became corrupted; in Zig it | immediately crashes with a stack trace. This is just one | example. | | * Zig makes certain data structures comfortable and ergonomic | such as MultiArrayList. In C++ it's too hard, you end up | making performance compromises to keep your sanity. | | Generally, I would say that C++ and Zig are in the same | performance ballbark, but my (obviously biased) position is | that the Zig language guides you away from bad habits where | as C++ encourages them (such as smart pointers and reference | counting). | | As for less memory, I think this is simply a clear win for | Zig. No other modern languages compete with the tiny memory | footprints of Zig software. | | Some of the projects I am exited to use Zig for: | | * rewriting Groove Basin (a music player server) in zig and | adding more features | | * a local multiplayer arcade game that runs bare metal on a | raspberry pi | | * a Digital Audio Workstation | Karliss wrote: | Can you clarify about the union part? Did you meant that | zig allowed you replacing what would be untagged union in | C++ with tagged union in zig? Or does the zig compiler has | some kind of debug sanitizer mode which automatically turns | untagged unions into tagged unions with checks? | dralley wrote: | In the past they've talked about the speed and memory | improvements they've gotten from using MultiArrayList in | the compiler, storing tags separately from the unions | themselves. If you have a union with a size of 16 bytes | and you add a tag to that which is 1 byte, a lot of space | is wasted due to padding. If you keep the tags in a | separate array, both arrays are individually densely | packed. Less memory wasted due to padding == less memory | use overall and better utilization of cache. | | But in terms of the implementation, this means working | with untagged unions, because the tags are maintained | externally. | abbeyj wrote: | If the union is untagged, how can it be determined (at | runtime) that you've accessed the wrong field? | Spex_guy wrote: | The compiler adds a tag in debug modes, but not in | release modes. | elcritch wrote: | Impressive work getting Zig self-hosting. However: | | > As for less memory, I think this is simply a clear win | for Zig. No other modern languages compete with the tiny | memory footprints of Zig software. | | Is not true at all. There are several other modern | languages that compete with Zig for small memory | footprints. | geodel wrote: | Would you tell about those languages or they are left as | an exercise to readers? | elcritch wrote: | Sort of left it to the readers and hopefully encourage | people to investigate for themselves. It's far too easy | to get into "this benchmark vs this benchmark", etc. | Memory usage is overall a complicated topic, which I | think Andrew's comment doesn't do justice to. Granted the | Zig team has done some impressive work, much of the | memory usage & bloat in the C++ world comes from real | world programs and libraries and the inevitable drift in | program architecture over time. | | However, I could believe Zig's stdlib and culture | encourages low memory footprints, but there isn't | anything novel in the language that makes it inherently | lower memory footprint. Though to name a few languages | I'd say that can be directly comparable are Rust, D (esp. | BetterC mode), and Nim. Even Julia & Go in the right | context. Though honestly I often prefer wasting a few | hundred bytes of RAM here and there, even on a | microcontroller, for pure convenience. | | edit: forgot Odin. Another comment mentioned it, though | I've never used it. It looks like it's used in | production. | maleldil wrote: | Thanks for the detailed answer! I have more questions, if | you'll indulge me: | | If I understood it correctly, you think smart pointers and | reference counting are bad habits. Why? Especially the | smart pointers bit. | | Why does Zig use less memory than other languages? Is it | inherent to Zig, or can it be reproduced in other | languages? | lupire wrote: | I think Zig prefers explicit memory management, because | allocations may fail and should be handled explicitly, | and because automatic deallocations lead to hard-to- | predict lifetimes (excess memory usage, and bugs for | resource handles that are destructed at hard to predict | moments). | | These are things that a "systems language" programmer | should put in the work to do correctly/near-optimally, | and not ask the compiler to just do something "good | enough", like Python would. | pjmlp wrote: | And as we know from C, every developer is quite capable | of taking care of use after free possible bugs. | messe wrote: | The general purpose allocator in the zig standard library | has protections against use after free bugs. | pcwalton wrote: | By quarantining all memory forever. This is not a | scalable solution because keeping one allocation in a 4kB | page alive will leak the whole rest of the page. And if | you don't quarantine all memory forever then use after | free comes back. If it were that easy to solve UAF then | C++ would have solved it by now. | | There _is_ a scalable solution for UAF that doesn 't | involve introducing a lifetime/region system: garbage | collection. Of course, that comes with its own set of | tradeoffs. | AndyKelley wrote: | The problem of a single allocation keeping a 4 KB page | alive is something that you might commonly find with the | C++ or Rust way of programming that encourages allocating | many individual objects on the heap, but in Zig land this | is pretty rare. In fact, compare a Zig implementation of | a given application with an equivalent in any other | language and you will find there is no contest with | respect to the size of the memory footprint. | | There are many cool possibilities that C++ has never | explored and frankly I find your argument unimaginative. | pjmlp wrote: | Just like C and C++ debugging allocators, so what is the | improvement here? | Comevius wrote: | The point of C and Zig is that you can solve any kind of | problems with them. In particular there is much more to | memory reclamation than garbage collectors or Rust's | borrow checker. Some of the reclamation schemes offer | wait-freedom, or efficiently support linearizable | operations. | maleldil wrote: | What can C and Zig do that Rust can't? | politician wrote: | This is kind of a trick question because they are all | Turing Complete, but so is Assembly. The best way to | interpret your question, then, is not "what is possible" | but rather "what is simple to express correctly" and | "what is simple to get correct eventually". Those are | questions about how tricky it is to get something to | compile in the language and which tools exist to help | determine whether a compiled program does what's expected | and does not do what's not expected. | Comevius wrote: | Nothing if unsafe Rust is considered, though Zig does not | require you to fight the language nearly as much. This is | especially obvious with embedded. Zig's philosophy of no | hidden control flow or allocation makes things simple. | Simplicity is power. | | For certain problems you would want a TLA+ specification | for safety and especially liveness either way. It's not | like Rust absolutely guarantees correctness in all cases. | | Rust sits in a sweet spot between C/Zig and languages | like Java, but it's not an appropriate replacement for | either of them. | pjmlp wrote: | Any kind of problem? | | So how do you solve SIMD with C, without language | extensions? | | C is not a special snowflake. | turminal wrote: | Are there languages that "solve" SIMD? | pjmlp wrote: | ISPC for one. | | https://ispc.github.io/ | Comevius wrote: | SIMD is not a problem, it's hardware. Compilers tend to | take advantage of the CPU-specific SIMD registers and | instructions, or you can use them explicitly. | | Writing generic SIMD code is more portable. C has | libraries, and Zig also has vector primitives available | through built-in functions. | pjmlp wrote: | Any language can have libraries, C is not special here, | nor is Zig. | | In fact, a few GC enabled languages have explicit SIMD | support. | coder543 wrote: | > because automatic deallocations lead to hard-to-predict | lifetimes (excess memory usage, and bugs for resource | handles that are destructed at hard to predict moments). | | I don't really feel this is the case in Rust. | throwawayzr wrote: | varajelle wrote: | But it is. If you have a String on the stack, it's memory | is only reclaimed at the end of the scope, while it often | could be free'd before. This is especially bad in async | code around await point since it means the memory need to | be kept alive more than needed. | coder543 wrote: | I disagree. It is substantially and unequivocally better | to hold onto memory until the end of scope than to leak | memory by default. How can anyone argue that leaking | memory is a better default? That's a ticking time bomb. | Maybe someone is so optimistic as to believe they'll | catch every leak before shipping new code? | | You can easily add a manual "drop" call in Rust at any | point if you want to force an allocation to be freed | sooner, but I speak from years of experience using Rust | for work when I say that Rust's RAII model is not | problematic in practice. I'm not simply speculating or | theorizing, and I have professional experience with a | variety of languages at all levels of the stack. I | personally don't mind garbage collectors most of the | time, but Rust is great when you need more control. | | In C++, RAII can absolutely be problematic because you | are able to easily do things that cause undefined | behavior _by accident_ , which is arguably worse than | either leaking by default or the mere act of holding onto | memory for the duration of a scope. | | If you can propose a system which cannot be contrived to | have any downside, that would be fantastic! In the real | world, Rust's approach to memory management is extremely | pragmatic and beneficial. I'm sure someone will | eventually improve on Rust's approach, but "leak by | default" isn't it. | | I honestly do enjoy following Zig... it is a fascinating | language taking a really interesting approach to solving | many problems, but its memory safety story is not where I | want it to be yet. Leaking memory by default is | technically safe, but it's not exactly endearing. | varajelle wrote: | Of course you can call drop() manually, but almost nobody | does or even think about it because that's not the way | you program in a language with RAII. | | Don't get me wrong. I do think that rust and c++ RAII is | much more convenient and safe than the C or Zig way. | | (I'd even prefer if you could annotate given struct in | rust so the compiler could drop them as soon as it's no | longer used, but that s not that simple) | coder543 wrote: | I definitely wish that Non-Lexical Lifetimes would | eagerly drop anything that doesn't implement Drop. | | It would probably be a breaking change to automatically | call an explicit Drop implementation anywhere other than | the end of the current scope, so I think that would have | to be left as-is. String doesn't implement Drop, so it | could easily be dropped eagerly within the scope as soon | as it won't be referenced again. Such a change would be | roughly equivalent to any of the compiler optimizations | that reorder statements in ways that should be | unobservable. | guidoism wrote: | I've recently been writing personal code that leaks like | a sieve. It's just not worth my time to find every leak | when the lifetime of the process is finite and short and | it will only ever run on a machine with gigs of memory. I | haven't thought through your question enough but maybe a | situation where memory usage would be super high if | waiting until the end of scope? I'm probably trying to | hard to come up with a situation but I have a gut feeling | that freeing mid scope is important under certain | circumstances to keep the code simple and understandable. | charcircuit wrote: | The lifetime of the memory a smart pointer manages is | very predictable. It will have the same lifetime as the | smart pointer itself (this is ignoring moves). | RustyConsul wrote: | I think what he's saying is there is a way to carelessly | use smart pointers in rust. | | pub enum List { Empty, Elem(i32, Box<List>), } | | instead of : | | pub struct List { head: Link, } | | enum Link { Empty, Some(Box<Node>), } | | struct Node { elem: i32, next: Link, } | erwincoumans wrote: | Great, thanks for those details! I primarily develop using | C++ and avoiding pitfalls (smart pointers, exceptions, | unintended memory allocations) takes a lot of effort. | | I enjoy synthesizers (including Eurorack) and looking | forward playing with a Zig DAW! | jchw wrote: | > * a Digital Audio Workstation | | Woah. | | A little bit ago I went to write a little tool that mucked | with the FL Studio FLP format. It was easy enough to guess | out the bits that I cared about, so I pretty much just did | that using a couple quick projects with specific things in | them. However, I did check to see if anyone else had mucked | around with the FLP format, and couldn't help but notice | your name. Was pretty surprised as a very curious onlooker | to the Zig programming language. You certainly seem to get | around :) | | That's a little tangential, but I guess I mention it | because I was actually wondering if this was ever something | you planned on doing given the fact that it was clear you | had dabbled with DAW stuff (forgive me for not knowing if | you have a more rich connection to music production than | just that; I never bothered to check.) | | A DAW in Zig sounds like a kick-ass idea. I tried to write | a sort-of DAW toy with friends in Rust and it was a lot of | fun even if it mostly made me realize how challenging it | could be. (And also how bad at math I am. It took me so | much effort to feel like I could understand FFTs enough to | actually _implement_ them.) It makes me wonder if your Zig | DAW would be open source? It would be a fun project to | attempt to contribute to, if or when it ever came to | fruition. | | Exciting stuff. Congrats on the Zig milestone. | jcpst wrote: | Thanks for all the context. Curious to know more about the | concept/design of the DAW. | aaaaaaaaata wrote: | Seconded. | carapace wrote: | Congratulations! | [deleted] | riffic wrote: | Take off every 'ZIG'!! | | edit: all your base are belong to us | mindwok wrote: | I've spent the last few weeks building an 8080 emulator in Zig to | learn both emulator programming and the language. Gotta say, it's | been a pretty pleasant experience. My only issue was with dynamic | dispatch, which lead me down quite a rabbit hole which I didn't | ever fully come out of. Seems that the current situation is build | your own using compiler functions and pointer casts. ___________________________________________________________________ (page generated 2022-04-16 23:00 UTC)