Geschichte der C-Sprache. §1 Allgemeine Informationen zur Sprache. Phasen der Programmgestaltung. Anwendungslebenszyklusmodelle Wer hat die Programmiersprache C erfunden?

Programmiersprache C++

Letzte Aktualisierung: 28.08.2017

Die Programmiersprache C++ ist eine statisch typisierte, kompilierte Allzweck-Programmiersprache auf hoher Ebene, die sich zum Erstellen einer Vielzahl von Anwendungen eignet. C++ ist heute eine der beliebtesten und am weitesten verbreiteten Sprachen.

Es hat seine Wurzeln in der Sprache C, die 1969–1973 in den Bell Labs vom Programmierer Dennis Ritchie entwickelt wurde. In den frühen 1980er Jahren entwickelte der dänische Programmierer Bjarne Stroustrup, der damals bei Bell Labs arbeitete, C++ als Erweiterung der C-Sprache. Tatsächlich hat C++ anfangs lediglich die C-Sprache um einige objektorientierte Programmierfunktionen ergänzt. Und deshalb nannte Stroustrup es selbst zunächst „C mit Klassen“.

Anschließend neue Sprache begann an Popularität zu gewinnen. Es wurden neue Funktionen hinzugefügt, die es nicht nur zu einer Ergänzung von C, sondern zu einer völlig neuen Programmiersprache machten. Infolgedessen wurde „C mit Klassen“ in C++ umbenannt. Und von da an begannen sich beide Sprachen unabhängig voneinander zu entwickeln.

C++ ist eine leistungsstarke Sprache, die umfangreiche Speicherfunktionen von C erbt. Daher findet C++ häufig Verwendung in der Systemprogrammierung, insbesondere bei der Erstellung von Betriebssystemen, Treibern, verschiedenen Dienstprogrammen, Antivirenprogrammen usw. Übrigens ist das Windows-Betriebssystem größtenteils in C++ geschrieben. Aber nur Systemprogrammieranwendung dieser Sprache nicht limitiert. C++ kann in Programmen jeder Ebene verwendet werden, bei denen Geschwindigkeit und Leistung wichtig sind. Es wird oft zum Erstellen verwendet grafische Anwendungen, verschiedene Anwendungsprogramme. Es wird auch besonders oft verwendet, um Spiele mit reichhaltiger, reichhaltiger Visualisierung zu erstellen. Außerdem in In letzter Zeit Die mobile Richtung gewinnt an Dynamik, wo auch C++ seine Anwendung gefunden hat. Und selbst in der Webentwicklung können Sie C++ verwenden, um Webanwendungen oder einige unterstützende Dienste zu erstellen, die Webanwendungen bedienen. Im Allgemeinen ist C++ eine weit verbreitete Sprache, in der Sie nahezu jede Art von Programm erstellen können.

C++ ist eine kompilierte Sprache, was bedeutet, dass der Compiler den C++-Quellcode in eine ausführbare Datei übersetzt, die eine Reihe von Maschinenanweisungen enthält. Da jedoch unterschiedliche Plattformen ihre eigenen Eigenschaften haben, können kompilierte Programme nicht einfach von einer Plattform auf eine andere übertragen und dort ausgeführt werden. Auf der Quellcodeebene sind C++-Programme jedoch weitgehend portierbar, sofern nicht einige betriebssystemspezifische Funktionen verwendet werden. Und die Verfügbarkeit von Compilern, Bibliotheken und Entwicklungstools für fast alle gängigen Plattformen ermöglicht es Ihnen, denselben C++-Quellcode in Anwendungen für diese Plattformen zu kompilieren.

Im Gegensatz zu C können Sie mit der Sprache C++ Anwendungen in einem objektorientierten Stil schreiben und ein Programm als Sammlung von Klassen und Objekten darstellen, die miteinander interagieren. Dies vereinfacht die Erstellung großer Anwendungen.

Hauptstadien der Entwicklung

1979-80 entwickelte Bjarne Stroustrup eine Erweiterung der C-Sprache – „C with Classes“. 1983 wurde die Sprache in C++ umbenannt.

Im Jahr 1985 erschien die erste kommerzielle Version der Sprache C++ sowie die Erstausgabe des Buches „The C++ Programming Language“, das die Erstbeschreibung dieser Sprache in Ermangelung eines offiziellen Standards darstellte.

1989 wurde eine neue Version der Sprache C++ 2.0 veröffentlicht, die eine Reihe neuer Funktionen enthielt. Danach entwickelte sich die Sprache bis 2011 relativ langsam. Doch gleichzeitig wurde 1998 der erste Versuch unternommen, die Sprache durch die ISO-Organisation (International Organization for Standardization) zu standardisieren. Der erste Standard hieß ISO/IEC 14882:1998, kurz C++98. Anschließend wurde im Jahr 2003 eine neue Version des C++03-Standards veröffentlicht.

Im Jahr 2011 wurde der neue C++11-Standard veröffentlicht, der viele Ergänzungen enthielt und die C++-Sprache um eine Vielzahl neuer Funktionalitäten bereicherte. Daraufhin wurde 2014 eine kleine Ergänzung des Standards, auch bekannt als C++14, veröffentlicht. Und eine weitere wichtige Veröffentlichung der Sprache ist für 2017 geplant.

Compiler und Entwicklungsumgebungen

Um Programme in C++ zu entwickeln, benötigen Sie einen Compiler – er übersetzt den Quellcode in C++ in eine ausführbare Datei, die Sie dann ausführen können. Aber im Moment gibt es viele verschiedene Compiler. Sie können sich in verschiedenen Aspekten unterscheiden, insbesondere in der Umsetzung von Standards. Eine grundlegende Liste von Compilern für C++ finden Sie auf Wikipedia. Für die Entwicklung wird empfohlen, diejenigen Compiler auszuwählen, die die neuesten Standards entwickeln und implementieren. Daher werden wir in diesem Tutorial hauptsächlich den frei verfügbaren g++-Compiler verwenden, der vom GNU-Projekt entwickelt wurde.

