2009-03-27 69 views
18

Lớp trình biên dịch của tôi đang tạo ra một ngôn ngữ mà chúng tôi dự định biên dịch sang Java Bytecode. Chúng tôi đã thực hiện rất nhiều tiến bộ và đang gần đến thời điểm tạo mã.Biên dịch sang bytecode java (không sử dụng Java)

Chúng tôi đang gặp sự cố khi tìm thông tin về cách tạo tệp .class từ trình biên dịch của chúng tôi. Bạn có bất kỳ tài nguyên nào có thể hỗ trợ cho chúng tôi không? Chúng tôi đã có rất nhiều tài liệu hướng dẫn trên bộ hướng dẫn, nhưng cần thông tin về cách điền trực tiếp vào tệp lớp/bản ghi của hex.

Chúng tôi không cần thông tin hoặc đề xuất về giải mã các tệp .class.

Ngay cả một ví dụ đơn giản về viết ra một tệp .class từ đầu sẽ là tuyệt vời.

Thông số JVM không phải là những gì chúng tôi đang theo dõi. Những gì chúng tôi thực sự cần là một ví dụ hoặc một hướng dẫn.

+0

tôi chỉ viết một tập tin phân tích cú pháp lớp ... các thông tin mà bạn cần phải phát ra bytecode được chứa trong chương 4. Có gì đặc biệt là nó mà bạn tìm thấy thiếu trong chương 4? – TofuBeer

+0

Bạn có thể cho chúng tôi một hướng dẫn hoặc một ví dụ? – Allyn

+0

Xem cập nhật của tôi, nhưng tôi nghĩ bạn cần cụ thể hơn về phần phát ra tệp lớp mà bạn không hiểu. – TofuBeer

Trả lời

8

Thông số VM: The Class File FormatThe Java Virtual Machine Instruction Set sẽ thực hiện.

Bạn có thể xem Thư viện kỹ thuật mã byte (BCEL) để biết một số nguồn cảm hứng cũng như Findbugs (nó phải đọc/hiểu tệp lớp).

+2

Tôi đề xuất ASM thay vì BCEL vì sự tỉnh táo của bạn. –

+0

đã không sử dụng một trong số họ, chỉ đề nghị nó như là một tài liệu tham khảo để xem làm thế nào các tập tin lớp học được viết (tôi vẫn nói chương 4 và 6 là tất cả những gì cần thiết mặc dù) trừ khi vấn đề cụ thể phát sinh. – TofuBeer

2

JVM specification có lẽ là những gì bạn đang tìm kiếm và đặc biệt là chapter 4 - the class file format.

+2

Bất kỳ ai khác đưa ra câu trả lời này và họ nhận được một cuộc bỏ phiếu tiêu cực để giới thiệu thông số JVM mặc dù cụm từ được in đậm - nhưng Jon nhận được ba phiếu bầu. Anh ấy đúng, nhưng tôi sẽ cá rằng một người không có tín đồ điên rồ mà Jon tích lũy bị giải tán. Đạo cụ cho bạn, Jon. – duffymo

+1

khó nói, cus cả câu trả lời của Jon và sửa đổi xảy ra "một giờ trước" nhưng dòng in đậm về không muốn JVM spec được chỉnh sửa, vì vậy câu trả lời của Jon có khả năng xảy ra trước khi chỉnh sửa. – shsteimer

+0

Jon và tôi đề xuất đặc tả VM. Việc bỏ phiếu đã xảy ra và sau đó chỉnh sửa hoặc chỉnh sửa và bỏ phiếu xuống. Dù bằng cách nào, việc chỉnh sửa và bỏ phiếu xuống cũng diễn ra khá nhiều trong cùng một thời điểm. – TofuBeer

9

Có một số dự án ngoài đó cung cấp giao diện cấp cao để tạo tệp lớp Java mà bạn không phải tự viết các tệp lớp. Hãy xem ví dụ sau:

