Triển khai C # cho JVM


91

Có ai đang cố gắng triển khai C # cho JVM không? Là một nhà phát triển Java, tôi đã để mắt đến C # với sự ghen tị, nhưng tôi không sẵn lòng từ bỏ tính di động và sự trưởng thành của JVM, chưa kể đến hàng loạt công cụ đa dạng cho nó.

Tôi biết có một số điểm khác biệt quan trọng giữa JVM và CLR nhưng có điều gì là một showstopper không?


3
Tôi cũng đã viết rất nhiều ứng dụng đa nền tảng hoàn toàn bằng Java - đó là việc hàng ngày đối với tôi và nhóm của tôi. Chúng tôi thường chạy kế hoạch thử nghiệm trên mỗi nền tảng mà chúng tôi chính thức "đủ điều kiện", nhưng tôi nghĩ rằng đã nhiều năm kể từ khi một lỗi thử nghiệm được cho là do sự khác biệt của nền tảng.
Jared

1
Sản phẩm chính của chúng tôi chạy trên Windows, OS X và Linux không thay đổi. Nó thực sự không khó để làm.
Thorbjørn Ravn Andersen

1
Tôi làm Java của mình trong Windows, anh ấy làm phần của mình trong OSX, CI xử lý tất cả các bài kiểm tra trong Linux và chúng tôi đã triển khai phần mềm cho nhiều loại máy chủ Windows và Linux và thậm chí cả Solaris. Vì vậy, tôi đoán tôi có thể nói rằng tôi đã viết các chương trình Java thực sự, đầy đủ, đa định dạng trong một thời gian.
Esko

1
JavaVM được triển khai trong .NET; .NET triển khai Java LIBS; khả năng tương tác của cả hai thế giới -> IKVM.NET ( ikvm.net )
gsscoder

1
Dường như với tôi rằng nếu bạn có thể chuyển đổi NET JavaScript (JSIL thực hiện điều này chẳng hạn), bạn sẽ có thể chuyển nó sang Java ...
BrainSlugs83

Câu trả lời:


93

Có sự khác biệt rất đáng kể giữa CLR và JVM.

Một vài ví dụ:

  • Java không có các loại giá trị do người dùng xác định
  • Các generics Java hoàn toàn khác với các generics .NET
  • Nhiều khía cạnh của C # phụ thuộc vào các yếu tố của khuôn khổ - các đại biểu, v.v. Bạn cũng cần phải chuyển thư viện, ngay cả đối với các khía cạnh ngôn ngữ .
  • Java không hỗ trợ những thứ như thuộc tính và sự kiện ở cấp độ JVM. Bạn có thể giả mạo một số điều này, nhưng nó sẽ không giống nhau.
  • Tôi không tin rằng Java có bất kỳ tham số nào tương đương với tham số truyền qua tham chiếu, ngay cả ở cấp JVM
  • Các yếu tố cần làm với các mô hình bộ nhớ khác nhau có thể sẽ rất khó khăn, mặc dù tôi không chắc chắn về thông số kỹ thuật C # là bao nhiêu.
  • Mã không an toàn nói chung có thể không sử dụng được trong Java
  • Khả năng tương tác với mã gốc rất khác nhau giữa JNI và P / Invoke. Đây có lẽ không phải là vấn đề nhiều đối với bạn.
  • Bạn sẽ phải giả mạo quá tải toán tử và chuyển đổi do người dùng xác định

Bạn có thể chuyển rất nhiều C # - nhưng bạn sẽ bị bỏ lại với một trải nghiệm khá không hài lòng, IMO.

Đi theo hướng khác, bạn có biết về IKVM ? Nó cho phép bạn chạy mã Java trong .NET.


7
Java có các trình hoàn thiện và quá trình hoàn thiện .NET cũng không phải là xác định. Có thể có một số khác biệt nhỏ giữa cả hai, nhưng tôi không thể nghĩ ra bất kỳ sự khác biệt nào. Tôi nghi ngờ kiểm tra reachability Java là mạnh hơn NET là mặc dù: không hoàn thiện trong khi thread khác vẫn chạy một phương pháp dụ
Jon Skeet