Sie können zum Erstellen von Programmen auch IDEs wie Visual Studio, Netbeans, Eclipse, Qt usw. verwenden.

Was ist der Grund für diesen Status der C-Sprache? Historisch gesehen ist diese Sprache untrennbar mit dem Betriebssystem Unix verbunden, das nun seine Wiedergeburt erlebt. Die 60er Jahre waren die Ära der Entstehung von Betriebssystemen und höheren Programmiersprachen. Zu dieser Zeit wurden Betriebssysteme und Compiler für jeden Computertyp unabhängig entwickelt und oft sogar eigene Programmiersprachen (denken Sie beispielsweise an PL/I). Gleichzeitig ist die Gemeinsamkeit der in diesem Fall auftretenden Probleme bereits offensichtlich geworden. Die Reaktion auf das Bewusstsein dieser Gemeinsamkeit war der Versuch, ein universelles Mobiltelefon zu schaffen Betriebssystem, und dafür brauchten wir eine ebenso universelle und mobile Programmiersprache. C wurde zu einer solchen Sprache, und Unix wurde das erste Betriebssystem, das fast vollständig in einer Hochsprache geschrieben war.

Die enge Verbindung mit Unix verschaffte der C-Sprache ein Testfeld, das zu dieser Zeit keine andere Sprache hatte. Probleme der Systemprogrammierung galten damals zu Recht als die schwierigsten in der Branche. Sie waren größtenteils so maschinenabhängig, dass viele nicht einmal daran dachten, sie anders als in Assembler zu lösen. Hochsprachen waren für die Anwendungsprogrammierung gedacht und implementierten nur sehr begrenzte Funktionen, die für die Systemarbeit notwendig waren, und oft auch nur für bestimmter Typ Autos

Die Sprache C wurde von Anfang an so konzipiert, dass Systemaufgaben darin geschrieben werden können. Die Erfinder von C haben kein abstraktes Modell des Sprachausführers entwickelt, sondern einfach die Fähigkeiten darin implementiert, die in der Praxis der Systemprogrammierung am meisten benötigt werden. Dabei handelte es sich in erster Linie um Mittel der direkten Arbeit mit dem Gedächtnis, strukturelle Kontrollstrukturen und die modulare Organisation des Programms. Und im Wesentlichen war nichts anderes in der Sprache enthalten. Alles andere wurde in die Laufzeitbibliothek gestellt. Kritiker bezeichnen die C-Sprache daher manchmal als strukturellen Assembler. Aber egal, was sie sagten, der Ansatz erwies sich als sehr erfolgreich. Dank ihm wurde ein neues Niveau in Bezug auf Einfachheit und Sprachfähigkeit erreicht.

Es gibt jedoch noch einen weiteren Faktor, der den Erfolg der Sprache bestimmt. Die Macher trennten darin sehr geschickt maschinenabhängige und unabhängige Eigenschaften. Dadurch können die meisten Programme universell geschrieben werden – ihre Leistung hängt nicht von der Prozessor- und Speicherarchitektur ab. Einige hardwareabhängige Teile des Codes können in separaten Modulen lokalisiert werden. Und mithilfe eines Präprozessors können Sie Module erstellen, die bei der Kompilierung auf verschiedenen Plattformen den entsprechenden maschinenabhängigen Code generieren.

Die Syntax der C-Sprache hat viele Kontroversen ausgelöst. Die darin verwendeten Kürzungstechniken können bei übermäßiger Verwendung das Programm völlig unlesbar machen. Aber, wie Dijkstra sagte, die Mittel seien nicht schuld daran, dass sie ungebildet eingesetzt würden. Tatsächlich entsprechen die in C vorgeschlagenen Syntaxabkürzungen den häufigsten stereotypen Situationen in der Praxis. Wenn wir Abkürzungen als Redewendungen zur ausdrucksstarken und kompakten Darstellung solcher Situationen betrachten, dann wird ihr Nutzen unbedingt und offensichtlich.

So entwickelte sich C zu einer universellen Systemprogrammiersprache. Aber er blieb nicht innerhalb dieser Grenzen. Ende der 80er Jahre erlangte die C-Sprache, nachdem sie Fortran von seiner Führungsposition verdrängt hatte, bei Programmierern auf der ganzen Welt enorme Popularität und begann, in einer Vielzahl von Anwendungsaufgaben eingesetzt zu werden. Eine wesentliche Rolle spielte dabei die Verbreitung von Unix (und damit C) im universitären Umfeld, wo eine neue Generation von Programmierern ausgebildet wurde.

Wie alle Sprachen wurde C schrittweise verbessert, die meisten Verbesserungen waren jedoch nicht radikal. Die bedeutendste davon ist vielleicht die Einführung einer strikten Spezifikation von Funktionstypen, die die Zuverlässigkeit der Kommunikation zwischen Modulen in C erheblich erhöhte. Alle diese Verbesserungen wurden 1989 im ANSI-Standard verankert, der noch immer definiert C Sprache.

Aber wenn alles so rosig ist, warum werden dann alle anderen Sprachen weiterhin verwendet, was ihre Existenz stützt? Die Achillesferse der C-Sprache war, dass sie sich für die Aufgaben, die in den 90er Jahren auf der Tagesordnung standen, als zu niedrig herausstellte. Darüber hinaus hat dieses Problem zwei Aspekte. Einerseits wurden zu Low-Level-Tools in die Sprache eingebaut – vor allem Speicherverwaltung und Adressarithmetik. Nicht umsonst hat die Änderung der Bitkapazität von Prozessoren bei vielen C-Programmen sehr schmerzhafte Auswirkungen. Andererseits fehlen C Funktionen auf hoher Ebene – abstrakte Datentypen und Objekte, Polymorphismus, Ausnahmebehandlung. Daher dominiert in C-Programmen häufig die Technik der Aufgabenumsetzung deren Inhalt.

