Warum Vase ertrunken ist und C ++ immer noch flott ist

  • Tutorial
Dieser Artikel ist eine kurze Nacherzählung eines unglaublich interessanten Scott Myers- Berichts für diejenigen, die nicht 70 Minuten für den gesamten Bericht, sondern 7 Minuten für die wichtigsten Punkte haben.

Einige Leute, die nicht in C ++ schreiben, sondern nur von dieser Sprache hören, stellen die Frage: "Warum schreibt jemand überhaupt in C ++?" Aber es gibt Leute, die C ++ jeden Tag benutzen, und diese Leute stellen sich die Frage: "Aber warum schreibe ich wirklich in dieser Sprache?"

Aber es muss einen Grund geben, warum Leute C ++ - Programme schreiben. Gehen wir zurück zu den frühen 90er Jahren, als die C ++ - Standardisierung stattfand. Viele Ideen wurden vorgeschlagen. Es gab so viele Vorschläge und sie waren so unterschiedlich, dass ich mich an ein Zitat von Jim Waldo erinnere, der damals im Standardisierungskomitee arbeitete: „Jeder, der vorschlägt, etwas zu C ++ hinzuzufügen, muss der Bewerbung seine Niere beifügen. Dann wird niemand mehr als zwei Ideen anbieten, und er wird unglaublich verantwortungsbewusst an die Wahl dieser beiden herangehen. “

Die Sprache, die sich durch die Annahme aller Vorschläge ergeben hätte, erwies sich als zu kompliziert, und dann sagte Björn Straustrup:„ Erinnerst du dich an Vaz? “ Niemand außer Schweden verstand, worum es ging. Vasewar ein riesiges Kriegsschiff, das 1625 in Schweden gebaut wurde. Das Grundprinzip der Schiffskonstruktion lautete: "Warum fügen wir hier keine solche Funktion hinzu?" Viele der Ideen kamen direkt vom König, insbesondere genehmigte er persönlich die Größe des Schiffes. Außerdem war es gemäß den Anweisungen von oben erforderlich, eine große Anzahl von Dekorationselementen, Schnitzereien, eine große Anzahl von Gewehren usw. anzubringen. Aber du wirst den König nicht ablehnen. Das Ergebnis war logisch - aufgrund von Konstruktionsfehlern sank Vaz auf der ersten Reise und verließ kaum die Bucht.

Werfen wir einen Blick auf C ++. Ist es so "geladen" mit Funktionen? Auf den ersten Blick - kein Zweifel:



Schauen wir uns das an:
f(x);


Alles scheint klar zu sein - das ist die Funktion f, an die x übertragen wird. Also? Keine Tatsache. Es kann sich um eine Funktion handeln, oder es kann sich um einen Zeiger auf eine Funktion handeln, oder es kann sich um eine Referenz auf eine Funktion handeln. Es kann sich auch um ein Objekt handeln, in dessen Klasse der Klammeroperator überladen ist. Oder ein Objekt, das implizit in eines der oben genannten Objekte konvertiert werden kann. Oder eine der überladenen Funktionen. Oder eine Vorlage. Oder mehrere der oben genannten Dinge gleichzeitig.

Ich fange an zu verstehen, warum die Leute C ++ kompliziert finden. Es scheint, dass all das völlig falsch ist. Zu kompliziert
Aber warte. Lassen Sie uns ein paar Dinge messen. Zum Beispiel die Anzahl der Stellenangebote für Programmierer in verschiedenen Sprachen, die Menge des Codes für sie in offenen Quellen, die Anzahl der Suchanfragen an Suchmaschinen usw. Und wenn wir uns die Statistik ansehen, ist C ++ in den letzten 25 Jahren weltweit auf Platz 2 bis 4 der Beliebtheitsskala.



C ++ steht an zweiter Stelle nach der Anzahl der Codes in Open Source (12%), und dieser Prozentsatz wächst von Jahr zu Jahr.



Dementsprechend wird etwas in dieser Sprache richtig gemacht. Aus irgendeinem Grund schwimmt er. Finden wir heraus warum.

C kompatibel

Wir können den Code in C - und in C ++ verwenden. Wir können den Editor, die IDE, den Linker und den Debugger von C übernehmen und sie sofort oder mit minimalen Änderungen für C ++ verwenden. Wir können einen C-Programmierer mitnehmen und ihm sagen, "Sie kennen bereits einige der Funktionen von C ++, sehen sich OOP, STL und ein paar andere Dinge an, und Sie können in C ++ schreiben." Dieses Ding war in den 90ern und frühen 2000ern unglaublich wichtig. Und heute ist der C-Code der weltweit am häufigsten verwendete.

