Сборка байт-кода JVM (через 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
К сожалению, Жасмин не допускает столько приятных трюков, сколько ilasm
позволяет Microsoft . Но у JVM есть шесть различных dup
инструкций, которые делают все самое интересное. Переупорядочение элементов в стеке - это то, что .NET, похоже, не поддерживает.
В любом случае, я полагаю, что ни одна из моих двух записей не является серьезным претендентом на самый короткий код, но я думаю, что сделать их намного короче сложно. Поэтому просто для полноты :-)
Комментируемая версия с информацией о том, что находится в стеке:
.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
История:
- 2011-02-07 02:09 (990) - Первая рабочая версия.
- 2011-02-07 02:11 (960) -
ldc
короче bipush
или iconst_*
.
- 2011-02-07 02:30 (952) - Кто сказал, что мне нужно наследовать от java.lang.Object? Другие имена классов намного короче :-)