On 4/10/12, Jakub Jelinek <ja...@redhat.com> wrote:
> That when stepping through code in the debugger you keep
> enterring/exiting these one liner inlines, most of them really
> should be at least by default considered just as normal statements
> (e.g. glibc heavily uses artificial attribute for those, still
> gdb doesn't hide those by default).

You do want to step into those inline functions, except when you do.
In the short term, we can make the debugger behave as though they did
not exist.  In the longer term, we really want debugging tools that
help C++ programmers.  One way to get there is to use C++ ourselves.

> > The above is just quickly cooked up examples. A carefully
> > designed C++ based API can be self documenting and make the
> > client code very readable. It is hard to believe that there is
> > no room for improvement in GCC.
>
> Do you have examples?  E.g. I haven't touched gold, because,
> while it is a new C++ codebase, looks completely unreadable to
> me, similarly libdw C++ stuff.  A carefully designed C based API
> can be self documenting and make the code very readable as well,
> often more so.

If you just look at any decently sized code base, it'll look pretty
much unreadable.  The question is how quickly can someone who learns
the base vocabulary can produce reasonable modifications.

There are many places where C++ can help substantially.  For example:

() The C++ postfix member function call syntax means that following
a chain of attributes is a linear read of the expression.  With C
function call syntax, you need to read the expression inside out.

() C++ has both overloaded functions and member functions, so you can
use the same verb to talk about several different kinds of objects.
With C function names, we have to invent a new function name for
each type.  Such names are longer and burden both the author and
the reader of the code.

() Standard C++ idioms enable mashing program components with ease.
The C++ standard library is based on mixing and matching algorithms
and data structures, via the common idiom of iterators.

() The overloadable operator new means that memory can be
_implicitly_ allocated in the right place.

() Constructors and destructors reduce the number of places in the
code where you need to do explicit memory management. Without garbage
collection, leaks are less frequent.  With garbage collection, you
have much less active garbage, and can run longer between collection
runs.  Indeed, a conservative collector would be sufficient.

() Constructors and destructors also neatly handle actions that
must occur in pairs.  The classic example is mutex lock and unlock.
Within GCC, timevar operations need to happen in pairs.

() Class hierarchies (even without virtual functions) can directly
represent type relationships, which means that a debugger dump of
a C++ type has little unnecessary information, as opposed to the
present union of structs approach with GCC trees.

() Class hierarchies also mean that programmers can distinguish
in the pointer types that a function needs a decl parameter,
without having to say 'all trees' versus 'a very specific tree'.
The static type checking avoids run-time bugs.

I have written compilers in both C and C++.  I much prefer the
latter.

-- 
Lawrence Crowl

Reply via email to