3
Tôi nghĩ bạn có thể ánh xạ các loại giá trị thành các loại tham chiếu. Chỉ cần thực hiện mọi nhiệm vụ làm một bản sao nông cạn!
Daniel Earwicker

3
@Earwicker: ... và thay đổi phân bổ mảng, và nhiều nơi khác mà ngữ nghĩa tạo ra sự khác biệt? Tôi nghi ngờ rằng sẽ rất khó để làm cho nó hoạt động, nếu có thể, và kết quả sẽ không phải là thứ bạn muốn sử dụng.
Jon Skeet

4
Tôi nghĩ thuốc chung cũng có thể giải quyết được. Bạn phải tạo một lớp java với các trường bổ sung để chứa các đối tượng Lớp cho các tham số kiểu, vì vậy nó sẽ thêm một số chi phí, nhưng sau đó T () và typeof (T) mới sẽ có sẵn.
Daniel Earwicker

30
@Jon Skeet: Điều đó mang lại cho bạn điều tồi tệ nhất trong cả hai thế giới: ngôn ngữ hơi lỗi thời của Java trên nền tảng độc quyền của Microsoft.
Bart van Heukelom

43

Truy cập http://code.google.com/p/stab-language

Đoạn mã dưới đây nếu là mã ngôn ngữ Stab cho JVM

using java.lang;
using stab.query;
public class Test {
   public static void main(String[] args) {
   // Sorts the arguments starting with "-" by length and then using the default   
        // string comparison
        var query = from s in Query.asIterable(args)
                    where s.startsWith("-")
                    orderby s.length(), s
                    select s;
        foreach (var s in query) {
            System.out.println(s);
        }
    }
}

7
đâm vào cung cấp phần lớn nội dung của ngôn ngữ C # trên JVM nhưng làm như vậy theo cách Java rất có thể hoạt động được. Vì vậy, nó không hoàn toàn tương thích với mã nguồn C # được viết cho .NET CLR nhưng nó cho phép lập trình viên Java tận hưởng một ngôn ngữ giống C # trong khi nhận được mã byte chất lượng tương tự được tạo ra và có khả năng tương tác không trở kháng với các thư viện và khuôn khổ Java. Đó là cách tiếp cận đúng đắn để có được C # trên JVM.
RogerV

Ngôn ngữ tốt, trên một nền tảng tốt ... ước gì tôi đã vấp phải điều này nhiều năm trước.
Hang động Jefferey

14

Bộ chuyển mã Bytecode

Grasshopper có thể lấy một mã bytecode CLR và chuyển nó cho JVM. Chủ yếu dành cho các ứng dụng web, nó không cung cấp triển khai JVM ví dụ như các lớp Windows Forms. Có vẻ hơi cũ, mặc dù. Trang web nói về ASP.NET 2.0, Visual Studio 2008, v.v. Được đề cập lần đầu bởi @alex

XMLVM có thể lấy CLR hoặc JVM bytecode làm đầu vào và sản xuất dưới dạng đầu ra. Ngoài ra, nó có thể xuất ra Javascript hoặc Objective-C. Chưa có bản phát hành nào, chỉ có Subversion. "Phiên bản phát triển thử nghiệm không được sử dụng trong môi trường sản xuất."

IKVM đi theo hướng khác mà OP muốn. Nó cung cấp một triển khai JVM chạy trên CLR, một trình vận chuyển mã bytecode JVM sang CLR và một trình tạo sơ khai phương thức thư viện CLR cho Java. http://www.ikvm.net/uses.html Được đề cập bởi @Jon Skeet

RPC

Tại sao không để CLR và JVM chạy cùng và làm cho việc giao tiếp trở nên dễ dàng nhất có thể? Đây không phải là những gì OP muốn, nhưng một số câu trả lời khác đã khá lạc đề theo những cách khác nhau, vì vậy hãy đề cập đến nó.

RabbitMQ , có một tùy chọn miễn phí, nó là một máy chủ RPC được viết bằng Erlang với các thư viện API cho C #, Java và hơn thế nữa.

jnBridge , giấy phép có thể quá đắt đối với một số người dùng tương lai.