Das wichtigste Merkmal der Sprache

Was würden Sie als das wichtigste Merkmal der Sprache bezeichnen? (Repliken aus dem Publikum: "Klammern", "Muster"). Nein. Das sind Destruktoren. Zerstörer machten RAII möglich. Destruktoren vereinfachten die Komplexität der in der Programmierung verwendeten Konzepte um eine Größenordnung. Im Destruktor können wir Speicher freigeben, Mutex, eine Datei oder eine Netzwerkverbindung schließen. Destruktoren bewahren uns vor Zustandsverzweigungen, vor unnötigem Wechseln.

Muster

Es gibt so einen kleinen Krater auf dem Mars, der sich aus der Tatsache ergab, dass die auf der Erde hergestellten Forschungsapparate heftig auf diesen Planeten stürzten, der im Allgemeinen nicht gebrochen werden sollte. Aber abgestürzt. Es stürzte ab, weil sich der Programmierer in einem Teil seines Codes für das metrische Maßsystem und in einem anderen Teil für das klassische Englisch entschieden hatte. Und irgendwie stellte sich heraus, dass ein Kilogramm nicht gleich einem Pfund ist.
Vorlagen in C ++ gaben uns die Möglichkeit, abstrakten Code, Algorithmen, Funktionen und Klassen zu schreiben, die in der Kompilierungsphase von bestimmten Typen zuverlässig und eindeutig angegeben werden können. Dies ist ein großer Schritt vorwärts. Und keine Kosten zur Laufzeit!

Überladung

Wir können Funktionen, Methoden und Operatoren überladen. Wir können den Code einfacher und aussagekräftiger machen. Das Überladen des Klammeroperators ist die Grundlage für Lambdas im C ++ 11-Standard geworden, und Lambdas sind sehr nützlich.

Sprache für Bibliotheken

C ++ wurde als eine Sprache entwickelt, die weniger für angewandte Programmierer als für Bibliotheksentwickler geeignet ist. Die Idee war, dass es praktisch ist, mit ihrer Hilfe wirklich gute Anwendungen zu schreiben, wenn viele gute Bibliotheken auftauchen. Jetzt können wir sagen, dass wir wirklich viele Bibliotheken für C ++ haben, also hat sich die Idee ausgezahlt.

Multiparadigma

Prozedurale Programmierung? Ok Objektorientierte Programmierung? Ok Metaprogrammierung auf Vorlagen? Ok Gefährliche Programmierung mit Zeigern und Assembler-Inserts? Ok Gemischte Konzepte? Auch ca. Mit dem Aufkommen der neuesten C ++ - Standards wird zum Teil sogar eine funktionale Programmierung möglich.

Beste Sprache für „Hindernisprogrammierung“

C ++ ist vielleicht nicht die beste Sprache aller Zeiten, aber im Moment ist es die beste Sprache für das, was ich "Programmieren mit Hindernissen" nenne. Ein Hindernis kann ein unbekannter Themenbereich sein, hohe Anforderungen an die Geschwindigkeit oder den Speicherverbrauch, die Notwendigkeit der Kommunikation mit fremden Codes oder Hardwaregeräten, die Unsicherheit von Aufgaben usw. Wenn Sie sich in einer Situation mit den oben genannten (oder anderen) Hindernissen für C ++ entscheiden, ist die Wahrscheinlichkeit am größten, dass Sie das Projekt irgendwann nicht mehr ruinieren, nur weil es unmöglich ist, das Problem in der ausgewählten Sprache zu lösen.

Sie zahlen nicht für das, was Sie nicht nutzen

Eines der Grundprinzipien der Sprache. Was beim Kompilieren berechnet werden kann - dort wird es berechnet. Unbenutzter Code - nicht aufgerufen. Das Programm verarbeitet nur die Anweisungen, die Sie geschrieben haben, in der genauen Reihenfolge, in der Sie sie ausgeführt haben. Keine Backstage-Spiele. Solche Dinge sind bei der Systemprogrammierung besonders wichtig.

Plattformunabhängiger Assembler

