JVM için C # uygulama


91

JVM için C # uygulamaya çalışan biri var mı? Bir Java geliştiricisi olarak, C # 'ı kıskançlıkla izliyordum, ancak JVM'nin taşınabilirliğinden ve olgunluğundan, bunun için çeşitli araçlardan bahsetmeye gerek yok.

JVM ve CLR arasında bazı önemli farklılıklar olduğunu biliyorum, ancak şov yapan bir şey var mı?


3
Ayrıca Java'da çok sayıda tamamen çoklu platform uygulaması yazdım - bu benim ve ekibim için günlük bir şey. Genellikle test planını resmi olarak "uygun hale getirdiğimiz" her platformda çalıştırırız, ancak sanırım bir test hatasının platform farkına atfedilmesinin üzerinden yıllar geçti.
Jared

1
Ana ürünümüz Windows, OS X ve Linux üzerinde değişmeden çalışır. Yapması gerçekten zor değil.
Thorbjørn Ravn Andersen

1
Java'mı Windows'ta yapıyorum, ya da adam OSX'te üzerine düşeni yapıyor, CI Linux altındaki tüm testleri zorluyor ve yazılımı hem Windows hem de Linux sunucularına ve hatta Solaris'e yerleştirdik. Sanırım bir süredir gerçekten, tam anlamıyla çok platformlu Java programları yazdığımı söyleyebilirim.
Esko

1
.NET'te uygulanan JavaVM; Java LIBS'nin .NET uygulaması; her iki dünyanın birlikte çalışabilirliği -> IKVM.NET ( ikvm.net )
gsscoder

1
Bana öyle geliyor ki, eğer .NET'i JavaScript'e dönüştürebiliyorsan (örneğin JSIL bunu yapıyor), onu Java'ya
çevirebilmelisin

Yanıtlar:


93

CLR ve JVM arasında çok önemli farklar vardır.

Birkaç örnek:

  • Java'nın kullanıcı tanımlı değer türleri yoktur
  • Java jenerikleri, .NET jeneriklerinden tamamen farklıdır
  • C # 'ın birçok yönü çerçevenin öğelerine bağlıdır - temsilciler vb . Dil yönleri için bile kitaplığı da taşımanız gerekir .
  • Java, JVM düzeyinde özellikler ve olaylar gibi şeyleri desteklemez. Bunun bir kısmını taklit edebilirsin, ama bu aynı olmaz.
  • Java'nın JVM düzeyinde bile referansla geçiş parametrelerine eşdeğer olduğuna inanmıyorum
  • C # spesifikasyonunda ne kadar olduğundan emin olmasam da, farklı bellek modelleriyle yapılacak incelikler büyük olasılıkla ısırır.
  • Güvenli olmayan kod genel olarak Java'da muhtemelen mümkün değildir
  • Yerel kodla birlikte çalışabilirlik, JNI ve P / Invoke arasında çok farklıdır. Bu muhtemelen sizin için pek sorun değil.
  • Operatör aşırı yüklemesini ve kullanıcı tanımlı dönüşümleri taklit etmeniz gerekir

Muhtemelen çok fazla C # taşıyabilirsiniz - ancak oldukça yetersiz bir deneyimle baş başa kalırsınız, IMO.

Diğer tarafa gidersek, IKVM'nin farkında mısınız? Java kodunu .NET'te çalıştırmanıza izin verir.


7
Java'nın sonlandırıcıları vardır ve .NET sonlandırması da belirleyici değildir. İkisi arasında bazı ince farklılıklar olabilir, ancak herhangi bir hazırlıksız düşünemiyorum. Java'nın erişilebilirlik testlerinin .NET'ten daha güçlü olduğundan şüpheleniyorum: başka bir iş parçacığı hala bir örnek yöntemi çalıştırırken sonlandırma yok
Jon Skeet

3
Değer türlerini referans türleriyle eşleştirebileceğinizi düşünüyorum. Sadece her görevi sığ bir klon yapın!
Daniel Earwicker

3
@Earwicker: ... ve dizi tahsisini ve anlambilimin fark yarattığı diğer çeşitli yerleri değiştirin? Öyle olacağını sanıyorum çok , işe almak zor eğer bu mümkün ve sonuç kullanmak istediğiniz istediğiniz bir şey olmaz.
Jon Skeet

4
Sanırım jenerikler de çözülebilir. Tür parametreleri için Class nesnelerini tutmak için fazladan alanlara sahip bir java sınıfı oluşturmanız gerekir, bu nedenle biraz ek yük ekler, ancak daha sonra yeni T () ve typeof (T) kullanılabilir olacaktır.
Daniel Earwicker

30
@Jon Skeet: Bu size her iki dünyanın da en kötüsünü veriyor: Microsoft'un tescilli platformunda Java'nın biraz modası geçmiş dili.
Bart van Heukelom

43

Http://code.google.com/p/stab-language adresini ziyaret edin.

