2013-04-08 16 views
5

Có cách nào tốt để viết trình biên dịch Scala ánh xạ các tính năng Scala khác nhau tới bytecode không?Tham chiếu tốt về cách scala được ánh xạ tới jvm bytecode

Một google nhanh chóng bật lên các tài liệu hỗ trợ từ David Pollak năm 2009 talk

https://github.com/dpp/jvm_summit_2009/blob/master/scala_fancy_pants.pdf

Nhưng tôi nghi ngờ đây có thể là cả ngày và không đầy đủ.

Tôi có thể tự mình thử và thu thập dữ liệu này qua scalap javap, nhưng sẽ rất hữu ích nếu ai đó nỗ lực và hiểu biết sâu sắc.

+0

này có lẽ thay đổi từ phiên bản lên phiên bản. Bạn đã thử nhìn vào nguồn trình biên dịch chưa? Bạn cũng có thể biên dịch một số lớp và sau đó tháo rời chúng. – Antimony

+0

Tôi có thể duyệt và thử và hiểu nguồn, tháo rời một loạt các scala hoặc đọc một vài năm giá trị của danh sách gửi thư scala internals nhưng tôi đã hy vọng tìm thấy một cái gì đó để cắt ngắn tất cả điều đó. Tôi lười. – henry

+0

@Antimony Tôi nghĩ rằng bạn chính xác rằng nó thay đổi từ phiên bản này sang phiên bản khác. Tôi quan tâm nhất đến 2.10.1 - nhưng những thay đổi sắp tới để sử dụng các tính năng java jvm 1.7 cũng được quan tâm. – henry

Trả lời

1

Không có gì tôi biết. Cân nhắc sử dụng công cụ kiểm tra bytecode để kiểm tra mã mà trình biên dịch tạo ra. Nó thường hữu ích khi viết mã quan trọng về hiệu suất để xác minh xem chuyên môn đã được áp dụng đúng chưa, các loại đóng được loại bỏ, các mảng được truy cập trực tiếp thông qua các lệnh bytecode, các macro được mở rộng đúng cách, v.v.

Nếu bạn đang sử dụng Tuyệt vời, có một này plugin for viewing the bytecode.

5

trên REPAL REPL, sử dụng :javap -c để xem bytecode được tạo.

Ví dụ:

scala> class Bytes { def a = println("hello") } 
defined class Bytes 

scala> :javap -c Bytes 
Compiled from "<console>" 
public class Bytes extends java.lang.Object{ 
public void a(); 
    Code: 
    0: getstatic #13; //Field scala/Predef$.MODULE$:Lscala/Predef$; 
    3: ldC#15; //String hello 
    5: invokevirtual #19; //Method scala/Predef$.println:(Ljava/lang/Object;)V 
    8: return 

public Bytes(); 
    Code: 
    0: aload_0 
    1: invokespecial #24; //Method java/lang/Object."<init>":()V 
    4: return 

} 
+0

Cảm ơn, tôi biết rằng tôi có thể làm điều này, nhưng những gì tôi đang tìm kiếm là phân tích elses ai đó thay vì phải tự làm. – henry

+1

Không hoạt động với Java 1.7 –