Programming Languages: where I've been and where they are going

Trying out new programming languages seems to be a common theme throughout my programming career. I have picked up quite a few over the years, but not as many as some people. Most CS types seem to learn a dozen or more languages, and once you get the hang of it, another new language is no problem. My purpose in exploring new languages has not been deeply concerned with their formal syntax and semantics as much as with their general capabilities - what people can effectively do with them.

My purpose in giving this brief history of my personal programming language experience is to show I know what I am talking about when you get to the argument at the bottom about the future of programming languages.

Despite the fact that I have done nothing with declarative languages such as Prolog (other than course assignments), I believe they are the future of programming. The Japanese were correct, but too far ahead of the curve. The history of programming language development reflects the support for increasingly more complex and higher levels of abstraction. Software can do more complex things by taking advantage of the power provided by libraries, operating systems, and distributed services. This means that a programmer says less and less about exactly how to do something, which is equivalent to stating programs in a more and more declarative style.

We have a long way to go before we get to the level of declarative abstraction in Prolog, and in fact, we are likely to never reach pure declarative programs as a general practice. Consider how Prolog itself is not purely declarative since it includes a few imperative constructs. This is similar to the non-purity of practical, functional programming languages. It is certainly possible to program in a pure (declarative, functional, ) language but it tends to be impractical except for very constrained applications.

Another trend is that highly specialized langauges for specific domains will continue to be created. Similarly, libraries for specific domains are written with function calls as the main interface; these libraries effectively extend the languages they may be used with. Lisp macros are more obviously extensions of the language, and whole new languages have been written with macros. But note that all these specialized languages, with their specialized runtime system or libraries, are essentially declarative in that the programmer simply calls a routine and the implementation of the routine can carry out the request however it wants.

One thing that we need more of is declarative semantics to specify what a routine is expected to do. The types of the arguments and results returned, supported by most typed languages, are a form of declaration. Some languages support pre and post conditions for routines, which is a large step further. Sufficiently complete pre and post conditions could be executable in the Prolog sense, or compilable to executable code.

But in general, there may be a large gap between the statement of a goal (a declaration) and the starting point. A path to reach a goal may be difficult to find, and thus the creative intelligence of human programmers steps in to help the system out with some explicit pointers. A sufficiently smart compiler for a purely declarative language must be artificially intelligent (and creative). Not an easy goal itself.


Daniel LaLiberte (liberte@ncsa.uiuc.edu)
Last modified: Fri May 23 15:36:37 CDT 1997