Unterschied Java/ c++

10/11/2011 21:33 Godfather0945#1
Wie der Titel schon sagt, wüsste ich gerne genau, was der Unterschied ist.
Zurzeit lerne ich Java und deswegen ist es mir wichtig, ob ich anschließend auf c++ umsteigen kann, damit dies nicht nachher mehr arbeit ist, als von anfang an c++ zu lernen. Java lerne ich hauptsächlich weil ich es für informatik in der schule brauche, möchte danach aber umsteigen.

Vielen dank im vorraus
10/11/2011 22:26 Akorn#2
Ein C++ Kompilier erzeugt maschienencode der direct von der cpu ausgeführt werden kann (ausser man nutzt CLI). Dagegen liegt ein Proramm das in Java geschrieben wurde in Bytecode vor. Dieser kann nicht von der cpu direkt ausgeführt werden sondern muss vor dem ausführen erst in maschienencode übersetzt werden. Deswegen ist ein Java Programm langsammer als ein programm in C++. Dafür ist Java aber solange man nicht auf Systemspezifische Api´s zugreift Plattformunabhängig.
10/14/2011 00:01 Tyrar#3
Quote:
Originally Posted by Akorn View Post
Ein C++ Kompilier erzeugt maschienencode der direct von der cpu ausgeführt werden kann (ausser man nutzt CLI). Dagegen liegt ein Proramm das in Java geschrieben wurde in Bytecode vor. Dieser kann nicht von der cpu direkt ausgeführt werden sondern muss vor dem ausführen erst in maschienencode übersetzt werden. Deswegen ist ein Java Programm langsammer als ein programm in C++. Dafür ist Java aber solange man nicht auf Systemspezifische Api´s zugreift Plattformunabhängig.
wobei der teil mit der system spezifischen api eher nebensächlich ist, es gibt da genug libs die cross compatible sind (und im endeffekt die gleichen funktionen bringen) ;)
10/14/2011 00:44 Akorn#4
Quote:
Originally Posted by HeavyHacker View Post
wobei der teil mit der system spezifischen api eher nebensächlich ist, es gibt da genug libs die cross compatible sind (und im endeffekt die gleichen funktionen bringen) ;)
Schon klar das es für fast alles Plattformunabhänigee librarys gibt. Ich wollt damit halt eigentlich auch nur sagen das wen man auf systemspezifische Api´s zugreift das programm nicht mehr Plattformunabhängig ist.
10/14/2011 10:51 Tyrar#5
Quote:
Originally Posted by Akorn View Post
Schon klar das es für fast alles Plattformunabhänigee librarys gibt. Ich wollt damit halt eigentlich auch nur sagen das wen man auf systemspezifische Api´s zugreift das programm nicht mehr Plattformunabhängig ist.
hab ich mir schon fast gedacht :)

aber grundsätzlich: c++ ist schneller/sicherer/einfacher (wenn mans kann)

sicherer in dem sinn das mans nicht vernünftig decompilen kann
10/14/2011 13:42 NikM#6
ich habe erst c++ gelernt und jetzt lerne ich java
ich muss sagen java ist um einiges einfacher
beispielsweise muss man nicht darüber nachdenken speicher wieder freizugeben, da es einen garbage-collector gibt der immer nach speicher sucht der nicht mehr gebraucht wird und ihn automatisch wieder freigibt
von der syntax her sind sich beide sprachen sehr ähnlich
10/14/2011 23:01 MrSm!th#7
Quote:
Originally Posted by HeavyHacker View Post
hab ich mir schon fast gedacht :)

aber grundsätzlich: c++ ist schneller/sicherer/einfacher (wenn mans kann)

sicherer in dem sinn das mans nicht vernünftig decompilen kann
Dann nenne es doch bitte nicht sicherer, das trifft es nicht.

Und einfacher ist es gewiss auch nicht. Sprachlich sind sie auf dem selben Niveau, denn C++ und Java haben syntaxtechnisch so gut wie keine Unterschiede, demnach gibt es eigentlich nur die Unterschiede, die Akorn schon nannte.
Aber die Java VM übernimmt viele Dinge, die das Programmieren einfacher machen, zb. der Garbage Collector, das Zugreifen auf Klassennamen, strenger Typisierung, keine Pointer, ...