Eine weitere Eigenschaft der Kompatibilität mit C. Ein C ++ - Programm ist von Assembler noch nicht so weit entfernt. In den meisten Fällen können Sie nachvollziehen, für welche Assembler-Anweisungen der C ++ - Code bereitgestellt wird. Auf diese Weise können Sie effektive Programme für jede Plattform schreiben. Darüber hinaus kann für einige Plattformen nur in C / C ++ geschrieben werden.

Abwärtskompatibilität

C ++ - Code, der Anfang der 90er Jahre in den ersten Versionen des C ++ - Standards geschrieben wurde, kann einfach von einem modernen Compiler, der C ++ 14 unterstützt, übernommen und kompiliert werden. Und es wird kompiliert. Nun, mit hoher Wahrscheinlichkeit. Und er wird tun, was er muss. Wieder mit sehr hoher Wahrscheinlichkeit. Es gibt ein paar Orte, die brechen können, aber es gibt nur wenige und sie sind bekannt. So sagen wir Unternehmen: Wenn Sie heute in C ++ investieren, können Sie ruhig sein - und nach 10 und 20 Jahren wird Ihr Code funktionieren, was bedeutet, dass Ihr Geld nicht verloren geht.

Schwierigkeit sich zu verstecken

C ++ wird oft dafür verantwortlich gemacht, dass der Code komplex ist. Es wäre genauer zu sagen, dass es in C ++ wirklich möglich ist (wenn Sie möchten), komplexen Code zu schreiben. Und es ist schwer, über C ++ - Code zu sprechen. Werfen wir einen Blick darauf:

std::cout << x;


Oh mein Gott! Ja, es gibt Namespaces, Streams, eine Vorlage (implizit angegeben), ein Objekt einer Klasse (von einer anderen Klasse geerbt) und das Überladen von Operatoren. Ein Albtraum! Aber sehen Sie sich den obigen Code noch einmal an. Sie verstehen wirklich nicht, was dort steht? Denken Sie wirklich über all diese schrecklichen Begriffe nach, die ich beim Lesen dieses Codes erwähnt habe? Nein. Komplexität verbirgt sich vor Ihnen, Sie merken es nicht.

Sprache für diejenigen, die keine andere Wahl haben

Menschen, die sich für C ++ entscheiden, leben nicht in einem Panzer. Oft beherrschen sie einige andere Sprachen - skriptgesteuert, verwaltet, funktional. Wo Sie sich Zeit und Mühe sparen können - sie schreiben darauf. Aber manchmal stellt sich heraus, dass es keine Wahl gibt - das Problem ist zu kompliziert, die Anforderungen sind zu hoch, die Risiken sind jenseits. Und dann betritt C ++ die Szene. Ein ausgereiftes, aber leistungsstarkes Tool für komplexe, aber umfangreiche Aufgaben. Dies ist übrigens einer der Gründe, warum die Programmierung in C ++ und der Code in C ++ als komplex gelten - das durchschnittliche Niveau der in dieser Sprache gelösten Aufgaben ist höher. Es ist naiv, auf eine Lösung für ein überkomplexes Problem mit einfachem minimalistischem Code zu warten.

Sprache für diejenigen, die Schwierigkeiten mögen

Ja, in C ++ ist es sehr einfach, sich in den Fuß zu schießen. Sogar auf viele verschiedene Arten. Aber für manche ist das ein Plus. Die Fähigkeit, sich selbst in den Fuß zu schießen, lässt darauf schließen, dass Sie jederzeit und überall schießen können. Ja, die Ergebnisse können schrecklich sein. Aber die Leistung ist großartig.

Der Standard wird größer und ... einfacher

Uns wird gesagt, dass der C ++ - Sprachstandard im 1990er-Jahr 1998 - 700 Seiten umfasste und 2011 1300 Seiten umfasste. „Die Sprache wird immer komplizierter“, heißt es. Nein, das ist nicht der Fall. Ja, wir stellen neue Konzepte und Funktionen vor, aber die meisten sollen den Code nicht komplizieren, sondern vereinfachen. Denken Sie daran, wie Sie Iteratoren über Vektoren ausführen mussten - und hier in C ++ 11 haben wir bereichsbasiertes for und auto. Wir können eine Codezeile an die Stelle von 5 schreiben. Lambda-Funktionen ermöglichten es, ganze Entitäten aus dem Code auszuschließen - überflüssige Klassen und Methoden, die eigentlich nicht benötigt wurden. Ja, Standardentwickler müssen über wesentlich mehr Text nachdenken und ihn schreiben. Aber der Endprogrammierer wird immer einfacher.

Jetzt auch beliebt: