macrakis@marat.osf.fr (Stavros Macrakis) (01/10/90)
(I wrote this a week ago, but apparently there were problems with the news...) Part of the problem of pinning down "fundamental concepts" of programming languages is the inevitable mixture between original motivations, internal organising principles, unusual or salient features, innovations, new implementation techniques .... For instance, the original motivation behind Prolog was "programming in logic", i.e. separating the logical structure and the control flow of a program. The organising principle is the uniform framework of clauses. Backtracking control is not original to Prolog, although it is certainly a salient feature, and indeed experienced Prolog programmers tell me that they try to avoid backtracking as much as possible, considering that the real power of Prolog is unification -- which is only practical because of highly efficient implementations. You've also got to make the distinction between experimental or research languages, the main point of which is to prove a point or try something out, and production languages, which must be useful. Successful experimental languages often evolve into production languages, and along the way lose the narrow specificity of the original concept. Compare, for instance, Common Lisp to Lisp 1.5! (And Lisp 1.5 no doubt was less "pure" already than Lisp 1.) Lisp 1.5 hardly had the notion of data type and certainly not that of record, both of which are fundamental to Common Lisp. (By the way, I would not say that dynamic scope is a fundamental concept of any Lisp -- it is more an accident: McCarthy, by his own account, hadn't really understood the lambda calculus....) The other point is that you can talk about "fundamental concept" on a variety of levels. In the area of data types, for instance, we can talk about the originality of individual languages or about philosophically similar languages. Lisp, APL, and Snobol, although based on different specific data types, represent on some level the same fundamental concept: a single data type with a full library of powerful operations. Cobol (don't forget our debt to Cobol for the 'record' concept!) and PL/I in a simple way, and Pascal and C in a more sophisticated way, compose type operators to construct special-purpose types for each program. Clu, Ada, ... construct opaque types defined only by their operators. And then we have the issue(s?) of genericity and polymorphism.... The upshot of all this is that yes, there are fundamental concepts in programming languages, but you need a whole bundle for each language, especially production languages. -s