
Bjarne Stroustrup skapade programspråket C++ 1979. Men varför då? Samt, vilka programspråk fanns innan dess och bidrog till utformningen av C++. Dessa frågor, och några till, ska jag besvara i denna artikel.
Hela händelsekedjan jag kommer att beskriva utspelar sig på Bell Labs, som var vid denna tiden (1960-talet och 1970-talet) ett forskningscentra för telefonbolaget AT/T.
Det började med att Ken Thompson i slutet på 1960-talet utvecklade språket B, som var en kraftigt nedbantad version av språket BCPL (Basic Combined Programming Language). Målsättningen med B var att fungera som implementationsspråk för operativsystemet Multics (Multiplexed Computing System).
Utmärkande för språket B, var att det bara fanns en datatyp, nämligen machine word. Beroende på kontext så kunde det tolkas som ett heltal eller en adress i minnet. Så här kunde ett litet program se ut:
compute(a, x, b) {
auto result;
result = a * x + b;
return result;
}
main() {
extrn printf, compute;
auto answer;
answer = compute(5, 6, 12);
printf("the answer to everything is %d*n", answer);
}
En lokal variabel deklarerades med auto
, vilket stod för automatic storage. Termen hänför sig till att minnes blocket för en lokal variabel allokerades automatiskt i samband med funktionsanropet och deallokerades i samband med funktionsretur. Under 1960-talet var stackbaserade programspråk en stor nyhet. Vare sig COBOL eller tidiga versioner av FORTRAN hade stackbaserad exekvering.
I början på 1970-talet började utvecklingen av operativsystemet Unics (Uniplexed Computing System). Något senare ändrades stavningen till UNIX. Dennis Ritchie var inte nöjd med B, eftersom det saknades stöd för datatyper. Han designade och byggde vidare på språket och kallade det först B with types, sedemera kallat C. Språket C har sedan början av 1970-talet varit omåttligt populärt för maskinnära programmering. Så här kunde ett program se ut på den tiden:
#include <stdio.h>
double compute(a, x, b)
int a, b;
float x;
{
double result;
result = a * x + b;
return result;
}
void main(argc, argv)
int argc;
char* argv[];
{
double compute();
int answer;
answer = (int)compute(5, 6, 12);
printf("the answer to everything is %d\n", answer);
}
Här ovan ser vi att lokala variabler har explicit typning, samt att funktionsparametrar och returtyp ävenså. Du kanske undrar över varför en funktion inte skrevs som vi gör nuförtiden: double compute(int a, float x, int b)
. Skälet är Bjarnes förtjänst med C++ och man uppdaterade syntaxen för C i slutet på 1980-talet i enlighet med syntaxen för C++.
I mitten på 1970-talet var Bjarne Stroustrup klar med sina studier på Århus universitet i Danmark. Han hade då programmerat mycket i språket SIMULA (Simulation Language) och skrivit stora simuleringsprogram. Simula skapades under 1960-talet av Ole-Johan Dahl och Kristen Nygaard på Norsk Regnesentral och lade grunden för det vi idag förknippar med objekt-orienterad programmering, såsom klasser, arv och funktionsanrop med dynamisk binding. Så här kunde ett SIMULA program se ut:
BEGIN
INTEGER answer;
REAL x;
REAL PROCEDURE compute(a, x, b);
INTEGER a, b;
REAL x;
BEGIN
compute := a * x + b;
END;
x := 6.0;
answer := ENTIER( compute(5, x, 12) );
OutText("the answer to everything is ");
OutInt(answer, 0);
OutImage;
END;
Bjarnes uppgift var att skriva simuleringssystem för Bell Labs. Kruxet för Bjarne var att allt som behövdes för objekt-orienterad programmering saknades helt i C. Därför skrev han en pre-processor med namnet cfront
, som konverterade programkoden till vanlig C. I början kallade han språket bara för C with Classes. Det var först efter några år och det börjat bli populärt, som kollegan Rick Mascitti hittade på namnet C++.
Bjarne utökade struct
syntaxen med medlemsfunktioner, vilket senare blev till class
. Han införde referenser som en typsäkrare form av pekare, arv och dynamisk bindning, operator-överlagring och mycket mer. Så här kunde ett C++ program se ut på den tiden:
#include <iostream>
double compute(int a, float x, int b) {
return a * x + b;
}
int main(int argc, char* argv[]) {
int answer = int( compute(5, 6, 12) );
cout << "the answer to everything is " << answer << "\n";
}
Under det senaste decenniet, med start 2011, har C++ evolverat i rasande takt och blivit ett mycket modern och faktiskt hippt programspråk. En ny standard kommer var tredje år och den senaste heter C++23. Så här kan ett modernt C++ program se ut, vilket använder modules:
//file: compute.ixx
export module compute;
export double compute(int a, float x, int b) {
return a * x + b;
}
//file: main.cxx
import compute;
import std.io;
int main() {
auto answer = static_cast<int>( compute(5, 6, 12) );
std::cout << "the answer to everything is " << answer << "\n";
}