
CONTENTS 3
that system is the first task. As a result it is almost impossible to find a
UNIX system without support for C, so the software vendors who want to
target the UNIX marketplace find that C is the best bet if they want to get
wide coverage of the systems available. Realistically, C is the first choice for
portability of software in the UNIX environment.
C has also gained substantially in use and availability from the explosive
expansion of the Personal Computer market. C could almost have been
designed specifically for the development of software for the PC–developers
get not only the readability and productivity of a high-level language, but
also the power to get the most out of the PC architecture without having
to resort to the use of assembly code. C is practically unique in its ability
to span two levels of programming; as well as providing high-level control of
flow, data structures and procedures–all of the stuff expected in a modern
high-level language–it also allows systems programmers to address machine
words, manipulate bits and get close to the underlying hardware if they
want to. That combination of features is very desirable in the competitive
PC software markeplace and an increasing number of software developers
have made C their primary language as a result.
Finally, the extensibility of C has contributed in no small way to its popular-
ity. Many other languages have failed to provide the file access and general
input-output features that are needed for industrial-strength applications.
Traditionally, in these languages I/O is built-in and is actually understood
by the compiler. A master-stroke in the design of C (and interestingly, one
of the strengths of the UNIX system too) has been to take the view that if
you don’t know how to provide a complete solution to a generic requirement,
instead of providing half a solution (which invariably pleases nobody), you
should allow the users to build their own. Software designers the world over
have something to learn from this! It’s the approach that has been taken
by C, and not only for I/O. Through the use of library functions you can
extend the language in many ways to provide features that the designers
didn’t think of. There’s proof of this in the so-called Standard I/O Library
(stdio), which matured more slowly than the language, but had become a
sort of standard all of its own before the Standard Committee give it official
blessing. It proved that it is possible to develop a model of file I/O and as-
sociated features that is portable to many more systems than UNIX, which
is where it was first wrought. Despite the ability of C to provide access to
low-level hardware features, judicious style and the use of the stdio package
results in highly portable programs; many of which are to be found running
on top of operating systems that look very different from one another. The
nice thing about this library is that if you don’t like what it does, but you
have the appropriate technical skills, you can usually extend it to do what