Settings

Theme

D Programming Language

dlang.org

212 points by arcadia_leak 3 days ago · 271 comments

Reader

rafaelmn 2 days ago

IMHO D just missed the mark with the GC in core. It was released in a time where a replacement for C++ was sorely needed, and it tried to position itself as that (obvious from the name).

But by including the GC/runtime it went into a category with C# and Java which are much better options if you're fine with shipping a runtime and GC. Eventually Go showed up to crowd out this space even further.

Meanwhile in the C/C++ replacement camp there was nothing credible until Rust showed up, and nowadays I think Zig is what D wanted to be with more momentum behind it.

Still kind of salty about the directions they took because we could have had a viable C++ alternative way earlier - I remember getting excited about the language a lifetime ago :D

  • ibgeek 2 days ago

    I used to think of D as the same category as C# and Java, but I realized that it has two important differences. (I am much more experienced with Java/JVM than C#/.Net, so this may not all apply.)

    1. Very load overhead calling of native libraries. Wrapping native libraries from Java using JNI requires quite a bit of complex code, configuring the build system, and the overhead of the calls. So, most projects only use libraries written in a JVM-language -- the integration is not nearly as widespread as seen in the Python world. The Foreign Function and Memory (FFM) API is supposed to make this a lot easier and faster. We'll see if projects start to integrate native libraries more frequently. My understanding is that foreign function calls in Go are also expensive.

    2. Doesn't require a VM. Java and C# require a VM. D (like Go) generate native binaries.

    As such, D is a really great choice when you need to write glue code around native libraries. D makes it easy, the calls are low overhead, and there isn't much need for data marshaling and un-marshaling because the data type representations are consistent. D has lower cognitive overhead, more guardrails (which are useful when quickly prototyping code), and a faster / more convenient compile-debug loop, especially wrt to C++ templates versus D generics.

    • tracker1 a day ago

      Native calls from C# are MUCH better than then the Java experience. It's a massive part of why I chose it when it came out. Today, C# is pretty great... not ever MS dev shop, which is often, like Java, excessively complex for its' own sake.

      On #2, I generally reach for either TS/JS with Deno if I need a bit more than a shell script, or Rust for more demanding things. I like C# okay for the work stuff that I do currently though.

    • pjmlp a day ago

      1. Java nowadays has Panama

      2. Java and C# can also generate native binaries, just like Go, no need for VM.

      3. C++ nowadays has concepts, modules and compile time execution

      This wasn't true in 2010, but D has let them catch up with missing features.

      • thezipcreator a day ago

        what are you referring to regarding Java? I'm aware C# has AOT (and il2cpp for Unity projects) but I don't recall hearing about any sort of Java native binary that isn't just shipping a VM and java bytecode (ignoring the short-lived GNU java compiler).

        • pjmlp a day ago

          Java has had AOT compilers since around 2000, they only happened to be commercial, Excelsior JET was the most famous one.

          There were several vendors selling AOT compilers for embedded systems, nowadays they are concentrated into two vendors, PTC and Aicas.

          Then you have the free beer compilers GraalVM and OpenJ9, which are basically the reason why companies like Excelsior JET ended up closing shop.

          Also .NET has had many flavours, starting with NGEN, Mono AOT, Bartok, MDIL, .NET Native, and nowadays Native AOT.

          Both ecosystems are similar to Lisp/Scheme nowadays, having a mix of JIT and AOT toolchains, each with its plus and minus, allowing the developers to pick and choose the best approach for their deployment scenario.

  • arcadia_leakOP 2 days ago

    I'd rather say that the GC is the superpower of the language. It allows you to quickly prototype without focusing too much on performance, but it also allows you to come back to the exact same piece of code and rewrite it using malloc at any time. C# or Java don't have this, nor can they compile C code and seamlessly interoperate with it — but in D, this is effortless.

    Furthermore, if you dig deeper, you'll find that D offers far greater control over its garbage collector than any other high-level language, to the point that you can eagerly free chunks of allocated memory, minimizing or eliminating garbage collector stops where it matters.

    • rafaelmn 2 days ago

      > C# or Java don't have this, nor can they compile C code and seamlessly interoperate with it — but in D, this is effortless.

      C# C interop is pretty smooth, Java is a different story. The fact that C# is becoming the GC language in game dev is proving my point.

      >Furthermore, if you dig deeper, you'll find that D offers far greater control over its garbage collector than any other high-level language, to the point that you can eagerly free chunks of allocated memory, minimizing or eliminating garbage collector stops where it matters.

      Yes, and the no-gc stuff was just attempts to backpedal on the wrong initial decision to fit into the use-cases they should have targeted from the start in my opinion.

      Look D was an OK language but it had no corporate backing and there was no case where it was "the only good solution". If it was an actual C++ modernization attempt that stayed C compatible it would have seen much better adoption.

      • arcadia_leakOP 2 days ago

        > C# C interop is pretty smooth

        True, but you still need to either generate or manually write the bindings. In D, you just import the C headers directly without depending on the bindings' maintainers.

        > If it was an actual C++ modernization attempt that stayed C compatible it would have seen much better

        Any D compiler is literally also a C compiler. I sincerely don't know how can one be more C compatible than that.

        > Yes, and the no-gc stuff was just attempts to backpedal on the wrong initial decision

        I think that it was more of an attempt to appease folks who won't use GC even with a gun to their head.

        • rafaelmn 2 days ago

          I'm not saying D didn't have nice features - but if D/C#/Java are valid options I'm never picking D - language benefits cannot outweigh the ecosystem/support behind those two. Go picked a niche with backend plumbing and got Google backing to push it through.

          Meanwhile look at how popular Zig is getting 2 decades later. Why is that not D ? D also has comp-time and had it for over a decade I think ? Zig proves there's a need that D was in the perfect spot to fill if it did not make the GC decision - and we could have had 2 decades of software written in D instead of C++ :)

          • bw86 a day ago

            > Why is that not D ?

            You never get a second chance at making a good first impression.

            I believe that many people that gladly use Rust or Zig or Go nowadays would be quite happy with D if they were willing to give it a fair evaluation. But I still often find people going "D? I would never use a language where the ecosystem is split between different standard libraries"/"D? No thanks, I prefer compilers that are open source" or similar outdated claims. These things have not been true for a long time, but once they are stuck in the heads of the people, it is over. And these claims spread to other people and get stuck there.

            If you do not want to use a GC, it is trivial to avoid it and still be able to use a large chunk of the ecosystem. But often avoiding GC at all costs is not even necessary - you mostly want to avoid it in specific spots. Even many games today are written with tasteful usage of GC.

            The one thing that really is a fair disadvantage for D is its small community. And the community is small because the community is too small (chicken/egg) and many believe in claims that have not been true for a long time ...

            • arcadia_leakOP a day ago

              > You never get a second chance at making a good first impression.

              There's a good number of younger programmers like myself who've never heard of D, say, before 2017 when those false claims were still true. Our first impression of D comes from its state today, which is not that far behind from other emerging languages.

          • arcadia_leakOP 2 days ago

            > D/C#/Java are valid options I'm never picking D

            This is perfectly fair.

            > D was in the perfect spot to fill if it did not make the GC decision

            I just find it hard to believe that the GC is the one big wart that pushed everyone away from the language. To me, the GC combined with the full power of a systems language are the killer features that made me stick to D. The language is not perfect and has bad parts too, but I really don't see the GC as one of them.

            • Cloudef 2 days ago

              Its not the GC, its that D has no direction. Its kitchen sink of features and the optionality just fragments the ecosystem (betterC, gc) etc, making reusing code hard.

              • thezipcreator a day ago

                this is the main issue I think with D, yeah.

                regarding kitchen-sink-ness it's at least nowhere near as bad as C++, but that bar is basically below the ground anyway so it's not much to write home about.

            • zem 2 days ago

              go had a similar early trajectory where c++ programmers rejected it due to the gc. it gained traction among python/ruby/javascript programmers who appreciated the speed boost and being able to ship a single static binary.

      • cardanome 2 days ago

        > The fact that C# is becoming the GC language in game dev is proving my point.

        That is just the Unity effect. Godot adopted C# because they get paid to do so by Microsoft.

        C# allows for far lees control over the garbage collection compared to D. The decision to use C# is partly responsible for the bad reputation of Unity games as it causes a lot of stutters when people are not very careful about how to manage the memory.

        The creator of the Mono runtime actually calls using C# his Multi-million dollar mistake and instead works on swift bindings for Godot: https://www.youtube.com/watch?v=tzt36EGKEZo

        • debugnik 2 days ago

          C# wouldn't be a problem for Unity if they hadn't mapped most engine abstractions to class hierarchies with reflection-based dispatch instead of value-type handles and the seldom interface, and had dropped the Boehm GC. .NET has actually got a lot of features to avoid allocations on the hot paths.

          • pjmlp a day ago

            The problem is called Mono, and Unity's refusal to pay for an update.

            • debugnik a day ago

              I agree Mono is bad compared to upstream .NET, but I used to write game prototypes with it back before .NET Core without as many performance issues as I still find in Unity. It was doable with a different mindset.

            • thezipcreator a day ago

              instead they made (or funded? not exactly sure) il2cpp which is a batshit compiler that compiles IL to C++ for better performance, I guess.

              sidenote, I wonder how many other low-level to high-level compilers exist out there. can't be many.

              • debugnik a day ago

                AFAIK, the original reason to build IL2CPP was to appease console certification and leave behind Mono's quirky AOT on iOS. Capcom is also using their own C# implementation targeting C++ for console certification.

                Allegedly some games are now managing to ship on console with ports of .NET NativeAOT.

      • arcadia_leakOP 2 days ago

        > The fact that C# is becoming the GC language in game dev is proving my point.

        Respectfully, it doesn't prove your point. Unity is a commercial product that employed C# because they could sell it easily, not because it's the best language for game dev.

        Godot supports C# because Microsoft sponsored the maintainers precisely on that condition.

      • xigoi 2 days ago

        > The fact that C# is becoming the GC language in game dev is proving my point.

        Popularity is not proof of anything. C# is popular because it’s made by Microsoft and rode the OOP hype.

  • optionalsquid 2 days ago

    My (likely unfair) impression of D is that it feels a bit rudderless: It is trying to be too many things to too many people, and as a consequence it doesn't really stand out compared to the languages that commit to a paradigm.

    Do you want GC? Great! Do not want GC? Well, you can turn it off, and lose access to most things. Do you want a borrow-checker? Great, D does that as well, though less wholeheartedly than Rust. Do you want a safer C/memory safety? There's the SafeD mode. And probably more that I forget.

    I wonder if all these different (often incompatible) ways of using D ends up fragmenting the D ecosystem, and in turn make it that much harder for it to gain critical mass

    • cardanome 2 days ago

      > My (likely unfair) impression of D is that it feels a bit rudderless

      The more positive phrasing would be that it is a very pragmatic language. And I really like this.

      Currently opinionated langues are really in vogue. Yes they are easier to market but I have personally very soured on this approach now that I am a bit older.

      There is not one right way to program. It is fun to use on opinionated language until you hit a problem that it doesn't cover very well and suddenly you are in a world of pain. I like languages that give me escape hatches. That allow me to program they way I want to.

    • atilaneves 2 days ago

      > and lose access to most things

      What "most things" are these?

    • DeathArrow 2 days ago

      >My (likely unfair) impression of D is that it feels a bit rudderless: It is trying to be too many things to too many people, and as a consequence it doesn't really stand out compared to the languages that commit to a paradigm.

      My (likely unfair) impression of D is that it feels a bit rudderless: It is trying to be too many things to too many people, and as a consequence it doesn't really stand out compared to the languages that commit to a paradigm.

      Nim kind of does that, too.

      • cb321 2 days ago

        This can very clearly be said about C++ as well, which may have started out as C With Classes but became very kitchen sinky. Most things that get used accrete a lot of features over time, though.

        FWIW, I think "standing out" due to paradigm commitment is mostly downstream of "xyz-purity => fewer ways to do things => have to think/work more within the constraints given". This then begs various other important questions, of course.. E.g., do said constraints actually buy users things of value overcoming their costs, and if so for what user subpopulations? Most adoption is just hype-driven, though. Not claiming you said otherwise, but I also don't think the kind of standing out you're talking about correlates so well to marketing. E.g., browsers marketed Javascript (which few praised for its PLang properties in early versions).

  • pron 2 days ago

    > GC/runtime

    1. Runtime: A runtime is any code that is not a direct result of compiling the program's code (i.e. it is used across different programs) that is linked, either statically or dynamically, into the executable. I remember that when I learnt C in the eighties, the book said that C isn't just a language but a rich runtime. Rust also has a rich runtime. It's true that you can write Rust in a mode without a runtime, but then you can barely even use strings, and most Rust programs use the runtime. What's different about Java (in the way it's most commonly used) isn't that it has a runtime, but that it relies on a JIT compiler included in the runtime. A JIT has pros and cons, but they're not a general feature of "a runtime".

    2. GC: A garbage collector is any mechanism that automatically reuses a heap object's memory after it becomes unreachable. The two classic GC designs, reference counting and tracing, date back to the sixties, and have evolved in different ways. E.g. in the eighties and nineties there were GC designs where the compiler could either infer a non-escaping object's lifetime and statically insert a `free` or have the language track lifetimes ("regions", 1994) and have the compiler statically insert a `free` based on information annotated in the language. On the other hand, in the eighties Andrew Appel famously showed that moving tracing collectors "can be faster than stack allocation". So different GCs employ different combination of static inference and dynamic information on object reachability to optimise for different things, such as footprint or throughput. There are tradeoffs between having a GC or not, and they also exist between Rust (GC) and Zig (no GC), e.g. around arenas, but most tradeoffs are among the different GC algorithms. Java, Go, and Rust use very different GCs with different tradeoffs.

    So the problem with using the terms "runtime" and "GC" colloquially as they're used today is not so much that it differs from the literature, but that it misses what the actual tradeoffs are. We can talk about the pros and cons of linking a runtime statically or dynamically, we can talk about the pros and cons of AOT vs. JIT compilation, and we can talk about the pros and cost of a refcounting/"static" GC algorithm vs a moving tracing algorithm, but talking in general about having a GC/runtime or not, even if these things mean something specific in the colloquial usage, is not very useful because it doesn't express the most relevant properties.

    • rafaelmn 2 days ago

      It's pretty obvious from the context that runtime/GC means having a runtime with a tracing GC - and the tradeoffs are well known. These discussions were played out over the last two decades - we all know GC can be fast, but there were and are plenty of use-cases where the tradeoffs are so bad that it's a non-starter.

      Not to mention that writing a high quality GC is a monumental task - it took those decades for C# and Java to get decent - very few projects have the kind of backing to pull that off successfully.

      In practical terms think about the complexity of enabling WASM that someone mentioned in this thread when you reuse C runtime and skip tracing GC.

      I'm kind of venting in the thread to be fair, Walter Bright owes me nothing and it's his project, I had fun playing with it. I'm just sad we couldn't have gotten to Zig 20 years ago when we were that close :)

    • gavinray 2 days ago

      The "GC is slow"/"JIT/VM's are slow" is such a tired, dated take at this point.

      Look at C#'s competitive placings with C++/Rust on The Computer Benchmark game due to .NET's ruthless optimization.

      • rafaelmn 2 days ago

        Ironically those optimizations came from .NET avoiding GC and introducing primitives to avoid it better.

        And .NET is moving heavily into the AoT/pre-compilation direction for optimization reasons as well (source generators, AoT).

        If you look at the change logs for the past few versions of the framework from perf perspective the most significant moves are : introduce new primitives to avoid allocating, move more logic to compile time, make AoT better and work with more frameworks.

        • pjmlp a day ago

          So what, that is exactly the point.

          A programming language having a GC doesn't mean every single allocation needs to be on the heap.

          C# is finally at the sweet spot languages like Oberon, Modula-3 and Eiffel were on the late 90's, and unfortunely were overshadowed by Java's adoption.

          Go and Swift (RC is a GC algorithm) are there as well.

          D could be there as well on the mainstream, if there was a bit more steering into what they want to be, instead of having others catching up on its ideas.

          That is what made me look into the language after getting Andrei Alexandrescu's book.

          • rafaelmn a day ago

            The point is that if you need performance you need to drop below tracing GC, and depending on your use-case, if that's the majority of your code it makes sense to use a language that's built for that kind of programming (zero cost abstractions). Writing C# that doesn't allocate is like wearing a straightjacket and the language doesn't help you much with manual memory management. Linters kind of make it more manageable but it's still a PITA. It's better than Java for sure in that regard, and it's excellent that you have the option for hot paths.

            • pjmlp a day ago

              I rather have the productivity of a GC (regardless of which kind), manual allocations on system/unsafe code blocks, and value types, than going back to bare bones C style programming, unless there are constraints in place that leave no other option.

              Note that even Rust's success, has triggered managed languages designers to research how far they can integrate linear, affine, effects, dependent types into their existing type systems, as how to combine the best of both worlds.

              To the point that even Rust circles now there are those speaking about an higher level Rust that is supposed be more approachable.

              • gavinray a day ago

                This is essentially how I feel -- GC by default with user control over zero-copy/stackalloc behavior.

                Modern .NET isn't even difficult to avoid allocations, with the Span<T> API and the work they've done to minimize unnecessary copies/allocs within the std lib.

                (I say this as a Kotlin/JVM dev who watches from the sideline, so not even the biggest .NET guy around here)

            • arcadia_leakOP a day ago

              > Writing C# that doesn't allocate is like wearing a straightjacket

              Yes, and that's where D is majorly superior to C# -- it's flexible enough for you to go down to the metal for the critical parts.

              • pjmlp a day ago

                That is the no longer the case in C# 14/.NET 10, D has lost 16 years counting from Andrei's book publishing date, letting other programing languages catch up to more relevant features.

                You are forgetting that a language with a less mature ecosystem isn't much help.

                • arcadia_leakOP a day ago

                  > C# 14/.NET 10

                  Yes, they added AOT but it's still challenging to do anything that requires calling into the OS, because you're going to need the bindings. It will still add some overhead under the hood and more overhead will you need to add yourself to convert the data to blittable types and back.

                  Mixing C# with other languages in the same project is also difficult because it only supports MSBuild.

                  > You are forgetting that a language with a less mature ecosystem isn't much help.

                  Fair.

                  • pjmlp a day ago

                    You also need bindings in D, nothing new there.

                    Rust also has issues using anything besides cargo.

                    • arcadia_leakOP a day ago

                      > Rust also has issues using anything besides cargo.

                      D also has its own build system but it's not the only option. Meson officially supports building D sources. You could also easily integrate D with SCons, though there's no official support.

                      • pjmlp a day ago

                        Well, you can do the same with Java and C#, assuming you actually know the ecosystem.

                    • arcadia_leakOP a day ago

                      > You also need bindings in D, nothing new there.

                      You don't. Any D compiler is a C compiler too, so it can take C headers without bindings or any overhead added.

                      • pjmlp a day ago

                        You have forgotten the footnote that not everything has a C API, not BetterC supports everything in ISO C, or common extensions.

                        Hint, before keeping to discuss what D can and cannot do, better go look how long I have been around on D forums, or existing projects on my Github.

                        • arcadia_leakOP a day ago

                          > not everything has a C API

                          Anything that has stable ABI does.

                          > go look how long I have been around on D forums

                          You claimed higher up in this thread that D requires bindings to interoperate with C API. You don't seem that well informed really.

    • ceteia 2 days ago

      Does Rust really require reference counting? I thought Rust programs only used reference counting when types like Rc and Arc are used.

      Swift seems to require reference counting significantly more than Rust.

      • brabel 2 days ago

        Op saying Rust has a kind of GC is absurd. Rust keeps track of the lifetime of variables and drops them at the end of their lifecycle. If you really want to call that a GC you should at least make a huge distinction that it works at compile time: the generated code will have drop calls inserted without any overhead at runtime. But no one calls that a GC.

        You see OP is trying to murk the waters when they claim C has a runtime. While there is a tiny amount of truth to that, in the sense that there’s some code you don’t write present at runtime, if that’s how you define runtime the term loses all meaning since even Assemblers insert code you don’t have to write yourself, like keeping track of offsets and so on. Languages like Java and D have a runtime that include lots of things you don’t call yourself, like GC obviously, but also many stdlib functions that are needed and you can’t remove because it may be used internally. That’s a huge difference from inserting some code like Rust and C do. To be fair, D does let you remove the runtime or even replace it. But it’s not easy by any means.

        • pron 2 days ago

          > If you really want to call that a GC you should at least make a huge distinction that it works at compile time: the generated code will have drop calls inserted without any overhead at runtime. But no one calls that a GC.

          Except for the memory management literature, because it's interested in the actual tradeoffs of memory management. A compiler inferring lifetimes, either automatically for some objects or for most objects based on language annotations, has been part of GC research for decades now.

          The distinction of working at compile time or runtime is far from huge. Working at compile time reduces the work associated with modifying the counters in a refcounting GC in many situations, but the bigger differences are between optimising for footprint or for throughput. When you mathematically model the amount of CPU spent on memory management and the heap size as functions of the allocation rate and live set size (residency), the big differences are not whether calling `free` is determined statically or not.

          So you can call that GC (as is done in academic memory management research) or not (as is done in colloquial use), but that's not where the main distinction is. A refcounting algorithm, like that found in Rust's (and C++'s) runtime is such a classic GC that not calling it a GC is just confusing.

          • pron 2 days ago

            P.S.

            I should add that the JVM (and Go) also infers lifetime for non-escaping objects and "allocates" them in registers (which can spill to the stack; i.e. `new X()` in Java may or may not actually allocate anything in the heap). The point is that different GCs involve compiler-inferred lifetimes to varying degrees, and if there's a clear line between them is less the role of the compiler (although that's certainly an interesting detail) and more whether they generally optimise for footprint (immediate `free` when the object becomes unreachable) or throughput (compaction in a moving-tracing collector, with no notion of `free` at all).

            There are also big differences between moving and non-moving tracing collectors (Go's concurrent mark & sweep and Java's now removed CMS collector). A CMS collector still has concepts that resemble malloc and free (such as free lists), but a moving one doesn't.

          • ceteia 2 days ago

            > A refcounting algorithm, like that found in Rust's (and C++'s) runtime is such a classic GC that not calling it a GC is just confusing.

            But is it not easy to opt out of in C, C++, Zig and Rust, by simply not using the types that use reference counting?

            And how does your performance analysis consider techniques like arenas and allocating at startup only?

            • pron 2 days ago

              > But is it not easy to opt out of in C, C++, Zig and Rust, by simply not using the types that use reference counting?

              In C, Zig, and C++ sure. In Rust? Not without resorting to unsafe or to architectural changes.

              > And how does your performance analysis consider techniques like arenas and allocating at startup only?

              Allocating at startup only in itself doesn't say much because you may be allocating internally - or not. Arenas indeed make a big difference and share some performance behaviours with moving-tracing collectors, but they can practically only be used "as god intended" in Zig.

  • Dwedit 2 days ago

    Zig got too much in to avoiding "hidden behavior" that destructors and operator overloading were banned. Operator overloading is indeed a mess, but destructors are too useful. The only compromise for destructors was adding the "defer" feature. (Was there ever a corresponding "error if you don't defer" feature?)

    • jibal 2 days ago

      No, defer is always optional, which makes it highly error prone.

      There's errdefer, which only defers if there was an error, but presumably you meant what you wrote, and not that.

      BTW, D was the first language to have defer, invented by Andrei Alexandrescu who urged Walter Bright to add it to D 2.0 ... in D it's spelled scope(exit) = defer, scope(failure) = errdefer, and scope(success) which is only run if no error.

  • gorgonical 2 days ago

    Re: the point about Zig: Especially considering I used and played a lot with D's BetterC model when I was a student, I wonder as a language designer what Walter thinks about the development and rise in popularity of Zig. Of course, thinking "strategically" about a language's adoption comes off as Machiavellian in a crowd of tinkers/engineers, but I can't help but wonder.

  • fuhsnn 2 days ago

    FIl-C, the new memory-safe C/C++ compiler actually achieved that through introducing a GC, with that in mind I'd say D was kind of a misunderstood prodigy in retrospect.

    • rafaelmn 2 days ago

      There's two classes of programs - stuff written in C for historic reasons that could have been written in higher level language but rewrite is too expensive - fill c. Stuff where you need low level - Rust/C++/Zig

      • uecker 2 days ago

        Na, there are only three classes: stuff where you need simplicity, fast compilation times, portability, interoperability with legacy systems, or high-performance - C. Stuff where you need perfect memory safety: Fil-C. And stuff where you need a combination: C + formal verification. Not sure where I would Rust/C++/Zig (none of those offers perfect memory safety in practice)

      • brabel 2 days ago

        FillC works fine with all C code no matter how low level. There’s a small performance overhead but for almost every scenario it’s an acceptable overhead!

        • jibal 2 days ago

          up to 5x is not what most people mean by small.

          • brabel 2 hours ago

            For most apps it’s much less than that and in most cases it’s unnoticeable. I think it would be more productive if you could point out an app that has noticeably worse performance on FillC, so that the cause for that could be looked at and perhaps even fixed, so that eventually there would be neatly zero examples like that.

          • arcadia_leakOP a day ago

            Depends on what the multiplicand is.

