Oh dear. This is getting a little heated. TUHS to Bcc:, replies to COFF.

On Sun, Feb 6, 2022 at 8:15 AM Ed Carp <erc@pobox.com> wrote:
Since you made this personal and called me out specifically, I will respond:

"In what way is automatic memory management harder, more unsafe, and
less robust than hand-written memory management using malloc and
free?"

Because there's no difference in the two. Someone had to write the
"automatic memory management", right?

I cannot agree with this, there is a big difference.

With GC, you are funneling all of the fiddly bits of dealing with memory management through a runtime that is written by a very small pool of people who are intimately familiar with the language, the runtime, the compilation environment, and so on. That group of subject matter experts produce a system that is tested by every application (much like the _implementation_ of malloc/free itself, which is not usually reproduced by every programmer who _uses_ malloc/free).

It's like in "pure" functional languages such as Haskell, where everything is immutable: that doesn't mean that registers don't change values, or that memory cells don't get updated, or that IO doesn't happen, or the clock doesn't tick. Rather, it means that the programmer makes a tradeoff where they cede control over those things to the compiler and a runtime written by a constrained set of contributors, in exchange for guarantees those things make about the behavior of the program.

With manual malloc/free, one smears responsibility for getting it right across every program that does dynamic memory management. Some get it right; many do not.

In many ways, the difference between automatic and manual memory management is like the difference between programming in assembler and programming in a high-level language. People have written reliable, robust assembler for decades (look at the airline industry), but few people would choose to do so today; why? Because it's tedious and life is too short as it is. Further, the probability of error is greater than in a high-level language; why tempt fate?

[snip]
"This discussion should probably go to COFF, or perhaps I should just
leave the list. I am starting to feel uncomfortable here. Too much
swagger."

I read through the thread. Just because people don't agree with each
other doesn't equate to "swagger". I've seen little evidence of
anything other than reasoned analysis and rational, respectful
discussion. Was there any sort of personal attacks that I missed?

It is very difficult, in a forum like this, to divine intent. I know for a fact that I've written things to this list that were interpreted very differently than I meant them.

That said, there has definitely been an air that those who do not master manual memory management are just being lazy and that "new" programmers are unskilled. Asserting that this language or that is "ours" due to its authors while that is "theirs" or belongs solely to some corporate sponsor is a bit much. The reality is that languages and operating systems and hardware evolve over time, and a lot of the practices we took for granted 10 years ago deserve reexamination in the light of new context. There's nothing _wrong_ with that, even if it may be uncomfortable (I know it is for me).

The fact of the matter is, code written with malloc/free, if written
carefully, will run for *years*. There are Linux boxes that have been
running for literally years without being rebooted, and mainframes and
miniframes that get booted only when a piece of hardware fails.

That there exist C programs that have run for many years without faults is indisputable. Empirically, people _can_ write reliable C programs, but it is often harder than it seems to do so, particularly since the language standard gives so much latitude for implementations to change semantics in surprising ways over time. Just in the past couple of weeks a flaw was revealed in some Linux daemon that allowed privilege escalation to root...due to improper memory management. That flaw had been in production for _12 years_. Sadly, this is not an isolated incident.

That said, does manual memory management have a place in modern computing? Of course it does, as you rightly point out. So does assembly language. Rust came up in the context of this thread as a GC'd language, and it may be worth mentioning that Rust uses manual memory management; the language just introduces some facilities that make this safer. For instance, the concept of ownership is elevated to first-class status in Rust, and there are rules about taking references to things; when something's owner goes out of scope, it is "dropped", but the compiler statically enforces that there are no outstanding references to that thing. Regardless, when dealing with some resource it is often the programmer's responsibility to make sure that a suitable drop implementation exists. FWIW, I used to sit down the hall from a large subgroup of the Go developers; we usually ate lunch together. I know that many of them shared my opinion that Rust and Go are very complimentary. No one tool is right for all tasks.

        - Dan C.