Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
wenn ich die datei z.b. hallo.java kompiliere so erhalte ich doch meinen bytecode also meine class-Datei, nicht wahr?
hab folgende frage : Kann ich die Klasse Hallo.class von einem Windows-Rechner auf Unix kopieren und dort mit dem Interpreter java zur Ausführung bringen? Wenn nicht, was fehlt? Wenn ja: Was benötige ich dafür?
ich würde sagen, dass das schon geht, denn der bytecode ist doch unabhängig von der plattform, bzw. vom betriebsystem. wenn es nicht gehen würde, so weiß man dass die virtuelle maschine also die laufzeitumgebung fehlt. denn die virtuelle maschine übersetzt ja den bytecode in maschinencode.
ist das eine gute antwort auf diese frage, oder komplett falsch, was ich da getippt habe?
Genau, das hat mit der Ungenauigkeit von floats zu tun. Kannst du z.B. in der Wiki nachlesen: Gleitkommazahl ? Wikipedia.
Java verwendet irgendwas mehr oder weniger "IEEE 754"-konformes.
@TO
so lange dein code plattformunabhängig geschrieben ist kannst ihn auf jeder VM der selben oder einer höheren version ausführen ... wichtig ist nur das sowohl compiler als auch runtime dem selben standard folgen müssen ... *spielt bei speziellen dingen mit reflections eine rolle*
es ist auch möglich code mit native-passagen "plattformunabhängig" zu gestalten ... man muss allerdings selbst innerhalb seines codes dafür sorgen *z.b. OS erkennen* und ggf benötigte libs mitliefern ... dann stellt auch sowas kein problem dar
allgemein gilt jedoch : wenn entsprechend programmiert ist java-code völlig unabhängig vom OS und der VM ... so lange alles einem gewissen standard folgt ...
was die ungenauigkeit bei floats angeht :
0.0f 0.0d mag für den rechner wohl noch irgendwie darstellbar sein ... eben weil alle bits 0 sind ...
aber schon 0.1f 0.1d kann auf den meisten systemen nicht mehr mit der genauigkeit dargestellt werden die benötigt wird um z.b. aus 0.1 + 0.1 = 0.2 zu erhalten ...
für einen menschen sieht 0.1 im dezimal system recht simpel aus : das zehntel von 1 ...
für einen rechner mit binär system ist das schon nicht mehr so einfach darzustellen da er die komplexe darstellung verwendet die dazu führt das der rechner dann z.b. 10 durch 100 rechnet *nur ein beispiel ! kann einfacher oder komplexer sein !* ... und da der rechner sowas immer mit multiplikation und division löst ... und auch FPUs eine maximale auflösung haben kommt es irgendwann zu ungenauigkeiten ...
stichwort : just-in-time-compiler ...
die VM mit entsprechendem HotSpot-system macht zur runtime sehr wohl zum teil dierekten ASM für die cpu draus ...
Ja, wenn code mehrmals durchlaufen wird, wer definiert mehrmals? Ist JIT teil der Spezifikatioon einer VM?
[edit]Bist Du Dir sicher, das Java-JIT daraus direkt Maschinencode (also für den jeweiligen Prozessor Intel etc.) erzeugt und ausführt, also ich meine nicht einen optimierten Java-VM code? Wo kann man das nachlesen?[/edit]
Bist Du Dir sicher, das Java-JIT daraus direkt Maschinencode (also für den jeweiligen Prozessor Intel etc.) erzeugt und ausführt, also ich meine nicht einen optimierten Java-VM code? Wo kann man das nachlesen?
Der JIT/Hotspot kommt nicht immer zum Einsatz, erst wenn es "sich lohnt" und er aktiviert ist (-server Parameter macht einen riesigen Unterschied IME).
Wenn er zum Einsatz kommt, wird wirklich Maschinencode erzeugt.
Ansonsten sind Maschinencode und Assemblercode nicht dasselbe, Assembler ist eine low level Programmiersprache für Menschen, Maschinencode ist was die CPU selber frisst.
das kein Assembler sondern entsprechend des JIT nativer cpu-code generiert wird ist mir auch klar ... hab nur ASM als kürzel verwendet da es für viele *wenn auch wie ihr schon gesagt habt* fälschlicher weise als "niedrigste" programmier-"sprache" angesehen wird ...
*imho : ich sehe es teilweise auch so da es einen unterschied macht ob ich jetzt direkt byte-werte im cpu-dialekt programmiere oder eine "sprache" habe in der ich "befehle" habe welche an sich immer gleich sind ... durch den assembler aber in unterschiedliche byte-folgen im cpu-dialekt übersetzt werden*
was die unterstützung von JIT angeht
selbst wenn man die -server option verwendet *welche unter anderem bei der 64-bit VM DEFAULT ist* gibt es in der arbeitsweise des JIT selbst nur wenig unterschied ...
ob man den JIT nun zwingt oder er es selbst macht *also byte-code in native-code zu übersetzen* ... ich denke das dieser unterschied vernachlässigbar ist ... und was genau JIT übersetzt *ob z.b. nur stellen die mehrmals durchlaufen werden *wie viele immer sagen* ... oder spezielle zeilen welche sich besonderst gut umwandeln lassen *z.b. increment-statements* ... ich denke da müsste man mal ganz tief in die spec's gucken um das wirklich rauszubekommen**
fakt ist : nur wenn man den JIT vollständig abschaltet *also die VM im reinen interpreter modus laufen lässt* wird KEIN code in native umgewandelt ...