Tất cả cung cấp một API để tạo ra các file class. Bạn luôn có thể xem mã họ đã viết để làm điều này và viết một số mã tương tự cho trình biên dịch của bạn mặc dù tôi sẽ tưởng tượng rằng đó là một số tiền hợp lý của công việc.

Với BCEL hãy nhìn vào ClassGen, mà nên cho phép bạn để viết ra các file lớp trong các định dạng mà bạn muốn, một ví dụ đơn giản sau:

ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", 
          "<generated>", ACC_PUBLIC | ACC_SUPER, 
          null); 
6

Tôi xin lỗi làm bạn thất vọng nhưng the VM specschính xác những gì bạn đang theo dõi. Nếu bạn không thể xử lý các đặc tả thì có lẽ bạn không nên viết trình biên dịch sau khi tất cả.

4

Tôi đoán bạn có thể thử sử dụng các công cụ hiện có và kiểm tra ảnh hưởng của các thay đổi gia tăng đối với bytecode kết quả.

Nguồn:

public class Hello { 
     public static void main(String[] args) { 
       System.out.println("H"); 
     } 
} 

javap đầu ra:

Compiled from "Hello.java" 
public class Hello extends java.lang.Object{ 
public Hello(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(java.lang.String[]); 
    Code: 
    0: getstatic  #2; //Field java/lang/System.out:Ljava/io/PrintStream; 
    3: ldc  #3; //String H 
    5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    8: return 

} 

Binary:

CA FE BA BE 00 00 00 32 00 1D 0A 00 06 00 0F 09   _______2________ 
00 10 00 11 08 00 12 0A 00 13 00 14 07 00 15 07   ________________ 
00 16 01 00 06 3C 69 6E 69 74 3E 01 00 03 28 29   _____<init>___() 
56 01 00 04 43 6F 64 65 01 00 0F 4C 69 6E 65 4E   V___Code___LineN 
75 6D 62 65 72 54 61 62 6C 65 01 00 04 6D 61 69   umberTable___mai 
6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67   n___([Ljava/lang 
2F 53 74 72 69 6E 67 3B 29 56 01 00 0A 53 6F 75   /String;)V___Sou 
72 63 65 46 69 6C 65 01 00 0A 48 65 6C 6C 6F 2E   rceFile___Hello. 
6A 61 76 61 0C 00 07 00 08 07 00 17 0C 00 18 00   java____________ 
19 01 00 01 48 07 00 1A 0C 00 1B 00 1C 01 00 05   ____H___________ 
48 65 6C 6C 6F 01 00 10 6A 61 76 61 2F 6C 61 6E   Hello___java/lan 
67 2F 4F 62 6A 65 63 74 01 00 10 6A 61 76 61 2F   g/Object___java/ 
6C 61 6E 67 2F 53 79 73 74 65 6D 01 00 03 6F 75   lang/System___ou 
74 01 00 15 4C 6A 61 76 61 2F 69 6F 2F 50 72 69   t___Ljava/io/Pri 
6E 74 53 74 72 65 61 6D 3B 01 00 13 6A 61 76 61   ntStream;___java 
2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D 01   /io/PrintStream_ 
00 07 70 72 69 6E 74 6C 6E 01 00 15 28 4C 6A 61   __println___(Lja 
76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29   va/lang/String;) 
56 00 21 00 05 00 06 00 00 00 00 00 02 00 01 00   V_!_____________ 
07 00 08 00 01 00 09 00 00 00 1D 00 01 00 01 00   ________________ 
00 00 05 2A B7 00 01 B1 00 00 00 01 00 0A 00 00   ___*____________ 
00 06 00 01 00 00 00 01 00 09 00 0B 00 0C 00 01   ________________ 
00 09 00 00 00 25 00 02 00 01 00 00 00 09 B2 00   _____%__________ 
02 12 03 B6 00 04 B1 00 00 00 01 00 0A 00 00 00   ________________ 
0A 00 02 00 00 00 03 00 08 00 04 00 01 00 0D 00   ________________ 
00 00 02 00 0E           _____ 
Các vấn đề liên quan