2012-12-30 10 views
11

W platformie .NET można bezpośrednio napisać program z Common Intermediate Language i skompilować źródła z IL Asembler (ILASM).Czy możliwe jest bezpośrednie napisanie programu za pomocą instrukcji kodu bajtowego Java?

Na przykład poniżej kodu znajduje się program "Hello World".

.assembly Hello {} 
.assembly extern mscorlib {} 
.method static void Main() 
{ 
    .entrypoint 
    .maxstack 1 
    ldstr "Hello, world!" 
    call void [mscorlib]System.Console::WriteLine(string) 
    ret 
} 

Czy możliwe jest napisanie programu za pomocą instrukcji kodu bajtowego Java bezpośrednio jak .NET?

+1

Istnieje jest asm (http://asm.ow2.org/). – fge

+0

Brak odpowiedzi na twoje pytanie (które jest twierdzące, ale nie proste;)) Oto ładny wpis na blogu z odnośnikami http://arhipov.blogspot.se/2011/01/java-bytecode-fundamentals.html?m=1 –

+0

Dlaczego ktoś chciałby lub musiałby to zrobić? Ponieważ jest to maszyna oparta na stosie, wątpię, by były jakieś sztuczki, które mógłbyś zrobić, o czym kompilator jeszcze nie wie. – James

Odpowiedz

7

Możesz sprawdzić Jasmin. Z Wikipedii:

Niektóre projekty udostępniają asemblery Java umożliwiające ręczne pisanie kodu bajtowego Java. Kod zespołu może być również generowany przez maszynę, na przykład przez kompilator kierowany na wirtualną maszynę Java. Znane asemblery Java obejmują:

Jasmin, pobiera tekstowe opisy klas Javy, napisane w prostej składni przypominającej złożenie przy użyciu zestawu instrukcji Java Machine i generuje plik klasy Java.

Jamajka, język assemblera makr dla maszyny wirtualnej Java. Składnia języka Java jest używana do definiowania klasy lub interfejsu. Ciała metod są określone przy użyciu instrukcji kodu bajtowego.

Uwaga: Nie użyłem żadnego z tych narzędzi osobiście.

+0

Czy te narzędzia mogą być używane do osadzania wbudowanych instrukcji maszyny JVM w normalnym kodzie źródłowym Java? – Philipp

+0

@Philipp - Nigdy nie słyszałem o wersji javac, która pozwoliłaby na wstawiony język "asembler". (Nie jestem też pewien, jak dobrze/łatwo działa Jasmin od masowej masakry opisowej pętli.) –

6

Można użyć Jasmin

.class public HelloWorld 
.super java/lang/Object 

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

    getstatic  java/lang/System/out Ljava/io/PrintStream; 
    ldc   "Hello World." 
    invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V 

return 

.end method 

skompilować go za pomocą:

java -jar jasmin.jar hello.j

Można odnieść this również

Powiązane problemy