• edinbruh@feddit.it
    link
    fedilink
    English
    arrow-up
    73
    ·
    1 year ago

    That’s like… It’s purpose. Compilers always have a frontend and a backend. Even when the compiler is entirely made from scratch (like Java or go), it is split between front and backend, that’s just how they are made.

    So it makes sense to invest in just a few highly advanced backends (llvm, gcc, msvc) and then just build frontends for those. Most projects choose llvm because, unlike the others, it was purpose built to be a common ground, but it’s not a rule. For example, there is an in-developement rust frontend for GCC.

    • Kazumara@discuss.tchncs.de
      link
      fedilink
      arrow-up
      21
      ·
      1 year ago

      that’s just how they are made.

      Can confirm, even the little training compiler we made at Uni for a subset of Java (Javali) had a backend and frontend.

      I can’t imagine trying to spit out machine code while parsing the input without an intermediary AST stage. It was complicated enough with the proper split.

      • LeFantome@programming.dev
        link
        fedilink
        arrow-up
        10
        ·
        1 year ago

        I have built single pass compilers that do everything in one shot without an AST. You are not going to get great error messages or optimization though.

        • Kazumara@discuss.tchncs.de
          link
          fedilink
          arrow-up
          3
          ·
          1 year ago

          Oh! Okay, that’s interesting to me! What was the input language? I imagine it might be a little more doable if it’s closer to hardware?

          I don’t remember that well, but I think the object oriented stuff with dynamic dispatch was hard to deal with.

      • LeFantome@programming.dev
        link
        fedilink
        arrow-up
        17
        ·
        1 year ago

        I guess I should have put a /s but I thought it was pretty obvious. The 68 in Algol 68 is 1968. COBOL is from 1959. Modula-2 is from 1977.

        My point exactly was that all the hot new languages are built with LLVM while the “new” language options on GCC are languages from the 50’s, 60’s, and 70’s.

        I am not even exaggerating. That is just what the projects look like right now.

        • lad@programming.dev
          link
          fedilink
          English
          arrow-up
          4
          ·
          1 year ago

          I would guess those languages are added for preservation and compatibility reasons, and it’s also an important thing

          • LeFantome@programming.dev
            link
            fedilink
            arrow-up
            2
            ·
            1 year ago

            I think some are getting used actually, particularly COBOL. I think Modula-2 still gets used in some embedded contexts. But these languages are not exactly pushing the state-of-the-art.

            Algol 68 is interesting. It is for sure just for academic and academic enthusiast purposes. Historical and educational value only as you say.

        • parlaptie@feddit.org
          link
          fedilink
          arrow-up
          1
          ·
          1 year ago

          I had my suspicions that that’s what you were going for, I just thought I’d make it obvious.

    • Dejected Warp Core@lemmy.world
      link
      fedilink
      arrow-up
      1
      ·
      1 year ago

      Honestly, now that I can see the “business productivity” through-line from COBOL, to BASIC, and most recently, Python, I should probably just learn COBOL.

      • CanadaPlus@lemmy.sdf.org
        link
        fedilink
        arrow-up
        10
        ·
        1 year ago

        That sounds pretty great. My impression is that relatively little code actually runs that often.

        but with none of the footguns of manual memory management, no garbage collection pauses, but yet also no evil stepparent style borrow checker to be beaten by.

        That part sounds implausible, though. What kind of memory management are they doing?

          • CanadaPlus@lemmy.sdf.org
            link
            fedilink
            arrow-up
            11
            arrow-down
            1
            ·
            1 year ago

            Oh, you just mean it’s a kind of garbage collection that’s lighter on pauses. Sorry, I’ve had the “my pre-Rust pet language already does what Rust does” conversation on here too many times.

            • BatmanAoD@programming.dev
              link
              fedilink
              arrow-up
              8
              ·
              1 year ago

              To be fair, the drop/dealloc “pause” is very different from what people usually mean when they say “garbage collection pause”, i.e. stop-the-world (…or at least a slice of the world).

              • CanadaPlus@lemmy.sdf.org
                link
                fedilink
                arrow-up
                2
                arrow-down
                1
                ·
                1 year ago

                Yeah, it might be better, I don’t actually know. It’s not as novel as OP maybe thinks it is, though.

                • BatmanAoD@programming.dev
                  link
                  fedilink
                  arrow-up
                  4
                  ·
                  1 year ago

                  That’s fair; Python, Swift, and most Lisps all use or have previously used reference-counting. But the quoted sentence isn’t wrong, since it said no “garbage collection pauses” rather than “garbage collection.”

            • Ethan@programming.dev
              link
              fedilink
              English
              arrow-up
              3
              ·
              1 year ago

              Garbage collection is analyzing the heap and figuring out what can be collected. Reference counting requires the code to increment or decrement a counter and frees memory when the counter hits zero. They’re fundamentally different approaches. Also reference counting isn’t necessarily automatic, Objective-C had manual reference counting since day one.

              • BatmanAoD@programming.dev
                link
                fedilink
                arrow-up
                6
                ·
                1 year ago

                “Garbage collection” is ambiguous, actually; reference counting is traditionally considered a kind of “garbage collection”. The type you’re thinking of is called “tracing garbage collection,” but the term “garbage collection” is often used to specifically mean “tracing garbage collection.”

              • CanadaPlus@lemmy.sdf.org
                link
                fedilink
                arrow-up
                3
                ·
                1 year ago

                It’s still mentioned as one of the main approaches to garbage collection in the garbage collection Wikipedia article.

                • Ethan@programming.dev
                  link
                  fedilink
                  English
                  arrow-up
                  1
                  ·
                  1 year ago

                  Ok, I concede the point, “garbage collection” technically includes reference counting. However the practical point remains - reference counting doesn’t come with the same performance penalties as ‘normal’ garbage collection. It has essentially the same performance characteristics of manual memory management because that’s essentially what it’s doing.

              • calcopiritus@lemmy.world
                link
                fedilink
                arrow-up
                6
                ·
                1 year ago

                There is no reference counting if the count is always one.

                The defining feature of reference counting is that its a runtime check. Which in turn results in a runtime performance.

                If there is no in memory counter at runtime, nobody calls that reference counting.

              • CanadaPlus@lemmy.sdf.org
                link
                fedilink
                arrow-up
                5
                ·
                edit-2
                1 year ago

                Did you think rust doesn’t free up memory for you? That would be the biggest memory leak in history! No! Rust does reference counting, it just makes sure that that number is always one! What did you think the borrow checker was for?

                There is no runtime garbage collection in Rust. Given a legal program, it can detect where free-type instructions are needed at compile time, and adds them. From there on it works like C, but with no memory leaks or errors because machines are good at being exactly correct. If you want to say that’s just a reference counting algorithm that’s so simple it’s not there, sure, I guess you can do that.

                Roc has runtime overhead to do garbage collection, it says so right on their own page. It might be a post-Rust language but this feels like the same conversation I’ve had about D and… I can’t even remember now. Maybe Roc is a cool, innovative language. It’s new to me. But, it doesn’t sound like it’s doing anything fundamentally new on that specific part.

                Edit: Reading your follow up to the other person, it sounds like it has both a Rust-style compile time algorithm of some sort, and then (reference count-based) garbage collection at run time for parts of the program that would just be illegal in Rust.

          • Frezik@lemmy.blahaj.zone
            link
            fedilink
            arrow-up
            4
            ·
            1 year ago

            I wish more languages used ref counting. Yes, it has problems with memory cycles, but it’s also predictable and fast. Works really well with immutable data.

              • Frezik@lemmy.blahaj.zone
                link
                fedilink
                English
                arrow-up
                2
                ·
                1 year ago

                Thanks, this looks really interesting. I’ve thought for a while that Rust’s borrow checker wouldn’t be such a pain in the ass if the APIs were developed with immutable data in mind. It’s not something you can easily slap on, because the whole ecosystem fights against it. Looks like Roc is taking that idea and running with it.

    • Lena@gregtech.euOP
      link
      fedilink
      English
      arrow-up
      14
      ·
      1 year ago

      Yeah, I think Go’s compiler is so fast partially because it doesn’t use LLVM