JVM için Stab dil kodu ise aşağıdaki kod

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
stab, C # dilinin etinin çoğunu JVM'de sunar, ancak bunu Java'nın birlikte çalışabileceği bir şekilde yapar. Bu nedenle, .NET CLR için yazılmış C # koduyla tam olarak kaynak kodu uyumlu değildir, ancak bir Java programcısının, oluşturulan aynı kalitede bayt kodunu alırken ve Java kitaplıkları ve çerçeveleriyle empedanssız birlikte çalışabilirliğe sahipken çok C # benzeri bir dilden yararlanmasını sağlar. JVM'de C # almak için izlenecek doğru yaklaşım budur.
RogerV

1
İyi platformdaki iyi dil ... keşke buna yıllar önce rastlasaydım.
Jefferey Mağarası

15

Bayt kodu aktarıcıları

Grasshopper bir CLR bayt kodu alıp JVM için aktarabilir. Öncelikle web uygulamaları için tasarlanmıştır, örneğin Windows Forms sınıflarının JVM uygulamasını sağlamaz. Yine de biraz eski görünüyor. Web, ASP.NET 2.0, Visual Studio 2008 vb. Hakkında konuşuyor. İlk olarak @alex tarafından bahsedildi

XMLVM , girdi olarak CLR veya JVM bayt kodunu alabilir ve her ikisini çıktı olarak üretebilir. Ek olarak Javascript veya Objective-C çıktısını alabilir. Henüz sürüm yok, yalnızca Subversion. "Bir üretim ortamında kullanılmayacak deneysel geliştirme sürümü."

IKVM , OP'nin istediğinin tersine gider. CLR'de çalışan bir JVM uygulaması, bir JVM'den CLR'ye bayt kodu aktarıcısı ve Java için bir CLR kitaplık yöntemi saplama oluşturucusu sağlar. http://www.ikvm.net/uses.html @Jon Skeet tarafından bahsedilmiştir

RPC

Neden CLR ve JVM birlikte çalışmıyor ve iletişimi olabildiğince sorunsuz hale getirmiyor? Bu, OP'nin istediği şey değil, ancak diğer bazı yanıtlar zaten farklı şekillerde konu dışı, bu yüzden ele alalım.

RabbitMQ , ücretsiz bir seçeneğe sahiptir, C #, Java ve daha fazlası için API kütüphaneleri ile Erlang'da yazılmış bir RPC sunucusudur.

jnBridge , lisans bazı potansiyel kullanıcılar için çok pahalı olabilir.

gRPC ve benzer modern RPC kitaplıkları, geniş dil desteği, bu dillerdeki istemci kitaplıkları için kod oluşturma, veriler için dilden bağımsız kablo biçimi, basamaklı çağrı iptali gibi gelişmiş özellikler vb. sunar.

Programlama dilleri

Bir kez yazın, her yerde çalıştırın;)

Haxe , C # / CLR, Java / JVM, Javascript, Flash, Python,… için derler. Hedef dillerin her biri için birlikte çalışma mekanizmaları sağlar. Bir dereceye kadar ActionScript3'ün halefi olarak düşünülebilir. Aslında en az bir şirketin bağlı olduğu oldukça sağlam şeyler görünüyor. Stab'dan çok daha güvenilir.

Stab , bazı C # özellikleri ve Java birlikte çalışabilirliği sağlar. Çok kullanışlı değil, bazı C # özellikleri elde edersiniz, ancak etkileşimde bulunduğunuz şey onları kullanmayan Java kodudur. https://softwareengineering.stackexchange.com/a/132080/45826 Dil nispeten belirsizdir, muhtemelen terk edilmiştir ve daha iyi olma vaadinde bulunulmamaktadır. İlk olarak burada @Vns tarafından bahsedilmiştir.

JVM platformu için taze hava fırtınası;)

Scala , Kotlin , diğerleri, Java'da bir C # programcısının gözden kaçırabileceği özellikleri getiren JVM üzerinde çalışan oldukça hoş dillerdir. Özellikle Kotlin, JVM dünyasında C # için makul bir alternatif gibi hissediyor. Scala, bir programcının kısa sürede alışması için biraz fazla büyük bir dil olabilir.

Mono

Bu da kesinlikle bir seçenektir. Mono onu olduğu gibi çalıştırabiliyorsa neden JVM'ye aktarılsın. İlk olarak @ferhrosa bahsetti

NEW YORK - 12 Kasım 2014 - Çarşamba günü, Microsoft Corp., tam sunucu tarafı .NET yığınını açık kaynak kullanarak ve .NET'i Linux ve Mac OS platformlarında çalışacak şekilde genişleterek platformlar arası geliştirici deneyimlerine olan bağlılığını pekiştirdi.

Alıntı yapılan bu basın bültenine göre , Visual Studio 2015 desteklenen bir platform olarak Linux / Mono'yu ekleyecektir.

Bu, Mono proje insanlarının diğer taraftan yazdığı bir blogdur: .NET Kaynak Kod Entegrasyonu (Kasım 2014).

.NET Çekirdeği

Microsoft tarafından yönetilen (bazıları) .Net'in Windows / Linux çoklu platform sürümü. 'nuff https://github.com/dotnet/core dedi .