jakkos 3 days ago

I often see people lament the lack of popularity for D in comparison to Rust. I've always been curios about D as I like a lot of what Rust does, but never found the time to deep dive and would appreciate someone whetting my appetite.

Are there technical reasons that Rust took off and D didn't?

What are some advantages of D over Rust (and vice versa)?

  • deng 2 days ago

    > Are there technical reasons that Rust took off and D didn't?

    As someone who considered it back then when it actually stood a chance to become the next big thing, from what I remember, the whole ecosystem was just too confusing and simply didn't look stable and reliable enough to build upon long-term. A few examples:

    * The compiler situation: The official compiler was not yet FOSS and other compilers were not available or at least not usable. Switch to FOSS happened way too late and GCC support took too long to mature.

    * This whole D version 1 vs version 2 thingy

    * This whole Phobos vs Tango standard library thingy

    * This whole GC vs no-GC thingy

    This is not a judgement on D itself or its governance. I always thought it's a very nice language and the project simply lacked man-power and commercial backing to overcome the magical barrier of wide adoption. There was some excitement when Facebook picked it up, but unfortunately, it seems it didn't really stick.

    • kjs3 a day ago

      The compiler situation

      I think people forget this. I know a lot of folks that looked at D back when it needed to win mindshare to compete with the currently en vogue alternatives, and every one of them nope'd out on the licensing. By the time they FOSS'ed it, they'd all made decisions for the alternative, and here we are.

    • amelius 2 days ago

      How many people were working on the core compiler/language at the time versus Rust? This could explain it.

    • Kapendev a day ago

      > This whole GC vs no-GC thingy

      And I am here, enjoying both. Life is good.

    • anal_reactor 2 days ago

      Can you elaborate on the points? I know nothing about D, but I'm just curious about old drama

      • schveiguy 2 days ago

        ooooold drama. Like 2008.

        FOSS: DMD was always open source, but the backend license was not compatible with FOSS until about 2017. D is now officially part of GCC (as of v6 I think?), and even the frontend for D in gcc is written in D (and actively maintained).

        D1 vs. D2: D2 introduced immutability and vastly superior metaprogramming system. But had incompatibilities with D1. Companies like sociomantic that standardized on D1 were left with a hard problem to solve.

        Tango vs phobos: This was a case of an alternative standard library with an alternative runtime. Programs that wanted to use tango and phobos-based libraries could not. This is what prompted druntime, which is tango's runtime split out and made compatible, adopted by D2. Unforutuntately, tango took a long time to port to D2 and the maintainers went elsewhere.

        gc vs. nogc: The language sometimes adds calls to the gc without obvious invokations of it (e.g. allocating a closure or setting the length of an array). You can write code with @nogc as a function attribute, and it will ban all uses of the gc, even compiler-generated ones. This severely limits the runtime features you can use, so it makes the language a lot more difficult to work with. But some people insist on it because it helps avoid any GC pauses when you can't take it. There are those who think the whole std lib should be nogc, to maximize utility, but we are not going in that direction.

  • arcadia_leakOP 2 days ago

    D and Rust are on the opposite sides at dealing with memory safety. Rust ensures safety by constantly making you think about memory with its highly sophisticated compile-time checks. D, on the other hand, offers you to either employ a GC and forget about (almost) all memory-safety concerns or a block scoped opt-out with cowboy-style manual memory management.

    D retains object-oriented programming but also allows functional programming, while Rust seems to be specifically designed for functional programming and does not allow OOP in the conventional sense.

    I've been working with D for a couple of months now and I noticed that it's almost a no-brainer to port C/C++ code to D because it mostly builds on the same semantics. With Rust, porting a piece of code may often require rethinking the whole thing from scratch.

  • ender341341 2 days ago

    I think 3 things

    1. D had a split similar to python 2 vs 3 early on with having the garbage collector or not (and therefor effectively 2 standard libraries), but unlike python it didn't already have a massive community that was willing to suffer through it.

    2. It didn't really have any big backing. Rust having Mozilla backing it for integration with Firefox makes a pretty big difference.

    3. D wasn't different enough, it felt much more "this is c++ done better" than it's own language, but unlike c++ where it's mostly a superset of c you couldn't do "c with classes" style migrations

  • vaylian 2 days ago

    > Are there technical reasons that Rust took off and D didn't?

    My (somewhat outdated) experience is that D feels like a better and more elegant C++. Rust certainly has been influenced by C and C++, but it also took a lot of inspiration from the ML-family of languages and it has a much stronger type system as a consequence.

  • badsectoracula 2 days ago

    One feature of D that i really wish other languages would adopt (not sure about Rust but i also think it lacks it, though if it has it to a similar extent as D it might be the reason i check it again more seriously) is the metaprogramming and compile-time code evaluation features it has (IIRC you can use most of the language during compile time as it runs in a bytecode VM), down to even having functions that generate source code which is then treated as part of the compilation process.

    Of course you can make codegen as part of your build process with any language, but that can be kludgy (and often limited to a single project).

    • skocznymroczny 2 days ago

      Arguably, most of the metaprogramming in D is done with templates and it comes with all the flaws of templates in C++. The error messages are long and it's hard to decipher what exactly went wrong (static asserts help a lot for this, when they actually exist). IDE support is non-existent after a certain point because IDE can't reason about code that doesn't exist yet. And code gets less self-documenting because it's all Output(T,U) foo(T, U)(T t, U u) and even the official samples use auto everywhere because it's hard to get the actual output types.

      • srean 2 days ago

        It is quite ridiculous to place C++ metaprogramming and D's. For one in D it's the same language and one can choose whether to execute compile time constant parts at compile time or run time. In C++ it's a completely different language that was bolted on. C++ did adopt compile time constant expressions from D though.

      • schveiguy 2 days ago

        No, templates are only needed to introduce new symbols. And D templates are vastly superior to C++. D's superpowers are CTFE, static if, and static foreach.

        auto is used as a return type because it's easy, and in some cases because the type is defined internally in the function and can't be named.

        You would not like the code that uses auto everywhere if you had to type everything out, think range wrappers that are 5 levels deep.

      • arcadia_leakOP 2 days ago

        I'd say D's template error messages are much better than C++'s, because D prints the instantiation stack with exact locations in the code and the whole message is just more concise. In C++, it just prints a bunch of gibberish, and you're basically left guessing.

    • ameliaquining 2 days ago

      Rust has procedural macros, which turn out to be a good-enough substitute for real compile-time reflection for surprisingly many use cases, though nowhere near all of them. (In particular, Serde, the universally-adopted framework/library for serializing and deserializing arbitrary data types, is a third-party library powered by procedural macros.)

      Real compile-time reflection is in the works; the very earliest stages of a prototype implementation were released to the nightly channel last month (https://github.com/rust-lang/rust/pull/146923), and the project has proposed (and is likely to adopt) the goal of completing that prototype implementation this year (https://rust-lang.github.io/rust-project-goals/2026/reflecti...), though it most likely will not reach the stable channel until later than that, since there are a whole lot of complicated design questions that have to be considered very carefully.

      • debugnik 2 days ago

        "Powered by" is an understatement, Serde would be unusable without procedural macros. Deserializers use a ridiculously verbose visitor pattern that's completely unnecessary in a language with move semantics, it should have been a recursive descent API.

        Using serde_json to accurately model existing JSON schemas is a pain because of it.

        I personally find third-party deriving macros in Rust too clunky to use as soon as you need extra attributes.

  • dadoum 2 days ago

    D has much better metaprogramming compared to Rust. That has been one of the only things making me still write a few D programs. You can do compile time type introspection to generate types or functions from other elements without having to create a compiler plug-in parsing Rust and manipulating syntax trees.

    Rust has some of the functional programming niceties like algebraic data types and that's something lacking in D.

  • p0nce a day ago

    > Are there technical reasons that Rust took off and D didn't?

    This talk explain why, it's not technical: https://www.youtube.com/watch?v=XZ3w_jec1v8

    > What are some advantages of D over Rust (and vice versa)?

    Advantages for D: Build faster, in typical programs you would need about 20 packages not 100, COM objects, easy meta-programming, 3 compilers. GC, way better at scripting.

    Advantages for Rust: borrow-checker is better. rustup.

  • pjmlp 3 days ago

    More like the companies that jumped into D versus Rust, D only had Facebook and Remedy Games toy a bit with it.

    Many of us believe on automatic memory management for systems programming, having used quite a few in such scenarios, so that is already one thing that D does better than Rust.

    There is the GC phobia, mostly by folks that don't get not all GCs were born alike, and just like you need to pick and chose your malloc()/free() implementation depending on the scenario, there are many ways to implement a GC, and having a GC doesn't preclude having value types, stack and global memory segment allocation.

    D has compile time reflection, and compile time metaprogramming is much easier to use than Rust macros, and it does compile time execution as well.

    And the compile times! It is like using Turbo Pascal, Delphi,... even thought the language is like C++ in capabilities. Yet another proof complexity doesn't imply slow compile natives in a native systems language.

    For me, C# and Swift replace the tasks at work were I in the past could have reached for D instead, mostly due to who is behind those languages, and I don't want to be that guy that leaves and is the one that knew the stack.

    • deng 2 days ago

      > Many of us believe on automatic memory management for systems programming

      The problem is the term "systems programming". For some, it's kernels and device drivers. For some, it's embedded real-time systems. For some, it's databases, game engines, compilers, language run-times, whatever.

      There is no GC that could possibly handle all these use-cases.

      • amelius 2 days ago

        But there could be a smoother path between having a GC and having no GC.

        Right now, you'd have to switch languages.

        But in a Great Language you'd just have to refactor some code.

        • troad 2 days ago

          Why would you have to switch languages? There are no languages with 'no GC', there are only languages with no GC by default.

          Take C - you can either manually manage your memory with malloc() and free(), or you can #include a GC library (-lgc is probably already on your system), and use GC_malloc() instead. Or possibly mix and match, if you're bold and have specific needs.

          And if ever some new revolutionary GC method is developed, you can just replace your #include. Cutting-edge automatic memory management forever.

      • pjmlp 2 days ago

        Except there is, only among GC-haters there is not.

        People forget there isn't ONE GC, rather several of possible implementations depending on the use case.

        Java Real-Time GC implementations are quite capable to power weapon targeting systems in the battlefield, where a failure causes the wrong side to die.

        > Aonix PERC Ultra Virtual Machine supports Lockheed Martin's Java components in Aegis Weapon System aboard guided missile cruiser USS Bunker Hill

        https://www.militaryaerospace.com/computers/article/16724324...

        > Thales Air Systems Selects Aonix PERC Ultra For Java Execution on Ground Radar Systems

        https://vita.militaryembedded.com/5922-thales-execution-grou...

        Aonix is nowadays owned by PTC, and there are other companies in the field offering similar implementations.

        • deng 2 days ago

          Look, when someone says "There's no thing that could handle A,B,C, and D at the same time", answering "But there's one handling B" is not very convincing.

          (Also, what's with this stupid "hater" thing, it's garbage collection we're talking about, not war crimes)

          • pjmlp 2 days ago

            It is, because there isn't a single language that is an hammer for all types of nails.

            It isn't stupid, it is the reality of how many behave for decades.

            Thankfully, that issue has been slowly sorting out throughout generation replacement.

            I already enjoy that nowadays we already have reached a point in some platforms where the old ways are nowadays quite constrained to a few scenarios and that's it.

  • otabdeveloper4 2 days ago

    > Are there technical reasons that Rust took off and D didn't?

    Yes. D tried to jump on the "systems programming with garbage collection" dead horse, with predictable results.

    (People who want that sort of stupidity already have Go and Java, they don't need D.)

    • tmtvl 2 days ago

      Go wasn't around when D was released and Java has for the longest time been quite horrible (I first learnt it before diamond inference was a thing, but leaving that aside it's been overly verbose and awkward until relatively recently).

      • tpoacher 2 days ago

        Is Java even a "systems programming" language?

        I don't even know what that term means anymore; but afaik Java didn't really have reliable low-level APIs until recently.

        • pjmlp 2 days ago

          Depends if one considers writing compilers, linkers, JITs, database engines, and running bare metal on embedded real time systems "systems programming".

    • lelanthran 2 days ago

      > (People who want that sort of stupidity already have Go and Java, they don't need D.)

      Go wasn't around when D was created, and Java was an unbelievable memory hog, with execution speeds that could only be described as "glacial".

      As an example, using my 2001 desktop, the `ls` program at the time was a few kb, needed about the same in runtime RAM and started up and completed execution in under 100ms.

      The almost equivalent Java program I wrote in 2001 to list files (with `ls` options) took over 5s just to start up and chewed through about 16MB of RAM (around 1/4 of my system's RAM).

      Java was a non-starter at the time D came out - the difference in execution speed between C++ systems programs and Java systems programs felt, to me (i.e. my perception), larger than the current difference in performance between C++/C/Rust programs and Bash shell scripts.

Rounin 2 days ago

As far as adoption is concerned, I'm not sure it should be that big of a concern.

After all, D is supported by GCC and Clang and continually being maintained, and if updates stopped coming at some point in the future, anyone who knew a bit of C / Java / insert language here could easily port it to their language of choice.

Meanwhile, its syntax is more expressive than many other compiled languages, the library is feature-rich and fairly tidy, and for me it's been a joy to use.

  • nicwilson 2 days ago

    It has an LLVM backend, LDC, that is separate from the LLVM project/Clang.

  • pjmlp 2 days ago

    GCC usually drops frontends if there are no maintainers around, it already happened to gcj, and I am waiting for the same to happen to gccgo any time now, as it has hardly gotten any updates since Go 1.18.

    The team is quite small and mostly volunteers, so there is the question how long can Walter Bright keep at it, and who will keep it going afterwards when he passes the torch.

    • schveiguy 2 days ago

      gdc is 100% Iain Buclaw. But he and Walter collaborate on needs for gcc compatibility, as long as Iain is around, gdc will be around.

      It is true we have a small team. But we are a dedicated team.

      • pjmlp a day ago

        And was for several releases delayed due to personal issues, which is understandable in a small team among open source projects, however it is a problem.

      • joecool1029 2 days ago

        > gdc is 100% Iain Buclaw

        So uh, funny story: I didn’t know this a few years back. GDC was missing the sqlite interface in GDC’s phobos. This made it so the dlang onedrive client and some other packages wouldn’t compile with it. Situation was like this for years: https://forum.dlang.org/thread/doevjetmiwxovecplksr@forum.dl...

        I eventually complained that it was easier to argue with Walter about politics on HN than get a library fixed on his programming language. Fortunately the right people saw it and it was fixed soon after: https://bugs.gentoo.org/722094

skocznymroczny 2 days ago

I like D in general, however it is missing out in WASM where other languages like Rust, Zig, even Go are thriving. Official reasoning usually included waiting for GC support from WASM runtime, but other GC languages seem to just ship their own GC and move on.

  • destructionator 2 days ago

    OpenD added almost-full (you can't catch exceptions or spawn threads, so not really full, but the GC and such work fine) wasm support with like .... i think it was less than one day of work. wasm sucks though, what a miserable platform.

    • Defletter 2 days ago

      Why is WASM a miserable platform?

    • fuzztester a day ago

      what's the latest news about OpenD, anyone?

      I had read about the split (D vs. OpenD) recently on the Dlang newsgroup.

      Also, just had the thought that the split may damage Dlang's progress / prospects, for users, like the Phobos issue etc. stuff was supposed to have done.

      I don't know much about those details either, I had just read a bit about it earlier, as an interested light user of the language.

WhereIsTheTruth 2 days ago

D is a treasure we should continue to cherish and protect

A language with sane Compile Time features (Type Introspection, CTFE, mixins, etc)

A language that can embrace C ecosystem with sane diagnostics

A language that ships with its own optimizing code generator and inline assembler!

A compiler that compiles code VERY fast

A compiler with a readable source code that bootstraps itself in just 5 seconds

People who dunk on it "bEcAuSe iT Is nOt MaInsTrEaM" are clueless

erzhan89 2 days ago

When I was student, our group was forced to use D lang instead C++ for CS2* classes. That was back in 2009. After 16 years I see that level of adoption did not change at all.

fl0ki 4 hours ago

There are two kinds of post on HackerNews: (1) Trolling Walter, (2) Other

bingemaker 3 days ago

Off topic: Back in the day, C++ programming books Andrei Alexandrescu are a joy to read, especially, Modern C++ design.

Also, this presentation https://accu.org/conf-docs/PDFs_2007/Alexandrescu-Choose_You... killed a lot of bike shedding!

self_awareness 3 days ago

I never understood why this language didn't gain much traction. It seems very solid.

At the same time, I've never used it, I'm not sure why.

Anyway, the author of D language is here on HN (Walter Bright).

casey2 2 days ago

When design a language for everything nobody will use it for anything. When you design a language to simply accomplish one thing people will use it for everything. This is because people get the most efficient training using that simple language for one thing. From there it is only marginally more effort to carry some boilerplate.

That "one thing" could be real or propaganda. Rust's one thing is writing "memory-safe" without GC. Eventually the marginal cost becomes too high or your are tricked by advertising and "graduate" from awk to perl. From there depending on the pull of the community or the actual utility of the language you will use it for more and more tasks. If the community pull is strong your programs start to look like line noise or boilerplate hell. If the utility for your problems is genuine they remain simple but you probably aren't producing the most efficient binaries.

As for why c programmers don't just use -betterc well some do, but for most people the reality is that can just do it in c and prefer c -> c++ (ofc the vast majority of projects just start as c++ which makes -betterC )

c++'s one thing c with objects.

If you learned to code writing Go what did you do?

If you learned to code writing D what did you do?

That's not to say you can't learn to code from writing D just that it discipline, most people don't even know a problem exists before they are already learning some language or tool, nor do they have the goal of building everything, most programmers are lazy they want to build the minimal amount and end up building everything by accident.

Why don't experienced devs use D then? They think if they strive for ideological purity that they won't "build everything" next time, or they just enjoy ideological purity as it's own mental exercises. Unix faithfuls want to show that computing can be (conceptually) simple in implementation and use. Rust programmers want to show that those simple (to use) unix programs can be (memory) safe. To a senior engineer D is just too good and easy to take.

lossolo 2 days ago

Years ago I got interested in D. It's a great language, but at the time its garbage collector was leaky. There weren't any D entries on the Benchmarks Game back then, so I ported most of the programs to D and optimized them as best I could as a newcomer. Performance wise, D was in the C/Rust/C++ range and in many cases it even beat Rust and C++. I tried to get the community involved to help the language gain wider adoption, but nothing really happened. I think everything has its moment, and D's moment has passed. They didn't make the most of the window when D could have gone mainstream.

DeathArrow 2 days ago

Every talk about D here seems to transform into "why D failed?".

  • pjmlp 2 days ago

    Maybe because there were some expectations when "The D Programming Language" was published back in 2010, regarding where D would be 16 years later.

  • cb321 2 days ago

    I don't use D.. I find Nim helps with even lower ceremony. That said, it's hard for me to understand how "getting into gcc" is failure. The list of such PLangs is very short. People can be very parochial, though. They probably mean pretty shallow things (just one example, but something like "failed to convert me, personally", or "jobs I'd like to apply for", or etc.).

    Maybe people should instead talk about how they use D or what they'd like to see added to D? In an attempt to be the change one wants to see, I'd say named arguments are a real win and there seem to be some stalled proposals for that in D last I checked.

    • jibal 2 days ago

      D has named regular arguments and optional regular arguments. It has optional template arguments but not named template arguments.

small_model 2 days ago

Seen D being posted regularly on here, seems like flogging a dead horse. It's the equivalent of keeping grandma on life support when there is no hope.

  • arcadia_leakOP 2 days ago

    You'd be surprised to see how active the D community is, despite your fair point that it's noticeably smaller than in the "competing" (in quotes because it's not a competition, actually) languages.

    The latest release [1] was on Jan 7th, and it contains more updates than, say, the latest release of Dart, which has one of the largest corporations behind it.

    1. https://dlang.org/changelog/2.112.0.html

    • schveiguy 2 days ago

      To be fair, the release cadence has been in a bit of a mess lately. But I expect that to be fixed soon. We don't want 6 months between releases.

fithisux 3 hours ago

My only problem with D is that gdc does not work on Windows.

I would be happy if they released it without phobos.

Other than that it is excellent.

DMD does its job.

999900000999 2 days ago

What can D do other languages can't?

Say your starting a new Staff Engineer or Tech Lead job. What gets you to convince a CTO that we need to have a team learn D ?

On the flip side, where are the 200k base salary D positions.

Get me an interview in 2 months and I'll drop 10 hours a week into learning

  • arcadia_leakOP 2 days ago

    Well, I would say it's more like glasses - you can't convince those who don't wear them, and you don't need to convince those who need them either.

    • 999900000999 2 days ago

      What problem is D solving ?

      • srean 2 days ago

        To be a modern and sane C++ that C++ could have been, (rather than a complex collection of tacked on languages that C++ is), with modules instead of the the mess of C++'s headers, with instant compilation times that does not need a compilation server farm.

      • arcadia_leakOP 2 days ago

        One good case for it that I see is a viable basis for cross-platform desktop apps. Today, cross-platform desktop GUI apps are either just a snapshot of the website contained inside Electron, or a C/C++ code base with manual memory management. D can serve as a nice middle ground in that space.

        • jpc0 2 days ago

          Where is the extensive tooling support for this use case if that is where you think it fits?

          Apple is all in on Swift, so you will not be writing native MacOS or iOS code for UI in D, best case you put your business logic in D but you can do that in any language which has bindings to swift/Obj-C.

          Android is all in on Kotlin/Java, not D again

          Microsoft is all in on C#, again not D.

          Linux your two best options for UI is GTK and Qt, C and C++ respectively.

          So the only place where you could bave seemless integration is Linux through FFI.

          Here's the thing though, for building a core layer that you can wrap a UI around, Rust has insanely good ergonomics, with very good third-party libraries to automatically generate safe bindings to a decent amount of languages, at least all those listed above and WASM for web.

          None of those uses cases are painless in D.

          • arcadia_leakOP 2 days ago

            It's true that there is no off the shelf tool that you can use right now to write your app, but it certainly doesn't prove that making such a tool is impossible or even complicated.

            It makes sense for a complex productivity app (e.g. an office suite editor) to implement the UI from scratch anyway, and for that they may choose D. If Jane Street didn't pick OCaml, it would've died long ago -- in the same manner, some company might pick D to do UI or anything else really.

            • jpc0 2 days ago

              It is extremely complicated to do so yourself.

              Handling energy efficiency/a11y/i8n is non trivial in any language, using the paved road of the system's native implementation solves for many of those problems out of the box.

              You would need to reimplement all of that in D lang for your UI layer, and all you wanted to do was build an application to solve a problem, you weren't in the business of building a UI library to begin with.

        • 999900000999 2 days ago

          Flutter does cross platform + web and is as close to native as you'll get without writing code directly in Swift, C#, etc.

          You're free to start a company and solve a real business problem.

          If I became a D expert tomorrow it's not going to make me more money. It's not getting me a better job.

        • p0nce a day ago

          Exactly what some of us are doing with D.

ivolimmen 2 days ago

I tried some D some time ago, it is a nice language. Given today's landscape of programming languages I think it's difficult to reason why a program should be written in D if there are more programming languages that overlap in features. Also depends on how fast you need to scale in developers, how quickly people can learn a language (and not just the syntax) so popularity is also important. I work in consultancy and this is what I always factor in for a client.

kombine 3 days ago

I was personally a lot more excited by D and subsequently Nim, but ultimately it's Rust and Zig that got adoption. Sigh.

dhruv3006 2 days ago

I remember the creator of D programming Language replying to me on HN on one of my posts!

https://news.ycombinator.com/item?id=46261452

  • jibal 2 days ago

    Walter's a regular on HN.

    > This very post is probably his too, under an alt :)

    The probability of that is virtually zero. Walter is a principled person, has better things to do, and his writing style is vastly different from the OP's.

    • abcd_f 2 days ago

      This very post is probably his too, under an alt :)

      • avadodin a day ago

        I was hoping to see one of his posts here. If he's going to post under an alt, he should advertise it so that I can know which posts I should be taking extra ironically.

  • FrozenSynapse 2 days ago

    I had an interview at Facebook 10+ years ago and my interviewer was the other creator!

amelius 2 days ago

How good are the big LLMs at writing D code? Just curious.

KnuthIsGod 3 days ago

Sigh.

Ownership and borrowing are so much less baroque in D than in Rust. And compile times are superb.

In a better world, we would all be using D instead of C, C++ or Rust.

However in this age of Kali...

  • chhs 3 days ago

    For those curious what ownership and borrowing looks like in D: https://dlang.org/blog/2019/07/15/ownership-and-borrowing-in...

    • fooker 3 days ago

      This is a somewhat simplistic view of ownership and borrowing for modern programming languages.

      Pointers are not the only 'pointer's to resources. You can have handles specific to your codebase or system, you can have indices to objects in some flat array that the rest of your codebase uses, even temporary file names.

      An object oriented (or 'multi paradigm') language has to account for these and not just literal pointers.

      This is handled reasonably well both in Rust and C++. (In the spirit of avoiding yet another C++ vs Rust flamewar here, yes the semantics are different, no it doesn not make sense for C++ to adopt Rust semantics)

      • tgv 2 days ago

        How does Rust (or C++) treat array indices as resources? And won't that defy the reason to use indices over pointers?

        • fooker 2 days ago

          Here's how it works in some C++ libraries.

            struct resource {
              resource(ctx *c, ...) {index = c->store(...); ...;}
              size_t index;
              ctx *c;
              ~resource() {c->free(index);}
              // copy constructor+op creates new handle
              // move constructor+op copies the handle, maybe zeroes the current one 
            };
          
          With this you can rely on RAII, smart pointers, upcoming lifetime checks and annotations, etc. The core idea is that you treat objects of classes like this as values and everything works out seamlessly. Even if they are 'pointers' in all but name. You can also overload the dereference operator for it to have pointer-like syntax, but that is discouraged.

          When you have just once resource this might be overkill but for large projects with tangled webs of resources, this sort of setup really makes the code simpler and easier to design.

          That's C++ for you, simple things look complex but once you get into big hairy projects things stay at the same level of complexity instead of becoming an unmanageable mess.

          D almost supports RAII, and the compiler seems to do some automated copy to move conversion, but this is the sort of thing that really, really needs a large number of users and compiler implementers to iron out issues and corner cases. Nothing against D, the language is pretty neat!

          • tgv a day ago

            But if I'm not mistaken, this is just handling index allocation, release and avoiding dangling manually. The programmer is still responsible, right? And I don't think Rust can do better for indices, since indices are normal, "eternal" values.

            • fooker a day ago

              > this is just handling index allocation, release and avoiding dangling manually

              No, it is abstracted away. You just have to follow best practices when writing a library.

                resource foo(...); // This gets freed at the end of scope. See RAII.
                auto x = make_unique<resource>(...); // can be moved, freed when owner is.
                auto y = make_shared<resource>(...); // freed on zero reference count
    • randfur 3 days ago

      I don't know D so I'm probably missing some basic syntax. If pointers cannot be copied how do you have multiple objects referencing the same shared object?

    • uecker 3 days ago

      Is there any experience on how this works in practice?

  • torginus 3 days ago

    OOP and ownership are two concepts that mix poorly - ownership in the presence of OOP-like constructs is never simple.

    The reason for that is OOP tends to favor constructs where each objects holds references to other objects, creating whole graphs, its not uncommon that from a single object, hundreds of others can be traversed.

    Even something so simple as calling a member function from a member function becomes incredibly difficult to handle.

    Tbh - this is with good reason, one of the biggest flaws of OOP is that if x.foo() calls x.bar() in the middle, x.bar() can clobber a lot of local state, and result in code that's very difficult to reason about, both for the compiler and the programmer.

    And it's a simple case, OOP offers tons of tools to make the programmers job even more difficult - virtual methods, object chains with callbacks, etc. It's just not a clean programming style.

    Edit: Just to make it clear, I am not pointing out these problems, to sell you or even imply that I have the solution. I'm not saying programming style X is better.

    • FeepingCreature 3 days ago

      I work at a D company. We tend to use OOP only for state owners with strict dependencies, so it's rare to even get cycles. It is extremely useful for modeling application state. However, all the domain data is described by immutable values and objects are accessed via parameters as much as fields.

      When commandline apps were everywhere, people dreamed of graphical interfaces. Burdened by having to also do jobs that it was bad at, the commandline got a bad reputation. It took the dominance of the desktop for commandline apps to find their niche.

      In a similar way, OOP is cursed by its popularity. It has to become part of a mixed diet so that people can put it where it has advantages, and it does have advantages.

    • abbbyz 3 days ago

      >one of the biggest flaws of OOP is that if x.foo() calls x.bar() in the middle, x.bar() can clobber a lot of local state, and result in code that's very difficult to reason about

      That's more a problem of having mutable references, you'd have the same problem in a procedural language.

      • torginus 2 days ago

        Very few OO languages track reference mutability with any level of rigor. In C/C++ most devs don't even know what restrict is or how to write code using it correctly (which is very difficult an bug prone), const is unfortunately not enough.

        In fact I don't even know of any production language that handles variable mutability with any rigor other than Rust.

    • pjmlp 3 days ago

      It worked alright for Rust, and yes Rust does support OOP, there are many meanings to what is OOP from CS point of view.

      I have ported Ray Tracing in One Weekend into Rust, while keeping the same OOP design from the tutorial, and affine types were not an impediment to interfaces, polymorphism and dynamic dispatch.

      • torginus 2 days ago

        I don't think it worked well for Rust - in fact one of the core issues of Rust imo, is that it somewhat encourages this OOP style which can cause major headaches when you design an app in a traditional OO way - object compostion, complex and stateful, non-copyable objects full of 'smart' behavior, necessitating clones, and state that needs to be reconciled.

        The whole concept of OOP is a major conceptual regression in how it treats aliasing, which is a major headache for compiler writers, necessitating either whole program analysis or JIT like techniques.

        • pjmlp a day ago

          Hardly any different from structs with function pointers that are so praised among C and Zig devs.

    • arcadia_leakOP 3 days ago

      On the flipside, with OOP is usually quite easy to put a debugger breakpoint on a particular line and see the full picture of what the program is doing.

      In diehard FP (e.g. Haskell) it's hard to even place a breakpoint, let alone see the complete state. In many cases, where implementing a piece of logic without carrying a lot of state is impossible, functional programming can also become very confusing. This is especially true when introducing certain theoretical concepts that facilitate working with IO and state, such as Monad Transformers.

      • torginus 3 days ago

        That is true, but on the flip-flip side, while procedural or FP programs are usually easy to run piecewise, with OOP, you have to run the entire app, and navigate to the statement in question to be even able to debug it.

        Imho, most FP languages have very serious human-interface issues.

        It's no accident that C likes statements (and not too complex ones at that). You can read and parse a statement atomically, which makes the code much easier to read.

        In contrast, FP tends to be very, very dense, or even worse, have a density that's super inconsistent.

        • troad 2 days ago

          > In contrast, FP tends to be very, very dense, or even worse, have a density that's super inconsistent.

          Depends on the FP. Pipes make things fairly legible. Example from Elixir:

              def some_function(thing, doodad, doohickey) do
                thing
                |> foo(doodad)
                |> bar()
                |> baz(doohickey)
                |> quux()
              end
          
          Also easy to debug -- break on any of those lines, or insert `|> IO.inspect()` at any point for good old fashioned print debugging.

          Conversely, the non-FP non-pipe version of this would:

          (a) be monstrous and difficult to segment: `quux(baz(bar(foo(thing, doodad)), doohickey))`,

          (b) needlessly require OOP: `thing.swizzle(doodad).razzle().blorple(doohickey).dazzle()`, where the functions are methods defined on the preceding construct (or some parent construct, to god-knows-what generation), or

          (c) require a lot of throw away variables (you get the picture).

          I wish more languages had a pipe construct. It's very handy.

          Interestingly, D is one of the few languages to have uniform function call syntax,[0] which makes the dot syntax effectively act as a pipe operator, requiring no OOP coupling for its use. Very neat!

          [0] https://en.wikipedia.org/wiki/Uniform_function_call_syntax

  • pjmlp 3 days ago

    Slowly it is going to be only skills.md.

    I agree with the sentiment, I really like D and find a missing opportunity that it wasn't taken off regarding adoption.

    Most of what made D special in D is nowadays partially available in mainstream languages, making the adoption speech even harder, and lack of LLM training data doesn't help either.

    • bigstrat2003 3 days ago

      > lack of LLM training data doesn't help either.

      That shouldn't stop any self-respecting programmer.

      • pjmlp 3 days ago

        Self respecting developers are an endangered species, otherwise we would not have so much Electron crap.

        Those that learn to do robot maintenance, are the ones left at the factory.

      • gigatexal 3 days ago

        Exactly. We wrote code before LLMs and we can after their advent too

        • pjmlp 3 days ago

          Yeah, that is why carpenters are still around and no one buys Ikea.

          • stephenr 3 days ago

            > that is why carpenters are still around and no one buys Ikea

            The irony in this statement is hilarious, and perfectly sums up the reality of the situation IMO.

            For anyone who doesn't understand the irony: a carpenter is someone who makes things like houses, out of wood. They absolutely still fucking exist.

            Industrialised furniture such as IKEA sells has reduced the reliance on a workforce of cabinet makers - people who make furniture using joinery.

            Now if you want to go ask a carpenter to make you a table he can probably make one, but it's going to look like construction lumber nailed together. Which is also quite a coincidence when you consider the results of asking spicy autocomplete to do anything more complex than auto-complete a half-written line of code.

            • kjs3 a day ago

              These guys made one of the most amazing tables for someone I know: https://rustictradesfurniture.com/. If you said "you're not a carpenter because you aren't slapping 2x4s together", you'd get a wry chuckle that means 'who is this idiot'.

            • cake-rusk 3 days ago

              I think you have misunderstood what a carpenter is. A carpenter is someone who makes wooden furniture (among other things).

              • gspr 2 days ago

                > I think you have misunderstood what a carpenter is. A carpenter is someone who makes wooden furniture (among other things).

                I think _you_ have misunderstood what a carpenter is. At least where I live, you might get a carpenter to erect the wood framing for a house. Or build a wooden staircase. Or erect a drywall. I'm sure most carpenters worth their salt could plausibly also make wooden furniture, at an exorbitant cost, but it's not at all what they do.

                I sanity checked with Wiktionary, and it agrees: "A person skilled at carpentry, the trade of cutting and joining timber in order to construct buildings or other structures."

            • fuzztester 2 days ago

              https://en.wikipedia.org/wiki/Carpentry

              Carpenters make many things besides houses.

              See the section "Types of carpentry".

          • gspr 3 days ago

            > Yeah, that is why carpenters are still around and no one buys Ikea.

            I'm sorry, what? Are you suggesting that Ikea made carpenters obsolete? It's been less than 6 months since last I had a professional carpenter do work in my house. He seemed very real. And charged very real prices. This despite the fact that I've got lots of Ikea stuff.

            • cinntaile 3 days ago

              Compared to before, not a lot of carpenters/furniture makers are left. This is due to automation.

              • gspr 2 days ago

                > Compared to before, not a lot of carpenters/furniture makers are left.

                Which is it? Carpenters or furniture makers? Because the two have nothing in common beyond the fact that both professions primarily work with wood. The former has been unaffected by automation – or even might plausibly have more demand due to the overall economic activity caused by automation! The latter certainly has been greatly affected.

                The fact that people all over the thread are mixing up the two is mindboggling. Is there a language issue or something?

                • tmtvl 2 days ago

                  There is a language issue: carpenter is used as synonym of woodworker. It's like someone who doesn't know anything about computers using the term 'memory' to mean storage rather than working memory (i.e. RAM).

                • cinntaile 2 days ago

                  From the context it was pretty obvious what the original poster meant, as long as you charitably interpret their message. As per the site guidelines.

              • 1718627440 2 days ago

                Nah, IKEA has replaced moving furniture with throwing it away and rebuying it. Prior to IKEA hiring a carpenter was also something that is done a few times in a lifetime/century. If anything it has commodized creating new furniture.

          • tjr 3 days ago

            Is your proposition that programmers are now incapable of writing code?

            • pjmlp 3 days ago

              Eventually yes, when incapable becomes a synonymous with finding a job in an AI dominated software factory industry.

              Enterprise CMS deployment projects have already dropped amount of assets teams, translators, integration teams, backend devs, replaced by a mix of AI, SaaS and iPaaS tools.

              Now the teams are a fraction of the size they used to be like five years ago.

              Fear not, there will be always a place for the few ones that can invert a tree, calculate how many golf balls fit into a plane, and are elected to work at the AI dungeons as the new druids.

              • tmtvl 2 days ago

                While I don't share this cynical worldview, I am mildly amused by the concept of a future where, Warhammer 40,000 style, us code monkeys get replaced by tech priests who appease the machine gods by burning incense and invoking hymns.

              • anonzzzies 3 days ago

                Same for ERP/CRM/HRM and some financial systems ; all systems that were heavy 'no-code' (or a lot of configuration with knobs and switches rather than code) before AI are now just going to lose their programmers (and the other roles); the business logic / financial calcs etc were already done by other people upfront in excel, visio etc ; now you can just throw that into Claude Code. These systems have decades of rigid code practices so there is not a lot of architecting/design to be done in the first place.

              • gigatexal 2 days ago

                Nick Offerman wants to have a word with you. Given the choice of building my own furniture and things or IKEA and I had the skills I’d go the build it myself route. It’s doable. It was before. And it still is. All we got now is super duper capable auto correct and text completion. Use it for what it is. Don’t let it replace you.

      • feastingonslop 3 days ago

        Nor does it stop self-respecting LLMs.

      • usrnm 3 days ago

        Self-respecting programmers write assembly for the machines they built themselves. I swear, kids these days have no respect for the craft

    • gmueckl 3 days ago

      My experience is that all LLMs that I have tested so far did a very good job producing D code.

      I actually think that the average D code produced has been superior to the code produced for the C++ problems I tested. This may be an outlier (the problems are quite different), but the quality issues I saw on the C++ side came partially from the ease in which the language enables incompatible use of different features to achieve similar goals (e.g. smart_ptr s new/delete).

    • baruch 3 days ago

      I work with D and LLMs do very well with it. I don't know if it could be better but it does D well enough. The problem is only working on a complex system that cannot all be held in context at once.

      • pjmlp 3 days ago

        I based my opinion on this recent thread, https://forum.dlang.org/thread/bvteanmgrxnjiknrkeyg@forum.dl...

        Which the discussion seems to imply it kind of works, but not without a few pain points.

        • baruch a day ago

          The complaints are against the open-weight LLMs, I didn't try them much. I do use mostly Claude as that's what the company is paying for. They don't pay for laptops with GPUs or locally hosted LLMs to test those.

          It's not like it knows perfect D, it does make mistakes and I don't work on a C++ or Rust project to compare its behavior. Generating templates from scratch is a bit of a challenge but given we have plenty of examples in our code with some prodding it manages to write well enough.

  • fuzztester 2 days ago
cocodill 2 days ago

D is boring, let's see how to recreate the B language:

https://www.youtube.com/playlist?list=PLpM-Dvs8t0VZn81xEz6Ng...

4gotunameagain 3 days ago

D is like a forced meme at that point.

Never has an old language gained traction, its all about the initial network effects created by excitement.

No matter how much better it is from C now, C is slowly losing traction and its potential replacements already have up and running communities (Rust, zig etc)

  • einr 3 days ago

    Not everything needs to have "traction", "excitement" or the biggest community. D is a useful, well designed programming language that many thousands of people in this vast world enjoy using, and if you enjoy it too, you can use it. Isn't that nice?

    • 4gotunameagain 2 days ago

      Oh a programming language certainly needs to have traction and community for it to succeed, or be a viable option for serious projects.

      You can code your quines in whatever you'd like, but a serious project needs existence of good tooling, good libraries, proven track record & devs that speak the language.

      • einr 2 days ago

        "Good tooling, good libraries, proven track record" are all relative concepts, it's not something you have or don't have.

        There are serious projects being written in D as we speak, I'm sure, and the language has a track record of having been consistently maintained and improved since 2001, and has some very good libraries and tooling (very nice standard library, three independent and supported compiler implementations!) It does not have good libraries and tooling for all things; certainly integrations with other libs and systems often lag behind more popular languages, but no programming language is suitable for everything.

        What I'm saying is there's a big world out there, not all programmers are burdened with having to care about CV-maxxing, community or the preferences of other devs, some of them can just do things in the language they prefer. And therefore, not everything benefits from being written in Rust or whatever the top #1 Most Popular! Trending! Best Choice for System Programming 2026! programming language of the week happens to be.

      • cardanome 2 days ago

        D has three high quality compiler implementations. It has been around for ages and is very stable and has a proven track record.

        Zig has one implementation and constant breaking changes.

        D is the far more pragmatic and safer choice for serious projects.

        Not that Zig is a bad choice but to say that a unstable lang in active development like Zig would be a better choice for "serious projects" compared to a very well established but less popular lang shows the insanity of hype driven development.

      • fuzztester 2 days ago

        >Oh a programming language certainly needs to have traction and community for it to succeed, or be a viable option for serious projects.

        You are totally right, sir.

        >You can code your quines in whatever you'd like, but a serious project needs existence of good tooling, good libraries, proven track record & devs that speak the language.

        Now, you HN user who calls yourself 4gotunameagain (which type of name is already a red flag for those in the know, because usually used by trolls), do us a favour by posting the link to at least one of your so-called serious projects here. Put your money where your mouth is.

  • kitd 3 days ago

    Python was first released in 1991. It rumbled along for about 20 years until exploding in popularity with ML and the rise of data science.

    • querez 3 days ago

      That's not how I remember it. Excitement for python strongly predated ML and data science. I remember python being the cool new language in 1997 when I was still in high school. Python 2.4 was already out, and O'Reilly had put several books kn the topic already it. Python was known as this almost pseudo code like language thst used indentation for blocking. MIT was considering switching to it for its introductory classes. It was definitely already hyped back then -- which led to U Toronto picking it for its first ML projects that eventually everyone adopted when deep learning got started.

      • kitd 3 days ago

        It was popular as a teaching language when it started out, along side BASIC or Pascal. When the Web took off, it was one of a few that took off for scripting simple backends, along side PHP, JS and Ruby.

        But the real explosion happened with ML.

        • trwired 3 days ago

          I agree with the person you're replying to. Python was definitely already a thing before ML. The way I remember it is it started taking off as a nice scripting language that was more user friendly than Perl, the king of scripting languages at the time. The popularity gain accelerated with the proliferation of web frameworks, with Django tailgating immensely popular at the time Ruby on Rails and Flask capturing the micro-framework enthusiast crowd. At the same time the perceived ease of use and availability of numeric libraries established Python in scientific circles. By the time ML started breaking into mainstream, Python was already one of the most popular programming languages.

          • tmtvl 2 days ago

            As I remember it there was a time when Ruby and Python were the two big up-and-coming scripting languages while Perl was in decline.

            • toraway a day ago

              That is correct. I "came of age" in 2010-11 during the Web 2.0 era of web apps beginning to eat the world. Ruby was just starting to come down from its peak as the new hotness, and Python thanks to Django + Google's support/advocacy was becoming the new Next Big Thing for the web and seemed like a no-brainer to learn as my main tool back at the time.

              At the time Java was the mature but boring "enterprise" alternative to both, but also beginning its decline in web mindshare as Ruby/Python (then JavaScript/Node) were seen as solving much of the verbosity/complexity associated with Java.

              There was a lot of worry that the Python 2->3 controversy was threatening to hurt its adoption, but that concern came from Python in a position of strength/growing fast.

              Python's latter day positioning as the ML/scientific computing language of choice came as its position in the web was being gobbled up by JavaScript by the day and was by then well on the downswing for web, for a variety of technical/aesthetic reasons but also just simply no longer being "cool" vs. a Node/NoSQL stack.

          • kitd 2 days ago

            Sure, but the point was that it being used for web backends was years after it was invented, an area in which it never ruled the roost. ML is where it has gained massive traction outside SW dev.

    • eddythompson80 3 days ago

      Python was common place long before ML. Ever since 1991, it would jump in popularity every now and then, collect enough mindshare, then dives again once people find better tools for the job. It long took the place of perl as the quick "linux script that's too complex for bash" especially when python2 was shipping with almost all distros.

      For example, python got a similar boost in popularity in the late 2000s and early 2010s when almost every startup was either ruby on rails or django. Then again in the mid 2010s when "data science" got popular with pandas. Then again in the end of 2010s with ML. Then again in the 2020s with LLMs. Every time people eventually drop it for something else. It's arguably in a much better place with types, asyncio, and much better ecosystem in general these days than it was back then. As someone who worked on developer tools and devops for most of the time, I always dread dealing with python developers though tbh.

      • CatMustard 3 days ago

        > I always dread dealing with python developers though tbh.

        Out of curiosity, why is that?

        • eddythompson80 2 days ago

          There are plenty of brilliant people who use python. However, in every one of these boom cycles with python I dealt with A LOT of developers with horrific software engineering practices, little understanding of how their applications and dependencies work, and just plane bizarre ideas of how services work. Like the one who comes with 1 8k line run.py with like 3 functions asking to “deploy it as a service”, expecting it to literally launch `python3 run.py` for every request. It takes 5 minutes to run. It assumes there is only 1 execution at a time per VM because it always writes to /tmp/data.tmp. Then poses a lot of “You guys don’t know what you’re doing” questions like “yeah, it takes a minute, but can’t you just return a progress bar?” In a REST api? Or “yeah, just run one per machine. Shouldn’t you provide isolation?”. Then there is the guy who zips up their venv from a Mac or Windows machine and expects it to just run on a Linux server. Or the guy who has no idea what system libs their application needs and is so confused we’re not running a full Ubuntu desktop in a server environment. Or the guy who gives you a 12GB docker image because ‘well, I’m using anaconda”

          Containers have certainly helped a lot with python deployments these days, even if the Python community was late to adopt it for some reason. throughout the 2010s where containers would have provided a much better story especially for python where most libraries are just C wrappers and you must pip install on the same target environments, python developers I dealt with were all very dismissive of it and just wanted to upload a zip or tarball because “python is cross platform. It shouldn’t matter” then we had to invent all sorts of workarounds to make sure we have hundreds of random system libs installed because who knows what they are using and what pip will need to build their things. prebuilt wheels were a lot less common back then too causing pip installs to be very resource intensive, slow and flaky because som system lib is missing or was updated. Still python application docker images always range in the 10s of GBs

          • CatMustard 2 days ago

            Thanks for the detailed reply. I wrote and deployed a few dev-opsy python scripts in my last job that I wasn't massively proud of, but after reading that I all of a sudden don't feel so bad lol

    • nickm12 3 days ago

      Python crossed the chasm in the early 2000s with scripting, web applications, and teaching. Yes, it's riding an ML rocket, but it didn't become popular because it was used for ML, it was chosen for ML because it was popular.

    • nottorp 3 days ago

      Oh? How about Raymond's "Why python?" article that basically described the language as the best thing since sliced bread? Published in 2000, and my first contact with python.

    • flohofwoe 2 days ago

      Python had already exploded in popularity in the early 2000s, and for all sorts of things (like cross-platform shell scripting or as scripting/plugin system for native applications).

    • pjmlp 2 days ago

      Not really, back in 2003 when I joined CERN it was already the offical scripting language on ATLAS, our build pipeline at the time (CMT) used Python, there were Python trainings available for the staff, and it was a required skill for anyone working in Grid Computing.

      I started using Python in version 1.6, there were already several O'Reilly books, and Dr.Dobbs issues dedicated to Python.

  • arcadia_leakOP 3 days ago

    This is not true. It took about 20 years for Python to reach the levels of its today's popularity. JavaScript also wasn't so dominant and omnipresent until the Chrome era.

    Also, many languages that see a lot of hype initially lose most of their admirers in the long run, e.g. Scala.

  • gspr 3 days ago

    > Never has an old language gained traction, its all about the initial network effects created by excitement.

    Python?! Created in 1991, became increasingly popular – especially in university circles – only in the mid-2000s, and then completely exploded thanks to the ML/DL boom of the 2010s. That boom fed back into programming training, and it's now a very popular first language too.

    Love it or hate it, Python was a teenager by the time it properly took off.

Keyboard Shortcuts

j
Next item
k
Previous item
o / Enter
Open selected item
?
Show this help
Esc
Close modal / clear selection