[Java] Compiler maakt van kleinere java kleinere class file?

Pagina: 1
Acties:

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 18:22

RayNbow

Kirika <3

Topicstarter
Ik las ooit hier op het forum ([rml]mbravenboer in "[ JAVA] Hoe Class naar Java omzetten?"[/rml]) dat commentaar -niet- in de byte code wordt opgeslagen.

Maar ik ben aan het experimenteren geslagen en kwam op de volgende resultaten:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class CommentaarTest {

       public static void main(String[] args) {

              // Dit programma heeft spaties, commentaar, enz
              // en doet niet bijzonder veel

              System.out.println("Regel 1");
              System.out.println("Regel 2");
              System.out.println("Regel 3");

       }

}

Gecompileerde Class File met JDK 1.4.2: 479 bytes

Maar het volgende stukje code (expres geen code tags gebruikt, anders wordt de layout verneukt)...

public class CommentaarTest{public static void main(String[] args){System.out.println("Regel 1");System.out.println("Regel 2");System.out.println("Regel 3");}}

...levert een Class File op van slechts 467 bytes op.

Dus nu is mijn vraag... waarom levert een "gecomprimeerd" Java bestand een kleinere Class bestand op? Zou de Java compiler toch commentaar, etc, opslaan in de bytecode?

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dat commentaar wordt niet opgeslagen. Ik zou niet weten hoe je dat zinnetje zou moeten comprimeren naar 12 bytes.

{signature}


Verwijderd

Je trekt je relatie een beetje scheef. De relatie die je legt tussen aantal karakters en byte code klopt niet. Er is wel een relatie, maar die bestaat voornamelijk uit het aantal commando's die je uitvoert

Het verschil in grootte zit hem denk ik in dat je nu alles op 1 regel hebt, voor backtrace-en van errors worden er regel aanduidingen gebruikt

[ Voor 28% gewijzigd door Verwijderd op 14-11-2003 12:15 ]


  • raoulduke
  • Registratie: Oktober 2003
  • Niet online

raoulduke

Get in!

479 - 467 = 12 bytes. Je commentaar is al langer dan 12 tekens, dus het commentaar wordt duidelijk niet opgeslagen. Waarschijnlijk heeft het met de regeleindes te maken, misschien kan je met de bytecode disassembler (javap) achterhalen wat er extra in de classfile komt.

Remember, if you have any trouble you can always send a telegram to the Right People.


  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 18:22

RayNbow

Kirika <3

Topicstarter
Heh, ok... het zijn dus de regelnummers:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Compiled from "CommentaarTest.java"
public class CommentaarTest extends java.lang.Object{
public CommentaarTest();
  Signature: ()V
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

  LineNumberTable: 
   line 1: 0

public static void main(java.lang.String[]);
  Signature: ([Ljava/lang/String;)V
  Code:
   0:   getstatic   #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc #3; //String Regel 1
   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   getstatic   #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   11:  ldc #5; //String Regel 2
   13:  invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   16:  getstatic   #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   19:  ldc #6; //String Regel 3
   21:  invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   24:  return

  LineNumberTable: 
   line 8: 0
   line 9: 8
   line 10: 16
   line 12: 24

}


versus

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Compiled from "CommentaarTest.java"
public class CommentaarTest extends java.lang.Object{
public CommentaarTest();
  Signature: ()V
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

  LineNumberTable: 
   line 1: 0

public static void main(java.lang.String[]);
  Signature: ([Ljava/lang/String;)V
  Code:
   0:   getstatic   #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc #3; //String Regel 1
   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   getstatic   #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   11:  ldc #5; //String Regel 2
   13:  invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   16:  getstatic   #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   19:  ldc #6; //String Regel 3
   21:  invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   24:  return

  LineNumberTable: 
   line 1: 0

}

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • nxt
  • Registratie: November 2001
  • Laatst online: 04-02 09:36

nxt

als ik dat zo zie komt het denk ik door de debug-info
probeer ze eens te compileren met
code:
1
-g:none
als parameter van javac

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 11:06

Robtimus

me Robtimus no like you

Dan wordt ie 382 bytes.

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1