Assemblage de bytecode JVM (via Jasmin ) - 952 960 990
.class public Q
.super java/io/File
.method public static main([Ljava/lang/String;)V
.limit stack 9
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc ".class public Q%n.super java/io/File%n.method public static main([Ljava/lang/String;)V%n.limit stack 9%ngetstatic java/lang/System/out Ljava/io/PrintStream;%nldc %c%s%c%nldc 3%nanewarray java/lang/Object%ndup%ndup%nldc 0%nldc 34%ninvokestatic java/lang/Integer/valueOf(I)Ljava/lang/Integer;%ndup_x2%naastore%nldc 2%nswap%naastore%ndup2%nswap%nldc 1%nswap%naastore%ninvokevirtual java/io/PrintStream/printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;%npop%nreturn%n.end method"
ldc 3
anewarray java/lang/Object
dup
dup
ldc 0
ldc 34
invokestatic java/lang/Integer/valueOf(I)Ljava/lang/Integer;
dup_x2
aastore
ldc 2
swap
aastore
dup2
swap
ldc 1
swap
aastore
invokevirtual java/io/PrintStream/printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
pop
return
.end method
Malheureusement, Jasmin n'autorise pas autant de belles astuces que Microsoft le ilasm
permet. Mais la JVM a un total de sixdup
instructions différentes qui font toutes sortes de choses amusantes. Réorganiser les éléments de la pile est quelque chose que .NET ne semble pas prendre en charge.
Dans tous les cas, je suppose qu'aucune de mes deux entrées n'est sérieuse pour le code le plus court, mais je suppose qu'il est difficile de les rendre beaucoup plus courts. Par conséquent, juste pour être complet :-)
Version commentée avec des informations sur le contenu de la pile:
.class public Q
.super java/io/File
.method public static main([Ljava/lang/String;)V
.limit stack 9
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc ".class public Q%n.super java/io/File%n.method public static main([Ljava/lang/String;)V%n.limit stack 9%ngetstatic java/lang/System/out Ljava/io/PrintStream;%nldc %c%s%c%nldc 3%nanewarray java/lang/Object%ndup%ndup%nldc 0%nldc 34%ninvokestatic java/lang/Integer/valueOf(I)Ljava/lang/Integer;%ndup_x2%naastore%nldc 2%nswap%naastore%ndup2%nswap%nldc 1%nswap%naastore%ninvokevirtual java/io/PrintStream/printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;%npop%nreturn%n.end method"
ldc 3 ; stack; System.out, string, 3
anewarray java/lang/Object ; stack: System.out, string, Object[3]
dup
dup ; stack: System.out, string, array, array, array
ldc 0 ; stack: System.out, string, array, array, array, 0
ldc 34 ; stack: System.out, string, array, array, array, 0, 34
invokestatic java/lang/Integer/valueOf(I)Ljava/lang/Integer;
dup_x2 ; stack: System.out, string, array, array, 34, array, 0, 34
aastore ; stack: System.out, string, array, array, 34
ldc 2 ; stack: System.out, string, array, array, 34, 2
swap ; stack: System.out, string, array, array, 2, 34
aastore ; stack: System.out, string, array
dup2 ; stack: System.out, string, array, string, array
swap ; stack: System.out, string, array, array, string
ldc 1 ; stack: System.out, string, array, array, string, 1
swap ; stack: System.out, string, array, array, 1, string
aastore ; stack: System.out, string, array
invokevirtual java/io/PrintStream/printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
pop
return
.end method
Histoire:
- 2011-02-07 02:09 (990) - Première version de travail.
- 2011-02-07 02:11 (960) -
ldc
est plus court que bipush
ou iconst_*
.
- 2011-02-07 02:30 (952) - Qui a dit que je dois hériter de java.lang.Object? Les autres noms de classe sont tellement plus courts :-)