Mais um blog inútil.

Abril 10, 2009

Arvorezinha – Java Bytecode [e optimizado]

Filed under: Arvorezinha — falso @ 14:58

Ora viva amigos.
Tive alta submissão por amigo meu e colega de trabalho de uma arvorezinha numa coisa mesmo verdadeiramente inutil. Tive mesmo de blogar sobre isso!
Esta arvorezinha é em java bytecode, só mesmo para quem ama!

.class public Avorezinha
.super java/lang/Object

.method public <init>()V
   aload_0
   invokenonvirtual java/lang/Object/<init>()V
   return
.end method

.method public static main([Ljava/lang/String;)V
	; set limits used by this method
	.limit locals 4
	.limit stack 3

	; setup local variables:
	;    1 - the PrintStream object held in java.lang.System.out
	getstatic java/lang/System/out Ljava/io/PrintStream;
	astore_1

	;    2 - the integer 10 - the counter used in the loop
	bipush 1
	istore_2

	; now loop 10 times printing out a number

Loop1:
	goto InitLoop2
endLoop1:
	aload_1    ; push the PrintStream object
	ldc ""
	invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V

	; decrement the counter and loop
	iinc 2 1
	iload_2
	bipush 6
	isub
	ifne Loop1
	goto exit

InitLoop2:
	iload_2
	istore_3
Loop2:
	aload_1    ; push the PrintStream object
	ldc "*"
	invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
	iinc 3 -1
	iload_3
	ifne Loop2

	goto endLoop1

exit:
	; done
	return
.end method

Ele disse me que se tem de usar o assemblador Jasmin. Espero que amem porque esta eu amei mesmo bues!

EDIT: Estive a ver os comentarios, ele submeteu uma versao mais optizada aqui vai o código completo, copiado dos comentarios.

Aqui fica uma versão melhorada:
.class public Arvorezinha
.super java/lang/Object

.method public static main([Ljava/lang/String;)V
.limit locals 4
.limit stack 3

bipush 1
istore 1 ; int i=1

InicioFor1:
iload 1
bipush 5
if_icmpgt SairFor1 ; i
bipush 0
istore 2 ; int j=0

InicioFor2:
iload 2
iload 1
if_icmpge SairFor2 ; j

getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "*"
invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V ; System.out.print("*")

iinc 2 1 ; j++
goto InicioFor2
SairFor2:
getstatic java/lang/System/out Ljava/io/PrintStream;
invokevirtual java/io/PrintStream/println()V ; System.out.println()

iinc 1 1 ; i++
goto InicioFor1

SairFor1:
return
.end method

8 comentários a “Arvorezinha – Java Bytecode [e optimizado]”

  1. fuck diz:

    este gajo em vez de tar ca gaja vai fazer codigo
    fds....

  2. karpa diz:

    ok mas falta a arvorezinha em PostgreSQL:

    select repeat('*',generate_series(1,5)) as arvorezinha;

  3. jsaramago diz:

    Mas a arvorezinha em java bytecode bate tudo. :D

  4. jsaramago diz:

    Aqui fica uma versão melhorada:
    .class public Arvorezinha
    .super java/lang/Object

    .method public static main([Ljava/lang/String;)V
    .limit locals 4
    .limit stack 3

    bipush 1
    istore 1 ; int i=1

    InicioFor1:
    iload 1
    bipush 5
    if_icmpgt SairFor1 ; i

  5. jsaramago diz:

    bipush 0
    istore 2 ; int j=0

    InicioFor2:
    iload 2
    iload 1
    if_icmpge SairFor2 ; j

  6. jsaramago diz:

    getstatic java/lang/System/out Ljava/io/PrintStream;
    ldc "*"
    invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V ; System.out.print("*")

    iinc 2 1 ; j++
    goto InicioFor2
    SairFor2:
    getstatic java/lang/System/out Ljava/io/PrintStream;
    invokevirtual java/io/PrintStream/println()V ; System.out.println()

    iinc 1 1 ; i++
    goto InicioFor1

    SairFor1:
    return
    .end method

  7. jsaramago diz:

    Aqui fica tb a arvorezinha em ml(ocaml):
    let rec arvorezinha_aux x =
    match x with
    5 -> print_string "*";
    |_ -> print_string "*"; arvorezinha_aux (x+1)
    ;;

    let rec arvorezinha a =
    match a with
    1 -> arvorezinha_aux a;
    |_ -> arvorezinha_aux a; print_string "\n";arvorezinha (a-1)
    ;;

    arvorezinha 5;;

  8. [...] gostei da outra versão (está nos comentários) ... estava pouco ML like. Espero que gostes desta [...]

Comentar

widgeon
widgeon
widgeon
widgeon