In dem Artikel: Warum POCO gibt es diesen Satz:
Maciej Sobczak bringt es auf den Punkt: „Ich mag es einfach nicht, wenn mir jemand die Hälfte der Sprache gibt und mir sagt, dass es zu meinem eigenen Schutz ist.“
Ich verstehe nicht, was er meint, obwohl C # im Besitz von Microsoft und Java im Besitz von Oracle ist , heißt das nicht, dass sie die Hälfte der Sprache beherrschen, oder? Ich habe keine Beweise gefunden, um diesen Satz zu beweisen, und ich bin wirklich neugierig darauf. Und noch neugieriger auf den Teil "Zu meinem eigenen Schutz".
Antworten:
Sobczak spricht nicht von Firmeneigentum. Die "halbe" Sprache, die ihm fehlt, ist all das, was Sie in vielen modernen Sprachen nicht können, obwohl er als gut ausgebildeter Computerexperte weiß, dass sie möglich gemacht werden könnten : Erben Sie von so vielen Klassen, wie Sie möchten. Weisen Sie ein beliebiges Objekt ohne Typbeschränkungen einem anderen zu. Steuern Sie die Zuweisung und Freigabe von Ressourcen manuell, anstatt dem Compiler und der Laufzeit zu vertrauen, die dies für ihn tun.
Die Sache ist, all diese Einschränkungen wurden aus einem bestimmten Grund in Programmiersprachen eingeführt. Wir hatten Sprachen, die das alles zuließen. Im Laufe der Zeit stellten wir fest, dass der durchschnittliche Programmierer mit einer gewissen Anzahl von Einschränkungen und Handgriffen besser dran ist, da das Potenzial, wirklich schlimme Fehler zu machen, einfach zu groß ist, um die zusätzliche Kraft und Ausdruckskraft wert zu sein.
(Offensichtlich ärgert dies manchmal Programmierer, die nicht wirklich so viel Handarbeit benötigen. Ihre Beschwerden sind manchmal legitim. Aber die Leute sind notorisch schlecht darin, ihre eigenen Fähigkeiten einzuschätzen, und viele, die glauben, dass sie die Sicherheitsvorkehrungen nicht benötigen, tun dies.) Tatsächlich brauchen wir sie sehr. Es ist nicht immer einfach, echte überlegene Intellektuelle, die sich durch Einschränkungen in höheren Sprachen zurückgehalten fühlen, von durchschnittlichen Programmierern zu unterscheiden, die nur der Meinung sind, dass Beschwerden sie überlegen erscheinen lassen oder die es nicht wissen etwas besser.)
quelle
dynamic
?Dies wird in der Originalquelle des Zitats recht gut erklärt :
Mit anderen Worten, der Autor dieses Zitats mag C ++, und er mag kein Java, und er hat das Gefühl, dass in Java die Hälfte von C ++ fehlt. Und das ist alles, was zu diesem Zitat gehört.
quelle
Der Artikel, auf den Sie in dem von Ihnen geposteten Blog verlinkt haben, wurde entfernt, daher ist es schwierig, sicher zu sein, aber wie Kilian sagt, ist es wahrscheinlich, dass C # und Java sich wie C ++ anfühlen, aber mit viel Features und Konstrukte wurden entfernt, um sie benutzerfreundlicher oder sicherer zu machen.
Im Jahr 2006, als dies geschrieben wurde, als C # noch relativ jung war und Java in vielerlei Hinsicht noch nicht ausgereift war, und als Power vs. Safety ein Kompromiss schien, bei dem man nur einen auswählen konnte, war dies keine völlig unvernünftige Position .
In diesen Tagen ist diese Position überhaupt nicht vernünftig. C # und Java haben sich enorm weiterentwickelt und Funktionen aus anderen (besonders funktionalen) Sprachen übernommen, um das Schreiben von sicherem Code zu fördern. Wir haben auch Sprachen wie Rust und Swift, die von Grund auf dafür entwickelt wurden.
Wenn jemand auf eine Sprache herabschaut, weil sie Ihre Hand hält oder sagt, dass eine schwer zu verwendende Sprache irgendwie gut ist, würde ich alles, was sie sagt, mit einem Körnchen Salz nehmen. Sie müssen sich nur die peinliche Anzahl von Fehlern ansehen, die in Code gefunden wurden, von denen wir jeden Tag abhängig sind und die von den klügsten Köpfen der Branche geschrieben wurden. Dies wäre trivialerweise durch die Verwendung von "sicheren" Sprachen vermieden worden, um herauszufinden, warum.
quelle
Rückblickend auf die Archive scheint dieses Zitat aus dem Jahr 2003 zu stammen (trotz des Artikels, in dem es aus dem Jahr 2006 zitiert wird). Zu dieser Zeit war C # in Version 1. x und es fehlten viele seiner modernen Funktionen :
Es ist wahrscheinlich verständlicher, dass C # in diesem Kontext wie eine halbe Sprache wirkte, da es nicht viel von dem gab, was C # heute ist. Es ist komisch zu denken, dass es nicht einmal
static
Unterricht gab!Es fehlte auch mehr Material, da C # an .NET gebunden war. Zum Beispiel gab es damals noch kein WPF . es war alles WinForms.
quelle
static
Klassen scheinen solch ein primitives Merkmal zu sein; Ich stellte mir ein bisschen vor, dass sie Klassen mit Instanzen vorbereiteten.static
in den meisten Fällen sowieso kein großer Klassenfan . Ehrlich gesagt, ich habe es als ein Feature ausgewählt, das ich hervorheben möchte, da es ein sehr einfacher, primitiver Teil von C # ist. Ich habe nicht gedacht, dass sie nicht in Java sind.Er beklagte sich über das Fehlen von Sprachfunktionen, die eine feinkörnige Kontrolle ermöglichen. Dazu gehören Tools für
const
Schlüsselwort)Dies erinnert mich an eine meiner Kritikpunkte an Java:
In C ++ - Objekten sind Zeiger und Referenzen drei unterschiedliche Konzepte mit klarer Semantik. In Java haben Sie nur den Pseudo-Objekt-Zeiger. Durch das Zusammenführen dieser und das Vermeiden der wahren Zeigersemantik wird das Objektmodell weniger klar.
In einem gut definierten C ++ - Programm kann der Programmierer erwarten, dass Referenzen gültig und nicht null sind. Aufgrund seines vereinfachten Modells kann Java nicht dieselben Garantien geben.
Zu den Symptomen dieses weniger klaren Modells gehören das Nullobjektmuster und Yoda-Bedingungen wie
5.equals(potentiallyNullIntegerReference)
.quelle
Map.merge
wenn Sie einfach einen Wert in einer Karte aktualisieren möchten).const
. Es wird zwar "funktionale Programmierung" erwähnt, die Sprache, die er als Beispiel verwendet, ist jedoch "Schema", was keine reine funktionale Sprache ist (in der Tat achten die Designer von "Schema" darauf, die Verwendung des Wortes "Funktion" zu vermeiden und darüber zu sprechen " Prozeduren "), so scheint es, verwendet er die Interpretation von FP" erstklassiger Unterprogramme "und nicht" referentielle Transparenz ".Ich stimme der Antwort von @Kilian zu, aber ich werde einige Elemente hinzufügen.
1- Ausführen gegen eine virtuelle Maschine, nicht das Betriebssystem
Da Java und C # über eine virtuelle Maschine ausgeführt werden, wird logischerweise erwartet, dass Sie nicht genau das tun können, was Sie möchten, wenn Sie direkt mit dem Betriebssystem arbeiten, da Sie wahrscheinlich etwas in der VM beschädigen. Darüber hinaus ist Java noch logischer, da es plattformunabhängig ist.
2 - Tonnen von Anwendungen erfordern nicht, dass Sie solche Dinge benötigen.
Es gibt Unmengen von Anwendungen, bei denen Sie nicht so viele Details durcharbeiten müssen. Wenn Sie dies jedoch in einer Sprache tun, die dies erfordert, erhalten Sie:
3- Die Sprache wird nach einer bestimmten Wahl gewählt, die Kosten / Nutzung / Risiken wie ... alles bewertet.
Mit C ++ können Sie so ziemlich alles machen, was Sie wollen, das ist die Wahl der C ++ - Leute. Je mehr es gibt, desto mehr müssen Sie bewältigen.
Dinge wie Mehrfachvererbung werden also nicht nur aufgrund der Tatsache aufgegeben, dass sie gefährlich sind. Sie werden aufgegeben, weil die Implementierung mit Kosten (Entwicklung, Wartung) verbunden ist, die für eine Funktion anfallen, die nur selten richtig eingesetzt wird und eingesetzt werden kann in der Regel anders umgeschrieben werden.
quelle
B
überschrieben wirdM
, istB
die Version dieses Mitglieds nur überM
'' zugänglich. s überschreiben; (2)T
Wenn Sie eine Typreferenz angeben und diese in eine beliebige Supertypreferenz umwandeln, erhalten SieT
eine Referenz, die dem Original entspricht. Beide Garantien sind nützlich, und für die Unterstützung der Mehrfachvererbung muss mindestens eine aufgegeben werden.Setzen Sie einfach alle Einschränkungen in Hochsprachen wie C # und Java, um den Programmierer zu schützen. Sie existieren nicht so sehr, um den Programmierer vor sich selbst zu schützen, sondern um den Programmierer vor anderen Programmierern zu schützen!
Wie oft stoßen wir als Programmierer auf Bibliotheken, deren Codierungspraktiken und Design ausgesprochen schlecht waren, die wir jedoch aus dem einen oder anderen Grund verwenden mussten?
Diese Programme weisen in der Regel die Merkmale der alten prozeduralen Programmiermethode auf, da keine Kapselung vorhanden ist und viel direkter Speicher mit wenig oder gar keinem Fehler beim Abfangen oder Behandeln geschrieben wird. Segfaults werden häufig eingesetzt, wenn versucht wird, sie in einem Großprojekt zu verwenden.
Hier sind Sprachen wie Java und C # äußerst hilfreich. Es ist nicht so, dass sie uns die Tatsache gefallen lassen, dass sie uns nicht all die netten Dinge machen lassen, die andere Sprachen tun machen.
Schnittstellen sind meiner Meinung nach in Bezug auf den Speicher oder die Ausführungsgeschwindigkeit jeden Kompromiss wert. Ich hoffe, Sie können sehen, dass in jeder Art von zeitlich begrenzter, geschäftskritischer Anwendung all diese Schutzmaßnahmen, die ordnungsgemäße Fehlerbehandlung und die allgemeine Gewissheit, dass der Speicher nicht ausgelastet ist, gute Dinge sind!
quelle
They exist not so much to protect the programmer from him/herself, but rather to protect the programmer from other programmers!
oder soll es andere programmierer vor dem programmierer schützen?