Sonuç

Şimdi bu araçları / çerçeveleri denemek ve ne kadar sürtüşme olduğunu görmek gerekli olacaktır. OP, Grasshopper ile oldukça iyi çalışabilen JVM için C # ile yazmak istiyor.

Bunu C # ve Java dünya kitaplıklarını tek bir kod tabanında karıştırmak amacıyla yapmak o kadar iyi çalışmayabilir.

Kaynaklar

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


Mükemmel cevap! Java'ya geçmek zorunda kalmaktan memnun olmayan (mülkler olmadan nasıl yaşayabilirsiniz ?!) ve Scala hakkında şüpheli bir C # geliştiricisi olarak, bu gerçekten seçenekleri iyi bir şekilde ortaya koyuyor.
Gilthans

9

IL'den bayt koduna bir dönüştürücü yazmak daha basit olabilir. Bu şekilde, JVM'deki herhangi bir .NET dili için otomatik olarak destek alırsınız.

Bununla birlikte, bu o kadar açık bir fikir ki, eğer bu daha önce yapılmadıysa, muhtemelen son derece zor veya iyi / yararlı bir şekilde yapmak zordur.


6
Listelediğim sorunların çoğuyla karşılaşırsınız - farklı jenerikler vb.
Jon Skeet

8
Bu tam olarak Grasshopper'ın yaptığı şeydir (yukarıdaki @ alex'in cevabına bakın), gerçekten iyi yapmak son derece zordur (Grasshopper üzerinde çalışıyordum).
Motti

7

Grasshopper'a bak . Linux® ve diğer Java etkin platformlarda .NET Web ve sunucu uygulamalarını çalıştırmanızı sağlayan, Visual Studio tabanlı bir SDK ve patentli .NET - Java dönüştürücüdür.


2
Onunla pratik deneyiminiz var mı? Ayrıca, lisansın ücretsiz sürüm için acımasız olduğunu unutmayın.
Thorbjørn Ravn Andersen

13
"Patentli" kelimesini söylediğiniz anda ilgimi kaybettiniz. İç çekmek.
Stephen C

2
Sadece birkaç haber: Grasshopper artık ücretsiz , destek ve garanti olmadan (çoğu açık kaynaklı ürün gibi).
fernacolo

1
Mainsoft tamamen ölmüş gibi görünüyor ve Grasshopper bağlantıları artık çalışmıyor.
David

1
Belli ki sadece net bir hareket. Her iki bağlantı da şimdi çalışıyor. Ne yazık ki şimdi neden istediğimi hatırlayamıyorum ...
David Verilen



0

Bu cevap sizin için geç olabilir, ancak bu sadece yeni. Kotlin programlama dilini kontrol etmek isteyebilirsiniz . Herhangi bir Java olmayan JVM dili dışında, C # 'ın sahip olduğu ve C # sözdizimine en yakın olan sözdizimsel şekerleri sunar. Onun dan JetBrains .


0

Bunun pek heyecanlanmamasının iki nedenini görebiliyorum.

Farkına varılması gereken ilk şey, dilin gerçek özelliklerine gelince, C # ve Java'nın çok yakın olduğudur. Sadece C # ve Java yakın değil, aynı zamanda benzer yönlerde hareket ediyorlar. JVM'nin şu anda kutunun dışında desteklemeyeceği bazı özellikler var, ancak bu gerçek sorun değil. Her zaman eksik olanı taklit edebilirsiniz. Bence insanlar sıfırdan bir Almost-Java yaratmaktansa Java'nın biraz daha fazla şeker almasını beklemeyi tercih ediyor. Bağlantı noktası hazır olduğunda, Java yetişmeye karar vermiş olabilir.

İkinci olarak, geliştiricilerin C # tercih etmesinin nedeni dilin kendisi değil, etrafındaki araçlar, C # ile iki yönlü ilişkileri ve Microsoft'un her şeyi nasıl desteklediği. Örneğin, C # -XAML kombinasyonu JavaFX'ten daha dostudur, çünkü C # ve XAML birbirleri için saldırıya uğramıştır (örneğin, C #'daki kısmi sınıflar, XAML'deki bağlamalar ve daha fazlası). JavaFX üzerinde C # kullanmak pek bir gelişme sağlamaz. JVM'de C # deneyimini elde etmek için, araçları da taşımanız gerekir ve bu çok daha büyük bir proje. Mono bile rahatsız etmeyecek.

Bu yüzden, tanıdık araçların üzerinde daha meraklı bir dil kullanmak isteyen bir Java geliştiricisine tavsiyem, mevcut JVM dillerine göz atmaktır .

Mono da bir seçenek ama ben her zaman şüpheliydim. C # - .NET ve çapraz platform olmasına rağmen, Microsoft'un araçlarıyla oluşturulan şeyler genellikle Mono üzerinde çalışmaz. Esasen kendine has bir şeydir. Şimdi Microsoft işbirliği yapacaklarını söylediği için ne olacağını göreceğiz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.