I think another part of it was people wanted to go on using systems the way they had been, with the operating system being a base layer on which things happen, which does not exist as a foundation for building a different system. To create code, you put it in files, files go in directories, you compile it into a static executable, which becomes temporarily dynamic when executed, and then goes back to being static when it exits, because it was based on a static image. The OS makes it difficult for the executable to update the state of its own image, assuming that trying to do so is a mistake. You run it on top of the OS, not in the OS, not part of it. It's the recapitulation of the application metaphor, where the app. only exists while someone is using it, and then all its state goes away when they're done with it, unless a small piece of it is serialized (unpacked into raw bytes, with no meta-code) for later retrieval. With that kind of setup, the thinking is there's no need for inter-entity relationships that become part of the larger whole, though eventually people wanted applications systems with capabilities, and so more cruft got added onto the pile, trying to create versioned late-binding in the midst of a system designed for abstract data types.
When I talk to people about OOP, I explicitly try to distinguish it from ADTs and systems like I've described above, though I'm at a bit of a loss to come up with a phrase for what to call languages that people commonly call "OO." I've sometimes called them procedural languages, with an extra layer of scoping, or that work with ADTs, but that's a mouthful.
I think another part of it was people wanted to go on using systems the way they had been, with the operating system being a base layer on which things happen, which does not exist as a foundation for building a different system. To create code, you put it in files, files go in directories, you compile it into a static executable, which becomes temporarily dynamic when executed, and then goes back to being static when it exits, because it was based on a static image. The OS makes it difficult for the executable to update the state of its own image, assuming that trying to do so is a mistake. You run it on top of the OS, not in the OS, not part of it. It's the recapitulation of the application metaphor, where the app. only exists while someone is using it, and then all its state goes away when they're done with it, unless a small piece of it is serialized (unpacked into raw bytes, with no meta-code) for later retrieval. With that kind of setup, the thinking is there's no need for inter-entity relationships that become part of the larger whole, though eventually people wanted applications systems with capabilities, and so more cruft got added onto the pile, trying to create versioned late-binding in the midst of a system designed for abstract data types.
When I talk to people about OOP, I explicitly try to distinguish it from ADTs and systems like I've described above, though I'm at a bit of a loss to come up with a phrase for what to call languages that people commonly call "OO." I've sometimes called them procedural languages, with an extra layer of scoping, or that work with ADTs, but that's a mouthful.