Aaaah, geiles Posting. Langsam kommen wir in die Tiefen rein
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Spezifikationen habe ich keine gesehen, nur vieles, um dort Mitglied zu werden.
wenn du auf jtopen.com gehst und dann auf Technology, findest du auf der rechten Seite die Spezifikationen.
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Was ich an Java gut finde ist, dass es Framework gibt. Man kann mal schnell etwas machen. Was ich an Java nicht gut finde ist die Sprache, die nicht nur sehr geschwätzig ist, sondern auch, dass sie ein Framework hat, was veraltet, inkompatibel wird und reihenweise Sicherheitslücken hat. Man kann sich also entscheiden, ob die Software sicher läuft, weil sie auf der getesteten Version läuft oder ob sie möglicherweise an Inkompatiblitäten abschmiert, weil Sicherheitsupdates notwendig waren. Letzteres wurde daher überall wo ich bisher war abeschaltet, die Software wurde immer mit eigener JVM installiert, bei der man wusste, dass es läuft.
Naja, seit Java bei Oracle ist, ist es mit der Sprache ein ständiges auf und ab. Man beachte nur die lange Zeit, bis Java8 und Java9 released wurden. Dann sieht man mittlerweile diverse Announcements, von gekippten Featuren (siehe Nashorn). JavaFX wurde erst groß gehypet, dann kam die Ankündigung, es aus der SE zu werfen, was dann doch nicht passiert. Sicherheitsfeatures werden auch nicht immer zeitnah eingespielt, was aus meiner Sicht viel politisches Geplänkel ist, denn in manchen Bereichen sind die Sicherheitslücken gleich geschlossen, in anderen nicht. Auch die JVM bringt von zu Hause aus mittlerweile einige Probleme mit sich. Da bleibt die Entwickung der GraalVM abzuwarten. Und man findet mittlerweile einige Artikel dazu, dass man sich doch Gedanken machen sollte, auf die GraalVM umzusteigen.
Aber da sind wir mitten in den Entwicklungsmodellen. Ich glaube nicht, dass es auf Dauer Sinn macht, wenn eine Technologie ausschließlich bei einem global Player in der Verantwortung liegt. Ich glaube aber auch nicht, dass es Sinn macht, wenn eine Sprache in der Verantwortung von einem Konsortium von Global Playern (ISO) liegt. Unterm Strich steht die Politik dann meist vor dem sinnvollen Technologieeinsatz. Und das ist aus meiner Sicht auch der Grund, warum wir gerade in den letzten Jahren so viele neue Programmiersprachen sehen.
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Schlussendlich ist das in C++ ähnlich. Aber die Probleme scheinen geringer.
Ansichtssache.
Was mich an C++ stört ist, dass es keine gute Standardbibliothek gibt, die einem die zügige Implementierung von Standardproblemen bietet.
Ok, dafür gibt es boost, was mittlerweile Quasi-Standardbibliothek für C++ ist.
Faktisch muss man mittlerweile zwei riesen Systeme lernen: C++ & boost. Und dann haben wir letztlich nur noch ganz wenige, die das sinnvoll beherrschen können.
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Mal schnell etwas machen hat den Vorteil, dass man schnell etwas zeigen kann. Dann allerdings bleibt eine geschwätzige Sprache über, in der man vieles sehr umständlich machen muss. Const-Correctness beispielsweise. Oder Mehrfachvererbung, die jetzt ja wohl als Methodenvererbung so halb eingeführt wurde? Es gibt mir Pointer und die Behauptung, dass es keine Pointer sind.
Letztlich muss man jede Sprache können - und da sind wir wieder bei dem Problem, dass viele ihren Job "einfach nur noch machen". Egal mit welcher Sprache man arbeitet, man muss sich schon ein wenig auskennen.
Const Correctness ist definitiv ein Java-Problem. Man muss riesen Aufwand betreiben, um sicherzustellen, dass die übergeebenen Objekte nicht verändert werden können. Also wird es letztlich auf Kopien rauslaufen.
Das Thema mit den Pointern ist einfach ganz simpel, halt nur völlig von den Marketing-Sprüchen belastet. Jedes Argument wird grundsätzlich immer "call by value" übergeben. Bei Primitiven ist das const, bei Objekten eben nur eine const reference, sprich man kann kein anderes Objekt zuweisen, was einen aber nicht daran hindert, den Objektzustand zu ändern.
Und genau da kommt aus meiner Sicht ein generelles Thema rein: wenn ich tatsächlich diese const correctness haben will, bin ich dann bei einer antiquierten, "rein objektorientierten" Sprache richtig? Warum gibt es denn gerade diese Renaisance der funktionalen Programmiersprachen. Wenn man sich anschaut, wann Java "erfunden" wurde, war der FP Hype schon länger durch und OO galt als DAS Konzept der Zukunft. 25 Jahre später sieht die Welt halt völlig anders aus. Aber FP ist wiederum ein Konzept, das die Masse der Programmierer eben nicht verstehen wird, da fehlt die Leidenschaft, sich in das schwierige Thema einzuarbeiten (und genau diese Programmierer werden aber auch keine guten C++ oder Java Programmierer).
Noch kurz zur Mehrfachvererbung:
Ich frage mich, warum gerade C++ Entwickler immer wieder Mehrfachvererbung als so tolles Feature anpreisen. Selbst unser lieber Bjarne Stroustrup schreibt mittlerweile überall, man solle am besten gänzlich auf die Mehrfachvererbung verzichten. Er hat wohl mittlerweile gesehen, dass das eher von schlechtem Design zeugt, als im Großen und Ganzen einen sinnvollen Nutzen hat.
Und bei schlechtem Design meine ich das genau so: Dank der Mehrfachvererbung macht man sich viel zu wenig Gedanken über die Trennung von Daten und Verhalten und mischt viel zu viel Zeugs einfach durcheinander. Mir ist in all den Jahren kein Fall unter gekommen, in dem ich gesagt hätte "Verdammt, mit Mehrfachvererbung könnte ich das Problem jetzt leicht lösen". Viel eher "oh, da heb ich gerade ein kleines Designproblem. NNa dann, auf zum Refactoring" und der entstandene Code war viel besser strukturiert, klarer und die Zuständigkeiten in Ordnung.
Mal abgesehen davon kommt Rust z.B. ganz ohne VVererbung aus. Und sind wir mal ehrlich, wieviel Vererbung ist denn tatsächlich sinnvoll? Polymorphie zum Ersatz von switch-case Strukturen, ja. Vererbung zum Aufbau eines GUI-Baumes, ja. Abstraktion gemeinsamer Konzepte, ja. Aber wieviele Klassen sind denn "einfach nur Klassen"? Ich denke, das sind deutlich mehr als die Hälfte in jedem Projekt. Und in jedem Anfängerbuch findet man seitenweise Kram über die Vererbung, die Neulinge werden völlig verschreckt und am Ende kommt - nur um Vererbung einzusetzen - völlig wirrer Code ohne klar definierte Zuständigkeiten raus.
Ich bin mittlerweile sehr vorsichtig beim Einsatz von Vererbung und denke lieber zweimal nach, bevor ich Vererbung nutze.
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Java war nie eine ehrliche Sprache, Java war nie eine gute Sprache. Java ist lediglich eine erfolgreiche Sprache, weil es viele Java-Entwickler gibt, denen C++ zu schwer erscheint, da sie dafür verstehen müssten, was sie da eigentlich schreiben.
Das kann ich so durchaus unterschreiben. Marketing war der Haupttreiber und Marketing ist nie ehrlich. Es gab Zeiten, da war Java aus meiner Sicht wirklich gut, aber dann haben sie mal wieder die Entwicklung verpennt. Und das Festhalten an der Byte-Kompatibilität bricht Java letztlich das Genik, denn sinnvoller Einsatz der Generics ist kaum möglich.
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Und so wachsen die Projekte und man bekommt auf die Frage, warum da einmal pro Stunde eine Exception im Protokoll landet die Antwort "Das wissen wir nicht, aber wenn sie nicht kommt, läuft irgendwas verkehrt."
Warum oder wie eine Software läuft, scheint in Java häufiger zu passieren. Man kümmert sich halt nicht drum. Und man stellt dann einen C++-Entwickler ein, der dann Reingeneering machen darf.
Das immer wieder gleiche Thema..... Qualität der Entwickler.
Und ein C++ Entwickler, der sein Handwerk wirklich versteht, ist eben einer, der die Passion mitbringt. Solche Java-Entwickler findet man auch - nur woher soll man vorher wissen, wer die Passion und das Know-How mitbringt.
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Und warum kann man das nicht? Warum ist das anders gelagert? Warum macht man in Java genau das gleiche wie in C++, nur dass man die Sachen, die in C++ als gute Programmierung gilt, in Java nicht machen kann?
Wie oben schon angesprochen, gibt es z.B. den Unterschied Mehrfachvererbung vs. Interfaces. Static vs. nicht OO-Code. Überladen von Operatoren vs Functional Interfaces usw.
Man muss schon in die Sprachen reingehen, um festzustellen, dass die Konzepte sehr unterschiedlich sind und somit auch die Lösungen unterschiedlich ausfallen müssen. Man kann es nicht an einer For-Schleife festmachen, die in beiden Sprachen identisch aussieht. Der erwähnte Thread "Warum ich Java hasse" zeigt eine 1:1 Umsetzung des C++-Code in Java und mir haben sich die Fußnägel hochgerollt, als ich den Code überflogen habe. Wenn ich nur solchen Java-Code sehen würde, fände ich die Sprache auch zum k******. Man kann das aber auch elegant und ähnlicch knapp, aussagekräftig und effizient programmieren.
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Dann habe ich Java entweder nie verstanden - was allerdings auch für die Leute gilt, die in meinem beruflichen Umfeld professionel damit arbeiten, denn eigentlich sind Java und C++ in meinen Augen sehr nah beisammen. Nur halt, dass Java halt geschwätzig ist und nur die Basics kann.
Das kann ich nicht beurteilen, aber es ist gut möglich.
Java hat eben auch das Problem, dass man es schnell lernen kann und schnell Code "zum Laufen" bringen kann. Es ist aber eben auch nicht mehr. Er läuft, ist aber oft weder gut noch effizient oder sonstwie brauchbar. Ich denke, Java ist nicht wirklich einfacher oder schlechter als C++, nur mit dem Unterschied, dass man schneller größere Projekte umsetzen kann. Für guten Code wird man in beiden Sprachen wohl ähnlich lang lernen müssen. ur, in C++ sieht man die Notwendigkeit, in Java eher weniger, es läuft ja
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
koshamo hat geschrieben: ↑Mi Aug 15, 2018 9:35 pm
Java hat sich mittlerweile so weit von C++ entfernt, dass Vergleiche nur noch auf anderer Ebene geführt werden können. Selbst das Thema Performance muss besonders betrachtet werden. Es gibt genug Beispiele, in denen C++ schneller ist, aber eben auch genug, in denen Java schneller ist.
Ich höre bisher nur von konstruierten Beispielen. Ein echtes Beispiel, wo Java C++ abhängt kenne ich nicht.
Naja, die Unterschiede sind doch eingentlich ganz simpel: C++ ist native Sprache und kommuniziert viel mit dem OS, z.B. bei jedem new. Java ist faktisch nix anderes als ein Exokernel mit eigener Speicherverwaltung. D.h. bei einem new muss kein teurer Aufruf an das OS erfolgen, die JVM kümmert sich drum und hier ist sie tatsächlich echt schnell!
Wenn ich also ein Projekt habe, in dem viele kleine Objekte erzeugt und wieder verworfen werden müssen, was bei gutem Design in vielen Projekten der Fall ist, dann hat die JVM hier echte Vorteile gegenüber C++. Der JIT-Compiler ist mittlerweile echt sehr gut, so dass die wenigen performance-kriitischen Codefragmente genauso schnell laufen wie in C++, weil sie eben auch nativ sind (ok, oft nicht so hoch optimiert).
Aber möglicherweise kommt hier zum Tragen, dass der C++-Programmierer bei den Objekt-intensiven (Java)-Programmen in C++ einen völlig anderen Weg einschlagen würde -- und dann sind wir wieder genau bei dem Thema, dass man den Code eben nicht 1:1 übersetzen kann.
Ich sollte mal wieder mit C++ coden... ist einfach schon zu lange her. Zuletzt mit C++03 tehe.
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Die DSL ist "kann man schnell im Framework finden"?
Wozu brauche ich dann Java, dann kann ich auch Python nehmen.
Guter Punkt.
Noch vor einigen Jahren wollte niemand mit einer interpretierten Sprache in große Projekte gehen, weshalb Python da auch nicht so richtig in die Pötte kam. Das ist mittlerweile anders und Python ist sogar auf embedded Systemen zu finden. Interpretiert heißt eben nicht langsam (siehe auch Java).
Python hat einen großen Vorteil gegenüber Java: sie haben tatsächlich zwischen der 2er und 3er Linie die Kompatibilität über Bord geworfen, was der Sprache gut getan hat. Das fehlt Java (siehe oben).
Aber warum Python so gehypet wird, ist mir schleierhaft. Die Sprache vereint viele Konzepte, aber keines ist vollständig umgesetzt. Aus meiner Sicht ist die Sprache "nicht Fisch, nicht Fleisch". Aber man kann noch schneller als in Java Prohejte umsetzen -- und genau so sieht dann auch der meiste Code aus
![Wink ;)](./images/smilies/icon_e_wink.gif)
Man wird einfach nicht um Kompetenz drumrum kommen, in keiner Sprache.
Aber es so toll, nach einem Wochenende so viel gelernt zu haben, dass man den Eindruck hat, programmieren zu können und die Welt mit dem eigenen Code zu beglücken.
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Durchaus. Eine Templatefunktion, wie beispielsweise to_string kann man nicht in die Klasse schreiben, man möchte aber damit vielleicht Daten aus der Klasse auslesen, ohne öffentliche getter anzubieten.
Warum kann ich eine Methode, die eindeutig zu einer Klasse gehört, nicht in eine Klasse schreiben? Mal im ernst, das zerschießt doch ein sauberes Design, weil ich nicht Dinge, die zusammen gehören, zusammen packen kann. Und für den Anwender heißt das, dass er mehrere Klassen / Files betrachten muss, um zu sehen, was zzusammen gehört. Macht die Sache nicht einfacher. Und genau das ist ein großer Kritikpunkt an C++.... die Unsauberheiten werden dann als Maß der Kompetenz herangezogen um zu unterscheiden, wer es kann und wer nicht. Für mich ist das einfach nur ein unsauberes Ärgernis und ein Grund, die Sprache zu meiden.
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Ich sehe auch nicht, wo die Modularisierung kaputt geht, denn wie Du schon schreibst: Man könnte die Funktionen ja in die Klasse schreiben (was nunmal eben nicht geht), also schreibt man mit friend dazu, welche externe Funktion dann mit dieser Klasse verbunden ist.
Wenn C++ doch so viel kann, warum gerade das nicht?!
Und ich werde gezwungen, viel tiefer in die Klasse zu schauen, als ich als Anwender sollte.... konzeptionell fraglich.
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Eine brauchbare Definition kenne ich nicht. Für mich ist OOP ein Design Pattern, das mit virtual (bzw. final/static in Java) unterstützt (bzw. verhindert) wird.
Wissenschaftlich betrachtet gibt es auch keine Definition, aber die Literatur ist sich einig, dass Konzepte wie
Objekte & Klassen
Vererbung
Polymorphy / späte Bindung
Kapselung / Information Hiding
dazu gehören bzw. den Kern bilden. Rust z.B. bietet keine Vererbung, ist aber OO.
OO als Design Pattern zu sehen, finde ich interessant. Ich bin mir nur noch nicht sicher, ob ich da mitgehen kann. Das würde letztlich implizieren, dass ich eben auch andere Patterns daneben nutzen kann und das ist aktuell wenig der Fall.
C++ und Java haben aus meiner Sicht das Problem, viel zu imperativ zu sein. Die Grenze zwischen imperativer und oo Programmierung ist völlig verwaschen. So gesehen ist OO eine strukturelle Abstraktion, was einem Pattern entspricht. Hm.... muss ich drüber nachdenken.
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
In C++ kann man nicht den Code ändern, der gerade läuft. Aber man kann Code erstellen, der später laufen soll.
JIT programmiert sich ähnlich wie normaler Code: Man vereinfacht die Dinge auf ein niedriges Level, wie Assembler oder C und ruft die entsprechenden Funktionen, die Operation Codes in einen std::vector rausfeuern. Man fasst einige Dinge zusammen, Print zum Beispiel ist bei mir eine Funktion, der ich sage was sie drucken soll, zum Beispiel den Inhalt eines Registers oder einen Text. Und anschließend habe ich im Vector die Opcodes, um das Register im 10er System als ASCII-Zeichen auszugeben und tue das dann auch.
Mir erschließt sich nicht, warum ich in der heutigen Zeit (außer bei Compilerbau) auf diesem Low-Level rumfriemeln sollte. Abstraktion ist eigentlich das Thema und die wird so komplett torpediert. Die primären Programmfehler liegen in den unteren Schichten und von denen sollte man eher wegkommen (und den Leuten überlassen, die das wirklich können). Meine Meinung.
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Das kostet wieviel Zeit?
Oh, Common Lisp ist angeblich ähnlich performant wie C. Performance sollte da also nicht das Thema sein
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Bleibt die Frage, ob hier eine akademische Geilheit aufkommt, den praktisch fand ich Lisp unlesbar. Große Projekte möchte ich damit nicht umsetzen.
Bei mir persönlich: ja!
Och, man gewöhnt sich dran
![Wink ;)](./images/smilies/icon_e_wink.gif)
Was ich als "Deutscher" toll finde: es gibt quasi nur runde Klammern, ich kann mich von der Alt-Gr-Taste lösen und schnell tippen. statt car und cdr könnte ich auch head und tail schreiben. Und was mir sprachlich sonst nicht in den Kram passt, verpasse ich einfach mit einem neuen Namen...
Aber letztlich: ist nicht jede neue Sprache oder Sprachfamilie anfangs seltsam im Erscheinungsbild? Jeder Pascal-Programmierer hat sich vor 30 Jahren über die geschweiften Klammern oder die kryptisch kurzen Namen in C-Programmen aufgeregt.... alles nur eine Frage der Sichtweise und Gewöhnung.
Xin hat geschrieben: ↑Fr Aug 17, 2018 1:53 pm
Mag sein. Aber damals war ich 14 und Goto war noch eine ganz normale Sache und Gosub war was für Leute, die irgendwie komisch dachten.
Es gab ja auch Zeiten, da glaubte man, FORTRAN sei eine gute Sprache
![Laughing :lol:](./images/smilies/icon_lol.gif)