Has the evolution of computer hardware influenced programming languages throughout history? Or vice versa?

The design of a computer system is a tradeoff between computer hardware cost-performance on the one hand and accessible programming functionality on the other. This trade off is reflected in the mutual influences between computer hardware design and programming languages and techniques.

Generally speaking, the trends of the hardware evolution never have direct effects on the evolution of programming language. The design of hardware and the design of programming language have never been combined or cooperative procedures. It is a common observation that with the improvement of computer hardware cost-performance ratio, programming languages tend to be more complex and less efficient.

However, it is not the trends in hardware evolution that affect the complexity and efficiency of programming languages. Programming languages are in their nature being developed to be more complex in accordance with the growth of the complexity of the problem we tend to cope with. Also, programming language designers have to sacrifice the efficiency of programming languages for a better program readability, modularity, and reusability.

What we can say is that with the decreasing cost and increasing speed of hareware we simply can afford the programming language to be more complex and tolerate the programming language to be less efficient.

Also, it is not that code efficiency is not as important an issue any more. Efficiency should always be the primary concern of programming language designers. First, the size and complexity of the problems we would like to deal with grow faster than the developing of hardware technologies, so we seem never have enough computing power to "waste". Second, at any time, efficient use of computing facility could yield a better productivity.


A primary concern of the hardware designer is with the functionality provided to the programming user and programming language compiler. The functionality is affected directly by the selection of an instruction set for the computer. A determinant factor of the instruction set efficiency is its usefulness to the compiler code generator and hardware implementation consideration. Although the actual performance differences in instruction set efficiency are slight, these differences still stir passions among hardware designers. Within the past decade, there has been a continuing debate over the cost-performance benefits of the RISC instruction sets over earlier instruction sets labeled CISC. Also, the issues are not ones simply of selecting new instructions and the ramifications thereof, but rather more subtle issues such as compatibility with older instruction sets no longer useful in the context of new applications, but whose functionality must be available to run old programs. However, RISC does not directly affect programming language, but it does make the life of compiler designer easier.


During the early days of the computer, hardware was very expensive and the system resources available to the programmers were fairly limited, especially in the term of main memory. In some early versions of C, programmers had to use such key words as NEAR and FAR to distinguish pointers to within-segment memory address from pointers to beyond-segment memory address. This was a huge burden to programmers. The demand of transparent access to large programmable memory spaces inspired the design of virtual memory management, which was a significant accomplishment of both hardware and software designers. This ability of the hardware to reference very large address spaces contained on disk in a manner that is transparent to the user enabled combinations of very large software programs to be available on a single processor platform, and provided the programmers with ample arena of creativity.


With the fast declining cost and increasing performance of the computer hardware, cost of software development became a significant part of the computer system cost. Thus, programming productivity becomes a more and more important issue, which leads to the idea of sharing programs across different hardware platforms to save time and cost on program development. The initial impetus went to designs of compatible families of machines such as IBMís System 360, which offered many cost-performance design points all sharing a common instruction set. Since the software was compatible across all implementations, this enormously improved the accessibility of users to shared programs. However, the nature of the evolution of the computer tends to favor the co-existing and competition among versatile hardware platforms and it is unpractical that all of these platforms can be unified. With the development of internet and web computing, the sharing of programs across heterogeneous platforms, the establishing of an unified programming and computing environment across the fundamentally heterogeneous world wide web become critical issues, which lead to the booming of brand new programming languages such as Java. Java may be not distinct in its way of programming, but it is definitely distinguished in the execution of its programs on different hardware platforms available at present or may not even exist right now. Another possible trend is the popularity of script language on the Internet. Script languages, such as JavaScript and Perl, have the merits of easy programming, modifying, and maintaining. With the availability of more and more powerful computing facilities, script languages executed by interpreter may be practical again.


Generally speaking, with the impressive improvement of computer hardware on cost-performance issue, programming languages tend to be more complex and less efficient. Since the cost-performance ratio of computer hardware tends to maintain its trend of fast improving, the programming language designer might as well take advantage of this to design the programming language with a little bit less efficiency but good readability, reusability, and program structure. However, it should still be kept in mind by the language designers that simplicity and efficiency are always the primary concerns because the magnitude of the size and complexity of the tasks we tend to deal with is growing faster than the cost-effectiveness of the computer.


Another architectural improvement that call for the innovation of programming language is parallel and distributed computing, which is becoming more practical because of the decreasing of the hardware cost and the fast developing of the computer network. New programming languages that can support this kind of computing activities are in great demand. There are currently two approaches to this special issue. One is to adapt currently available popular programming languages, for example C and FORTRAN, and equip them with special library. The results are parallel and distributed programming languages like CC++, pC++, and HPF (High Performance Fortran). Another approach is to design conceptually new language that exploit the fundamental principle of parallel and distributed computing. The results are programming languages like Linda.

Questions and Answers


[1] Michael J. Flynn. Introduction to "Influence of Programming Techniques on the Design of Computers". Proceedings of the IEEE, pp. 467 - 469, VOL. 85, NO. 3, March 1997.

[2] C. A. R. Hoare. Hints on programming language design. In A. I. Wasserman, editor, Tutorial Programming Language Design, pp. 43 - 52, IEEE, Oct. 1980.