2012-07-23 27 views
5

Scala (ít nhất là trên JVM) sử dụng type erasure để tương thích với Java. Đây là featurewidelyheldtosuck. Fixing this would be difficult on the JVM.Generics phổ biến trong Scala trên .NET/CLR

In contrast to the JVM situation, .NET supports reified generics.Scala's .NET implementation có sử dụng chúng không? Nếu không, có thể nó, hoặc người nào khác những vấn đề sẽ sử dụng reification gây ra?

+0

M. Garcia có một [bài viết] liên quan (http://lampwww.epfl.ch/~ magarcia/ScalaNET/slides/TourCLRGenerics.pdf) và [cập nhật trạng thái] (http://lampwww.epfl.ch/~magarcia/ScalaNET/slides/2011-09-06-GenericsGettingCloser.pdf). Nhưng những thỏa thuận này với các chi tiết thực hiện; thật khó để có được bức tranh lớn. –

Trả lời

4

Đó là công việc đang tiến hành, cẩn thận không phá vỡ Scal một ngữ nghĩa giữa JVM và .NET.

Tôi hỏi câu hỏi này trở lại trong năm 2011 trên scala-công cụ mailinglist và câu trả lời được đưa ra bởi Miguel Garcia, trong đó ông vạch ra những bức tranh lớn:

Một số trích dẫn:

(1) gì bản xem trước của Scala.Net hiện tại. Như bạn đã thấy, pha xóa cũng chạy như một phần của đường ống. Đây là một " " tính năng "của phiên bản xem trước, một" tính năng "cần phải được bao gồm vì hỗ trợ cho CLR Generics chưa có (thêm vào số này bên dưới). Tuy nhiên có một lợi thế lớn để chạy JVM kiểu xóa trong Scala.Net: tất cả các chương trình Scala trên đó dựa vào thư viện Scala có thể đã được biên dịch trên .Net, thay vì chờ đợi cho CLR Generics sẵn sàng. Các chương trình dựa trên Java JDK cũng có thể được biên dịch, tùy thuộc vào sự hỗ trợ IKVM của các API JDK trong câu hỏi [1].

(2) Hỗ trợ cho CLR Generics trong Scala.Net. Động lực chính để hỗ trợ nó là đạt được khả năng tương tác với các hội đồng hiện có. Trong đạt được khả năng tương tác, chăm sóc sẽ được thực hiện không để phá vỡ từ ngữ nghĩa Scala. Nói cách khác, bất kỳ chương trình Scala hợp lệ nào cũng sẽ là để chạy và tạo ra các kết quả tương tự trên JVM và .NET. Điều này mang lại cho chúng tôi cho công việc đang tiến hành [2]. Nguyên mẫu ban đầu chỉ xử lý C# tập con của Scala. Vì vậy, bây giờ tôi đang giải quyết phần còn lại. Đó là công việc nhiều hơn ban đầu được dự đoán nhưng điều quan trọng là phải bao gồm toàn bộ ngôn ngữ.

Một vài nhận xét khác về interop với hội đồng .NET, trong các vấn đề gốc cụ thể. Có, hội đồng CLR có thể diễn tả bằng cách sử dụng "int tự nhiên" (kích thước khác nhau trên các CPU khác nhau), P/Gọi của các hàm C được xuất bởi một .dll và như vậy. Scala.Net không nhằm mục đích làm rằng thủ đoạn cấp thấp. Khả năng tương thích của assembly là ở mức "Common Language Specification", nghĩa là thường nhận được từ bất kỳ trình biên dịch C#, VB.NET, v.v. ("thông thường" tức là trừ khi sử dụng các thuộc tính "[DllImport]" C++ - isms).

Trích dẫn từ spec CLI:

--- bắt đầu quote --- Ngôn ngữ Đặc điểm kỹ thuật chung (CLS) - Các CLS là một thỏa thuận giữa các nhà thiết kế ngôn ngữ và khung (có nghĩa là, thư viện lớp) nhà thiết kế . Nó chỉ định một tập con của CTS (Common Type System) và một tập hợp các quy ước sử dụng. Ngôn ngữ cung cấp cho người dùng khả năng truy cập khuôn khổ tốt nhất bằng cách triển khai ít nhất các phần của CTS là một phần của CLS. Tương tự, các khung công tác sẽ được sử dụng rộng rãi nhất nếu các khía cạnh được xuất công khai của họ (ví dụ: các lớp, giao diện, phương thức, và các trường) chỉ sử dụng các loại thuộc CLS và tuân theo các quy ước của CLS. --- End quote ---

xem cho toàn bộ chủ đề:

https://groups.google.com/forum/?fromgroups#!topic/scala-tools/JDjstK1_uvM

3

Từ câu trả lời của this question, bạn có thể thấy rằng nó có thể không phải là một lợi thế để bảo toàn các generics trong máy ảo, vì nó vẫn sẽ ra lệnh cho những gì có thể biểu diễn và quan hệ giữa các loại. (Để biết thêm chi tiết, hãy truy cập original blog bởi Ola Bini).

ví dụ khác:

Erasure có vẻ hữu ích không chỉ cho tương thích ngược, nhưng vì thời gian chạy hoàn chỉnh thông tin kiểu như được quảng cáo bởi các ngôn ngữ được nhập động được tính phí. Thiết kế của .NET CLR Generics giải quyết chi phí này bằng cách chuyên môn hóa mã. Các trường hợp trên phải rõ ràng khi nó được xóa và khi nó là ngôn ngữ được đổ lỗi cho một thiếu sót cụ thể.

Các net-net được rằng nếu JVM đã reified generics (không có loại tẩy xoá), nó sẽ không thể thực hiện hệ thống kiểu Scala của ... hệ thống kiểu Scala là phức tạp hơn so với Java và nếu JVM có generics dựa trên Generics Java, chúng ta vẫn có vấn đề trong Scala. Mặt khác, loại xóa bỏ cho phép trình biên dịch thực hiện một hệ thống kiểu phức tạp, ngay cả khi tất cả các thông tin kiểu không có sẵn khi chạy.


Theo như tôi biết Scala của .NET backend là xa phía sau việc thực hiện JVM hiện nay, và cũng không hỗ trợ .NET của reified generics.


Scala 2.10 thậm chí còn đi xa hơn theo hướng trừu tượng hóa thông tin loại từ mô hình máy ảo thực tế. Martin Odersky trình bày tương tác phản ánh/chỉnh sửa mới trong bản trình bày, ví dụ: embedded in this entry (bắt đầu từ 42'18 ").

Tôi tin rằng bạn sẽ có thể sử dụng thẻ loại (thay thế tệp kê khai) thành khắc phục các vấn đề với kết hợp mẫu và xóa, có một chút trên this mailing list thread, nhưng tôi không biết nó hoạt động ở mức độ nào hay không.

(Suy đoán thuần túy :) Sẽ giúp trừu tượng hơn có thể trợ giúp với các chương trình phụ trợ cho các nền tảng thậm chí có ít thông tin về loại hơn so với JVM, ví dụ như một trình biên dịch giả thiết cho JavaScript.

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