gRPC và các thư viện RPC hiện đại tương tự cung cấp hỗ trợ ngôn ngữ rộng rãi, tạo mã cho thư viện khách bằng các ngôn ngữ này, định dạng dây độc lập ngôn ngữ cho dữ liệu, các tính năng nâng cao như hủy cuộc gọi theo tầng, v.v.

Ngôn ngữ lập trình

Viết một lần, chạy khắp nơi;)

Haxe , biên dịch sang C # / CLR, Java / JVM, Javascript, Flash, Python,… Cung cấp cơ chế tương tác cho từng ngôn ngữ đích. Có thể được coi như một người kế nhiệm ActionScript3 ở một mức độ nào đó. Có vẻ như những thứ khá chắc chắn, với ít nhất một công ty thực sự phụ thuộc vào nó. Đáng tin cậy hơn nhiều so với Stab, được đề cập tiếp theo.

Stab mang đến một số tính năng C # và khả năng tương tác Java. Không hữu ích lắm, bạn nhận được một số tính năng C #, nhưng những gì bạn tương tác với là mã Java không sử dụng chúng. https://softwareengineering.stackexchange.com/a/132080/45826 Ngôn ngữ tương đối tối nghĩa, có thể bị bỏ rơi, ít hứa hẹn sẽ trở nên tốt hơn. Lần đầu tiên được đề cập ở đây bởi @Vns.

Luồng không khí trong lành cho nền tảng JVM;)

Scala , Kotlin , những ngôn ngữ khác, là những ngôn ngữ khá đẹp chạy trên JVM mang lại các tính năng mà một lập trình viên C # có thể bỏ lỡ trong Java. Đặc biệt Kotlin cảm thấy như một sự thay thế hợp lý cho C # trong thế giới JVM. Scala có thể là một ngôn ngữ hơi quá lớn đối với một lập trình viên để sử dụng trong thời gian ngắn.

Bệnh tăng bạch cầu đơn nhân

Đó chắc chắn cũng là một lựa chọn. Tại sao lại chuyển sang JVM nếu Mono có thể chạy nó như hiện tại. Được đề cập lần đầu bởi @ferhrosa

NEW YORK - Ngày 12 tháng 11 năm 2014 - Hôm thứ Tư, Microsoft Corp. đã củng cố cam kết của mình đối với trải nghiệm của nhà phát triển đa nền tảng bằng cách mở nguồn cung cấp đầy đủ ngăn xếp .NET phía máy chủ và mở rộng .NET để chạy trên nền tảng Linux và Mac OS.

Theo thông cáo báo chí có trích dẫn này, Visual Studio 2015 sẽ thêm Linux / Mono làm nền tảng được hỗ trợ.

Đây là một blog được viết bởi những người của dự án Mono về nó, từ phía bên kia: Tích hợp mã nguồn .NET (tháng 11 năm 2014).

.NET Core

Phiên bản đa định dạng Windows / Linux của (một số) .Net do Microsoft quản lý. 'nuff nói https://github.com/dotnet/core .

Phần kết luận

Bây giờ sẽ là cần thiết để thử các công cụ / khuôn khổ này và xem có bao nhiêu ma sát. OP muốn viết bằng C # cho JVM, có thể thực sự hoạt động khá tốt khi sử dụng Grasshopper.

Làm điều này với mục tiêu trộn các thư viện thế giới C # và Java trong một cơ sở mã duy nhất có thể không hoạt động tốt.

Nguồn

http://blog.pluralsight.com/new-course-making-java-and-c-work-together-jvm-and-net-clr-interop


Câu trả lời chính xác! Là một nhà phát triển C #, người không hài lòng với việc phải chuyển sang Java (làm sao bạn có thể sống mà không có tài sản ?!) và không rõ về Scala, điều này thực sự đưa ra các tùy chọn tốt.
Gilthans

9

Có thể đơn giản hơn khi viết một bộ chuyển đổi từ IL sang bytecode. Bằng cách đó, bạn sẽ tự động nhận được hỗ trợ cho bất kỳ ngôn ngữ .NET nào trên JVM.

Tuy nhiên, đây là một ý tưởng hiển nhiên đến nỗi nếu điều này chưa được thực hiện, nó có thể cực kỳ khó, hoặc khó làm tốt / hữu ích.


