Ich weiß nicht viel über D, aber viele, viele C ++ - Programmierer, von denen ich weiß, dass sie es nicht mögen, und ich persönlich muss zustimmen, dass ich das Aussehen von D nicht mag und nicht näher darauf eingehen werde.
Um zu verstehen, warum D nicht mehr an Bodenhaftung gewinnt, müssen Sie zunächst verstehen, was Menschen an C ++ interessiert. Mit einem Wort, der Hauptgrund ist die Kontrolle. Wenn Sie in C ++ programmieren, haben Sie die vollständige Kontrolle über Ihr Programm. Möchten Sie die Standardbibliothek ersetzen? Du kannst. Möchten Sie unsichere Zeigermodelle erstellen? Du kannst. Willst du die Beständigkeit verletzen? Du kannst. Möchten Sie die Speicherzuordnung ersetzen? Du kannst. Möchten Sie rohen Speicher ohne Rücksicht auf seinen Typ kopieren? Wenn du wirklich willst. Möchten Sie von mehreren Implementierungen erben? Es ist deine Beerdigung. Zum Teufel, Sie können sogar Müllbibliotheken kaufen, so wie der Böhm-Sammler. Dann haben Sie Probleme wie die Leistung, die eng mit der Kontrolle zusammenhängt - je mehr Kontrolle ein Programmierer hat, desto optimierter kann er sein Programm erstellen.
Hier sind ein paar Dinge, die ich gesehen habe, als ich ein wenig recherchiert und mit ein paar Leuten gesprochen habe, die es versucht haben:
Einheitliche Typhierarchie. C ++ - Benutzer verwenden Vererbung sehr selten, die meisten C ++ - Programmierer bevorzugen die Komposition, und Typen sollten nur durch Vererbung verknüpft werden, wenn es einen sehr guten Grund dafür gibt. Das Konzept des Objekts verletzt dieses Prinzip stark, indem es jeden Typ verknüpft. Darüber hinaus verstößt es gegen eines der grundlegendsten Prinzipien von C ++ - Sie verwenden nur das, was Sie wollen. Das Fehlen einer Wahlmöglichkeit für das Erben von Object und die damit verbundenen Kosten stehen sehr stark im Widerspruch zu dem, wofür C ++ als Sprache steht, um dem Programmierer die Kontrolle über sein Programm zu geben.
Ich habe von Problemen mit Funktionen und Delegierten gehört. Anscheinend hat D sowohl Funktionen als auch Delegierte als zur Laufzeit aufrufbare Funktionstypen und sie sind nicht gleich, aber austauschbar oder ... etwas? Mein Freund hatte einige Probleme mit ihnen. Dies ist definitiv eine Herabstufung von C ++, die nur hat std::function
und Sie sind fertig.
Dann hast du Kompatibilität. D ist nicht besonders kompatibel mit C ++. Ich meine, keine Sprache ist mit C ++ kompatibel, seien wir ehrlich, mit Ausnahme von C ++ / CLI, das eine Art Betrug darstellt, aber als Eintrittsbarriere muss es erwähnt werden.
Dann gibt es noch ein paar andere Dinge. Lesen Sie zum Beispiel einfach den Wikipedia-Eintrag.
import std.metastrings;
pragma(msg, Format!("7! = %s", fact_7));
pragma(msg, Format!("9! = %s", fact_9));
printf
ist eine der unsichersten Funktionen, die jemals entwickelt wurden, in derselben Familie wie große Probleme wie gets
in der alten C-Standard-Bibliothek. Wenn Sie im Stapelüberlauf danach suchen, werden Sie viele, viele Fragen im Zusammenhang mit dem Missbrauch finden. Grundsätzlich printf
ist eine Verletzung von DRY- Sie geben den Typ in der Formatzeichenfolge an und geben ihn dann erneut an, wenn Sie ihm ein Argument geben. Eine Verletzung von DRY, bei der, wenn Sie etwas falsch machen, sehr schlimme Dinge passieren, wenn Sie eine Typendefinition von einer 16-Bit-Ganzzahl in eine 32-Bit-Ganzzahl ändern. Es ist auch überhaupt nicht erweiterbar - stellen Sie sich vor, was passieren würde, wenn jeder seine eigenen Formatspezifizierer erfinden würde. Die iostreams von C ++ sind möglicherweise langsam und die Auswahl des Operators ist möglicherweise nicht die beste. Die Benutzeroberfläche kann Arbeit gebrauchen. Grundsätzlich ist jedoch die Sicherheit der Iostreams gewährleistet und DRY wird nicht verletzt. Sie können problemlos erweitert werden. Das kann man nicht sagen printf
.
Keine Mehrfachvererbung. Das ist ganz und gar nicht der C ++ Weg. C ++ - Programmierer erwarten, dass sie die vollständige Kontrolle über ihr Programm haben, und die Sprache, die das erzwingt, wovon Sie nicht erben können, verstößt gegen dieses Prinzip. Darüber hinaus wird die Vererbung (noch) anfälliger, da der gesamte Code Ihres Benutzers plötzlich beschädigt wird, wenn Sie einen Typ von einer Schnittstelle in eine Klasse ändern, weil Sie eine Standardimplementierung oder ähnliches bereitstellen möchten. Das ist keine gute Sache.
Ein anderes Beispiel ist string
und wstring
. In C ++ ist es bereits sehr schmerzhaft, zwischen ihnen konvertieren zu müssen. Unterstützt diese Bibliothek Unicode, und diese alte C-Bibliothek verwendet nur const char*
unterschiedliche Versionen derselben Funktion, abhängig vom gewünschten String-Argumenttyp. Insbesondere die Windows-Header enthalten zum Beispiel einige äußerst irritierende Makros, um das Problem zu lösen, das häufig Ihren eigenen Code stören kann. Das Hinzufügen dstring
zu der Mischung wird die Sache nur verschlimmern, da Sie jetzt anstelle von zwei Zeichenfolgentypen drei verwalten müssen. Wenn Sie mehr als einen Zeichenfolgentyp haben, werden die Wartungsprobleme zunehmen und sich wiederholender Code für Zeichenfolgen eingeführt.
Scott Meyers schreibt:
D ist eine Programmiersprache, die Programmierern dabei hilft, die Herausforderungen der modernen Softwareentwicklung zu meistern. Dies geschieht durch die Förderung von Modulen, die über präzise Schnittstellen miteinander verbunden sind, einem Zusammenschluss eng integrierter Programmierparadigmen, sprachgesteuerter Thread-Isolierung, modularer Sicherheit, eines effizienten Speichermodells und mehr.
Eine sprachgesteuerte Thread-Isolierung ist kein Plus. C ++ - Programmierer erwarten volle Kontrolle über ihre Programme, und die Sprache, die etwas erzwingt, entspricht definitiv nicht den Anweisungen des Arztes.
Ich werde auch die String-Manipulation während der Kompilierung erwähnen. D kann D-Code während der Kompilierung interpretieren. Dies ist kein Plus. Betrachten Sie die massiven Kopfschmerzen, die durch den relativ eingeschränkten Präprozessor von C verursacht werden, der allen erfahrenen C ++ - Programmierern bekannt ist, und stellen Sie sich dann vor, wie sehr diese Funktion missbraucht wird. Die Möglichkeit, D-Code zur Kompilierungszeit zu erstellen, ist großartig, sollte jedoch semantisch und nicht syntaktisch sein.
Außerdem ist ein gewisser Reflex zu erwarten. D hat eine Garbage Collection, die C ++ - Programmierer mit Sprachen wie Java und C # assoziieren werden, die in Philosophien ziemlich direkt dagegen stehen, und die syntaktischen Ähnlichkeiten werden sie auch in Erinnerung rufen. Dies ist nicht unbedingt objektiv zu rechtfertigen, aber es ist etwas, das auf jeden Fall beachtet werden sollte.
Grundsätzlich bietet es nicht so viel, wie C ++ - Programmierer es nicht können. Vielleicht ist es einfacher, ein faktorielles Metaprogramm in D zu schreiben, aber wir können bereits faktorielle Metaprogramme in C ++ schreiben. Vielleicht in D Sie können einen Compiler-ray-Tracer schreiben, aber niemand will wirklich , dass auf jeden Fall tun. Im Vergleich zu den grundlegenden Verstößen gegen die C ++ - Philosophie ist das, was Sie in D tun können, nicht besonders bemerkenswert.
Auch wenn diese Dinge nur Probleme auf der Oberfläche sind, bin ich mir ziemlich sicher, dass die Tatsache, dass D auf der Oberfläche überhaupt nicht wie C ++ aussieht, wahrscheinlich ein guter Grund dafür ist, dass viele C ++ - Programmierer nicht nach D migrieren. Möglicherweise muss D eine bessere Jobwerbung selbst erledigen.