The Story of C++
C++
is a strong statement, but it is not an exaggeration. C++ is the
center of gravity around which all of modern programming revolves.
Its syntax and design philosophy define the essence of
object-oriented programming. Moreover, C++ charts the course for
future language development. For example, both Java and C# are
directly descended from C++. C++ is also the universal language of
programming; it is the language in which programmers share ideas with
one another.
To be a professional programmer today implies competency
in C++. It is that fundamental and that important. C++ is the gateway
to all of modern programming. Before beginning your study of C++, it
is important for you to know how C++ fits into the historical context
of computer languages.
Understanding the forces that drove its creation, the
design philosophy it represents, and the legacy that it inherits
makes it easier to appreciate the many innovative and unique features
of C++. With this in mind, this chapter presents a brief history of
the C++ programming language, its origins, and its relationship to
its predecessor (C), its uses, and the programming philosophies that
it supports. It also puts C++ into perspective relative to other
programming languages.
The Origins of C++
The story of C++ begins
with C. The reason for this is simple: C++ is built upon the
foundation of C. In fact, C++ is a superset of C. (Indeed, all C++
compilers can also be used to compile C programs!) Specifically, C++
is an expanded and enhanced version of C that embodies the philosophy
of object-oriented programming (which is described\ later in this
chapter). C++ also includes several other improvements to the C
language, including an extended set of library routines. However,
much of the spirit and flavor of C++ is inherited directly from C. To
fully understand and appreciate C++, you need to understand the “how
and why” behind C.
The Creation of C
The C language shook the computer world. Its impact
should not be underestimated
Because it fundamentally changed the way programming was
approached and thought
About. C is considered by many to be the first modern
“programmer’s language.” Prior
to the invention of C, computer languages were generally
designed either as academic
Exercises or by bureaucratic committees. C is different.
C was designed, implemented,
and developed by real, working programmers, and it
reflected the way they approached
the job of programming. Its features were honed, tested,
thought about, and rethought
by the people who actually used the language.
The result of this process was a language that
programmers liked to use. Indeed, C quickly attracted many followers
who had near-religious zeal for it, and it found wide and rapid
acceptance in the programmer community. In short, C is a language
designed by and for programmers. C was invented and first implemented
by Dennis Ritchie on a DEC PDP-11 using the UNIX operating system. C
is the result of a development process that started with an older
language called BCPL, which was developed by Martin Richards. BCPL
influenced language called B, invented by Ken Thompson, which led to
the development of C in the 1970s.
For many years, the de facto standard for C was the one
supplied with the UNIX
operating system and described in The
C Programming Language, by Brian Kernighan
and Dennis Ritchie (Prentice-Hall, 1978). However, because no formal
standard existed, there were discrepancies between different
implementations of C. To alter this situation, a committee was
established in the beginning of the summer of 1983 to work on the
creation of an ANSI (American National Standards Institute) standard
that would define—once and for all—the C language. The final
version of the standard was a dopted in December 1989, the first
copies of which became available in early 1990. This version of C is
commonly referred to as C89,
and it is the foundation upon which C++ is
built.
NOTE:
The C standard was updated in 1999 and this version of C
is usually referred to as C99.
This version contains some new features,
including a few borrowed from C++, but, overall, it is compatible
with the original C89 standard. At the time of this writing, no
widely available compiler supports C99 and it is still C89 that
defines what is commonly thought of as the C language. Furthermore,
it is C89 that is the basis for C++. It is possible that a future
standard for C++ will include the features added by C99, but they are
not part of C++ at this time.
It may seem hard to understand at first, but C is often
called a “middle-level” computer
Language. As it is applied to C, middle-level does not
have a negative connotation; it does not mean that C is less
powerful, harder to use, or less developed than a “high-level”
language, or that it is as difficult to use as assembly language.
(Assembly language, or
assembler, as it is
often called, is simply a symbolic representation of the actual
machine code that a computer can execute.) C is thought of as a
middle-level language because it combines elements of high-level
languages, such as Pascal, Modula-2, or Visual Basic, with the
functionality of assembler.
From a theoretical point of view, a high-level
language attempts to give the programmer
everything he or she could possibly want, already built into the
language. A low-level language provides
nothing other than access to the actual machine instructions. A
middle-level language gives
the programmer a concise set of tools and allows the programmer to
develop higher-level constructs on his or her own. A middle-level
language offers the programmer built-in power, coupled with
flexibility. Being a middle-level language, C allows you to
manipulate bits, bytes, and addresses—the basic elements with which
a computer functions. Thus, C does not attempt to buffer the hardware
of the machine from your program to any significant extent. For
example, the size of an integer in C is directly related to the word
size of the CPU. In most high-level languages there are built-in
statements for reading and writing disk files. In C, all of these
procedures are performed by calls to library routines and not by
keywords defined by the language. This approach increases C’s
flexibility. C allows—indeed, needs—the programmer to define
routines for performing high-level operations. These routines are
called functions, and
they are very important to the C language. In fact, functions are the
building blocks of both C and C++. You can easily tailor a library of
functions to perform various tasks that are used by your program. In
this sense, you can personalize C to fit your needs.
There is another aspect of C that you must understand,
because it is also important
to C++: C is a structured language. The most
distinguishing feature of a structured language is that it uses
blocks. A block is a
set of statements that are logically connected. For example, imagine
an IF statement that, if successful, will execute five discrete
statements. If these statements can be grouped together and
referenced as an indivisible unit, then they form a block. A
structured language supports the concept of subroutines with local
variables. A local variable is
simply a variable that is known only to the subroutine in which it is
defined. structured language also supports several loop constructs,
such as while,
do-while, and for.
The use of the go to
statement, however, is either prohibited or
discouraged, and is not the common form of program control in the
same way that it is in traditional BASIC or FORTRAN. A structured
language allows you to indent statements and does not require a
strict field concept (as did early versions of FORTRAN).Finally, and
perhaps most importantly, C is a language that stays out of the way.
The underlying philosophy of C is that the programmer, not the
language, is in charge. Therefore, C will let you do virtually
anything that you want, even if what you tellit to do is unorthodox,
highly unusual, or suspicious. C gives you nearly complete control
over the machine. Of course, with this power comes considerable
responsibility, which you, the programmer, must shoulder.
Understanding
the Need for C++
Given the preceding
discussion of C, you might be wondering why C++ was invented.Since C
is a successful and useful computer programming language, why was
therea need for something else? The answer is complexity. Throughout
the history of programming, the increasing complexity of programs has
driven the need for better ways to manage that complexity. C++ is a
response to that need. To better understand this correlation,
consider the following. Approaches to programming have changed
dramatically since the invention of the computer. The primary reason
for change has been to accommodate the increasing complexity of
programs. For example, when computers were first invented,
programming was done by toggling in the binary machine instructions
using the computer’s front panel.
As long as programs were
just a few hundred instructions long, this approach worked. As
programs grew, assembly language was invented so that programmers
could deal with larger, increasingly complex programs by using
symbolic representations of the machine instructions. As programs
continued to grow, high-level languages were developed to give
programmers more tools with which to handle complexity. The first
widespread language was, of course, FORTRAN. While FORTRAN was a very
impressive first step, it is hardly a language that encourages clear,
easy-to-understand programs. The 1960s gave birth to structured
programming. This is the method of programming supported by languages
such as C.
With structured
languages, it was, for the first time, possible to write moderately
complex programs fairly easily. However,
even with structured programming methods, once a project reaches a
certain size, its complexity exceeds what a programmer can manage. By
the late 1970s, many projects were near or at this point. To solve
this problem, a new way to program began to emerge. This method is
called object-oriented
programming (OOP for short). Using OOP, a
programmer could handle larger programs.
The trouble was that C
did not support object-oriented
programming. The desire for an object-oriented version of C
ultimately led
to the creation of C++. In the final analysis, although C is one of
the most liked and widely used professional programming languages in
the world, there comes a time when its ability to handle complexity
reaches its limit. The purpose of C++ is to allow this barrier to be
broken and to help the programmer comprehend and manage larger, more
complex programs.
C++ Is Born
In response to the need to manage greater complexity,
C++ was born. It was invented by Bjarne Stroustrup in 1979 at Bell
Laboratories in Murray Hill, New Jersey. He initially called the new
language “C with Classes.” However, in 1983 the name was changed
to C++. C++ contains the entire C language. As stated earlier, C is
the foundation upon which C++ is built. C++ includes all of C’s
features, attributes, and benefits. It also adheres to C’s
philosophy that the programmer, not the language, is in charge. At
this point, it is critical to understand that the invention of C++
was not an attempt to create a new programming language. Instead, it
was an enhancement to an already highly successful language.
Most of the additions that Stroustrup made to C were
designed to support object-oriented programming. In essence, C++ is
the object-oriented version of C. By building upon the foundation of
C, Stroustrup provided a smooth migration path to OOP. Instead of
havingto learn an entirely new language, a C programmer needed to
learn only a few new features to reap the benefits of the
object-oriented methodology. But C is not the only language that
influenced C++. Stroustrup states that some ofits object-oriented
features were inspired by another object-oriented language called
Simula67. Therefore, C++ represents the blending of two powerful
programming methods.
When creating C++,
Stroustrup knew that it was important to maintain the original spirit
of C, including its efficiency, flexibility, and philosophy, while at
the same time adding support for object-oriented programming.
Happily, his goal was accomplished. C++ still provides the programmer
with the freedom and control of C, coupled with the power of objects.
Although C++ was initially designed to aid in the management of very
large programs, is in no way limited to this use. In fact, the
object-oriented attributes of C++ can be effectively applied to
virtually any programming task. It is not uncommon to see C++ used
for projects such as compilers, editors, programmer tools, games, and
networking programs. Because C++ shares C’s efficiency, much
high-performance systems software is constructed using C++. Also, C++
is frequently the language of choice for Windows programming. One
important point to remember is this: Because C++ is a superset of C,
once you can program in C++, you can also program in C! Thus, you
will actually be learning two programming languages at the same time,
with the same effort that you would use to learn only one.
The Evolution of C++
Since C++ was first invented, it has undergone three
major revisions, with each revision adding to and altering the
language. The first revision was in 1985 and the second occurred in
1990. The third revision occurred during the C++ standardization
process. In the early 1990s, work began on a standard for C++.
Towards that end, a joint ANSI and ISO (International Standards
Organization) standardization committee was formed. The first draft
of the proposed standard was created on January 25, 1994. In that
draft, the ANSI/ISO C++ committee (of which I was a member) kept the
features first defined by Stroustrup and added some new ones as well.
But, in general, this initial draft reflected the state of C++ at the
time.
Soon after the completion of the first draft of the C++
standard, an event occurred that caused the standard to expand
greatly: the creation of the Standard Template Library (STL) by
Alexander Step a now. As you will learn, the STL is a set of generic
routines that you can use to manipulate data. It is both powerful and
elegant. But the STL is also quite large. Subsequent to
Therefore, the code and information in this book is fully applicable
to all modern C++ environments.
No comments:
Post a Comment