There's a great article by Greg Colvin over at Artima on the Spirit of C. I'm a little indignant about some of his comments about Java on the third page (it pains me to count Java in C's lineage), but the article as a whole is very enjoyable.
The article is also very well written. Colvin weaves a discussion of typing throughout, and recounts the transition from B's typeless nature, to adding types in C and more in C++, to adding templates (generics) in C++, and continues on to discuss future possibilities for type inference that could bring C++, or another language such as D, back to the feel of typelessness that the C family of languages lost in their transition from B. His discussion of Java didn't have anything much to add to this thread in the article, which was another reason I disliked that part of it. However, the type inference mentioned is currenly a staple of languages in the ML family, and his account of the evolution of these languages makes it feel as if ML-style type inference will inexorably work its way into more mainstream languages over time.
There's also this neat tidbit about C++'s templates:
Although object-orientation was the initial motivation for extending C to C++, the most powerful extension has turned out to be the generic programming facility provided by templates. Templates were introduced to allow for type-safe containers, so that one could define a class like list<T> just once and then use it for any kind of list element. But in 1994 Erwin Unruh brought an innocent-looking little program to Santa Cruz that failed to compile, but caused the compiler to generate a sequence of prime numbers in its diagnostic output. I recall being mystified, then amused, then horrified. By introducing templates we had inadvertently added a Turing- complete meta-language to C++. At that point we could have restricted the template facility to prevent such meta-programming, but instead we took a gamble and embraced it, which cost us no end of pain as the impact of templates rumbled through the language and library.
If type inference doesn't make it into the mainstream, I'll be very disappointed. Now, all I want is some form of polymorphism added to the mix so that in something like:
fun blah x y =
x * y;;
x and y denote numbers as opposed to integers or floats.