Hacker News new | ask | show | jobs
by DeathArrow 1320 days ago
>C++ as a whole should be deprecated -- and no new projects should use C++ (unless for some very odd and specific reason).

And what can be used instead of C++? C? If C was better, then C++ wouldn't have been invented. Rust? It's much more painful to use than C++. Zig? It's immature and has very low usage. Nim? Has very low user base. Julia? It isn't solving the same problems.

7 comments

I don't think that's true. I started C++ using the 'cfront' system, the major push wasn't because C was somehow lacking, it was because it was fashionable to do object orient programming which is hard in C. Various horrible patterns were invented using function pointers so C programmers could feel like they were doing object oriented programming and all of them sucked.

When cfront turned up, the first versions basically automated that suckage. C++ did get better, but it was still horrible compared to CLOS or Smalltalk. This was largely due to weirdness in how the constructor/destructor ordering worked, the giant bogosity that is multiple inheritance and a few massive other undefined behaviours that every compiler did differently, but I think at this point it's fair to point out the language is bad and things like C# are so much better it's not even funny any more.

Yes, OOP kind of sucks. But you can use C++ without OOP if you so wish.

C# is much better but still it isn't a systems programming language due to garbage collection. So while you can solve some classes of problems easier and better, it can't replace all of C++ use cases.

That depends on the point of view.

Writing compilers, linkers, running bare metal on embedded hardware are all systems programming tasks.

Mark Russinovich (of Sysinternals fame), thinks Rust should be the non-GC language of choice moving forward.

https://twitter.com/markrussinovich/status/15719951172335042...

If people think C++ is hard to learn and attracts opinionated people boy are they in for a surprise when they start using Rust.
Learning rust is like cycling over 2 big hills. It’s exhausting and painful if you’re in any way out of shape.

Learning C++ is like cycling from SF to LA. It starts easy enough and every day you’re making a lot of satisfying progress. But you have so far to go because of all the features and quirks of the language.

It’s probably easier to get started learning C++. But it’s also much faster to finish learning rust and be able to read almost all rust code. (Pin still scares me though)

