This is a subject that I have long thought about but had yet to write about so I thought that this would be the right place to discuss this. I will warn you however that this might be a long ramble. So please get comfortable.

You may not have thought about it before but Classical Philosophy (Greek specifically) has much to say about the nature of programming languages. Two Greek writers stand out as the ones that I will talk about most today. The first is Plato who is probably one of the most famous philosophers ever. The other is his student Aristotle.

Plato in his Republic describes a notion called the "world of ideas". It goes something like this: everything in the universe has a corresponding abstract in the world of ideas. For instance, a table in the real world is just a reflection of the Table in the world of ideas. These abstracts continue to go up a hierarchy of types until you get to the ultimate type. In fact, this was a philosopher's job, according to Plato. It was the finding by dialectic of the ultimate type from which everything else derives.

If you are heavily into Object Oriented Programming. This may sound extremely familiar. In fact, I would suggest that the entire OOP paradigm is based upon Plato's "world of ideas". In Plato's famous "allegory of the cave", he describes the ultimate Object as goodness. Neo-Platonists in the second century AD would describe this ultimate Object as God. In OOP terms, this is the object from which everything else implicitly derives.

Which programming languages can be described as Platonic? I would argue that Java, Perl (because all objects derive from UNIVERSAL), and Smalltalk all fall under the Platonic description. They all have an ultimate Object from which all other objects derive. Java will pose a problem but I will return to that presently.

Now Plato's student Aristotle takes a completely different view of the universe. Rather than each object in the universe reflecting an Object in the "world of ideas", the universe is made up of descrete primative things called atoms. From these atoms, everything else in the universe is built. So for instance, to build a house, you must have all the atoms arranged in the right way to make wood. Then you have to arranged these "wood" objects into a house.

I would suggest that programming languages, which rely upon descrete primatives can be described as Aristotlean. Among these programming languages I would list: C and C++ (if there are any more which fit this description, please let me know). The reason for this is that both of these languages build larger abstractions based upon fundimental primatives such as int, float, char, etc. For instance, an array of chars makes a string rather than having a string object which represents a line of text (or many lines depending).

I understand that there may be some objections to these classifications. Like I alluded to above, Java has both an Aristotlean primitive system with int's, byte's, char's, etc. and a Platonic system based upon deriving from an ultimate base class. I would state that this has little effect since you can easily use objects to simulate the Platonic environment. Interestingly, with the addition of auto-boxing in Java 1.5, it will blur this distinction even further. (As an aside, I think that Smalltalk is the most "pure" Platonic system. Although, I do not have much experience with it.)

It is also interesting to note how Platonic programming systems almost inveriably have virtual machines to manage their environment. It seems that the only way to have a Platonic system is to have a completely separate universe pre-constructed for its sole use.

Hopefully, next time you think that a required course in Classical Philosophy has nothing to do with your computer science degree. Look very closely how Classical thought premiates the way in which you do the most modern of things, programming. I would heartily suggest that you read both Plato's Republic and Aristotles' Physics with an eye towards programming some time. It will greatly enhance your understanding of programming languages.