Live data from Hacker News

Surviving C++

c0de517e.blogspot.com

11–20 of 25 posts

Re: Surviving C++

#11
In fact, no one uses straight C++ to make anything, in real world everyone starts by sub-setting C++ into something "safer" and then adding back the fundamental missing features (i.e. memory management, serialization, reflection and so on) via libraries, macros or other trickery (i.e. code to code transformers, code generators or parsers and so on), so really the C++ we use is not a standard, but a studio specific version of the language.

I really don't understand this at all. He seems to be saying that using "straight C++" would mean using the worst parts of the language in the worst ways, but not taking advantage of the features that make C++ usable. If he really thinks everyone uses macros, code generators, or code transformers to do real-world C++, then he's wrong. I've been using C++ professionally for almost ten years now, and I've never seen anything like that except: a few legacy macro tricks that we easily replaced with better, non-macro techniques; and Qt's preprocessor, which we never actually used in production code.

Style points for C++ have been rehashed endlessly. "C++ Coding Standards" is pretty good IIRC: http://www.amazon.com/Coding-Standards-Rules-Guidelines-Prac...

For gaming and embedded software, you will need further rules for performance. I'm not sure why this is a ding on C++. Doesn't any reasonably powerful language have performance pitfalls? Don't use CLOS in your embedded systems, folks.

C++ as a medium for our art looks more like statuary marble than modeling clay: it requires a team of muscular stone cutters under the guidance of a genius in order to produce some amazing sculptures. And once a given idea has been translated into the stone, you hardy can change it without re-sculpting most of it or having to work in the constraints that the shape it currently has impose on you.

This is only true if your system is badly factored or if you are averse to recompiling. "Ahhh, arrgh, no, I refuse to change the interface of this fundamental class referenced by every other object in the system because the next compile-link cycle will take ten minutes! I'll leave it crappy for the rest of eternity just so I don't have to wait ten minutes for a compile, or because my approach to changing this extremely fundamental class is to keep making haphazard changes to its interface until my code finally works, so my ten or twelve compile-link cycles will cumulatively take almost two hours." Fine, we'll have an adult make the change instead.

Now I'm really not suggesting that it doesn't suck when you have to wait ten minutes to recompile your system when you change an interface that every other source file in your system includes, but I hope recompilation time is not the weightiest consideration in that case.

It's not a coincidence that the more a language is dynamic, the less need there is for fancy debugging tools. Who needs a watch window indeed, if I can just add on the fly a widget on screen that graphs the value of a given variable?

This is a legitimate complaint. Building instrumentation into a C++ system is a pain in the ass, and it will never be as powerful as in a language with introspection.

Well, the art of sculpting in C++, the art of design, becomes really the art of subdividing our sculpture in pieces, the real design challenge is all about how to cut or work into pieces. Too many of them and the sculpture will be a fragile and ugly mess (translation: craptastically slow OOP shit). Too little and we loose flexibility.

As far as I can tell, the point here is that if C++ was a better language, bad design wouldn't be a problem. If it took C++ to drive him to consider OO design principles, I'd hate to see the code he wrote in other OO languages. Also, decomposition is not the only consideration. There are cross-cutting concerns such as memory management, logging, and instrumentation.

The design principles at the end of the post are better and more comprehensively covered by "Large-Scale C++ Software Design": http://www.amazon.com/Large-Scale-Software-Design-John-Lakos... Some of the language points in that book reflect the immaturity of C++ implementations when the book was written, but the design guidelines are still relevant.

In general, it's very hard to say anything original about C++. Practitioners and proponents of C++ are much more aware of its limitations than its detractors realize. Also, this may come as a shock to the web generation, but C++ is a topic that is very well covered by available books. Just as you might browse through a few relevant blogs to see if someone else has already made the same point you were about to make, with C++ you should do the same with the highly-regarded books.

Re: Surviving C++

#12
post #4

Earlier quoted context omitted.

Bad mouthing of C++ has become a popular thing to do lately. I think it's partly because C++ is a difficult and time consuming language to learn with many caveats, and people find it easier to give up and bash it instead. Just because C++ doesn't feel as "clean" as other languages doesn't mean it's not incredibly powerful, widely supported, and a fun language to develop in. To all the haters out there - give it a cha…

But the main reason it's not as clean is because it has had to maintain backwards compatibility with C, which is 40 years old now. Ironically, had C++ been 'cleaner' and not as backwards compatible with C from the outset, then we probably would not be having this conversation today because no one would have ever adopted it. :)

Can you give an example of removing some backwards compatibility with C that would make C++ cleaner?

Re: Surviving C++

#13
post #4

Earlier quoted context omitted.

Bad mouthing of C++ has become a popular thing to do lately. I think it's partly because C++ is a difficult and time consuming language to learn with many caveats, and people find it easier to give up and bash it instead. Just because C++ doesn't feel as "clean" as other languages doesn't mean it's not incredibly powerful, widely supported, and a fun language to develop in. To all the haters out there - give it a cha…

But the main reason it's not as clean is because it has had to maintain backwards compatibility with C, which is 40 years old now. Ironically, had C++ been 'cleaner' and not as backwards compatible with C from the outset, then we probably would not be having this conversation today because no one would have ever adopted it. :)