You forgot to mention that someone mined parts of the roads from SF to LA.
More like NY to SF. The Appalachians would be when you're first learning pointers and the Rockies would be about the time you hit the STL and friends.
Having cut my teeth in Z80 Assembly, I could never understand people's aversion to pointers. You cannot do anything of any practical use, on hardware, without them.
You have to learn pointers in Rust too and I don't think the STL is any more complicated than Rust's standard library.
Regular Rust code uses references almost exclusively. (Unless you're working in kernel space or building fancy data structures.)

The big difference between C++ and Rust is what happens when you get something wrong. C++ has lots of undefined behavior and nasty surprises for the unwary. (I led a C++ project for a decade and saw it all.) In Rust, if you get something wrong, the compiler typically refuses to compile it. Which is also very frustrating, but the frustration is all up front.

It would also be easy to get started learning Rust, if people cared enough about doing it. The best way to learn Rust as a first programming language is to start with pure value-oriented programming at first, liberally using .clone() when necessary. Then introduce borrowing, with shared and mutable references; continuing with features involving interior mutability (Cell, RefCell etc.).

This is admittedly quite different from the way people usually learn C++, but it makes sense on its own terms. It's much closer to how higher-level languages like ML and Haskell are taught, and people have successfully learned those languages in introductory programming courses.

I like you're analogy, but I do think there are features of c++ that are big hills as well. To me it would be SF to LA with some big ups and downs on that long ride.

I'm also curious what's difficult about pin in rust? It basically just disables moving of the object for the lifetime of the pin.

> I'm also curious what's difficult about pin in rust?

I understand the concept. It’s the syntax which trips me up. You don’t mark structs as Pin. You mark them as !Unpin. And then, when is it safe to pin_project fields? Every time I read the documentation I understand it for about an hour. 2 weeks later I need to re-read the docs again to convince myself I’m not subtly messing anything up.

I’ve also gotten myself in hot water writing custom Futures, trying to wade through the barrage of compiler errors at the intersection of lifetimes, Pin and async. It’s a lot harder than it needs to be. The compiler holes around GAT, async closures and async trait methods doesn’t help.

I like the analogy!

I’m still not comfortable with Pin, UnsafeCell, raw FFI (lifetime and ownership handling across the boundary is tricky), and complex macros. But I also think that you don’t need to understand these at all to be an effective Rust dev.

rust doesn't have many of the features of c++, so it seems easier until you realize it's not.
Rust is way easier to learn than C++.
Until one needs to deal with async/await, write GUI code, the upcoming GAT, or macros.
Except that the C++ substitutes for those features (where applicable; C++ has nothing like GAT, and has to make do with complex template meta-programming) are a lot harder too.
C++ has had GAT like capabilities on templates since forever.

Complex template meta-programming only if one is stuck in pre-C++17 compilers.

Microsoft has apparently ported DWrite to Rust (the C++/WinRT team is now having all the fun in Rust/WinRT, while ignoring the lack of tooling in C++/WinRT after they killed C++/CX), Azure IoT unit is adopting Rust on Azure Sphere alongside C while not supporting C++, and at Ignite Mark Russinovich did mention they are planning to port some sysinternals tools into Rust as kind of POC.
I do respect Mark and his Sysinternals products. However I could not care less what he thinks is the language I should be using. I choose what works for me and as long as it brings me healthy dosh I am not in need of one's "approval.
I do not think so, though.
> Rust? It's much more painful to use than C++.

As someone who has used C++ professionally for two decades, I disagree. Rust's pain is superficial and all up front. C++ pain is death by a thousand paper cuts, especially if you have people on your team that aren't intimately familiar with its pitfalls and its more modern constructs. I don't plan to write a new C++ project ever again, unless there's some very compelling reason to do so. Rust is an absolute breath of fresh air.

> And what can be used instead of C++?

For most use cases Java is a better option. Very fast, without any of the pain.

If you truly must not have a VM (rare), there's still C. Perhaps rust.

I think this is probably the most salient point. C/Rust then Java. I don't know why people hate on Java so much. And I think C lives fine along side Rust.
Java forces OOP and it's verbosity is worse than COBOL.
> Java forces OOP and it's verbosity is worse than COBOL.

Java doesn't force OOP in any meaningful way. I mean it does, in that you need to wrap all code in a class, but that's a non-issue (one line of code at the top and a closing bracket). You can write Java code where all functions are static and do nothing is object-oriented, when that's the best match for your needs.

On verbosity, you can latch on to the ConstructorAccessorMapFieldGetterFactorySingleton nonsense if you want but that's on you. Nothing in the Java language forces that on anyone. Having been writing Java code since 1996 I've never written such code.

Java is based on Objective-C without any of the nice flexibility, doesn't have value types, has C-like numeric types except they're less flexible yet not any safer, and its culture thinks you organize code by putting it into 6+ layers of namespaces inside other namespaces.

My rule is that languages are good if they have value types, which explains why PHP is good.

C# also has value types and structs. Also a bonus over the top fanboyism is absent.
Java is not very fast compared to c++, or you'd see it in embedded systems all over.
> Java is not very fast compared to c++, or you'd see it in embedded systems all over.

Those are quite different domains, with only minimal overlap.

Embedded systems more often that not are not seeking maximum performance. What matters is smaller code size and running on mimimal hardware. Java doesn't do so well there since you have the overhead of the VM. Java is rarely a sensible choice for embedded code. Just use simple C, or rust if it works for the use case.

(Yes I know project green was originally about embedded set-top boxes! But times changed.)

Performance critical systems are usually large servers for either high througput (web or other server traffic) or low latency (HFT) applications. The opposite end of the spectrum from embedded. That's where Java shines. You might be able to beat Java with carefully hand-tuned C++ but just as likely the JIT might beat you. So for maximum performance server code combined with a more sane developer productivity, Java cannot be beat.

I understand, but the topic of this article is about embedded systems. Java is not a player here.
what's fast really depends on lot on what you are building - without more details about the challenge at hand any statements about performance are unhelpful. A huge backend system? The logic in a toaster? A space ship?
> Rust? It's much more painful to use than C++.

Unless you're doing something really highly specific to C++ (like Cuda for instance or deep integration with big C++ codebase), saying that rust is painful compared to C++ is laughable.

Gonna have to unwrap() this take
I'll just ignore this take and let it become a problem later.
.expect("fireworks")
Julia is solving many of the same problems as C++. GPU compute, HPC, high performance algebra kernels are all well within Julia's purview. It's not (at least yet) good for things like writing OS kernels but there is a large amount of overlap with C++.
Isn't Julia a dynamically typed language?
Yes, but it's strongly typed, which is more important.
Yes but C++ is strongly and statically typed. Julia is not even running in the same race as C++.
Yes. So what?
Then it is not a replacement for C++. It's going to be slow.
Static types are not required for things like type inference and optimizing compilers. It's just that many dynamic languages are not written with performance in mind, and have semantics that make optimization impossible.

Julia was designed from the ground up to have C level performance, and well written Julia code does that easily in throughput focused scenarios.

Julia's intermediate representation which it compiles dynamic code down to is statically typed, and any dynamism just manifests itself as the compiler waiting until the types are resolved at runtime before running again and generating new specialized code.

If your code is written so that the types are all inferrable, there's no pauses.

it's not. it uses type inference to infer types and llvm to compile down to native code. differentialequations.jl is often faster than the fastest C and Fortran solvers, and Octavian.jl often beats MKL at matrix multiplication.
Type inference changes things. It's awesome that it can beat handwritten C and Fortran code.
While being written in C++, so it can't make C++ go away in those domains.
llvm is c++ but almost all of Julia is written in Julia. codegen and the subtyping algorithm are the two main things written in C/C++.
Indeed, that doesn't change the matter that Julia depends on C++ until the day someone bootstraps the whole toolchain.
> Rust? It's much more painful to use than C++

Write a sufficiently complex memory safe program in C++. I dare you. It's been proven again and again that humans can't do it. And calling Rust more painful than C++ is just absurd.

> Write a sufficiently complex memory safe program in C++.

That is totally easy.

What's not so easy, necessarily, is complex numerically safe program in C++ (that performs well).

I write them routinely. Many, many people write them routinely. It is easy, in modern C++.

You appear to have fallen for the Rust hype machine.

We do know many people at Google can't.