5 ms·
Why do C++ folks make things so complicated?
- mrich 15y agoC# comes to mind when he is talking about top/bottom C++. They got this right, plus added some neat high-level features.
- JoachimSchipper 15y agoActually, the commenters are arguing about what languages are best used in those roles; e.g. C as "bottom C++", Python as "top C++" - or, indeed, C# as "Top C++". C# is nice, but I wouldn't want to write a kernel in it.
- profquail 15y agoC# is nice, but I wouldn't want to write a kernel in it. Why not? :) http://singularity.codeplex.com/ http://singularity.codeplex.com/ When C# is combined with Code Contracts / static verification, you get fairly clean/performant code and strong safety guarantees. I think that'd be quite nice for kernel programming.
- rch 15y agoNot so sure about that... Consider the Template Numerical Toolkit: extending it would be Bottom while using it would be Top (reference counting, overloaded for for both row-major or column-major array access, etc.). C# takes things several steps further down the road. http://math.nist.gov/tnt/ http://math.nist.gov/tnt/
- eru 15y agoBy the way, why do C++ people seem to think that reference counting is a good idea?
- gaius 15y agoBecause in some situations you can't tolerate GC pauses.
- gigamonkey 15y agoBut you can tolerate ref counting pauses? (When you release the last reference to the last object keeping a large tree of objects alive and have a lengthy cascade of objects being freed.)
- blub 15y agoIf speed requirements are so tight you should preallocate the memory. GC is completely out of the question.
- sambeau 15y agoGenerally, that will still be far smaller than copying every object pointed to on the stack.
- eru 15y agoMaybe, but what does that have to do with the discussion? Only because there are copying garbage collectors, doesn't mean you have to use one.
- NickPollard 15y agoIf you use reference counting for a full tree hierarchy of objects, then you have to expect that. The point is that sometimes in C or C++ you have a small, flat selection of objects that you want to dynamically create and destroy, whilst everything else falls into fairly stable patterns than can easily be handled manually. An example from my field; computer games: It's quite common for game engines to use reference counting for resources such as textures. These days, it is very common for textures to be streamed into and out of memory during gameplay, either because it's a large game-world with whole sections being streamed, or simply for LoD (level-of-detail) reasons - objects in the distance have low resolution textures, when they get closer they become higher resolution. To handle this, it's common to have a pool of textures that use reference counting, and every model/renderable that uses a particular texture increments or decrements the refcount as appropriate. The texture itself is just a flat blob of data, so when a texture is freed, there's no worry of large cascading frees. This approach is very simple and easy to implement when you only want it on a small selection of the program.
- dedward 15y agoSimply a combination of it's nature - it's C++, and It's been around a long time. It's easy to make messy stuff with it.
- danieldk 15y agoIf you want to make such a distinction, Qt is probably what would come close to top-C++. It offers dynamic binding via signals/slots, Java-like iterators, simple multi-threading/parallelization, signal/slot-driven networking, database access, and some automatic memory management (deletion via parent widgets, and auto-pointers). It only misses the proposed compiler warnings to indicate that 'bottom-C++' is used. Still, for the average programmar 'top-C++' makes a miserable language. Want to write a simple class? You have to make a separate header file and decide what methods to inline/make virtual, etc. Want (binary) compatibility? You'll have to worry about things such as PIMPL and d-pointers. It's a low-level language, and low-level issues will always leak into higher-level subsets. And why should one go through the effort? The old mantra "write in a higher language, rewrite what is too slow in C/C++" works fine.
- blub 15y agoPerformance is a cross-cutting concern, you should factor it into the design of the application and not remember it when doing field tests and noticing that the software is too slow. This doesn't mean that you must use C or C++, but assuming that you can always rewrite the slow parts in C or C++ is inviting disaster.
- jpablo 15y agoDoesn't that go against all we have learned in CS? Early optimization being the root of all evil. And don't optimize what you think will be slow, but what you have measured to be slow?
- groby_b 15y agoIf we had learned something, we'd have learned the FULL quote, wouldn't we? "We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil" Note, "small" and "97%". That means that you should make the right large-scale decisions before you code. Or measure.
- 15y ago
- cageface 15y agoC++ already contains "top" and "bottom" C++. You can write boost-style code, with heavy use of smart_ptr and STL algorithms & functors, or you can stay pretty close to the "C with classes" layer.
- 16s 15y agoThat's the thing I like most about C++. I can do any type of programming in it (OOP, functional, procedural, templates, etc.). I can roll my own data structures or use the built-in STL containers while working with low-level C-like code. I'm not sure why so many people complain about it. Once I began using it, it quickly became my primary programing tool on Unix, Windows and Macs.
- derleth 15y ago"Beware the Turing Tarpit, where everything is possible but nothing of interest is easy." -- Alan Perlis C++ is, for many people, a Turing Tarpit: Ask yourself why you wouldn't write something in assembly, and that's why they wouldn't write it in C++. In specific, C++ doesn't have built-in support for real garbage collection. This means a lot of the idioms I take for granted in languages like Common Lisp and Haskell, to pick two very different languages that have true gc in common, are effectively impossible in C++. For example, I can't reliably pass complex data structures around using function composition (think f(g(h(x)))) because I can't rely on them existing from one function call to the next; an allocation may have failed somewhere up the line and now what? Adding in all the code needed to handle that isn't just a pain, it obscures the algorithm to the point I'm not programming the same way anymore. I'm not even thinking the same way anymore. Now for a purely personal anecdote: I quite like C. I can do certain things in C about as fast as I can think of them (mostly, things involving the POSIX API and no really complex data structures). I occasionally get the notion to add some C++ to my bag of tricks; not C-With-Classes, but C++ with Boost and the STL and whatever else g++ can handle these days. I might as well learn to swim by jumping in 500 feet upstream of Niagara Falls; there's "hitting the ground running", there's "hitting the ground doing back-flips and double-somersaults", and then there's "hitting the ground juggling sharpened sabres and gently convincing hungry wolves to not eviscerate you." Honestly, it wasn't this hard to learn how to write macros in Common Lisp. I don't know if the problem is just me or if it really is that bizarre in C++-land.
- michaelfeathers 15y agoI think that the main reason that C++ is so complicated is because they've had to maintain compatibility with C's model. The declaration/definition and value/reference dichotomies double up a lot of work. When you add the fact that they wanted to base STL on pointeresque semantics (iterators) and people started using template meta-programming to deal with the lack of reflection, well, it all got complicated.