*.exe erstellen?

Original geschrieben von Terrance & Philipp
Wie sieht das eigentlich Performancemässig aus? Nützt die Kompilierung zu einer Exe Datei etwas?

vermutlich nicht, da sie noch nicht so weit in der Entwicklung sind um etwas auf Geschwindigkeit zu optimieren.
 
Original geschrieben von Kuniberd
Also ich habe mit jsmooth sehr gute Ehrfahrung gemacht.
http://jsmooth.sourceforge.net/
Hat ne sehr schöne GUI.

Ob es was für die Performence bringt kann ich leider nicht beantworten. Ich habe bis jetzt keine Geschwindigkeitssteigerung festgestellt.

Das macht keine Executable sondern verpasst dem Ganzen nur einen Wrapper der die VM aufruft. Der Sinn einer exe wäre, die VM nicht mehr zu benötigen.
 
Es ist unmöglich Java Bytecode ohne VM auszuführen ;o)

Sobald ein GC in der Exe steckt, kann man von einer integrierten VM ausgehen.

Zur Geschwindigkeit: Es gab mal Benchmarks in der dclj. Der Gcj war irgendwo zischen Server und ClientVM angesiedelt. Zum Teil ein bissi schneller als die Client VM, aber langsamer als die Server VM.

Im übrigen ist die Frage performance belanglos, denn sowohl die VM als auch gcj arbeiten mit nativem compilat. Interpretiert wird schon lange nicht mehr.

cybi
 
ich dachte der gcj kompiliert Java-Byte bzw. Quell-Code nach C/C++ und das mittels gcc nach nativ? Damit ist nicht mehr von einer "integrierter VM" zu sprechen. Bei einer solchen könnte man das ganze wieder zurückverwandeln quasi entpacken (was bei einem Wrapper geht). Beim nativen Compilat geht dies definitv nicht (dafür kann man es dann ordentlich disassemblieren).
 
Nur weil es als reines natives compilat vorliegt, heißt es noch lange nicht das auf diese Schicht namens "VM" verzichtet werden kann ;o)

Sie wird lediglich auf eine andere Art und Weise abgebildet.

cybi
 
Ist deine CPU virtuell - also meine ist es nicht. Eine VM ist eine VirtualMachine. Der Code der dort ausgeführt wird hat nichts mit dem realen Code der Maschine zu tun auf der die VM läuft. Die VM übersetzt (wie auch immer) den eigenen Code in den Code der tatsächlichen Maschine.

Bei einem nativen Compilat fällt dieser Übersetzungsschritt weg - schliesslich liegt der auszuführende Code schon nativ weg. Dies ist - und wird nie - eine VM sein und hat auch nichts mit dem Konzept zu tun.

JIT-Techniken ändern daran auch nichts, und auch nicht die Tatsache, dass der Java-Quellcode über einen Zwischenschritt Bytecode in nativen Code compiliert werden kann.
 
Ich bin jetzt zur hälfte durch, aber nur weil eine Bibliothek die Funktionen der VM übernimmt (und die der java bib) heisst das noch lange nicht, dass es eine VM ist. Es ist trotzdem nur eine Bibliothek.

Der Punkt ist:

eine VM (in Reinstform) interpretiert einen Maschinencode für die Maschine die sie virtuell darstellt. Dieses Konzept wird durch JIT-Compiler etwas verwässert, aber das Grundprinzip ist immer noch das gleiche - es liegt ein für die aktuelle Maschine nicht zwingend ausführbarer Code vor den die VM dann ausführt.

Ein natives Compilat hat nun andere Eigenschaften:
1. Ich kann z.B. verlinkte Bibliotheken (die auch nativ vorliegen müssen) statisch verlinken
2. Ich brauche ausser dem Binary keine weiteren Elemente mehr auf meiner Maschine.
3. Ich bin OS und Hardwareabhängig - könnte aber auch direkt Hardware ansprechen ohne die Java-Bibliotheken zu bemühen (das ginge dann allerdings nur über CodeInjection bzw. ähnlich wie bei einer Virusinfektion müsste Code zum Binary hinzugefügt werden.
4. Mein Compiler muss dafür sorgen, dass die von Java bekannten Mechanismen (z.B. GarbageCollection) entsprechend realisiert werden (z.B. durch zusätzlichen Code der mit compiliert wird oder aber durch Bibliotheken).
5. Das dynamische Nachladen von Klassen via Klassloader dürfte nicht mehr funktionieren, bzw. auf ganz anderen Mechanismen fußen z.B. Speicher allozieren, assemblierte Klasse laden, Zusatzinformationen für die Einsprungpunkte laden, Speicher ausführbar markieren, Einsprungpunkte in die entsprechenden Variablen bzw. Tabellen eintragen, ausführen).

Dies sind meiner Meinung nach gravierende Unterschiede zur VM. Es werden nur die Funktionen von der VM die für das funktionieren von Java nötig sind - nicht aber der Teil bei dem der Bytecode interpretiert/jit-compiled wird. Damit ist das native compilat keine VM.

Ich warte schon sehnsüchtig auf die Gegenargumente ;)
 
Zuletzt bearbeitet:
Negativ es ist und bleibt eine Laufzeitumgebung. Nichts anderes ist eine VM.

Außerhalb dieser Laufzeitumgebung kann der weitere Code nicht ablaufen. Weil eben Java kein rein statisch verlinkter Code sein kann. (Okay können schon, aber nur wenn man auf nahezu alle wichtigen Features verzichten würde).

Ob es sich nun um Bytecode oder direktes natives Compilat handelt ist für die Funktionalität der VM wiederum egal. Sie wäre auch eine VM, wenn sie nur mit nativen Klassen gefüttert werden würde.

cybi
 

Neue Beiträge

Zurück