Flaming Dangerzone

A Brief History of C++

Prehistorical C++

Human history begins with the invention of writing. That crucial event defines the point in time when history started being recorded. Before that lie prehistorical times.

Which crucial event in the evolution of C++ could mark a separation akin to the one between prehistory and history? I’d say that the creation of the first self-hosting compiler, Cfront, which coincides with the renaming of the language from “C with classes” to “C++”, is a good choice for this.

Prehistorical C++ is the C++ from before the creation of Cfront. It extends from the beginning of time to around 1983. At this time C++ was merely a series of preprocessor macros and had no virtual functions, no overloading, no references, no single-line comments, no const, no exceptions, no templates, no namespaces, no lambdas, and not even a bool type.

Bronze Age C++

The first records in writing are dated from around 3600 BCE. This marks the start of the period known as ancient history.

Ancient history starts with the Bronze Age, when bronze was a major tool material. The ancient civilisations of the Fertile Crescent are from this period; it’s the time of Babylonia, Phoenicia, and Ancient Egypt. This age ends around the time when usage of iron in tools became widespread, the beginning of the Iron Age.

C++’s Bronze Age starts with Cfront and ends with the STL. This period saw several new features and the publication of two editions of The C++ Programming Language, and later on of The Annotated C++ Reference Manual, in 1990.

Classical C++

The Iron Age, also known as the Classical Era, starts around 1000 BCE. During this period, the Mediterranean saw the peak of Ancient Egypt, the rise and fall of Ancient Greece, and the rise and decline of Ancient Rome. The period ends with the fall of the Western Roman Empire, around 500 CE.

For Classical C++ I chose the period that begins with the rise of the STL and ends with the first standard in 1998. The introduction of templates and the concepts from STL parallel nicely with the cultural advancements of the classical civilisations.

It might seem weird that standardization is paralleled with the fall of the Western Roman Empire, though. This choice is made primarily because it fits nicely with the idea of the C++ Middle Ages and C++ Renaissance.

Medieval C++

With the fall of the Western Roman Empire ends Ancient history and begins the Medieval period, also known as the Middle Ages. In Europe, these are the times of the Carolingian Empire, of the Crusades, and of the Black Death.

The C++ Middle Ages start with the first standard and end with C++11. C++ evolution saw some stagnation during this period. The language saw minimal changes in 2003, and stayed more or less unchanged until 2011.

The Middle Ages in human history were not devoid of progress, though. And neither were the Middle Ages of C++, despite the language undergoing no changes. Projects like Boost and TR1 kept trying new things, pushing the way of thinking in C++ forward, and working as an incubator for future C++ features. I guess we can draw parallels here between Boost and the scholastic traditions of Western Europe in the Middle Ages.

C++ Renaissance

The fall of Constantinople, the discovery of the Americas by Europeans, and the advent of moveable-type printing mark the end of the Medieval period and the beginning of the Modern history, around 1500 CE.

In Europe, Modern history starts with the Renaissance, a period marked by cultural and intellectual transformation. This period also coincides with the Age of Exploration, when Europeans set forth to explore and discover new land.

The C++ Renaissance was an idea popularised by Herb Sutter around the the release of C++11. My idea of this C++ Renaissance is not quite the same as Herb’s, though.

I see the C++ Renaissance as a period marked by cultural and intellectual transformation within the C++ community at large. Similar to the Renaissance from human history, which was in part fueled by looking back to the Classical period, the C++ Renaissance is also marked by a similar look back to Classical C++. The Rule of Zero is one such example. RAII is not a new idea in any shape or form, but C++11 triggered a wave of rediscovery. The recent infatuation with smart pointers is another symptom of that rediscovery.

There is also a parallel to be drawn with the Age of Exploration. C++11 brought a wealth of new features, and with them lots of new ground to be explored with the use of those features.

A C++ Revolution?

The Renaissance ends with the profound changes brought about by the Industrial Revolution and the French Revolution around 1800 CE.

I don’t know if we will be able to draw parallels between this period and a future period of C++ history. Maybe C++17 will finally include concepts and/or modules. Either of those features has the potential to bring profound changes. We’ll see.