Seite 3 von 4

Verfasst: 01.07.2007 17:10
von dead_cox
au man jetz bin ich verwirrt. ;D

Soll ich nun C++ nehmen oder nicht?
Java ist mir Unsympatisch, weshalb ich es auch ausgeschloßen habe.

Verfasst: 01.07.2007 17:14
von Zaphod
mir hat in 1985 ein hauptberuflicher programmierer gesagt: "Assembler braucht niemand mehr lernen, das geschwindigkeits-Problem wird Hardware-Seitig gelöst."
Im Prinzip hatte er damit auch recht (wenn auch ganz schön spät).
In aktuellen Spieleengines finden sich meistens keine Assembly Optimierungen mehr. Um Tim Sweeny zu Zitieren "I will gladly sacrifice 10% Performance for 10% productivity" (oder so ähnlich).

Bei WoW besteht der Spiele Code (nicht die Engine) bereits aus einer interpretierten Sprache (Lua) ;)

Mein Schlüsselerlebnis dazu war Quake... das habe ich einmal mit und einmal ohne Assembly Optimierungen kompiliert... tatsächlich macht das beim Software Renderer einen Unterschied... beim OpenGL renderer war der unterschied so klein, dass man ihn nicht in Frames messen konnte.

Der Java Quake 2 port (Jake 2) läuft auch superflüssig.

Mir ist Plattformunabhängigkeit inzwischen wichtiger als noch 0.1 FPS mehr heraus zu holen.

Klar kann man mit C++ ein paar dinge machen die mit Java nicht gehen... mit Assembly wird's jedenfalls nichts. Ich habe allerdings schon 1kb Javademos gesehen, die C++/Assembly intros in nichts nachstehen.

Also wer nicht grade ein Betriebssystem Programmmieren will brauch inzwischen weder C++ noch Assembly und auch ein WoW wäre machbar.

Das muss jeder für sich entscheiden... aber wer von Php kommt wird sich mit Java deutlich weniger schwer tun als mit C++.

Verfasst: 04.07.2007 11:12
von ZeHa
Also wenn es Dir nichts ausmacht, würde ich C++ lernen. Java hat durchaus seine Daseinsberechtigung, aber eben nicht für jeden Zweck. Und für Spiele würde ich gleich C++ benutzen. Du kannst nebenbei oder danach immer noch Java benutzen, da das ganz gut ist wenn Du ein Tool oder ein Spiel fürs Handy programmieren willst. Aber komplett Java für Spiele einzusetzen halte ich nicht generell für die beste Idee.

Außerdem lernst Du bei C++ einiges über Deinen Computer, und das ist auch was wert. Gerade was Buffer, Bytes, und solche Dinge angeht, bist Du bei C++ besser dran. Meiner Erfahrung nach haben einige, die nur Java gelernt haben, keine Ahnung von dem, was auf der Kiste eigentlich passiert. Das ist für einfache Business-Applikationen nicht unbedingt erforderlich, aber dennoch teilweise wünschenswert, weil man sich dann auch Gedanken um Speicherverwaltung, Algorithmen usw. macht, die einem auch in Java etwas bringen könnnen. Daher ist es kein Fehler, erstmal 'ne Weile in C++ programmiert zu haben, und sein Wissen dann in anderen Sprachen anzuwenden.

Bei mir war es sogar ähnlich, was PB angeht: Seit ich mit C++ vertraut bin, programmiere ich auch unter PB um einiges besser als vorher.

Wenn es Dir allerdings darum geht, erstmal OOP zu lernen, dann ist es vielleicht sinnvoll, Java als Zwischenschritt zu benutzen, damit Du ein Gefühl dafür bekommst. Solltest Du das allerdings unter PHP schon ausgiebig gelernt haben, würde ich direkt zu C++ wechseln und mir später noch Java oder auch C# anschauen. Es ist kein Fehler, viele Sprachen zu kennen, aber manchmal ist es eben besser, wenn man fundiertes Wissen in den "schwierigeren" Sprachen hat.

