On Mon, Jul 25, 2016 at 05:54:51AM -0600, ben wrote:
[...]
The other factor is that the 3 big computers at the
time IBM 360/370's PDP 10
and PDP 11 where machines when the Dragon Book came out thus you favored
register style code generators. Later you got the Pascal style one pass
generators that is still with us.
Those backend designs are completely obsolete now. Modern machines have more
grunt, so can use more complex algorithms to eke out more performance.
After that the Intel hardware mess, and the growth of
(to me useless
languages like C++ or JAVA) or features like OBJECTS has made every thing so
complex, that only few people can even understand just what a compiler is
doing.
A C++ object is a C struct, and a C++ method is a C function that has an
invisible first parameter that is a pointer to the object. The generated
machine code is bitwise identical. Dynamic dispatch muddies the water a bit,
and is equivalent to (but not usually implemented as) a function pointer in the
struct. This is not exactly rocket science.
There are more features in C++, and they tend to get overused by newcomers who
are blinded by the shinies, but it is possible to exercise good judgement to
make it *easier* to read than the equivalent C program by tucking all the
boilerplate out of the way.
PS: Has computer science really advanced since the
late 1970's? What about
hardware?
Is that a rhetorical question? I'm going to answer it anyway :)
One of my favourite bits of CS is Andrew Tridgell's PhD thesis, from 1999. The
advancement to human knowledge was his algorithm to very efficiently run a
sliding window across data using rolling checksums and compute deltas in a
network-efficient manner. This is the business end of rsync(1), and it can also
be used for data compression.
On compilation itself, there are a few interesting advances. Single Static
Assignment form was invented by IBM in the 1980s; ISTR it's covered in my 1986
edition of the Dragon Book. The essence of the idea is that variables can only
be assigned once, and since they are immutable values, it enables many very
worthwhile optimisations that wouldn't be as simple were the values liable to
change.
Functional programming is finally mainstream. Yes, Lisp has been around since
the 1950s, but it's been refined somewhat over the 2000s. It's used for
immutability (which Lisp didn't really have) and so is easier to reason about
on multi-threaded and multi-processor machines because one now doesn't need to
worry about shared mutable state.
There are *loads* of novel algorithms and techniques out there, but it seems to
take decades for them to appear in algorithm textbooks.