Die ersten Versuche, diese Mängel zu beheben, wurden Anfang der 80er Jahre unternommen. Schon damals begann Bjarne Stroustrup von den AT&T Bell Labs mit der Entwicklung einer Erweiterung der C-Sprache unter dem Codenamen. Der Entwicklungsstil entsprach durchaus dem Geist, in dem die C-Sprache selbst erstellt wurde – bestimmte Funktionen wurden in sie eingeführt, um mehr zu schaffen bequeme Arbeit bestimmte Personen und Gruppen. Der erste kommerzielle Übersetzer der neuen Sprache namens C++ erschien 1983. Dabei handelte es sich um einen Präprozessor, der das Programm in C-Code übersetzte. Als eigentliche Geburtsstunde der Sprache kann jedoch die Veröffentlichung von Stroustrups Buch im Jahr 1985 angesehen werden. Von diesem Moment an begann C++ weltweit an Popularität zu gewinnen.

Die wichtigste Neuerung von C++ ist der Klassenmechanismus, der es ermöglicht, neue Datentypen zu definieren und zu verwenden. Der Programmierer beschreibt die interne Darstellung eines Klassenobjekts und eine Reihe von Funktionsmethoden für den Zugriff auf diese Darstellung. Eines der geschätzten Ziele bei der Entwicklung von C++ war der Wunsch, den Prozentsatz der Wiederverwendung von bereits geschriebenem Code zu erhöhen. Das Konzept der Klassen bot hierfür einen Vererbungsmechanismus. Durch Vererbung können Sie neue (abgeleitete) Klassen mit erweiterter Darstellung und geänderten Methoden erstellen, ohne dass sich dies auf den kompilierten Code der ursprünglichen (Basis-)Klassen auswirkt. Gleichzeitig stellt die Vererbung einen der Mechanismen zur Implementierung von Polymorphismus dar – dem Grundkonzept der objektorientierten Programmierung, nach dem die gleiche Art von Verarbeitung durchgeführt werden soll verschiedene Typen Daten kann der gleiche Code verwendet werden. Tatsächlich ist Polymorphismus auch eine der Methoden, um die Wiederverwendung von Code sicherzustellen.

Die Einführung von Klassen erschöpft nicht alle Neuerungen der C++-Sprache. Es implementiert einen vollwertigen strukturierten Ausnahmebehandlungsmechanismus, dessen Fehlen in C das Schreiben zuverlässiger Programme erheblich erschwerte, einen Vorlagenmechanismus – einen hochentwickelten Mechanismus zur Makrogenerierung, der tief in die Sprache integriert ist und einen weiteren Weg zur Wiederverwendung von Code eröffnet. und vieles mehr.

Daher zielte die allgemeine Entwicklung der Sprache darauf ab, ihre Fähigkeiten durch die Einführung neuer High-Level-Konstrukte zu erweitern und gleichzeitig eine möglichst vollständige Kompatibilität mit ANSI C aufrechtzuerhalten. Natürlich ging auch der Kampf um die Verbesserung des Sprachniveaus weiter die zweite Front – dieselben Klassen ermöglichen es mit einem kompetenten Ansatz, Operationen auf niedriger Ebene auszublenden, sodass der Programmierer tatsächlich aufhört, direkt mit Speicher und systemabhängigen Entitäten zu arbeiten. Allerdings enthält die Sprache keine Mechanismen, die den Entwickler dazu zwingen, das Programm korrekt zu strukturieren, und die Autoren haben keine systematischen Empfehlungen für die Verwendung ihrer recht ausgefeilten Konstrukte herausgegeben. Sie haben sich auch nicht rechtzeitig darum gekümmert, eine Standardklassenbibliothek zu erstellen, die die am häufigsten vorkommenden Datenstrukturen implementiert.

All dies führte dazu, dass viele Entwickler gezwungen waren, die Labyrinthe der sprachlichen Semantik selbst zu erkunden und selbstständig erfolgreich funktionierende Redewendungen zu finden. Beispielsweise versuchten viele Ersteller von Klassenbibliotheken in der ersten Phase der Sprachentwicklung, eine einzige Klassenhierarchie mit einem gemeinsamen Basisklassenobjekt aufzubauen. Diese Idee wurde von Smalltalk übernommen, einer der bekanntesten objektorientierten Sprachen. In C++ erwies es sich jedoch als völlig undurchführbar – sorgfältig gestaltete Hierarchien von Klassenbibliotheken erwiesen sich als unflexibel und die Arbeit von Klassen war nicht offensichtlich. Damit Klassenbibliotheken genutzt werden konnten, mussten sie im Quellcode bereitgestellt werden.

Das Aufkommen von Template-Klassen widerlegte diese Entwicklungsrichtung vollständig. Die Vererbung wurde nur noch in Fällen eingesetzt, in denen es erforderlich war, eine spezielle Version einer vorhandenen Klasse zu generieren. Bibliotheken begannen, aus separaten Klassen und kleinen, unabhängigen Hierarchien zu bestehen. Auf diesem Weg begann jedoch die Wiederverwendung von Code abzunehmen, da in C++ die polymorphe Verwendung von Klassen aus unabhängigen Hierarchien unmöglich ist. Die weit verbreitete Verwendung von Vorlagen führt zu einer inakzeptablen Zunahme des kompilierten Codevolumens – vergessen wir nicht, dass Vorlagen mithilfe von Makrogenerierungsmethoden implementiert werden.

Einer der schwerwiegendsten Mängel von C++, den es von der C-Syntax geerbt hat, ist die Fähigkeit des Compilers, die interne Struktur aller verwendeten Klassen zu beschreiben. Infolgedessen führt eine Änderung der internen Struktur der Darstellung einer Bibliotheksklasse dazu, dass alle Programme, in denen diese Bibliothek verwendet wird, neu kompiliert werden müssen. Dies schränkt Bibliotheksentwickler hinsichtlich ihrer Modernisierung, denn bei der Veröffentlichung, erheblich ein neue Version, sie müssen binärkompatibel mit dem vorherigen bleiben. Dieses Problem lässt viele Experten glauben, dass C++ für die Ausführung großer und sehr großer Projekte ungeeignet ist.