6
Bạn muốn chạy vào hầu hết các vấn đề tôi liệt kê - Generics khác nhau vv
Jon Skeet

8
Đây chính xác là những gì Grasshopper làm (xem câu trả lời của @ alex ở trên), thực sự rất khó để làm tốt (tôi đã từng làm việc trên Grasshopper).
Motti

7

Hãy nhìn Grasshopper . Đây là SDK dựa trên Visual Studio và trình chuyển đổi .NET sang Java được cấp bằng sáng chế cho phép bạn chạy Web .NET và các ứng dụng máy chủ trên Linux® và các nền tảng hỗ trợ Java khác.


2
Bạn có kinh nghiệm thực tế với nó? Cũng lưu ý rằng giấy phép là bản thảo cho phiên bản miễn phí.
Thorbjørn Ravn Andersen

13
Bạn đã làm tôi mất hứng ngay khi bạn nói từ "được cấp bằng sáng chế". Thở dài.
Stephen C

2
Chỉ một số tin tức: Grasshopper hiện miễn phí , không có hỗ trợ và bảo hành (giống như hầu hết các sản phẩm mã nguồn mở).
fernacolo

1
Mainsoft dường như đã hoàn toàn chết và các liên kết Grasshopper không còn hoạt động.
David Given

1
Rõ ràng chỉ là một mạng lưới wibble sau đó. Cả hai liên kết đều hoạt động ngay bây giờ. Thật không may là bây giờ tôi không thể nhớ tại sao tôi muốn nó ...
David Given



0

Câu trả lời này có thể muộn đối với bạn, nhưng câu trả lời này là mới. Bạn có thể muốn kiểm tra ngôn ngữ lập trình Kotlin . Nó cung cấp các đường cú pháp mà C # có và cũng là cú pháp gần nhất với C #, khác với bất kỳ ngôn ngữ JVM không phải Java nào. Của nó từ JetBrains .


0

Tôi có thể thấy hai lý do tại sao điều này không nhận được nhiều sự nhiệt tình.

Điều đầu tiên cần nhận ra là, khi nói đến các tính năng thực tế của ngôn ngữ, C # và Java rất gần nhau. Không chỉ C # amd Java gần, chúng cũng đang di chuyển theo các hướng tương tự. Có một số tính năng mà JVM hiện sẽ không hỗ trợ, nhưng đó không phải là vấn đề thực sự. Bạn luôn có thể giả mạo những gì còn thiếu. Tôi nghĩ mọi người thích đợi Java kiếm được nhiều đường hơn là tạo ra một Hầu như Java từ đầu. Vào thời điểm cổng đã sẵn sàng, Java có thể đã quyết định bắt kịp.

Thứ hai, lý do tại sao các nhà phát triển thích C # không phải là ngôn ngữ mà chính là các công cụ xung quanh nó, mối quan hệ hai chiều của họ với C # và cách Microsoft hỗ trợ toàn bộ điều này. Ví dụ: tổ hợp C # -XAML thân thiện hơn JavaFX, vì C # và XAML đã bị tấn công cho nhau (ví dụ: các lớp một phần trong C #, các liên kết trong XAML và hơn thế nữa). Sử dụng C # trên JavaFX không cải thiện nhiều. Để có được trải nghiệm C # trên JVM, bạn cũng cần phải chuyển các công cụ và đó là một dự án lớn hơn nhiều. Thậm chí không phải Mono cũng không bận tâm.

Vì vậy, lời khuyên của tôi dành cho một nhà phát triển Java, những người muốn sử dụng một ngôn ngữ lạ hơn ngoài các công cụ quen thuộc, là hãy kiểm tra các ngôn ngữ JVM hiện có .

Mono cũng là một lựa chọn, nhưng tôi đã luôn hoài nghi về nó. Mặc dù nó là C # -. NET và đa nền tảng, những thứ được xây dựng bằng các công cụ của Microsoft nói chung sẽ không hoạt động trên Mono. Về cơ bản nó là thứ riêng của nó. Chúng ta sẽ thấy điều gì sẽ xảy ra bây giờ khi Microsoft cho biết họ sẽ cộng tác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.