Hallo,
ich beschäftige mich schon sein einiger Zeit mit der Sprache
C++(Arduino).
Nun versuche ich JAVA zu lernen.
Bei C++ ist es mir klar wie ein Programm aufgebaut ist.
Zb
int Led =13;
void Setup()
{
pinMode(Led,OUTPUT);}
void Loop()
{
digitalWrite(Led,HIGH)}
Diese drei Schritte mache ich immer.
Wie ist es nun bei JAVA.
Da sieht es so aus.(ein Beispiel von Youtube)
public class
public static void main(String[]args){}
hat jedes Programm das selbe Schema?
Vielleicht kann mit jemand Tipps geben.
Oder vielleicht weiß jemand ein hilfreichen link wo alles genau erklärt
ist.
Danke
Markus94 schrieb:> Da sieht es so aus.(ein Beispiel von Youtube)
Youtube ist keine gute Idee.
Es gibt im Web jede Menge Tutorien, die dich mit dem gedruckten Wort
durch die Anfänge führen.
> hat jedes Programm das selbe Schema?
Ja.
In Java ist alles und jedes in einer Klasse verpackt. Auch main().
> Oder vielleicht weiß jemand ein hilfreichen link wo alles genau erklärt> ist.
Google ist dein Freund.
Markus94 schrieb:> Bei C++ ist es mir klar wie ein Programm aufgebaut ist.
scheinbar nicht. Auch C++ Programm brauchen eine Main Funktion.
Arduino versteckt dir viele Dinge, die man aber wissen wollte man glaubt
eine Sprache zu kennen.
Markus94 schrieb:> Bei C++ ist es mir klar wie ein Programm aufgebaut ist.>> Zb>> int Led =13;>> void Setup()> {> pinMode(Led,OUTPUT);}>> void Loop()> {> digitalWrite(Led,HIGH)}
Aber nur in Arduino, normal hat man eine main, dann würde dein Besipiel
so ausshen:
Google mal nach:
"java ist auch eine Insel"
Ist ein Onlinebuch, aber vorsicht, so richtig eins wo man noch selbst
lesen muss und nicht bunte Filmchen vorgespielt kriegt in denen einer
cool rumhüpft, triviale Beispiele zeigt und dir erzählt wie toll das
alles ist.
Andreas S. schrieb:> Das Buch gibt es außerdem auf totem Baum.
Ich weiss, aber ich denke damit hätte ich den TO völlig überlastet,
zumal es auch noch so ein dicker Wälzer ist und -igitt- nicht kostenlos.
Sorry wegen der Ironie, ist nicht gegen dich, Andreas :-)
Ich hätte da mal kurz eine Frage.
Erzeugt die Laufzeitumgebung von Java dann kein Objekt der Klasse in
welcher die public static void main(String[]args) definiert ist ?
Auf Mitglieder der Klasse die nicht static sind hätte die main ja eh
keinen Zugriff ?
Gruß Dennis
Dennis H. schrieb:> Erzeugt die Laufzeitumgebung von Java dann kein Objekt der Klasse in> welcher die public static void main(String[]args) definiert ist ?
Warum sollte sie? Die Klasse wird nirgendwo instanziert und main ist
static.
Dennis H. schrieb:> Auf Mitglieder der Klasse die nicht static sind hätte die main ja eh> keinen Zugriff ?
Richtig.
Dennis H. schrieb:> Erzeugt die Laufzeitumgebung von Java dann kein Objekt der Klasse in> welcher die public static void main(String[]args) definiert ist ?
Nicht automatisch. Aber oft wird innerhalb der main-Funktion ein Objekt
der umgebenden Klasse erzeugt und von diesem dann eine oder mehrere
Member-Fuktionen aufgerufen, die dann in einem OO-Kontext die
Hauptarbeit machen.
Yalu X. schrieb:> Dennis H. schrieb:>> Erzeugt die Laufzeitumgebung von Java dann kein Objekt der Klasse in>> welcher die public static void main(String[]args) definiert ist ?>> Nicht automatisch. Aber oft wird innerhalb der main-Funktion ein Objekt> der umgebenden Klasse erzeugt und von diesem dann eine oder mehrere> Member-Fuktionen aufgerufen, die dann in einem OO-Kontext die> Hauptarbeit machen.
Danke. Interessante Idee.
Der Unterschied zwischen JAVA und C++ ist erstmal das in JAVA es keine
mehrfachvererbungen gibt.
Alle Dateien eines JAVA Programs sind jeweils Klassen.
Arduino benutzt zwar C++ um die Bibliotheken zu machen ist aber eher was
selbstgestricktes.
Schau mal z.B. das JAVA-Tutorial duch:
http://docs.oracle.com/javase/tutorial/java/TOC.html
Bei C++ hast Du neben mehrfacher Vererbung auch kein Runtimecontainer,
d.h. während bei JAVA ein NULLPOINTER abgefangen wird kannst Du mit C++
den Rechner zerschießen.
Hier mal ein C++ Tutorial:
http://www.cpp-tutor.de/cpp/hinweise.html
Beides sind OOP und haben mächtige Bibliotheken.
Ich persönlich würde QT und C++ JAVA vorziehen, beides ist Plattform
unabhängig aber C++ nativ ist deutlich schneller als JAVA.
Lies Dir die Tutorials durch und entscheide dann was Du nehmen willst.
Um OO lernen kommst Du bei beiden nicht herum !
kalterkaffee schrieb:> Der Unterschied zwischen JAVA und C++ ist erstmal das in JAVA es> keine> mehrfachvererbungen gibt.
Wenn das für dich der Hauptunterschied ist, kennst du nicht viel von
Java und/oder C++... Das template-System von C++ ist viel komplexer und
mächtiger als die Java-Generics, C++ hat Destrukturen & damit RAII,
Operator-Überladungen, Default-Parameter, Typ-Aliase, Typfunktionen,
usw...
kalterkaffee schrieb:> Arduino benutzt zwar C++ um die Bibliotheken zu machen ist aber eher was> selbstgestricktes.
Nö, die Basis-Sprache für sowohl Biblitoheken als auch Anwendungen ist
immer noch C++
kalterkaffee schrieb:> Bei C++ hast Du neben mehrfacher Vererbung auch kein Runtimecontainer,> d.h. während bei JAVA ein NULLPOINTER abgefangen wird kannst Du mit C++> den Rechner zerschießen.
Quatsch, da stürzt höchstens das Programm ab. Höchstens bei Bare-Metal
Programmierung könnte da was "kaputt" gehen.
kalterkaffee schrieb:> Ich persönlich würde QT und C++ JAVA vorziehen, beides ist Plattform> unabhängig aber C++ nativ ist deutlich schneller als JAVA.
Das kann man keineswegs so pauschal sagen. Die Laufzeitumgebung von Java
ermöglicht diverse Optimierungen, von denen C++ nur träumen kann; zB
dass das Java Programm immer für den CPU des Nutzers optimiert
(just-in-time kompiliert) wird und diesen somit optimal nutzt, während
die meisten C++ Programme für den kleinsten Nenner der meistverwendeten
CPU's optimiert werden (zB typischerweise den uralten 80386) und somit
die Vorteile moderner CPU's gar nicht nutzen können.
kalterkaffee schrieb:> Um OO lernen kommst Du bei beiden nicht herum !
Naja, C++ ist eine Multi-Paradigmen-Sprache, die einem OOP nicht
aufzwingt. Selbst in Java kann man prozedural nicht-OOP coden (alles
schon gesehen).
Der in der Praxis relevanteste Hauptunterschied von Java und C++ wird
gerne übersehen, nämlich dass die Speicherlayouts von Funktionen & Daten
in kompilierten C++ Programmen/Libraries typischerweise fix sind,
während sie in Java flexibel sind. Dies erzwingt in C++ die
Rekompilierung sämtlicher Anwendugen wenn bestimmte Änderungen an
Libraries gemacht werden, während Java-Programme bei den meisten
Änderungen Binary-Kompatibel bleiben. Dies vereinfacht die Nutzung &
Deployment von Java-Anwendungen drastisch, und ermöglicht in
Zusammenhang mit der Einfachheit mächtige Entwicklungstools, die in C++
nicht möglich sind. Dies ist für eine konkrete Sprachwahl stark
ausschlaggebend.
Programmierer schrieb:> die Speicherlayouts von Funktionen & Daten in kompilierten C++> Programmen/Libraries typischerweise fix sind, während sie in Java> flexibel sind. Dies erzwingt in C++ die Rekompilierung sämtlicher> Anwendugen wenn bestimmte Änderungen an Libraries gemacht werden,
Auch in C++ können dynamisch Libraries erstellt und dynamisch geladen
werden, sofern es das OS zulässt oder man es manuell macht. Statische
Libraries müssen ja nicht verwendet werden.
Dennoch können die zur Runtime verfügbaren informationen bei Java
(Classen,member,dessen namen und typinformationen), welche mit Java
Reflect ausgelesen werden können, echte vorteile bieten.
Für mich ist der Hauptnachteil von Java die Notwendigkeit der JVM.
Was mir jetzt nach längerem Java-Coden und C++ - Abstinenz aufgefallen
ist: C++ hat nun all die schönen Datenstrukturen von Java bekommen. Also
von String bis Vector usw. Aber: die werden ja in den Standardlibs fast
nirgends verwendet? Ich mach also ne Usereingabe in einen String, will
den dann z.B. trimmen, in Tokens zerlegen usw, aber die Funktionen dort
erwarten ja einen char * , aber keinen String? Da muss die Standardlib
nach meiner Meinung nochmal ziemlich überarbeitet werden, um das ein
wenig runder zu bekommen.
Programmierer schrieb:> Das kann man keineswegs so pauschal sagen. Die Laufzeitumgebung von Java> ermöglicht diverse Optimierungen, von denen C++ nur träumen kann; zB> dass das Java Programm immer für den CPU des Nutzers optimiert> (just-in-time kompiliert) wird und diesen somit optimal nutzt, während> die meisten C++ Programme für den kleinsten Nenner der meistverwendeten> CPU's optimiert werden (zB typischerweise den uralten 80386) und somit> die Vorteile moderner CPU's gar nicht nutzen können.
Und weil Java so gut optimiert werden kann, sind alle Java-Anwendungen
ausnahmeslos schneckenlangsam?
Theoretisch mag das ja alles der Fall sein, aber praktisch merkt man
jeder Java-Anwendung sofort an, dass es eben eine Java-Anwendung ist.
Bestes Beispiel ist Eclipse, und das ist nur wirklich keine
Raketentechnik an Software.
Daniel A. schrieb:> Auch in C++ können dynamisch Libraries erstellt und dynamisch geladen> werden, sofern es das OS zulässt oder man es manuell macht.
Korrekt, aber auch diese Libraries haben statische Speicherlayouts.
Greifst du vom Programm aus auf Daten der Library zu, musst du das
Programm neu kompilieren wenn sich das Layout in der Library ändert
(Felder/virtuelle Funktionen vorher hinzufügen zB).
Andreas R. schrieb:> C++ hat nun all die schönen Datenstrukturen von Java bekommen. Also> von String bis Vector usw.
Du meinst: Du hast sie nun gefunden. C++ hat die schon lange.
Andreas R. schrieb:> Aber: die werden ja in den Standardlibs fast> nirgends verwendet?
Klar werden die verwendet. Meistens implizit über template-Argumente.
Andreas R. schrieb:> will> den dann z.B. trimmen, in Tokens zerlegen usw, aber die Funktionen dort> erwarten ja einen char * , aber keinen String?
Die C++ Standard Library hat keine trim/zerlege Funktion. Vielleicht
meinst du eine C library, die kann natürlich keine C++ Strings.
Thomas W. schrieb:> Und weil Java so gut optimiert werden kann, sind alle Java-Anwendungen> ausnahmeslos schneckenlangsam?
Weil viele Programmierer ausschließlich Java beherrschen und weil viele
Programmierer schlecht sind, ist ein "großer" Anteil der
Java-Anwendungen langsam. Man kann in allen Sprachen schlecht und
gut/effizient programmieren, und Java selbst limitiert da wenig.
Thomas W. schrieb:> und das ist nur wirklich keine> Raketentechnik an Software.
Eben doch, Eclipse ist ein hochkomplexes Framework das aus einer Unzahl
an Komponenten besteht. Wenn da nicht überall hohe Codingstandards
herrschen, wirds nunmal langsam...
Thomas W. schrieb:> Programmierer schrieb:> Bestes Beispiel ist Eclipse, und das ist nur wirklich keine> Raketentechnik an Software.
In welcher Sprache ist Visual Studio geschrieben? Es stimmt schon, dass
Java im Allgemeinen eine Bremse ist, ein gutes Beispiel dafür ist Maple,
als unter Linux auf eine Java-Gui gewechselt wurde....
kalterkaffee schrieb:> aber C++ nativ ist deutlich schneller als JAVA.
Kommt darauf an. Ich hatte mal ein paar Vergleiche gemacht, bei denen
Java durchgängig schneller war. War damals JDK 1.2 und Visual Studio 6.
Java kann den Heap effizienter managen als C++ (gar nicht). Die Tests
handelten hauptsächlich um Objekt-Erzeugung und -Destruktion.
Eine Runtime für C++ wie in Java gibt's zudem auch.
Programmierer schrieb:> Weil viele Programmierer ausschließlich Java beherrschen und weil viele> Programmierer schlecht sind, ist ein "großer" Anteil der> Java-Anwendungen langsam. Man kann in allen Sprachen schlecht und> gut/effizient programmieren, und Java selbst limitiert da wenig.
Und C++ ist so, dass du es entweder kannst, oder dir fliegt dein Projekt
frühzeitig um die Ohren. In Java oder beispielsweise .Net bekommt jeder
(wahrscheinlich auch ich) noch etwas hingestümpert was nicht sofort
abstürzt.
Beruflich habe ich mit einer Software von Siemens (TIA-Portal) zu tun.
Angeblich ist dies eines der größten .Net Projekte (in C# geschrieben).
Und es ist wirklich unglaublich langsam, ungefähr vergleichbar mit einer
Java-Anwendung. Vielleicht zieht die vermeintliche "Leichtigkeit" einer
Sprache viele schlechte Programmierer an. Ein so großes aktuelles
Softwareprojekt in C++ erstellen zu wollen, würde alleine anhand des
Personalmangels (fähige Programmierer die C++ beherrschen) scheitern.
Es liegt m.E. immer am Entwickler, der Skalierfähigkeit der Anwendung
(abhängig von der Datenkonstellation) und der Umgebung, wie schnell eine
Anwendung läuft, nicht an der Programmiersprache. Wir haben in der Firma
gut 1,5 Mio. LOC in Java für eine Enterprise Application und keine
Performance Probleme.
Eclipse für Java mit Maven ist unter Linux mit EXT4 richtig flott, unter
Windows weniger bei richtig großen Projekten (1 Mio. LOC und mehr, liegt
am lahmen NTFS). Eclipse für Java kann auch viel mehr als Eclipse für
C++ oder Visual Studio (Navigieren durch den Code (Call Hierarchie,
Symbol Search, ...), Plugins für Unused Code (UCDetector), Testabdeckung
(EclEmma), Maven, undendlich viele 3rd Party Libraries, ...). Und alles
kostenlos.
Die ganzen Amateurprojekte, um die es hier meist geht, meine hier
Zuhause auch, sind für Entwicklungsumgebungen doch alles nur Pipifax.
Andreas R. schrieb:> Was mir jetzt nach längerem Java-Coden und C++ - Abstinenz aufgefallen> ist: C++ hat nun all die schönen Datenstrukturen von Java bekommen. Also> von String bis Vector usw.
Da muß deine Abstinenz aber sehr lang gewesen sein, denn C++ wurde 1998
inklusive dieser Datentypen von der ISO genormt. Die Typen gab's aber
schon vorher, denn sie waren die Basis für den Standardbibliotheks-Teil
der Norm. Laut Wikipedia gibt es Java seit 1995, also würde es mich
nicht wundern, wenn manche der Klassen in C++ älter sind, als die
Sprache Java.
Programmierer schrieb:> Greifst du vom Programm aus auf Daten der Library zu, musst du das> Programm neu kompilieren wenn sich das Layout in der Library ändert> (Felder/virtuelle Funktionen vorher hinzufügen zB).
Da gibt es auch Möglichkeiten, Binärkompatibilität zu gewährleisten.
Große in C++ geschriebene Frameworks wie z.B. KDE tun das erfolgreich.
Programmierer schrieb:> Weil viele Programmierer ausschließlich Java beherrschen und weil viele> Programmierer schlecht sind, ist ein "großer" Anteil der> Java-Anwendungen langsam. Man kann in allen Sprachen schlecht und> gut/effizient programmieren, und Java selbst limitiert da wenig.
Ich habe mal den Test gemacht und bin zu dem Ergebnis gekommen, dass
einfache, aber rechenintensive Anwendungen, wie Primzahlsuche gleich
schnell waren. Es heißt auch immer wieder, dass Java inzwischen
mindestens so schnell wie C++ ist (hier ja auch).
Dann frage ich mich aber, warum Minecraft mit seiner wirklich extrem
einfachen Graphik meinen Computer so hoch auslastet, während andere
Spiele mit guter Graphik flüssig laufen. Ist Markus Persson so ein
schlechter Programmierer?
Markus schrieb:> kalterkaffee schrieb:>> aber C++ nativ ist deutlich schneller als JAVA.> Kommt darauf an. Ich hatte mal ein paar Vergleiche gemacht, bei denen> Java durchgängig schneller war. War damals JDK 1.2 und Visual Studio 6.> Java kann den Heap effizienter managen als C++ (gar nicht). Die Tests> handelten hauptsächlich um Objekt-Erzeugung und -Destruktion.> Eine Runtime für C++ wie in Java gibt's zudem auch.
Objekterzeugung ist in Java wesendlich teurer wie in C++, von daher
möchte ich deine Tests anzweifeln. Das liegt daran das die Vm erst
einmal den Classloader anwerfen muss und das Java Threads vor dem
Programmierer verbirgt aber dadurch jeden Furz im Hintergrund
synchronisiert ob notwendig oder nicht. Ich hatte schon Anwendungen, da
musste ich mir Objekt-Pools bauen und Objekte wiederverwenden um ein
einigermassen reaktionsfähiges Programm zu haben. Der new operator von
C++ erzeugt mit malloc(sizeof(class)) das Objekt und ruft dann den
Konstruktor auf aber den Konstruktor muss Java ja auch aufrufen.
Programmierer schrieb:> Das kann man keineswegs so pauschal sagen. Die Laufzeitumgebung von Java> ermöglicht diverse Optimierungen, von denen C++ nur träumen kann; zB> dass das Java Programm immer für den CPU des Nutzers optimiert> (just-in-time kompiliert) wird und diesen somit optimal nutzt, während> die meisten C++ Programme für den kleinsten Nenner der meistverwendeten> CPU's optimiert werden (zB typischerweise den uralten 80386) und somit> die Vorteile moderner CPU's gar nicht nutzen können.
Ja stimmt, aber die meisten Optimierungen werden auf dem Desktop gar
nicht gemacht, weil es die Latenz/Startgeschwindigkeit drastisch erhöht.
Deshalb ist Java auf Servern auch um einiges beliebter, da kann man sich
die Zeit nehmen.
Thomas W. schrieb:> Theoretisch mag das ja alles der Fall sein, aber praktisch merkt man> jeder Java-Anwendung sofort an, dass es eben eine Java-Anwendung ist.> Bestes Beispiel ist Eclipse, und das ist nur wirklich keine> Raketentechnik an Software.
Mein Eindruck ist das Java massiv mehr Speicher braucht (warum
eigentlich, alles nur wegen schlechter Programmierer?) und deshalb immer
langsamer ist. Der Speicher muss schließlich verwaltet werden.
Programmierer schrieb:> Thomas W. schrieb:>> Und weil Java so gut optimiert werden kann, sind alle Java-Anwendungen>> ausnahmeslos schneckenlangsam?> Weil viele Programmierer ausschließlich Java beherrschen und weil viele> Programmierer schlecht sind, ist ein "großer" Anteil der> Java-Anwendungen langsam. Man kann in allen Sprachen schlecht und> gut/effizient programmieren, und Java selbst limitiert da wenig.
Das Problem ist vor allem, dass Java schon immer damit propagiert hat,
dass man sich ab sofort um die Speicherverwaltung (dank GCC) nicht mehr
kümmern muss. Aber das stimmt nicht, du solltest eben nicht überall und
vor allem in Schleifen mit new um dich werfen. Die Sprache hat das denen
quasi so angelernt, also ist Java doch selbst daran Schuld?
Heute mal anonym schrieb:> Ich habe mal den Test gemacht und bin zu dem Ergebnis gekommen, dass> einfache, aber rechenintensive Anwendungen, wie Primzahlsuche gleich> schnell waren. Es heißt auch immer wieder, dass Java inzwischen> mindestens so schnell wie C++ ist (hier ja auch).
Da greift die Java Laufzeitumgebung auch kaum ein und solche Fälle sind
relativ einfach zu optimieren.
Heute mal anonym schrieb:> Dann frage ich mich aber, warum Minecraft mit seiner wirklich extrem> einfachen Graphik meinen Computer so hoch auslastet, während andere> Spiele mit guter Graphik flüssig laufen. Ist Markus Persson so ein> schlechter Programmierer?
Zu seiner Verteidigung muss man sagen, dass Minecraft als Hobbyprojekt
angefangen hat und natürlich der Erfolg nicht abzusehen war. Wenn er das
gewusst hätte, dann hätte er sicher mehr Arbeit in das Fundament
gesteckt. Ich denke mal, dass das der Hauptgrund ist.
TriHexagon schrieb:> Zu seiner Verteidigung muss man sagen
Eher zur Verteidigung von Java. Ich denke, dass die geringe
Geschwindigkeit an Java liegt.
Ohne das belegen zu können, habe ich das Gefühl, dass Java mit C++
mithalten kann, wenn nicht viel auf den Speicher zugegriffen wird.
Sobald aber der Speicher oft geleert, neu geschrieben und aktualisiert
werden muss, wie es bei Graphik (und anderen Situationen) der Fall ist,
bricht Java ein.
Ich halte Java für eine gute Sprache und inzwischen programmiere ich
viel lieber in Java als in C++, weil vieles einfacher ist, aber wenn es
auf Effizienz ankommt, würde ich trotzdem auf jeden Fall C++ vorziehen.
Beide Sprachen habe ich übrigens schon professionell für kommerzielle
Produkte eingesetzt.
@Heute mal anonym, ja da stimme ich dir zu. Ich hab früher mal viel mit
C# zu tun gehabt, es geht wirklich leichter von der Hand. Die Sprache
trägt auch kaum Altlasten mit sich und ist recht sauber aufgebaut.
Heute mal anonym schrieb:> Ohne das belegen zu können, habe ich das Gefühl, dass Java mit C++> mithalten kann, wenn nicht viel auf den Speicher zugegriffen wird.> Sobald aber der Speicher oft geleert, neu geschrieben und aktualisiert> werden muss, wie es bei Graphik (und anderen Situationen) der Fall ist,> bricht Java ein.
Bei Grafik hat Java eben noch zwei extreme Nachteile.
Erstens kann man in Java keine eigenen Wertetypen deklarieren, d.h. alle
Typen außer die Standarddatentypen kommen auf dem Heap. Wenn ich mal
schnell kurzzeitig einen Vektor oder eine Matrix brauche, ist es nicht
möglich das auf dem viel schnelleren Stack abzulegen, sondern nur auf
dem Heap, was wiederum einiges an Performanz kosten kann. Bei C++ kein
Problem.
Zweitens sind Drawcalls bei Java viel teurer, da muss man erst mal
durchs JNI und Parameter müssen gegebenenfalls umgewandelt werden, keine
schöne Sache. Besonders wenn man mehrere tausend davon hat.
TriHexagon schrieb:> Das Problem ist vor allem, dass Java schon immer damit propagiert hat,> dass man sich ab sofort um die Speicherverwaltung (dank GCC) nicht mehr> kümmern muss.
Mich stört da noch was anderes dran: Objekte bestehen nicht nur aus
Speicher. Es gibt auch noch andere Ressourcen. Die Automatisierung des
Speicherhandlings über einen GC geht aber einher damit, daß man sich um
alle anderen Ressourcen ab sofort von Hand kümmern muss. C++ bietet
keinen grusätzlich aktiven Automatismus, aber die Möglichkeit, es zu
automatisieren, und das eben für alle Ressourcen und nicht nur den
Speicher.
Hans-Georg L. schrieb:> Objekterzeugung ist in Java wesendlich teurer wie in C++, von daher> möchte ich deine Tests anzweifeln.
Hast also selbst noch keinen derartigen Test durchgeführt.
Just in time compiler sind aber nicht sehr verbreitet und die JVM ist
nunmal ein 8bit Interpreter der die compilierten classes verwaltet.
Per JNI wird auf die JVM oder andere native Programme zugegriffen, dann
gibt's noch Reflections und sicherlich noch die eine oder andere
Variante nativen Code einzubinden bzw. auszuführen.
Nur ändert das nichts an der Tatsache das nativ compilierter C++ Code
schneller ist, auch wenn man QT nimmt was mit den Slots ja auch eine
"Erweiterung" von C++ beinhaltet.
Meiner Meinung nach gibt sich C++11 mit QT nicht viel mit JAVA, bei
beiden sollte man setter und getter benutzen und jeweils die Variablen
private machen.
Es ist halt geschmackssache was man lieber mag, aber Programmiersprache
ist Programmiersprache, wichtiger ist ein gutes Grunddesign.
Ob ich nun einen KFZ-Steuerrechner in BASIC, C#, JAVA, C++ oder XYZ
schreibe bleibt sich gleich, nur muß der Rechenweg stimmen.
Ob das Ergebnis nun in 3D ausgegeben wird oder als Text auf der Konsole
ändert ja nix am Ergebnis.
Aber http://www.klickibunti.org/buntibunti.php ist ja wichtiger ...
kalterkaffee schrieb:> Just in time compiler sind aber nicht sehr verbreitet
Die HotSpot JVM gibt es schon seit den 90ern und die ist ziemlich
verbreitet.
Und der Datentyp int hat 32 Bit. Ja der compilierte Java-Code wird auch
Byte-Code genannt, aber deswegen ein 8-Bit-Interpreter. Klingt nach
Vorurteilen gepaart mit Ahnungslosigkeit. Nicht selten hier.
Eigentlich mag ich kalten Kaffee, aber ich hoffe der hat bei mit nicht
so gewirkt.
Bastler schrieb:> Ja der compilierte Java-Code wird auch> Byte-Code genannt, aber deswegen ein 8-Bit-Interpreter. Klingt nach> Vorurteilen gepaart mit Ahnungslosigkeit.
Die Opcodes der Instructionen sind 8 bit lang, wenn ich mich richtig
erinnere. Ich wollte mal eine JVM in JS schreiben, Ist dann ein
disassembler geworden, weil zuwenig zeit.
8-Bit Architektur ist ein definierter begriff. 8-Bit Interpreter und
4-Bit Maschine jedoch nicht, also kann ich die n-bit in einen beliebigen
Zusammenhang setzen, und das Opcode-Feld passt gerade.
Ich hatte vor vielen Jahren mal Tests gemacht. Es ging um unscharfe
Suche (Edit Distance).
Im ersten Versuch die Überraschung, java war etws schneller als C. Das
konnte nicht sein, also etwas mehr gesucht und gefunden, dass bei C noch
Debug Code erzeugt wurde, In Release und mit Optimierungen auf
Gschwindigkeit war dann C knapp doppelt so schnell wie Java.
Ist schon lange her war ein älterer MSC Compiler und Java 1.3
Nur:
1. Wer braucht wann überhaupt die volle Geschwindigkeit des Rechners,
meist wird doch nur auf Eingaben des benutzers gewartet.
2. Mit beschissener Programmierung kann man ganz schnell ein Programm um
den Faktor 100 oder 1000 langsamer machen. Je komplexer die Sprache,
desto schneller ist man in einem Fallstrick. Mein Rekord einer
Programmbeschleunigung durch Optimierung war der Faktor 10000. Da hatte
ein Super-Programmierer eine eigene Speicherverwaltung mit shared Mem
gemacht und ist beim Freigeben jedes einzelnen Blocks linear durch eine
verkettete Liste.
3. Im heutigen Zeitalter sind die meisten Anwendungen Client Server
Anwendungen mit Web Oberfläche. Fat Clients mit dicker grafischer
Oberfläche sind eine aussterbende Spezies, eigentlich nur noch im Spiele
und Hobby Bereich. Und im Serverbreich wird recht oft java benutzt.
4. Das Deployment mit Java und auch Datenbankanbindungen ist viel
einfacher, vor allem wenn unterschiedliche Betriebssysteme und
unterschiedliche Datenbanken zusammenkommen. Wir unterstützen hier
Unixe, Linux und Windows, mit Oracle DB2 und SQL Server als Datenbank,
und das mit EINER! Auslieferung. Einzig Batche und Scripte gibts eben
doppelt.
Macht das mal mit C(++)
Haben wir auch, das sogar für ein halbes Dutzend Host Systeme Vax VMS,
IBM MVS sowie diverse Cicse und sogar Siemens Host und AS400 früher.
Dazu etwa 10-15 unterschiedliche Datenbanksysteme das war/ist eine
einzige Qual. man hatte praktisch für jeden Kunden eine eigene
Compilierung.
Fazit: Wer Java pauschal als langsam und blöd verteufelt hat es nie
ernsthaft benutzt und kann nicht über seinen kleinen
Entwicklertellerrand schauen. In unserer Firma spart es uns Faktor 2 der
Entwicklungs und Deploymantzeit bei ausreichend guter Performance.
Für Spiele und extrem zeitkritische Dinge würde ich auch heute C(++)
benutzen, also immer das passende Tool für das Projekt.
Hallo Udo,
Udo S. schrieb:> 1. Wer braucht wann überhaupt die volle Geschwindigkeit des Rechners,> meist wird doch nur auf Eingaben des benutzers gewartet.
Das ist im Server- und im BigData-Umfeld anders.
> 2. Mit beschissener Programmierung kann man ganz schnell ein Programm um> den Faktor 100 oder 1000 langsamer machen. Je komplexer die Sprache,> desto schneller ist man in einem Fallstrick.
Es ist richtig, daß man mit schlechter Programmierung ein Programm um
viele Faktoren langsamer machen kann. Und nicht nur damit: schlechtes
Softwaredesign ist ein noch viel, viel schlimmerer Performancekiller.
Falsch ist hingegen, daß das pauschal an der Sprache liegen müsse. Es
hat nichts mit der Sprache zu tun, wenn Softwaredesigner oder
Programmierer ihr Handwerk und / oder ihre Werkzeuge nicht beherrschen.
Es hat auch nichts mit der Sprache zu tun, wenn die
Entwicklungswerkzeuge langsamen Code erzeugen und / oder die
Laufzeitumgebung imperformant ist. Das sind nur Eigenheiten der
jeweiligen Implementierung, nicht der Sprache.
> Fazit: Wer Java pauschal als langsam und blöd verteufelt hat es nie> ernsthaft benutzt
Richtig. Wir entwickeln (und verkaufen, natürlich) eine Java-Software
zur Betrugsprävention bei Banktransaktionen aller Art; da sind harte
Echtzeit mit Latenzen im Bereich von weniger als 50ms, sehr komplexe
Berechnungen und die Verwaltung großer Datenmengen (Kreditkarten-,
Terminalhistorien) im Bereich mehrerer hundert Gigabyte gefragt. Das
geht mit Java ziemlich gut, wenn man weiß, was man tut.
> In unserer Firma spart es uns Faktor 2 der> Entwicklungs und Deploymantzeit bei ausreichend guter Performance.
Nach den letzten Erhebungen, die ich bei Dr. Dobbs gelesen habe und die
über etwa 6000 verschiedene Projekte erhoben worden sind, hat Java durch
die automatische Speicherverwaltung einen Vorteil von rund 15% bei der
Entwicklungszeit; das entspricht auch meinen eigenen Erfahrungen.
Auf der anderen Seite sorgt ebendiese automatische Speicherverwaltung in
unserem Anwendungsfall immer wieder für Probleme, weil der GC sich nur
teilweise konfigurieren und beeinflussen läßt. Das ist nicht schön, aber
beherrschbar -- und frißt einen Teil der höheren Entwicklerproduktivität
gegenüber C++ leider wieder auf.
Nach meiner Erfahrung haben übrigens etwa 90% der Softwareentwickler,
egal in welcher Sprache, nur wenig Erfahrung mit Performancefragen --
und zwar vor allem deshalb, weil sie das nie wirklich gebraucht haben.
Darum halte ich die "Argumente" gegen bestimmte Sprachen, diese seien zu
langsam oder verbrauchten zuviel Speicher oä., alle für vorgeschobene
Pseudoargumente, die eine ideologische Präferenz oder schlichte
Unkenntnis so zu erklären, daß sich die "Begründung" irgendwie
vernünftig und fundiert anhört. Wenn die Performance immer so wichtig
wäre, dürfte es gar keine Skriptsprachen geben.
Liebe Grüße,
Karl
> 8-Bit Architektur ist ein definierter begriff. 8-Bit Interpreter und
4-Bit Maschine jedoch nicht, also kann ich die n-bit in einen beliebigen
Zusammenhang setzen, und das Opcode-Feld passt gerade.
Genau was ich mit meinem Post andeuten wollte: "8-Bit Interpreter" ist
eine völlig nutzlose Information.
Zu BigData: wichtig ist dabei eher die erreichte Speicherbandbreite als
die Frage, ob ich einen oder fünf Maschinenbefehle brauche. Wenn ich mit
jeden Zgriff einen Cache-Miss erzeuge, dann macht die CPU nur
Wartezyklen. Wenn ich durch geeignet Speicherlayout eine Cache-Line
möglichst ganz ausnutze, dann wird das was. Wenn ich wie bei Java den
Heap als eine Art Ringpuffer benutze, d.h. Immer am freien Ende Objekte
anlege und man davon ausgeht, daß gerade erzeugte Objekte mit größerer
Wahrscheinlichkeit benutzt werden als ältere, dann wird der Hotspot im
RAM kleiner und es paßt mehr davon in den Cache. Nachteil ist das den
Datenmüll auch jemand aufräumen muß. Werden Speicherbereiche dagegen
immer wieder freigegeben, dann fragmentiert der benutzte Speicher und
ein Teil des Cache-Inhalts hat eigentlich keinen Inhalt. Die Hitrate,
damit die effektive Speicherbandbreite bricht ein und die CPU kann
locker Byte-Code interpretierend mithalten.
Wie ich darauf komme? Nun, ich arbeite an Rechnern, in denen
Terabyteweise RAM steckt. Der Unterschied zwischen richtig und falsch
kann da locker ein 3-stelliger Faktor sein.
Daniel A. schrieb:> Eine Variable C, die Incrementiert wird. Weiss doch jeder auf java.
Wichtig ist: post-increment. Erst wird C benutzt und dann der Wert um
eins erhöht.