Und doch bleibt C++ trotz der aufgeführten Mängel und sogar der Nichtverfügbarkeit des Sprachstandards (und das nach mehr als fünfzehn Jahren Nutzung!) eine der beliebtesten Programmiersprachen. Seine Stärke liegt vor allem in der nahezu vollständigen Kompatibilität mit der Sprache C. Dadurch haben C++-Programmierer Zugriff auf alle in C gemachten Entwicklungen. Gleichzeitig bringt C++, auch ohne den Einsatz von Klassen, eine Reihe solcher wichtiger Vorteile mit sich Zusätzliche Funktionen und Annehmlichkeiten für C, so dass viele es einfach als verbessertes C verwenden.

Was das C++-Objektmodell betrifft, so ist es durchaus verwendbar, solange Ihr Programm nicht sehr groß wird (Hunderttausende von Zeilen). Der jüngste Trend des Übergangs zur komponentenbasierten Software stärkt nur die Position von C++. Bei der Entwicklung einzelner Komponenten treten die Mängel von C++ noch nicht in Erscheinung und die Einbindung der Komponenten in ein funktionierendes System erfolgt nicht mehr auf Sprachebene, sondern auf Betriebssystemebene.

Angesichts all dessen, was gesagt wurde, sehen die Aussichten für C++ nicht düster aus. Allerdings wird er kein Monopol auf dem Programmiersprachenmarkt haben. Das Einzige, was wir vielleicht mit Sicherheit sagen können, ist, dass diese Sprache eine weitere Modernisierungserweiterung nicht überleben wird. Nicht umsonst erregte Java bei seinem Erscheinen große Aufmerksamkeit. Die Sprache, die in ihrer Syntax C++ ähnelt und daher vielen Programmierern bekannt vorkommt, ist von den eklatantesten Mängeln von C++ aus den 70er Jahren verschont geblieben. Allerdings scheint Java der Rolle, die ihm manche zugeschrieben haben, nicht gerecht zu werden.

Die besondere Rolle der C/C++-Sprachen in der modernen Programmierung macht es praktisch sinnlos, im Internet konkrete Adressen anzugeben, unter denen man Materialien dazu finden kann. Es gibt einfach zu viele solcher Orte. Wenn Sie jedoch daran interessiert sind, mehr über die Entwicklung von C++ zu erfahren, dann beginnen Sie mit diesem kurzen Artikel http://citforum.syzran.ru/programming/prg96/76.shtml.

Alexander Sergejew, [email protected]
Artikel aus der Zeitschrift BYTE/Russia, März 2000

Um die Verwendung der beschriebenen Sprachen in der Praxis anschaulich zu demonstrieren, haben wir eine Aufgabe ausgewählt, bei der es darum ging, eine Reihe von Ganzzahlen aus der Standardeingabe oder aus einer Datei einzugeben und dann nur die ungeraden Zahlen in umgekehrter Reihenfolge auszugeben . Dies ist eines der einfachsten Probleme, für dessen Lösung im Wesentlichen die Arbeit mit Arrays, Schleifen, Verzweigungen und E/A erforderlich ist und die Ihnen auch die Demonstration von Unterprogrammaufrufen ermöglicht. Gleichzeitig ist es sichtbar und leicht wahrnehmbar.

Auflistung 1. C

1 #include /* I/O-Funktionen verbinden */ 2 3 void main(void) 4 ( 5 int M; /* Array von 10 Ganzzahlen, gezählt von 0 */ 6 int N; 7 for (N=0; N<10; ++N) /* Вводим не более 10 чисел */ 8 if (EOF == scanf ("%d, M+N)) 9 break; /* Если конец файла, прерываем цикл */ 10 11 for (-N; N>=0; --N) /* Wir gehen das Array in umgekehrter Reihenfolge durch */ 12 if (M[N]%2) /* ungerade Einsen ordnen und drucken */ 13 printf("%d\n", M[N]); 14 )

  • Zeile 3. In C/C++ beginnt die Programmausführung immer mit der Hauptfunktion.
  • Zeilen 7 und 11. Im Schleifenkopf werden die Anfangseinstellung, die Fortsetzungsbedingung und die Regel zur Neuberechnung des Schleifenparameters durch Semikolon getrennt angegeben. Operationen ++ Und -/- - die bekanntesten Abkürzungen der C-Sprache, die das Erhöhen und Verringern einer Variablen bedeuten, also eine Erhöhung und Verringerung ihres Werts um eins.
  • Zeile 8. Funktion scanf gibt entsprechend dem durch den ersten Parameter angegebenen Format die Werte von Variablen ein, deren Adressen durch die übrigen Parameter angegeben werden. Hier wird die Adresse, an der der Wert eingegeben wird, mittels Adressarithmetik zur Adresse des Array-Standorts berechnet M Der Offset wird um addiert N Elemente. Der gleiche Effekt kann durch Schreiben erreicht werden &M[N].
  • Zeile 12. Betrieb % berechnet den Rest einer Division. Bedienerzustand Wenn gilt als ausgeführt, wenn der numerische Wert des Ausdrucks von Null verschieden ist.
  • Zeile 13. Funktion printf- Das Drucken nach Format funktioniert auf die gleiche Weise scanf, aber statt Adressen werden ihm auszugebende Werte übergeben.