Verfasst: 04.07.2007 11:41
von Tafkadasom2k5
Nunja. bis auf die hardwarenahe Programmierung, stehen sich heutige Programmiersprachen eigentlich in kaum noch was nach. Wenn man wirklich programmieren kann, lässt sich so gut wie jedes Problem lösen (sofern man nicht von einer Runtime o.Ä. abhängig ist, die die komplizierten Sachen managed ;) )

Ich persönlich finde, dass wenn man "progammieren" kann, die Sprache eigentlich nur noch eine Frage des Geschmacks ist, und unter Umständen eine Frage des zu realisierenden Projekts.

Also Java ist jetzt nicht so mein Fall, da ich die Runtime irgendwie nicht mag. Und GUIs mit Java empfinde ich wie einen 100Meter-Lauf, mit Krückstock :freak:
Andererseits ist die OOP dort von Vorteil, was ich mir bei großen Projekten, und vor Allem auch Spielen sehr gut vorstellen kann.

.NET ist irgendwie so ein Java-Abklatsch und sowieso nicht mein #1-Symphatisant, weil mir diese extreme MS-Abhängigkeit Sorgen macht, aber however, das ist Geschmackssache, und warscheinlich bald unabdingbar: Die WinAPI wird sich in den nächsten Jahren weiter zurückziehen, und dann wird es kaum eine andere Möglichkeit geben :-/

Also wenn ich jetzt neu anfangen würde, dann würde ich mich an C++ ranmachen., nicht nur, dass du viel besser verstehst, was in deinem PC so abläuft, nein, du hast die
-> freie Wahl vieler Compiler (darunter OpenSource)
-> viele Beispiele
-> unendlich viele Optimierungsvarianten
-> Die Komfortablität von Objekten, kannst aber auch eine funktionelle GUI erstellen (und ja, das ist wirklich ein riesiger Vorteil. Ich hasse GUI mit Objekten ^^.Ich liebe Callbacks, und empfinde sie als logischer...)
-> Unabhängigkeit von Runtimes
Der Nachteil ist das Plattforumunabhängige: Die Sachen, die auf .NET für Win laufen, laufen auch auf .NET für Linux. Nur: C++ ist kein .NET. Das heißt, selber basteln, und mit beiden Plattforem auseinandersetzen. Das ist wirklich ein großer Nachteil, aber wenn man sich für eine Plattform eh entscheidet, dann ist es ok.

Vielleicht würde ich tatsächlich versuchen, mir mal "D" anzuschauen, aber da habe ich so wirklich noch garkeinen Überblick drüber. C# sieht sehr geil aus, ist aber leidergottes ein pures .NET-Ding.

Ich hoffe, dass eines Tages MONO mächtig genug wird, um das Framework zu ersetzen, und wir zumindest ein *kleines* Bisschen Sicherheit haben, um die Plattformunabhängigkeit zu gewährleisten.

Also hab keine Scheu: Wenn du wirklich Programmieren kannst, dann wirst du sehen: Programmiersprachen sind wie Autos: Wenn du fahren kannst, ist es nur noch eine Sache der Gewöhnung (Einparken, Verbrauch, Beschleunigung, Bremswirkung). Fahren kann man aber so gut wie sofort, und bremsen/beschleunigen auch. Nur muss man sich ab und zu an andere Eigenschaften eben gewöhnen.

Gr33tz
Tafkadasom2k5

Verfasst: 04.07.2007 11:54
von ZeHa
.NET ist irgendwie so ein Java-Abklatsch

