HNNewShowAskJobs
Built with Tanstack Start
A Look at Rust from 2012(purplesyringa.moe)
123 points by todsacerdoti 8 days ago | 39 comments
  • steveklabnik4 hours ago

    Fun trivia fact: this is basically the exact moment I first encountered Rust.

    I’m also generally very glad at where it went from here. It took a tremendous amount of work from so many people to get there.

    • ramon1564 hours ago |parent

      Hey, I remember your "Rust 1.0, ten years later" post. Good stuff!

  • OhMeadhbhan hour ago

    I encountered Rust sometime around 2010. I was working a couple of blocks away from Mozilla's Mountain View office and would often overhear people talking about it at Dana Street Coffee Roasting. A couple years later I was working at Mozilla trying to unf*ck their TLS and libpkix implementations. The team rocked, but management sucked. The best part about it is I kept bumping into Brendan Eich and having great conversations about Lisp. I can't remember if P. C. Walton worked there, but several occasions he was in the office and gave me a VERY good, VERY succinct description of the language.

    I wrote a fair amount of Rust code in 2012, none of it on a real project like servo. All of it just code to try to understand what the language was trying to make easy. None of that code compiles any more. (Or enough of it fails that I stopped looking at it.)

    It's not so much a "critique" as it is a confirmation that when the crustaceans tell you the language definition isn't finished yet, believe them. I like the feel of Rust much more than C/C++, but I have C code I wrote in 1982 that still compiles and does what you think it should do. C++ code from 1990 still seems to compile. I have Rust code from 2014 that won't even compile.

    Rust is a cool language and I hope it eventually settles down enough to be considered for "real" projects. I've done a little bit of Ada in the last year and I really, really want something better. But... reverse in-compatibility is a deal-breaker for some corners of the commercial world.

    And yes, I know that (like Python) you can build an environment that lets you continue to compile old code with old compilers and some old code with new compilers. But the projects I'm talking about have life-times measured in decades. Will rustc in 2055 be able to compile a program written today? It doesn't seem to be on the top of minds of most of the Rust community.

    I'm not saying Rust is ugly. In fact, I really like some aspects of the language. And post 1.0 is MUCH better than pre 1.0. But if we could go for a few years without breaking changes that would be nice.

    • steveklabnik44 minutes ago |parent

      Rust achieved 1.0 in 2015, three years after you wrote that code in 2012. Stability wasn't guaranteed until then. Afterwards, it has been. Code from 2015 still compiles today. It's no surprise that 2014 code doesn't compile, as it came before those suggestions.

      > I hope it eventually settles down enough to be considered for "real" projects.

      Rust is being deployed for real projects at pretty much every major tech company at this point, and is used on the critical path of real infrastructure.

      > Will rustc in 2055 be able to compile a program written today? It doesn't seem to be on the top of minds of most of the Rust community.

      This has been a very strong focus of the Rust project for a long time; the reason you saw so much breakage from 2010-2015 was to make sure that it was in the state that we'd be okay with making it stable, and then the track record from 2015 to now has been excellent. There have been a few exceptions, but they've generally been quite small, and needed for soundness fixes.

    • tialaramex28 minutes ago |parent

      What you've written at the end there is a critique of Rust in 2012, pointing out that it's not a stable language, which, it isn't, as reflected in its versioning, in 2012.

      But a few years later, in 2015, Rust 1.0 shipped. So the stability really firms up from there.

      I happen to have in front of me the first commit of the first modestly sized piece of software I wrote in Rust in April 2021. Which compiles today just fine and works exactly as it did when it was written, on this brand new Rust toolchain.

  • ramon1564 hours ago

    I actually liked @T because you would pronounce it as "At T".

    You could say "The address at T". Curious why people hated it, I might be missing something.

    • steveklabnik2 hours ago |parent

      @T had a number of issues. The first was just that it was weird. People tend to not like weird things. Rust developed a reputation for "that language with a bunch of pointer types that are all weird."

      The real reason it was removed in the end was just that it elevated a library concept into syntax. Today's Arc<T>/Rc<T> split isn't really possible in an @T world, for example. Shared ownership is a good concept, but you don't need special syntax to indicate it.

      • zozbot2342 hours ago |parent

        > The real reason it was removed in the end was just that it elevated a library concept into syntax.

        Rust still does this in all sorts of silly ways, such as the ! type. What's the point of wasting an entire symbol that could have plenty of alternate uses on something that's so rarely used and could easily be defined as either a library type (empty enum) or at least be given a custom keyword, such as `never`? (Introduce it over an edition boundary, if you must preserve backwards compatibility.) The fact that it involves some compiler magic is no excuse; that's why Rust uses "langitem" markers within its core library.

        • steveklabnik2 hours ago |parent

          The standing joke for the last few years is that "the never type is named after its date of stabilization."

          I certainly don't disagree that Rust has flaws, for sure. I think this particular one is pretty far down the list, though. I'm not sure what else I'd want to use ! for, and by virtue of it not being used so often means that it's much less of a pain than @T would have been, though I would also argue that 2012 Rust used ~T and @T far more than contemporary Rust does (I still remember pcwalton's mailing list post about how you didn't have to use ~ for comparing strings!) and so was even more painful at the time than would be now.

  • pton_xd40 minutes ago

    I was really excited about the idea of a modern statically typed language with green threads ala Erlang / BEAM. I lost interest when Rust moved away from that direction and became focused on zero-cost abstractions instead.

    • steveklabnik35 minutes ago |parent

      It certainly was a big shift, a lot of people both had your opinion and had the opposite, for sure.

      Do you think Go fulfills that for you today or do you think there's still space for a new language here?

    • nahuel0x19 minutes ago |parent

      check Gleam

  • srott4 hours ago

    > rest of the post is me trying to make sense of the tutorial on borrowing. It has fried my brain and negatively affected my skills in modern Rust, so be wary

    I think that tutorial discouraged me from really getting into Rust

  • ravenicalan hour ago

      continue was called loop for some reason
    How strange! Does anyone know why?
    • steveklabnik33 minutes ago |parent

      There was an early rule that Rust keywords should be five characters or less. I would guess it's because of this rule. I believe loop turned into cont to satisfy this rule, and then eventually we relaxed the rule, and it became continue.

    • kuresovan hour ago |parent

      I could see it… like “loop back around” or “continue loop”. I think good old “continue” is better and more familiar though :)

  • Macha2 hours ago

    I think this was a year or two before I got to rust - some of these things still existed then (bare traits, no NLL, the ecosystem was only halfway onto cargo), while others (the old pointer type syntax) had already gone.

  • assbuttbuttass5 hours ago

    Very interesting to see the ML influences like ~ for unary minus, unscoped enums, mut on specific struct fields...

    It seems like over time, a lot of that was replaced with C++-style syntax and semantics. Presumably to make the language appeal more to C++ devs

    • ahoka5 hours ago |parent

      People wanted a new C++ and they made Rust into it.

    • nine_k4 hours ago |parent

      AFAICT the need to resolve unscoped enum values, combined with type inference, is one of the things that makes the Swift compiler so slow.

    • echelon5 hours ago |parent

      Rust looks nothing like C++.

      It looks like Ruby.

      The generics look like Java.

      • tialaramex3 hours ago |parent

        How do you feel the generics "look like" Java ?

        Implementation-wise they're the same trick as C++, monomorphization.

        Stylistically they're not very like either, however the effect is more like C++ because Rust idiomatically prefers to constrain functions not types so e.g. it's fine to talk about HashMap<f32, f32> a hypothetical hash table of floating point numbers mapped to other floating point numbers - even though we can't use such a type because if we try to insert into it we'll be told that insert requires its key parameter to implement Eq and Hash, which f32 doesn't because of NaN.

        In both C++ and Java as I understand it these constraints live on the type not the functions associated with that type, although C++ does not have the same constraint here and is perfectly willing to try to make a hash table of floats... but where a constraint lives on a function in C++ it would behave similarly to Rust due to SFINAE - the function won't match so your diagnostics say there's no such function, probably worse diagnostics than Rust but that's par for the course in C++.

        • echelon2 hours ago |parent

          And here I was thinking we were talking about the syntax.

          My Ruby claim doesn't hold much weight either if we're talking about the actual implementation.

          C++ templates look like an entirely new language within the language.

          Rust and Java make generics fit within the aesthetics and ergonomics of the language.

          If anything feels "bolted on" to Rust, it's proc macros and (to a lesser degree) async.

      • ninkendo3 hours ago |parent

        Other than the `|var|` syntax in closures, I can't think of a single way Rust looks like Ruby. I mean that seriously, there is almost no other similarities.

        • jjtheblunt2 hours ago |parent

          i suspect the example was syntax like a.b().c().d(10)

        • echelon2 hours ago |parent

          Don't forget expressions and block expressions, and all of the Ruby-esque syntax sugar around them. How expressions work with functional methods.

          I write a lot of chains with block expressions that almost look 1:1 with Ruby.

          • nicoburnsan hour ago |parent

            There's definitely some Ruby influence (closures syntax in particulary), but I think I'd argue that Rust syntax is closer to JavaScript/TypeScript than anything else.

      • dhosek3 hours ago |parent

        Java Generics look like C++ templates and Rust generics act much more like C++ Templates than Java Generics.

        • dhosek3 hours ago |parent

          Also, “new C++” refers less to syntax and more to role in the development ecosystem.

  • mkornaukhov5 hours ago

    > I’m happy with how Rust turned out.

    I agree, with the possible exception of perplexing async stuff.

    • bryanlarsen4 hours ago |parent

      I was really hoping that there'd be movement on a comment without-boats made in https://without.boats/blog/why-async-rust/ to bring a pollster like API into the standard library.

      Rust has very good reasons for not wanting to bless an executor by bringing it into the standard library. But most of those would be moot if pollster was brought in. It wouldn't stifle experimentation and refinement of other approaches because it's so limited in scope and useless to all but the simplest of use cases.

      But it does in practice solve what many mislabel as the function coloring problem. Powerful rust libraries tend to be async because that's maximally useful. Many provide an alternate synchronous interface but they all do it differently and it forces selection of an executor even if the library wouldn't otherwise force such a selection. (Although to be clear such libraries do often depend on I/O in a manner that also forces a specific executor selection).

      Pollster or similar in standard library would allow external crates to be async with essentially no impact on synchronous users.

      • nicoburnsan hour ago |parent

        `pollster` in the stdlib would probably make sense. But of course there's nothing stopping anyone from using the `pollster` crate today.

    • vablings4 hours ago |parent

      I feel async is in a very good place now (apart from async trait :[ ) As a regular user who isn't developing libraries async is super simple to use. Your function is async = it must be .await and must be in an async runtime. Probably as simple and straightforward as possible. There are no super annoying anti-patterns to deal with.

      The ecosystem being tokio centric is a little strange though

      • leshow2 hours ago |parent

        I love Rust and async Rust, but it's not true that there aren't annoying things to deal with. Anyone who's written async Rust enough has run into cancel-safety issues, the lack of async Drop and the interaction of async and traits. It's still very good, but there are some issues that don't feel very rust-y.

        • pornelan hour ago |parent

          I've been writing async Rust for as long as it existed, and never ran into any cancel-safety issue. However, I also never used tokio's select macro.

    • treyd3 hours ago |parent

      The system Rust has is a lot better than that of Python or JavaScript. Cleanly separating construction from running/polling makes it a lot more predictable and easier to understand what's happening, and to conveniently compose things together using it.

      • phplovesong2 hours ago |parent

        Thats putting the bar pretty damn low.

    • echelon4 hours ago |parent

      I write and use mostly async code, and I cannot for the life of me understand the async hate.

      What do you want Rust to do differently?

      What language does async right?

      How did Rust not reach its async goals?

      Rust even lets you choose the runtime you want. And most big libraries work with several runtimes.

      • mkornaukhov3 hours ago |parent

        I do write mostly async code, too.

        There are several ~~problems~~ subtleties that make usage of Rust async hindered IMHO.

        - BoxFuture. It's used almost everywhere. It means there are no chances for heap elision optimization.

        - Verbosity. Look at this BoxFuture definition: `BoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;`. It's awful. I do understand what's Pin trait, what is Future trait, what's Send, lifetimes and dynamic dispatching. I *have to* know all these not obvious things just to operate with coroutines in my (possibly single threaded!) program =(

        - No async drop and async trait in stdlib (fixed not so long ago)

        I am *not* a hater of Rust async system. It's a little simpler and less tunable than in C++, but more complex than in Golang. Just I cannot say Rust's async approach is a good enough trade-off while a plethora of the decisions made in the design of the language are closest to the silver bullet.