C++ ist nebenbei eine Mischung aus generischer, prozeduraler und objektorientierte Programmiersprache; Java ist hingegen komplett objektorientiert.

Außerdem bietet Java eine systemunabhängige Standard-GUI-Schnittstelle, auf welche man bei C++ auch verzichten muss.
10/15/2011 14:52 Tyrar#8
Quote:
Originally Posted by MrSm!th View Post
Dann nenne es doch bitte nicht sicherer, das trifft es nicht.

Und einfacher ist es gewiss auch nicht. Sprachlich sind sie auf dem selben Niveau, denn C++ und Java haben syntaxtechnisch so gut wie keine Unterschiede, demnach gibt es eigentlich nur die Unterschiede, die Akorn schon nannte.
Aber die Java VM übernimmt viele Dinge, die das Programmieren einfacher machen, zb. der Garbage Collector, das Zugreifen auf Klassennamen, strenger Typisierung, keine Pointer, ...
hab mich da wohl falsch ausgedrückt:
mit einfacher meinte ich eher dass man direkt auf speicher zugreifen kann (was sich meines wissens in java ein wenig umständlicher umsetzen lässt)

und mit sicherer dass man einfach den quelltext nicht wieder herstellen kann (was meines wissens in java aber möglich ist)
10/15/2011 16:43 MrSm!th#9
Und was sollte an dieser Einfachheit positiv sein? Im allgemeinen werden Sprachen aufgrund ihrer Alltagstauglichkeit bewertet und nicht aufgrund ihrer Hacking-Tauglichkeit.
Demnach ist der Zugriff auf den Speicher eher ein Negativpunkt; für das Anwendungsprogrammieren ist das ohnehin nicht notwendig, Speicherverwaltung bleibt dem OS überlassen.
Ich weiß btw gar nicht, ob es in Java überhaupt möglich ist; in C# schon.

Ich sagte schon, dieses "sicher" trifft es aber nicht ganz.
Dann sag eher, dass es schwerer ist, den Quelltext wieder zurück zu erlangen, wobei das auch nur so halb stimmt oder dass C++ leichter gegen Reverse Engineering zu schützen ist, aber C++ ist ganz sicher nicht sicherer.

Und ich muss ganz ehrlich sagen, gegen Anti-Debugging etc. kann man mit viel Wissen und Ergeiz noch vergleichsweise leicht gegen ankommen; auch gegen VMs.
Aber ein guter Obfuscater macht den Code einfach so unverständlich, dass man einfach total durcheinander kommt, wenn man versucht, ihn zu entschlüsseln; das braucht nochmal eine ganze Ecke mehr Ergeiz. Dazu kommt, dass man nicht mal eben wie bei nativen Executables den Code auf niedrigster und simpelster Ebene ansehen kann, was es nochmal schwerer macht, wie ich finde, da obfuscateter highlevel Code schwerer zu lesen ist als obfuscateter ASM Code.

Außerdem gibt es auch schon große Fortschritte in der Decompilertechnik für C++.

Ach ja:

Quote:
dass man einfach den quelltext nicht wieder herstellen kann
Das ist so einfach falsch. Auch wenn es nicht möglich ist, den Source Code mit einem Decompiler 100%ig originalgetreu wiederherzustellen, so kann man doch sehr wohl durch Reverse Engineering und auch teilweise mit Decompilern den Code wiederherstellen; letzter ist zwar immer nur eine Art Pseudo-Code, der dem Original wohl kaum ähnlich ist, aber er lässt sich wieder compilen.
Ersteres ist zwar aufwändiger, da es von Hand geschieht, dafür erkennt ein Mensch normalerweise den Sinn von bestimmten Code Abschnitten und kann den Code deutlich "natürlicher" (also so, wie ihn ein Mensch schreiben würde) und originalgetreuer wiederherstellen.