Concepts, techniques and Models of Computer Programming
This is the title of the Peter Van Roy and Seif Haridi book I have been reading.
The book is well written. There is a clarity of thinking about different programming models that is expressed, (declarative, functional, dataflow, object-oriented) in which Van Roy and Haridi break down the computational model based on what key element is required in the abstract kernel language to implement the feature. I think this is a good way of thinking, and I should model this approach for the CycleFree Stuff.
The abstract kernel language is higher-level than assembly (or virtual machine code), but it lower-level than the programming language itself. For instance, the addition of explicit state and inheritance mechanisms to the kernel is needed to support object oriented programming.
I have just scanned through this book, and haven’t yet given it its full due, but it is clear to me that in the CycleFree computational model, there is a method of programming that has not been discovered and explained by Van Roy and Haridi.
They explain that the addition of explicit state and concurrency creates a dangerous programming model and their advice is to avoid using this model as much as possible. They point out that there are other concurrent programming models (dataflow with lazy execution) that are much safer. I think CycleFree brings safety to the explict state/concurrent programming model.
The overall theme of the book is that there are different programming models, and different jobs require different ways of thinking about computing. The computer scientist should know all of the models and select the right tool for the job. Their Mozart programming environment supports all of the different computing models that they have identified.
I don’t think about software quite the same way. Since I first started writing software, I have always been very visual in my thinking about code. While programming can resemble mathematics, for most of the industry jobs I have worked on, it has almost always come down to a bunch of state-full objects interacting with one-another. I have worked with many different multitasking models, low level synchronization, monitors, message passing; as well as single threaded event driven programs. Instead of many programming mechanisms, I have always prefered to use as few as possible. I endeavor to make the software structure as simple as possible and still get the job done. Mozart might be a great teaching tool, but I would hate to build a commercial system with it.
When you build a commercial system, it gets BIG and it EVOLVES. If you have many different computational models at your disposal, and many different programmers, you will get a lot of interactions between different models and styles of programming. The result invariably becomes a system that is almost impossible to decipher. This has been my commercial experience.
However, the way of reasoning about Programming Language is excellent. Discussion the Practical Programming Language Syntax, and showing how it is supported by underlying Abstract Kernel Semnatics. This needs to be done for the CycleFree model.