1 #include 2 3 Vorlage class Array 4 ( 5 public: Array (T Size=1) : M (new T), N(Size), n(0) () 6 Array (void) ( delete M;) 7 T Count (void) const ( return n; ) 8 T Operator (int i) const ( return M[i]; ) 9 void Add (T Data); 10 private: 11 T* M; // Verteilte Speicheradresse 12 int N, n; // N - verteilt; n - verwendet 13); 14 15 Vorlage Leeres Array ::Add(T Data) 16 ( if (N-n) // Wenn alle zugewiesenen 17 verwendet werden ( int* P = new T; // Leerzeichen, mehr 18 verteilen for (int i=0; i A; // Array von Ganzzahlen variabler Größe 28 while (1) // Endlosschleife 29 ( int N; 30 cin >> N; // cin - Standardeingabestream 31 if (cin.eof()) break; // Schleife verlassen bis zum Ende der Datei 32 A.Add(N); // Füge die eingegebene Zahl zum Array hinzu 33 ) 34 for (int N=A.Count()-1; N>=0; --N) // Durchgehen das Array 35 if ( A[N]%2) 36 cout<, und geben Sie Speicher frei
  • Zeilen 3-13. Die Template-Klasse ist deklariert Array mit Parameter T. Es handelt sich um ein Array von Objekten des Typs variabler Größe T. Natürlich besteht in unserer Aufgabe keine Notwendigkeit, eine Vorlagenklasse zu verwenden. Wir wollten jedoch zeigen, wie C++ eine polymorphe Datenstruktur erstellen kann, die mit jedem Elementtyp funktionieren kann.
  • Zeile 5. Klassenkonstruktor. Es initialisiert die Darstellung des Objekts. Zum Beispiel auf dem Feld M Die Adresse des durch die Operation bestellten Speicherblocks wird eingegeben Newt.
  • Zeile 8. Ein Beispiel für eine Betriebsüberlastung. Funktion Operator wird aufgerufen, wenn rechts von einem Klassenobjekt eckige Klammern erscheinen Array.
  • Zeile 9. Diese Funktion ist die wichtigste in der Implementierung. Es fügt dem Array Elemente hinzu und erweitert es nach Bedarf. Da sie komplexer ist als die anderen, wird ihre Definition aus der Klassenbeschreibung übernommen. Die im Hauptteil der Klasse beschriebenen Funktionen werden in C++ nicht durch Aufruf, sondern durch Inline-Substitution implementiert. Dies beschleunigt das Programm, erhöht jedoch seine Größe.
  • Zeilen 15-24. Funktionsdefinition Array::Add(T)(das ist übrigens ihr voller Name).
  • Zeile 27. Erstellen Sie ein Objekt vom Typ Array. Vorlage Aggau parametrisiert nach Typ int.

Geschichte der Schöpfung

Die Sprache entstand in den frühen 1980er Jahren, als Björn Stroustrup, Mitarbeiter von Bell Labs, für seine eigenen Bedürfnisse eine Reihe von Verbesserungen an der C-Sprache vorschlug. Als Stroustrup Ende der 1970er Jahre bei Bell Labs begann, sich mit Problemen der Warteschlangentheorie (in Bezug auf die Modellierung von Telefonanrufen) zu beschäftigen, stellte er fest, dass Versuche, die damals vorhandenen Modellierungssprachen zu verwenden, wirkungslos waren, und dass die Verwendung hocheffizienter Maschinensprachen ​​war für ihre begrenzte Ausdruckskraft zu schwierig umzusetzen. Daher verfügt die Simula-Sprache über Funktionen, die für die Entwicklung großer Software sehr nützlich wären, aber zu langsam sind, und die BCPL-Sprache ist schnell genug, kommt aber zu nahe an Low-Level-Sprachen und ist nicht für die Entwicklung großer Software geeignet.

Stroustrup erinnerte sich an die Erfahrungen seiner Dissertation und beschloss, die C-Sprache (BCPL-Nachfolger) durch die in der Simula-Sprache verfügbaren Funktionen zu ergänzen. C ist die Basissprache des UNIX-Systems, auf dem Bell-Computer liefen, und ist schnell, funktionsreich und portabel. Stroustrup fügte die Möglichkeit hinzu, mit Klassen und Objekten zu arbeiten. Dadurch erwiesen sich praktische Modellierungsprobleme sowohl im Hinblick auf die Entwicklungszeit (dank der Verwendung von Simula-ähnlichen Klassen) als auch im Hinblick auf die Rechenzeit (dank der Geschwindigkeit von C) als einfach zu lösen. Zunächst wurden C Klassen (mit Kapselung), Klassenvererbung, starke Typprüfung, Inline-Funktionen und Standardargumente hinzugefügt. Frühe Versionen der Sprache, ursprünglich „C mit Klassen“ genannt, wurden 1980 verfügbar.

Während der Entwicklung von C mit Klassen schrieb Stroustrup ein Programm namens cfront, einen Übersetzer, der C-Quellcode mit Klassen in einfachen C-Quellcode konvertiert. Dadurch war es möglich, an einer neuen Sprache zu arbeiten und sie in der Praxis zu verwenden, wobei die bereits verfügbare Infrastruktur genutzt wurde UNIX für die Entwicklung in C. Die für den Autor unerwartete neue Sprache erfreute sich bei seinen Kollegen großer Beliebtheit und bald konnte Stroustrup ihn nicht mehr persönlich unterstützen und Tausende von Fragen beantworten.

Bei der Erstellung von C++ wollte Björn Stroustrup
  • Erhalten Sie eine Allzwecksprache mit statischen Datentypen, der Effizienz und Portabilität der C-Sprache.
  • Unterstützen Sie direkt und umfassend eine Vielzahl von Programmierstilen, einschließlich prozeduraler Programmierung, Datenabstraktion, objektorientierter Programmierung und generischer Programmierung.
  • Geben Sie dem Programmierer Entscheidungsfreiheit, auch wenn er dadurch die Möglichkeit hat, eine falsche Wahl zu treffen.
  • Sorgen Sie so weit wie möglich für eine Kompatibilität mit C, um einen einfachen Übergang von der C-Programmierung zu ermöglichen.
  • Vermeiden Sie Diskrepanzen zwischen C und C++: Jedes Konstrukt, das in beiden Sprachen gültig ist, muss in beiden Sprachen dasselbe bedeuten und zum gleichen Programmverhalten führen.
  • Vermeiden Sie Funktionen, die plattformabhängig oder nicht universell sind.
  • „Zahlen Sie nicht für das, was Sie nicht nutzen“ – keine Sprachfunktion sollte zu Leistungseinbußen bei Programmen führen, die sie nicht nutzen.
  • Benötigen Sie keine übermäßig komplizierte Programmierumgebung.

Die Wahl von C als Grundlage für die Erstellung einer neuen Programmiersprache erklärt sich aus der Tatsache, dass die C-Sprache:

1. ist eine vielseitige, prägnante und relativ einfache Sprache;
2. geeignet zur Lösung der meisten Systemprobleme;
3. überall und auf allem durchgeführt;
4. Schnittstellen zur UNIX-Programmierumgebung.

— B. Stroustrup. Programmiersprache C++. Abschnitt 1.6

Trotz einer Reihe bekannter Mängel der C-Sprache entschied sich Stroustrup, sie als Grundlage zu verwenden, da „C seine Probleme hat, aber eine von Grund auf neu entwickelte Sprache hätte sie, und wir kennen die Probleme von C.“ Darüber hinaus war es dadurch möglich, schnell einen Prototyp-Compiler (cfront) zu erhalten, der nur die hinzugefügten syntaktischen Elemente in die ursprüngliche C-Sprache übersetzte.

Als sich C++ entwickelte, wurden weitere Funktionen hinzugefügt, die die Fähigkeiten von C-Konstrukten abdeckten, und daher wurde wiederholt die Frage aufgeworfen, ob die Sprachkompatibilität durch das Entfernen veralteter Konstrukte aufgegeben werden sollte. Die Kompatibilität wurde jedoch aus folgenden Gründen gewahrt:

  • Beibehaltung des aktuellen Codes, der ursprünglich in C geschrieben und direkt nach C++ übertragen wurde;
  • Es entfällt die Notwendigkeit, Programmierer, die zuvor C studiert haben, umzuschulen (sie müssen nur neue C++-Tools erlernen).
  • Beseitigung von Verwechslungen zwischen Sprachen bei gemeinsamer Verwendung („Wenn zwei Sprachen zusammen verwendet werden, sollten ihre Unterschiede entweder minimal oder so groß sein, dass eine Verwechslung der Sprachen unmöglich ist“).