Da muß ich Dir widersprechen - zumindest von der Konzeption her hat es einiges mehr drauf als Java. Die Java-Runtime war ursprünglich für die Sprache Java gedacht, und nichts weiter, .NET dagegen ist eine Runtime für alle möglichen Sprachen, und es ermöglicht auch, daß man untereinander Klassen benutzen kann (sprich, Du schreibst 'ne Klasse in C# und benutzt sie dann aber mit VB und mit Python). Das ist schon 'ne geile Idee. Ob die Umsetzung genauso cool ist, ist die andere Frage - da wäre an der Politik von Microsoft schon noch einiges zu verbessern.

Zum Thema C++ und Plattform(un)abhängigkeit: Auch da muß ich Dir widersprechen :mrgreen:
Früher wurde C und C++ als plattformunabhängige Sprache angepriesen, und das ist sie auch. Nur in einer anderen Dimension. Heute denken die meisten, daß nur so Sachen wie Java richtig plattformunabhängig sind, aber auch nur aus dem Grund, weil man nur EINMAL kompilieren muß. Bei C++ kann man genauso plattformunabhängig programmieren, vorausgesetzt, man benutz die richtigen Libs (und das ist bei Java prinzipiell nix anderes). Der Unterschied ist eben, daß man für jede Plattform separat kompilieren muß, womit man die gängigsten Systeme eben auch zur Verfügung haben muß. Das sollte man aber sowieso, wenn man diese Plattformen richtig unterstützen will. Denn einfach nur mit Java programmieren, kompilieren und dann auf gut Glück verteilen kann genauso schiefgehen ;)

Verfasst: 04.07.2007 15:08
von Zaphod
Für die Java Runtime gibt es ebenfalls mehrere Sprachen, darunter Ruby und Python. Die Runtime ist nur eine VM, die noch dazu vollkommen spezifiziert ist, es hindert einen also niemand daran Compiler für jede beliebige Sprache zu schreiben, die für die Java-Runtime Compilieren. Du kannst auch Klassen in die in unterschiedlichen Sprachen geschrieben wurden gemeinsam nutzen.
Du kannst die kompilierten Klassen sogar während der Laufzeit einfach in die VM nachladen und nutzen, das geht so mit keinem anderen System.



Deine Vorstellungen von der C++ Plattformunabhängigkeit lassen mich erahnen, dass du bisher wenig Cross Platform mit C++ entwickelt hast.

C++ ist nicht Hardwareunabhängig. Wurde dein Quellcode für 32bit CPUs geschrieben und compilierst du auf einem 64 bit System werden meistens große Anpassungen nötig. Von komplett anderen CPUs mal ganz zu schweigen.

Der Vorteil an C/C++ ist dabei allerdings, dass es für keine andere Sprache Compiler für so viele Umgebungen gibt. Es gibt vermutlich keine CPU die nicht mindestens von einem C oder C++ Kompiler bedient wird... nur wer brauch das?

Wenn du dich hauptsächlich mit Embedded Systemen beschäftigen willst führt kein weg an C/C++ herum, aber für Anwendungen halte ich es nicht mal für eine besonders gute Wahl. Für Spiele ist das natürlich nicht so eindeutig. Wenn du mit Epic und id konkurieren willst brauchst du C++... wenn nicht reichen auch die meisten anderen verbreiteten Sprachen.

Generell stimme ich aber zu, dass man irgendwann schon mindestens C lernen sollte um zu verstehen was in so einem PC überhaupt vor sich geht.

Verfasst: 04.07.2007 16:36
von ZeHa
Daß es mittlerweile andere Compiler für die Java-VM gibt, ist meiner Meinung nach aber nur ein Phänomen wegen .NET, weil das darauf konzipiert wurde und nun halt manche auch auf die Idee kommen, das für die Java-VM zu machen.

Gut, vielleicht ist es dann vergleichbar, aber trotzdem könnte ich mir gut vorstellen, daß der .NET-Bytecode darauf etwas ausgelegter ist und somit möglicherweise doch alles ein wenig bequemer von der Hand geht als bei Java. Oder kann man bei Java auch beliebige Klassen von beliebigen Sprachen mit beliebigen anderen Sprachen ansprechen?

Zum Thema 32bit und 64bit: Die Anpassungen hast Du aber nur dann, wenn Du für alles mögliche feste Datentypen nimmst. Wenn Du Dir eigene Typedefs machst, und diese genau dort einsetzt, wo sie auf anderen Plattformen kritisch werden könnten, dann ist die Anpassung nicht gerade groß (einfach kurz die typedefs umändern und - ja - testen. Aber testen solltest Du bei Java genauso).

Desweiteren wird es bei Java vielleicht mal umso schwieriger werden, die Vorteile von 64bit zu nutzen, da die VM auf 32bit-Systeme ausgelegt ist und die Datentypen sehr fixiert sind.

