What is it that drives the development and refinement of learning and understanding? While not being able to give a definite answer to this simple question, I can outline the motivation for endeavouring to advance the level of abstraction in the field of scientific computing.
From ancient times people strove to unravel the mysterious workings of the world surrounding us. From these considerations sprang what has been called philosophy, which gradually gave birth to different distinct fields of science, when they had sufficiently matured. The maturation of additional sciences brought the establishment of formalisms with which to express ideas in a clear and reproducible fashion. To this end natural sciences naturally employ abstractions which have been developed and refined in the field of mathematics. The application of mathematical principles has also lead to the spawning of machines to aid in the evaluation of the resulting mathematical formulations. The machines, now commonly known as computers, have grown rapidly in complexity, so as to become a field of research themselves, in order to provide more and more powerful tools with which to express ideas and patterns of thought in this automated setting.
At the same time the descriptions used in theoretical branches of sciences have evolved from bare basic expressions to formulations of increasing abstraction and expressive power. The increase in abstractions facilitates the treatment of a wide range of problems, but does not remove the need to finally carry out basic calculations. It is the simplest algebraic manipulation which computers are typically applied to. However, limiting computers to deal with only the lowest level of problems denies to acknowledge, and even less use, the whole evolution of abstractions developed in the course of several millennia.
However, it seems that many working with computers are reluctant and even blatantly refuse to consider employing higher levels of abstraction. The reasons seem to range from fear of squandering precious computing resources to a fear of the unknown and a refusal to learn, which while they may have some merit in a conservative industrial setting, are misplaced in anything even remotely connected to academia, which should always attempt to push the envelope of what is possible on all fronts. Nevertheless, the use of higher levels of abstractions seems to be alien to software development and is still not commonplace, despite the fact that software is itself nothing but abstraction and it is thus desirable to map mathematical abstractions of a higher level to the computational context of the machines.
To this end abstract mathematical concepts are defined for which a subsequent realization in a programming language are shown. By utilizing a conceptual approach to implementation the provided structures can transcend the primitive notions of basic data types and allow to maintain a high level of abstraction throughout all of the development cycle.
This dictates that the theoretical setting is clearly defined, which is best accomplished by providing mathematical expressions and tools. Since without the availability of mathematical terms and definitions, abstractions quickly degenerate into a vague mass of wishful thinking, considerable effort is invested to prevent this.
The approach to spend considerable effort in analysing a given problem instead of rabidly starting a frantic process of writing as much code as possible is often frowned upon and seen as unnecessarily philosophical. While it may seem preferable to some to produce enormous amounts of code of the lowest level of abstraction instead of utilizing high levels of abstraction, I find this notion abhorrently appalling. Not only does such an approach neglect the labours of previous generations of scientist, it is also a burden for any subsequent development as the sheer amounts of code become unmanageable, resulting in costly redevelopment cycles, which could have been avoided in the first place. This is not to say that higher abstractions will guarantee against redevelopment, but the lower the abstraction is, the longer it takes to decipher, as anybody digging through legacy code may already have experienced.
Therefore, I consider it as a big compliment should anyone find something he may call philosophical, as which it may not have been intended. For better or worse, philosophy is the mother of modern sciences and it would not be appropriate to break with the procedures and traditions completely, which have served philosophers to deal with the abstract and ungraspable. As is already derivable from the etymology of philosophy, it attempts to unveil the reasons behind phenomena, to develop deep understanding. It is only when we have a deep and profound understanding that we can arrive at efficient solutions applicable to a wide field of particular problems. While this has apparently already been known in ancient times 1 , it seems to be neglected in connection with the field of digital computers, where generic programming techniques are just currently emerging. Their proper development and deployment, however, is contingent on a highly abstract description, which requires more forethought compared to more traditional approaches, which can very well be described as being philosophical. The rewards for investing additional time in analysis and contemplation include greater flexibility and an even wider field of application.
Some may wonder with regard to the usefulness of anything treated here, if what has worked so far still works. However, I challenge those who ask what this is for to apply the question recursively to whatever they are doing and see if they find an answer that is neither dogmatic nor beyond all doubt. It may be called to have no use, but who, in the very end, truly has?
Doh! I wanted to leave this page blank intentionally …