2012-12-30 38 views
11

Trong nền tảng .NET, bạn có thể viết chương trình với Ngôn ngữ trung gian chung trực tiếp và biên dịch các nguồn với IL Assembler (ILASM).Có thể viết trực tiếp chương trình với các hướng dẫn bytecode Java không?

Ví dụ: mã bên dưới là chương trình "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 
} 

Có thể viết chương trình có hướng dẫn bytecode Java trực tiếp như .NET không?

+1

Có là asm (http://asm.ow2.org/) cho điều đó. – fge

+0

Không phải là câu trả lời cho câu hỏi của bạn (đó là có, nhưng không đơn giản;)) đây là một bài đăng trên blog hay với tài liệu tham khảo http://arhipov.blogspot.se/2011/01/java-bytecode-fundamentals.html?m=1 –

+0

Tại sao có ai muốn hoặc cần phải làm điều này? Vì nó là một máy tính dựa trên stack tôi nghi ngờ có bất kỳ thủ thuật bạn có thể làm điều đó trình biên dịch đã không biết về. – James

Trả lời

7

Bạn có thể xem Jasmin. Từ Wikipedia,

Một số dự án cung cấp trình tạo Java để cho phép viết mã Java bytecode bằng tay. Mã lắp ráp cũng có thể được tạo ra bởi máy, ví dụ như trình biên dịch nhắm mục tiêu máy ảo Java. Các bộ tạo Java đáng chú ý bao gồm:

Jasmin, có các mô tả văn bản cho các lớp Java, được viết theo cú pháp giống như lắp ráp đơn giản bằng cách sử dụng tập lệnh Java Virtual Machine và tạo tệp lớp Java.

Jamaica, ngôn ngữ lắp ráp macro cho máy ảo Java. Cú pháp Java được sử dụng cho định nghĩa lớp hoặc giao diện. Các đối tượng phương thức được xác định bằng cách sử dụng các lệnh bytecode.

Lưu ý: Tôi không tự mình sử dụng bất kỳ công cụ nào trong các công cụ này.

+0

Các công cụ này có thể được sử dụng để nhúng các lệnh JVM được mã hóa trong mã nguồn Java bình thường không? – Philipp

+0

@Philipp - Tôi chưa bao giờ nghe nói về một phiên bản của javac mà sẽ cho phép ngôn ngữ "lắp ráp" nội tuyến. (Tôi cũng không biết Jasmin hoạt động tốt như thế nào kể từ vụ thảm sát chú thích vòng lặp.) –

6

Bạn có thể sử dụng 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 

Bạn biên dịch nó bằng cách sử:

java -jar hello.j jasmin.jar

Bạn có thể tham khảo this cũng

Các vấn đề liên quan