Alle übrigen Probleme, wie z.B. ByteOrder usw. hast Du auch bei Java, nur daß bei Java noch dazukommt, daß Du keine unsigned-Datentypen zur Verfügung hast und es eine Qual ist, mit Buffern zu arbeiten. Das geht unter C/C++ dann doch sehr bequem.

Natürlich hat Java seine Berechtigung, und es gibt auch viele Vorteile, aber generell rate ich eben doch dazu, mal eine Sprache anzusehen, die mehr lowlevel ist und bei der man einiges über den Computer selbst erfährt. Wie gesagt, ich habe schon oft gemerkt, daß manche Java-Entwickler da nur sehr unzureichende Vorstellungen haben (und dann so Sachen machen wie z.B. generell float und long zu verwenden, etc).

Verfasst: 04.07.2007 18:35
von Zaphod
Oder kann man bei Java auch beliebige Klassen von beliebigen Sprachen mit beliebigen anderen Sprachen ansprechen?
Ja das geht. Die VM ist einfach ein Bytecode interpreter mit einem integriertem JIT compiler und einer Hotspot analyse. Die kannst du sogar quasi in "Java Assembly" (also purem Bytecode) per hand Programmieren. Daher funktioniert damit alles was man von physischen CPUs gewöhnt ist.

Die Java 64bit VM gibt es schon seit Ewigkeiten (wegen dem Sparc 64 bit CPUs). Generell hast du bei Javaprogrammen überhaupt keine Anpassungsarbeit zwischen 64 bit und 32 bit Ausführung. Der einzige unterschied ist, dass nach dem JIT auf einer 64 bit VM 64 bittige Werte schneller verarbeitet werden. 32bittige werte Werden auf der 64 bittigen VM nach dem JIT 64 bittig gespeichert, weswegen die ebenfalls nativ schnell laufen. Die Vorteile hat man also vollkommen automatisch.

Byteorder Probleme hast du bei Java nur beim zugriff auf externe Ressourcen. Bei C/C++ hast du Byteorder Probleme dagegen schon bei jedem stück alloziertem Speicher.

Das arbeiten mit Puffern ist vollkommen trivial und sogar einfacher als in C/C++. Und wenn du einen Überlauf produzierst, dann bekommst du es in einer Exception genau gesagt und musst nicht qualvoll auf die suche nach dem Leck gehen.

Ich komme von C++ und stimme dahingehend überein, dass das in jedem Fall sehr nützliches wissen ist, auch für andere Sprachen.
Für Spieleprogrammierung kann man auch noch darüber nachdenken ob C/C++ eine gute Wahl ist, aber für Anwendungsentwicklung würde ich inzwischen sehr von C++ abraten, denn da bringt die Optimierbarkeit in der Regel keine Vorteile mehr, ist dafür aber eine vergleichsweise unproduktive Sprache.

Verfasst: 05.07.2007 16:24
von Tafkadasom2k5
Zaphod hat geschrieben:Deine Vorstellungen von der C++ Plattformunabhängigkeit lassen mich erahnen, dass du bisher wenig Cross Platform mit C++ entwickelt hast.
Wenn das jetzt an mich ging: Da hast du Recht, dabin ich echt nicht so bewandert drin. Aber im ganzen Rest muss ich dir ziemlich zustimmen. Aber im Groben und Ganzen haben wir ja das Gleiche geschrieben :)

Zaphods Ansicht ins mE nichts hinzuzufügen :allright:

Gr33tz
Tafkadasom2k5

Verfasst: 05.07.2007 20:08
von hardfalcon
Die "universalste" Sprache dürfte definitiv C sein. Damit kannst du nicht nur Programme für (fast) jedes Betriebssystem schreiben, sondern auch für viele "exotische" Plattformen (PDAs, graphische Taschenrechner, Spielekonsolen (vom GameBoy bis zur PlayStation 3) etc...). Natürlich musst du dich auf jeder Plattform wieder mit den "neuen" Befehlen vertraut machen (auf jeder Plattform hast du ja andere Libraries zur Verfügung), aber die "Grundsyntax" (z.B. für Schleifen, If-ElseIf-Else, Variablen definieren, etc) sind immer gleich.