News for hackers. Stuff that matters.
Re:Zed Shaw on C++ by bad_user on Friday July 16, 2010 @03:59AM (#1520598)
> C++ just doesn't attract self-publicists the way Ruby seems to.

That's a cheap shot ... Linus Tolvards is definitely not the Ruby-type.

And his arguments are sound ... for system programming, C is a much better language because it's simpler, lacks magic, making the pieces of code easier to understand without the bigger context, and it's more portable.

And for application-level programming, why would you chose a language without a garbage-collector?

Re:Zed Shaw on C++ by gaius on Friday July 16, 2010 @05:27AM (#1520723)
Perhaps you need to run deterministically without a stop-the-world garbage collector? A) the world is bigger than simple web applications and B) some of us have been doing this for a long time.
Re:Zed Shaw on C++ by bad_user on Friday July 16, 2010 @06:54AM (#1520809)
I wasn't talking about web applications, and modern garbage collectors are not stop-the-world.

Not to mention ... stop-the-world garbage collectors have a good reason for doing what they do. They are defragmenting the memory. You get that for free, when in C++ you would have to deal with hell if your app is doing lots of allocations ... see the shit the Firefox devs had to go through to alleviate the problems of heap fragmentation, and its still a problem.

Re:Zed Shaw on C++ by heresy on Friday July 16, 2010 @08:24AM (#1520895)
Ah, but what, you're using both managed code (C#) and unmanaged code (C++) in the same address space, doing memory intensive work using third party proprietary C++ code that does lots of small allocations?

In 32-bit land, it's welcome to OutOfMemoryException because managed code can't allocate a big enough chunk when returning to C#.

No free lunch :)

Either recycle processes often or reserve big enough contiguous chunks in managed code before calling out to the bad C++ code, no amount of good citizenship in managed code will stop the poorly written native code from fragmenting the hell out of your address space.

Re:Zed Shaw on C++ by gaius on Friday July 16, 2010 @09:37AM (#1521073)
Unfortunately we don't all have the luxury of rewriting all our code in the trendy language du jour.
Re:Zed Shaw on C++ by wglb on Friday July 16, 2010 @07:45AM (#1520853)
Can you give an example of stop-the-world garbage collection?
Re:Zed Shaw on C++ by noss on Friday July 16, 2010 @08:42AM (#1520935)
I've experienced problems with java's concurrent mark and sweep collector. It will stop the world, two times, but two much shorter times than a non-concurrent mark and sweep. So it is definitely an improvement in the duration of the stop-the-world.

The problem tends to be that you need to tune it, and even as you have tuned it, you can not promise that under special condition it will fall back to a more primitive collector since the optimality it was tuned for doesn't hold anymore.

I would never argue giving up garbage collection entirely because of these failure scenarios. I would much rather look at moving some critical part of the code out to a language with manual allocation, and let it perform the latency-sensitive bits.

Another mid-ground is to have separate isolate processes (heaps really) that can be stop-the-world collected without blocking each other. Erlang makes great use of this to accomplish "soft realtime", among other things.

Re:Zed Shaw on C++ by bhousel on Friday July 16, 2010 @08:20AM (#1520886)
Javascript... Yes, even V8.

Side rant: it's part of the reason that my Palm Pre will sometimes just hang for a second at the worst times, such as when I go to answer the phone. :(

Re:Zed Shaw on C++ by silentbicycle on Friday July 16, 2010 @08:23AM (#1520893)
A simple mark & sweep or stop & copy GC. Collectors which are incremental (work in small steps, not one full pass at a time) and/or generational (using several smaller generations, which are collected individually) break up GC pauses into something less disruptive.

For a good overview, read "Uniprocessor Garbage Collection Techniques" by Paul Wilson (check google scholar). Richard Jones's _Garbage Collection: Algorithms for Automatic Dynamic Memory Management_ is more in depth.

Re:Zed Shaw on C++ by kenjackson on Friday July 16, 2010 @03:42PM (#1522284)
If you meant actually existing stop the world GC, the server GC in Microsoft's CLR stops all threads on a processor to do GC.
Re:Zed Shaw on C++ by kvs on Friday July 16, 2010 @08:43AM (#1520937)
Try allocating a very large chunk of memory using a high-level language with garbage collector. It's not always about collection.
Re:Zed Shaw on C++ by eru on Friday July 16, 2010 @10:08AM (#1521182)
Why would you allocate a large chunk of memory, when you are using a garbage collected language?

There may be reasons to want to mix manual and automatic memory management. If you want to do that, there are language that support it. Like D.

Re:Zed Shaw on C++ by kvs on Sunday July 18, 2010 @09:50PM (#1527344)
Not necessarily allocating very large chunks in bulk but umm... Allocating nodes for a million nodes of a graph and subsequently processing them. Java JVM fragments memory heavily. En
Re:Zed Shaw on C++ by tbrownaw on Friday July 16, 2010 @08:50AM (#1520955)
> And for application-level programming, why would you chose a language without a garbage-collector?

Because your code uses some finite resources other than memory, and you don't want the ability to forget to release said resources when you're done with them and they go out of scope.

Re:Zed Shaw on C++ by eru on Friday July 16, 2010 @10:14AM (#1521193)
Why should memory management related to managing other resources. Anyway, you might be interested in The Haskell Disciplined Disciple Compiler (http://www.haskell.org/haskellwiki/DDC) which lets you statically encode resource management rules. (And of course spots garbage collection for memory.)
Re:Zed Shaw on C++ by tbrownaw on Friday July 16, 2010 @07:47PM (#1522957)
Your objects contain/use various resources, such as memory, file descriptors, mutexes, etc. The way to reclaim any of these is to destroy the object, which lets you reclaim all of them. So memory management is very much tied to other resource management, since they both involve the same thing (deciding when to destroy objects you no longer need). Unfortunately not all resources can be collected equally lazily, so memory-centric GC schemes that ignore the requirements of other resources tend to get in the way (and make you do using(){...} or try/finally to make sure your files are closed, instead of allowing for RAII).
Re:Zed Shaw on C++ by eru on Sunday July 18, 2010 @02:30PM (#1526368)
> The way to reclaim any of these is to destroy the object, which lets you reclaim all of them.

I asked why one should mix management of resources, and you answer that one should mix management of resources. But I still don't know why?

Re:Zed Shaw on C++ by tbrownaw on Monday July 19, 2010 @09:28AM (#1528553)
It's more that how the hell do you unmix them (any why would you bother, anyway)?
Re:Zed Shaw on C++ by eru on Tuesday July 20, 2010 @11:58AM (#1532421)
How to unmix: Just e.g. close your files explicitly, but let the memory of the data structures that represent your files be garbage collected normally.

For patterns of usage similar to RAII, Common Lisp uses unwind-protect. I already mentioned Disciplined Disciple Compiler that extends Haskell to give static guarantees for following certain rules for resource management.

Why would you bother: RAII only covers some cases for resource management, and most garbage collectors can take an arbitrary long time to collect an object that's no longer reachable. Which is fine for memory, because memory is fungible, but the attached resources, say mutexen, are not necessarily fungible.