Thanks for this post; the importance of Alan Kay's work can hardly be overstated. Here's another quote by him that I find interesting:
I invented the term Object-Oriented and I can tell you I did not have C++ in mind.
Whether or not you share the disdain for C++ that is implicit in this quote, I believe it is important to understand the difference between the way OO was originally conceived of and the way C++ interprets it. I believe the best way to understand the difference is to look at object-variable binding. Smalltalk and almost every other OO language that followed it uses reference semantics: the assignment
x = y
causes the variable x to release its binding to whatever object it is currently referring to, and to refer to the object that y is referring to instead. C++, on the other hand, is pretty much the only OO language that uses value semantics: the intended meaning of the assignment
x = y
is to copy the state of the object to which y is referring over to the object to which x is referring. The older and wiser I get the more I am inclined to believe that this attempt to marry OO and value semantics was an experiment that has failed. Even if you do not believe this, you'd have to admit that the collective amount of time and effort that the C++ community has spent on dealing with the assignment operator is simply staggering. (I would have made that last statement even two years ago, and now we have rvalue refereces.)
The object model of C++ is almost entirely from Simula rather than from smalltalk. The object model of Simula is less dynamic and the language itself is based on Algol rather than being built from scratch like Smalltalk. In many ways, Simulas rather than Smalltalks object model has been the most influential, through C++ and later Java and C#.
Yeah, but Java has primitives and thus value semantics you mention. Also, Java is much cleaner than c++ and on the scale of object-ness, java ranks higher than c++ but only a little bit.
True, Java has primitives, but I believe it is pretty much decided that they will be discontinued beginning with Java 8. (The fact that the wrapper classes like Double and Integer are immutable makes them behave sort of as if they had value semantics, but that's really an orthogonal issue.)
I invented the term Object-Oriented and I can tell you I did not have C++ in mind.
Whether or not you share the disdain for C++ that is implicit in this quote, I believe it is important to understand the difference between the way OO was originally conceived of and the way C++ interprets it. I believe the best way to understand the difference is to look at object-variable binding. Smalltalk and almost every other OO language that followed it uses reference semantics: the assignment
x = y
causes the variable x to release its binding to whatever object it is currently referring to, and to refer to the object that y is referring to instead. C++, on the other hand, is pretty much the only OO language that uses value semantics: the intended meaning of the assignment
x = y
is to copy the state of the object to which y is referring over to the object to which x is referring. The older and wiser I get the more I am inclined to believe that this attempt to marry OO and value semantics was an experiment that has failed. Even if you do not believe this, you'd have to admit that the collective amount of time and effort that the C++ community has spent on dealing with the assignment operator is simply staggering. (I would have made that last statement even two years ago, and now we have rvalue refereces.)