Tôi tự hỏi làm thế nào là scala tạo mã byte, hiện nó sử dụng một số thư viện như ASM? Hoặc chỉ cần viết tệp nhị phân thành tệp .class để thực hiện?Mã scala tạo mã byte như thế nào? Sử dụng một số thư viện như ASM hoặc viết trực tiếp nhị phân?
Trả lời
Bắt đầu với 2.10 trình biên dịch Scala sử dụng ASM 4 phát ra bytecode, hỗ trợ -target: JVM-1.5, -target: JVM-1.6, và -target: khía cạnh thực hiện JVM-1,7
của backend được mô tả trong:
- Emitting Scala classfiles qua ASM http://lamp.epfl.ch/~magarcia/ScalaCompilerCornerReloaded/2012Q2/GenASM.pdf
Bytecode phát (GenASM, nguồn liên kết dưới đây) đến thăm một Flow Control Graph (CFG) được xây dựng bởi một giai đoạn trước đó, và sử dụng các API Truyền ASM để trực tiếp phát ra classfiles:
https://github.com/scala/scala/blob/master/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
Đó là cách mọi thứ hoạt động ngay bây giờ. Trong lĩnh vực khả năng thử nghiệm, tôi đã làm việc trên một bytecode thử nghiệm phát ra nhanh hơn, một phần vì nó bỏ qua việc xây dựng CFG và truy cập trực tiếp Scala Abstract Syntax Trees (sử dụng API Tree ASM để xây dựng các tệp lớp trong bộ nhớ). Chi tiết trong:
trông giống như họ đang tạo ra một số mã trung gian, và sau đó chuyển đổi nó bằng tay vào bytecode java hoặc .net MSIL
đẹp tổng quan về trình biên dịch ở đây: https://wiki.scala-lang.org/display/SIW/Overview+of+Compiler+Phases
Điều gì trước scala 2.10? – Freewind
Trước 2.10 "GenJVM" đã được sử dụng. Nó đã được EOL'd bây giờ. GenJVM đã sử dụng thư viện thao tác bytecode được phát triển trong nhà (ví dụ: không theo kịp với khung bản đồ chồng JDK6) –
Tôi gắn dấu sao câu hỏi này, nhưng chỉ vì câu trả lời của bạn. Thông tin tuyệt vời! – Andy