Bis 1983 wurden der Sprache neue Funktionen hinzugefügt, wie z. B. virtuelle Funktionen, Überladung von Funktionen und Operatoren, Referenzen, Konstanten, Benutzerkontrolle über die Verwaltung des freien Speichers, verbesserte Typprüfung und ein neuer Kommentarstil (//). Die resultierende Sprache war nicht mehr nur eine erweiterte Version des klassischen C und wurde von C mit Klassen in „C++“ umbenannt. Die erste kommerzielle Veröffentlichung erfolgte im Oktober 1985.

Der resultierende Sprachname stammt vom C++-Inkrementoperator für unäre Postfixe (Erhöhen des Werts einer Variablen um eins).

Bevor die offizielle Standardisierung begann, wurde die Sprache hauptsächlich von Stroustrup als Reaktion auf Anfragen aus der Programmiergemeinschaft entwickelt. Die Funktion von Standardbeschreibungen der Sprache übernahmen gedruckte Werke zu C++, die von Stroustrup verfasst wurden (Sprachbeschreibung, Referenzhandbuch usw.).

Geschichte der Normen

Im Jahr 1985 wurde die erste Ausgabe von The C++ Programming Language veröffentlicht, die die erste Beschreibung der Sprache lieferte, was aufgrund des Fehlens eines offiziellen Standards äußerst wichtig war.


1989 wurde C++ Version 2.0 veröffentlicht. Zu den neuen Funktionen gehörten Mehrfachvererbung, abstrakte Klassen, statische Memberfunktionen, konstante Funktionen und geschützte Member. 1990 wurde das „Annotated Reference Guide to C++“ veröffentlicht, das später zur Grundlage des Standards wurde. Zu den jüngsten Aktualisierungen gehörten Vorlagen, Ausnahmen, Namespaces, neue Umwandlungstypen und boolesche Typen.

Damit entwickelte sich auch die C++-Standardbibliothek. Die erste Ergänzung zur C++-Standardbibliothek waren I/O-Streams, die eine Möglichkeit bieten, die traditionellen C-Funktionen printf und scanf zu ersetzen. Die bedeutendste Weiterentwicklung der Standardbibliothek war später die Aufnahme der Standardvorlagenbibliothek.

Im Jahr 1998 wurde der vom C++ Standards Committee (ISO/IEC JTC1/SC22/WG21-Arbeitsgruppe) entwickelte Sprachstandard ISO/IEC 14882:1998 (bekannt als C++98) veröffentlicht. Der C++-Standard beschreibt nicht, wie Objekte benannt werden, einige Details zur Ausnahmebehandlung und andere Implementierungsdetails, wodurch der von verschiedenen Compilern erstellte Objektcode inkompatibel ist. Allerdings wurden viele Standards von Dritten für bestimmte Architekturen und Betriebssysteme erstellt.

Im Jahr 2005 wurde der Library Technical Report 1 (abgekürzt als TR1) veröffentlicht. Obwohl es sich nicht offiziell um einen Teil des Standards handelt, beschreibt der Bericht Erweiterungen der Standardbibliothek, von denen die Autoren erwarteten, dass sie in der nächsten Version der C++-Sprache enthalten sein werden. Die TR1-Unterstützung wird in fast allen unterstützten C++-Compilern verbessert.

Seit 2009 wird an der Aktualisierung des bisherigen Standards gearbeitet, die vorläufige Version des neuen Standards war zunächst C++09, ein Jahr später C++0x, heute C++11, die Ergänzungen zum Kern von enthielt die Sprache und eine Erweiterung der Standardbibliothek, einschließlich des größten Teils von TR1.

C++ entwickelt sich ständig weiter, um den heutigen Anforderungen gerecht zu werden. Eine der Gruppen, die die C++-Sprache entwickeln und dem C++-Standardkomitee Vorschläge für ihre Verbesserung unterbreiten, ist Boost, das sich unter anderem damit beschäftigt, die Fähigkeiten der Sprache durch das Hinzufügen von Metaprogrammierungsfunktionen zu verbessern.

Niemand besitzt die Rechte an der Sprache C++; sie ist kostenlos. Das Sprachstandarddokument selbst (mit Ausnahme von Entwürfen) ist jedoch nicht kostenlos verfügbar.

Warum C++

C++ gilt derzeit als die dominierende Sprache für die Entwicklung kommerzieller Softwareprodukte. In den letzten Jahren ist diese Dominanz aufgrund ähnlicher Behauptungen einer Programmiersprache wie Java leicht ins Wanken geraten, aber das Pendel der öffentlichen Meinung hat in die andere Richtung geschwungen, und viele Programmierer, die C++ zugunsten von Java aufgegeben haben, sind kürzlich zu seiner früheren Zuneigung zurückgekehrt. Auf jeden Fall sind sich die beiden Sprachen so ähnlich, dass man, sobald man die eine erlernt hat, automatisch 90 % der anderen beherrscht.

C# ist eine neue Sprache, die von Microsoft für die Netzwerkplattform entwickelt wurde. Im Wesentlichen ist C# eine Variation von C++, und trotz einer Reihe grundlegender Unterschiede sind die Sprachen C# und C++ zu etwa 90 % gleich. Es wird wahrscheinlich noch lange dauern, bis C# ernsthaft mit C++ konkurriert; Aber selbst wenn dies geschieht, sind Kenntnisse der Sprache C++ von großem Vorteil.

C++ ist eine Allzweck-Programmiersprache. Sein natürlicher Anwendungsbereich ist die Systemprogrammierung im weitesten Sinne des Wortes. Darüber hinaus wird C++ in vielen Anwendungsbereichen erfolgreich eingesetzt, die weit über diesen Rahmen hinausgehen. Implementierungen von C++ sind mittlerweile auf allen Maschinen verfügbar, vom kleinsten Mikrocomputer bis zum größten Supercomputer, und auf praktisch allen Betriebssystemen.

Die Entstehung und Entwicklung der C++-Sprache

Bjarne Stroustrup ist der Entwickler der Sprache C++ und der Schöpfer des ersten Übersetzers. Er ist Mitarbeiter des AT&T Bell Laboratories Research Computing Center in Murray Hill (New Jersey, USA). Er erhielt einen Master-Abschluss in Mathematik und Informatik von der Universität Aarus (Dänemark) und einen Doktortitel in Informatik von der Universität Cambridge (England). Seine Spezialgebiete sind verteilte Systeme, Betriebssysteme, Modellierung und Programmierung. Zusammen mit M. A. Ellis ist er der Autor des maßgeblichen Leitfadens zur C++-Sprache, The Annotated C++ Manual.

Natürlich hat C++ der C-Sprache viel zu verdanken, die eine Teilmenge davon bleibt. Alle Low-Level-C-Tools zur Lösung der dringendsten Probleme der Systemprogrammierung sind ebenfalls erhalten geblieben. C wiederum hat seinem Vorgänger, der BCPL-Sprache, viel zu verdanken. Der BCPL-Sprachkommentar wurde in C++ wiederhergestellt. Eine weitere Inspirationsquelle war die Sprache SIMULA-67; Daraus wurde das Konzept der Klassen (zusammen mit abgeleiteten Klassen und virtuellen Funktionen) übernommen. Die Fähigkeit von C++, Operatoren zu überladen, und die Freiheit, Deklarationen überall dort zu platzieren, wo ein Operator auftreten kann, erinnern an die Sprache ALGOL-68.

Frühere Versionen der Sprache, „C mit Klassen“ genannt, wurden ab 1980 verwendet. Diese Sprache entstand, weil der Autor unterbrechungsgesteuerte Simulationsprogramme schreiben musste. Die SIMULA-67-Sprache ist dafür ideal, abgesehen von der Effizienz. Für große Modellierungsprobleme wurde die Sprache C mit Klassen verwendet. Damals wurden die Möglichkeiten, darauf zeit- und speicherressourcenkritische Programme zu schreiben, einer strengen Prüfung unterzogen. In dieser Sprache fehlten Operatorüberladung, Referenzen, virtuelle Funktionen und viele andere Funktionen. C++ wurde erstmals im Juli 1983 außerhalb der Forschungsgruppe des Autors veröffentlicht, viele der Funktionen von C++ waren jedoch noch nicht entwickelt.

Der Name C++ (C plus plus) wurde im Sommer 1983 von Rick Mascitti geprägt. Der Name spiegelt die evolutionäre Natur der Änderungen in der C-Sprache wider. Die Notation ++ bezieht sich auf die Operation des Wachsens von C. Der etwas kürzere Name C+ ist ein Syntaxfehler. Darüber hinaus wurde es bereits als Name einer völlig anderen Sprache verwendet. Experten für C-Semantik finden C++ schlechter als ++C. Die Sprache wird nicht D genannt, da sie eine Erweiterung von C ist und nicht versucht, Probleme durch Eliminierung der Funktionen von C zu lösen. Eine weitere interessante Interpretation des Namens C++ finden Sie im Anhang zu .

C++ wurde ursprünglich so konzipiert, dass der Autor und seine Freunde nicht in Assemblersprache, C oder anderen modernen Hochsprachen programmieren mussten. Sein Hauptzweck besteht darin, den Programmierprozess für den einzelnen Programmierer zu vereinfachen und angenehmer zu gestalten. Bis vor kurzem gab es keinen Plan für die C++-Entwicklung auf dem Papier. Design, Implementierung und Dokumentation verliefen parallel. Es gab nie ein „C++-Projekt“ oder ein „C++-Entwicklungskomitee“. Daher hat sich die Sprache so weiterentwickelt und entwickelt sich auch weiterhin weiter, um alle Probleme zu überwinden, mit denen Benutzer konfrontiert sind. Auch die Diskussion aller Probleme des Autors mit seinen Freunden und Kollegen dient als Anstoß für die Entwicklung.

Seit der Veröffentlichung der ersten Auflage dieses Buchs hat die Sprache C++ erhebliche Änderungen und Verfeinerungen erfahren. Dies betrifft hauptsächlich die Mehrdeutigkeitsauflösung bei Überladung, Bindung und Speicherverwaltung. Es wurden jedoch geringfügige Änderungen vorgenommen, um die Kompatibilität mit der C-Sprache zu erhöhen. Außerdem wurden einige Verallgemeinerungen und bedeutende Erweiterungen eingeführt, wie z. B. Mehrfachvererbung, Mitgliedsfunktionen mit statischen und konstanten Spezifikationen, geschützte Mitglieder, Typvorlagen und die Behandlung spezieller Situationen. All diese Erweiterungen und Verbesserungen zielten darauf ab, C++ zu einer Sprache zu machen, in der Bibliotheken erstellt und verwendet werden können. Alle Änderungen sind in beschrieben.

Weitere Erweiterungen wurden zwischen 1985 und 1991 eingeführt (wie Mehrfachvererbung, statische Memberfunktionen und rein virtuelle Funktionen) sind eher aus der Verallgemeinerung der C++-Programmiererfahrung als aus anderen Sprachen entstanden.

Die in diesen sechs Jahren vorgenommenen Spracherweiterungen zielten in erster Linie darauf ab, die Ausdruckskraft von C++ als Sprache der Datenabstraktion und objektorientierten Programmierung im Allgemeinen und als Mittel zur Erstellung hochwertiger Bibliotheken mit benutzerdefinierten Datentypen im Besonderen zu erhöhen.

Um 1987 zeichnete sich ab, dass die C++-Standardisierungsarbeiten unmittelbar bevorstanden und dass die Arbeiten daran sofort beginnen sollten.

AT&T Bell Laboratories leistete einen wichtigen Beitrag zu dieser Arbeit. Etwa hundert Vertreter von etwa 20 Organisationen überprüften und kommentierten die moderne Version des Referenzhandbuchs und das Quellmaterial für die ANSI-Standardisierung. C++. Schließlich wurde im Dezember 1989 auf Initiative von Hewlett-Packard innerhalb der ANSI das X3J16-Komitee gegründet. Es wird erwartet, dass die ANSI-Standardisierungsarbeit (American Standard) für C++ Teil der ISO-Standardisierungsarbeit (International Organization for Standardization) wird.

C++ entwickelte sich gleichzeitig mit der Entwicklung einiger grundlegender Klassen.

C++ ist eine kompilierte Allzweck-Programmiersprache, die die Eigenschaften von High-Level- und Low-Level-Programmiersprachen kombiniert. Im Vergleich zu ihrem Vorgänger, der Programmiersprache C, wird größter Wert auf die Unterstützung der objektorientierten und generischen Programmierung gelegt. Der Name „C++-Programmiersprache“ stammt von der Programmiersprache C, in der der unäre Operator ++ das Inkrement einer Variablen bezeichnet.

Die Programmiersprache C++ wird häufig für die Softwareentwicklung verwendet. Nämlich die Erstellung verschiedener Anwendungsprogramme, die Entwicklung von Betriebssystemen, Gerätetreibern sowie Videospielen und vieles mehr. Es wurde in den frühen 1980er Jahren von Björn Stroustrup erstellt. Für seine eigenen Bedürfnisse entwickelte er eine Reihe von Verbesserungen der Programmiersprache C. diese. Ursprünglich gab es keine Pläne, die Programmiersprache C++ zu entwickeln.

Es unterstützt Programmierparadigmen wie prozedurale Programmierung, objektorientierte Programmierung, generische Programmierung, bietet Modularität, separate Kompilierung, Ausnahmebehandlung, Datenabstraktion, Deklaration von Objekttypen (Klassen) und virtuelle Funktionen.

Der resultierende Sprachname stammt vom C++-Inkrementoperator für unäre Postfixe (Erhöhen des Werts einer Variablen um eins). Der Name C+ wurde nicht verwendet, da es sich um einen Syntaxfehler in C handelte und auch weil der Name von einer anderen Sprache belegt war. Die Sprache wurde auch nicht D genannt, da sie „eine Erweiterung von C ist und nicht versucht, Probleme durch Entfernen von Elementen von C zu beheben“.

Vorteile der Sprache:

1. Skalierbarkeit. Programme werden in C++ für die unterschiedlichsten Plattformen und Systeme entwickelt.

2. Fähigkeit, auf niedrigem Niveau mit Speicher, Adressen und Ports zu arbeiten.

3. Die Fähigkeit, verallgemeinerte Algorithmen für verschiedene Datentypen, deren Spezialisierung und Berechnungen in der Kompilierungsphase mithilfe von Vorlagen zu erstellen.

4. Plattformübergreifend. Compiler sind für eine Vielzahl von Plattformen verfügbar und Programme werden in C++ für die unterschiedlichsten Plattformen und Systeme entwickelt.

5. Effizienz. Die Sprache soll dem Programmierer maximale Kontrolle über alle Aspekte der Programmstruktur und Ausführungsreihenfolge geben.

Nachteile der Sprache:

1. Das Vorhandensein vieler Funktionen, die gegen die Prinzipien der Typsicherheit verstoßen, führt dazu, dass sich leicht subtile Fehler in C++-Programme einschleichen können.

2. Schlechte Unterstützung für Modularität. Das Anschließen der Schnittstelle eines externen Moduls über das Einfügen einer Header-Datei (#include) durch den Präprozessor verlangsamt die Kompilierung erheblich, wenn eine große Anzahl von Modulen angeschlossen wird.

3. Die Sprache C++ ist schwer zu erlernen und zu kompilieren.

4. Einige Typkonvertierungen sind nicht intuitiv. Insbesondere führt eine Operation an einer vorzeichenlosen und einer vorzeichenbehafteten Zahl zu einem vorzeichenlosen Ergebnis.

5. Manche Leute halten das Fehlen eines integrierten Garbage-Collection-Systems für einen Nachteil der C++-Sprache. Andererseits verfügt C++ über genügend Tools, um die Verwendung gefährlicher Zeiger nahezu zu eliminieren; es gibt keine grundlegenden Probleme bei der Implementierung und Verwendung der Garbage Collection (auf Bibliotheksebene, nicht auf Sprachebene). Das Fehlen einer integrierten Speicherbereinigung ermöglicht es dem Benutzer, seine eigene Ressourcenverwaltungsstrategie zu wählen.

gastroguru 2017