I disagree. The reason it's not clean is because they threw everything including the kitchen sink into it.

C is a very simple and elegant language. You can write down the specs for it on a dinner napkin. And implement a compiler for it overnight.

C++, on the other hand? A fully compliant compiler for it took over a decade.

Re: Surviving C++

#14
post #4
post #2

I really don't see the point of the tone the article adopts. If it is aimed at C++ users, badly mouthing C++ can only put them off what could be useful advice. If it is aimed at C++ bashers, they don't need the C++ advice anyway.

Bad mouthing of C++ has become a popular thing to do lately. I think it's partly because C++ is a difficult and time consuming language to learn with many caveats, and people find it easier to give up and bash it instead. Just because C++ doesn't feel as "clean" as other languages doesn't mean it's not incredibly powerful, widely supported, and a fun language to develop in. To all the haters out there - give it a cha…

I did and do a fair share of C++ programming, but I disagree that it is fun to program in C++. Nearly everything is tedious in C++. Just to give one example: you can quickly prototype a class in Python or Ruby and rapidly revise it as your insight with respect to the problem improves. In C++ you have to decide for each member whether it should be an ordinary value, reference, pointer, or smart pointer, which methods to make virtual, behavior for the copy constructor and assignment operator, etc.

Of course, this is a double-edged sword. Higher-level languages have made choices so that you do not have to tinker with such details. But that also prevents you to decide on such behavior when necessary.

C++0x goes a long way in making many aspects of the language more enjoyable, such as type inference, lambda functions, range based loops and defaulted/deleted methods. But once a performant alternative shows up and becomes mainstream (strict Haskell? ;)), I will switch.

Re: Surviving C++

#15
post #4

Earlier quoted context omitted.

Bad mouthing of C++ has become a popular thing to do lately. I think it's partly because C++ is a difficult and time consuming language to learn with many caveats, and people find it easier to give up and bash it instead. Just because C++ doesn't feel as "clean" as other languages doesn't mean it's not incredibly powerful, widely supported, and a fun language to develop in. To all the haters out there - give it a cha…

But the main reason it's not as clean is because it has had to maintain backwards compatibility with C, which is 40 years old now. Ironically, had C++ been 'cleaner' and not as backwards compatible with C from the outset, then we probably would not be having this conversation today because no one would have ever adopted it. :)

There are counter-examples. Objective-C is a strict superset of C and a reasonably clean language.

Re: Surviving C++

#16
post #11

In fact, no one uses straight C++ to make anything, in real world everyone starts by sub-setting C++ into something "safer" and then adding back the fundamental missing features (i.e. memory management, serialization, reflection and so on) via libraries, macros or other trickery (i.e. code to code transformers, code generators or parsers and so on), so really the C++ we use is not a standard, but a studio specific ve…

> If he really thinks everyone uses macros, code generators, or code transformers...

That's not what he was talking about. He basically said that if you take two different teams, they will most likely use different subsets of C++ features. One will be all about classes, hierarchies and (god forbid) boost and other will be using C++ as beefed up C. That sort of thing.

Re: Surviving C++

#17
post #11

In fact, no one uses straight C++ to make anything, in real world everyone starts by sub-setting C++ into something "safer" and then adding back the fundamental missing features (i.e. memory management, serialization, reflection and so on) via libraries, macros or other trickery (i.e. code to code transformers, code generators or parsers and so on), so really the C++ we use is not a standard, but a studio specific ve…

It's true, in trying to come up with a presentation on C++, it's really hard to find anything new to say.

Re: Surviving C++

#18
Should we consider using PIMPL

No. Just don't.

I'll say this about C++: the worst thing about it is that each new job requires you to learn what is 'good' and what is 'taboo' at the new company. One man's natural and elegant is another man's obtuse and illegible.

Re: Surviving C++

#19
post #12

Earlier quoted context omitted.

But the main reason it's not as clean is because it has had to maintain backwards compatibility with C, which is 40 years old now. Ironically, had C++ been 'cleaner' and not as backwards compatible with C from the outset, then we probably would not be having this conversation today because no one would have ever adopted it. :)

Can you give an example of removing some backwards compatibility with C that would make C++ cleaner?

Converting static array references to pointers when passing them as a function parameter. The whole array/pointer conflation.

C's struct "tag name space".

Trigraphs and \ line splicing.

Replace #include with symbolic import.

Re: Surviving C++

#20
post #4
post #2

I really don't see the point of the tone the article adopts. If it is aimed at C++ users, badly mouthing C++ can only put them off what could be useful advice. If it is aimed at C++ bashers, they don't need the C++ advice anyway.

Bad mouthing of C++ has become a popular thing to do lately. I think it's partly because C++ is a difficult and time consuming language to learn with many caveats, and people find it easier to give up and bash it instead. Just because C++ doesn't feel as "clean" as other languages doesn't mean it's not incredibly powerful, widely supported, and a fun language to develop in. To all the haters out there - give it a cha…

C++ has uses, but it's the sulfuric acid of programming languages: you have to have good personnel control and fire those who screw around outside the boundaries of the right style. A programming group with one guy programming like C with classes and another guy programming like it's Ocaml without garbage collection, and you're in for a mighty piece of hell.
Post reply on HN