2009-03-25 8 views
82

Czy ktoś próbuje zaimplementować C# dla JVM? Jako programista Java, spoglądam na C# z zazdrością, ale nie chcę rezygnować z przenośności i dojrzałości maszyny JVM, nie wspominając o różnorodnych narzędziach do tego.Implementacja C# dla JVM

Wiem, że istnieją pewne ważne różnice między JVM i CLR, ale czy jest coś, co jest showstopper?

+3

Napisałem również wiele, wiele w pełni wieloplatformowych aplikacji w Javie - to codzienność dla mnie i mojego zespołu. Zazwyczaj uruchamiamy plan testów na każdej platformie, którą oficjalnie "kwalifikujemy", ale myślę, że minęły lata, odkąd błąd testowy został przypisany różnicy platformy. – Jared

+1

Nasz główny produkt działa w systemie Windows, OS X i Linux bez zmian. To naprawdę nie jest trudne. –

+0

Zrobiłem rozwój zewnętrznych z Java i to było niesamowite. Mój partner korzystał z Linuksa, korzystałem z Maca, a nasz klient był w systemie Windows ... co jeszcze mogę powiedzieć? – graffic

Odpowiedz

84

Istnieją bardzo znaczne różnice między CLR i JVM.

Kilka przykładów:

  • Java nie posiada typy wartości zdefiniowanych przez użytkownika
  • leków generycznych Java całkowicie inna .NET generycznych
  • wielu aspektach C# zależeć na elementach framework - delegaci itd. Trzeba również przenieść bibliotekę, nawet dla aspektów języka.
  • Java nie obsługuje obiektów takich jak właściwości i zdarzenia na poziomie maszyny JVM. Możesz to udawać, ale to nie będzie to samo.
  • Nie wierzę, że Java ma jakikolwiek odpowiednik parametrów referencyjnych, nawet na poziomie JVM.
  • Subtelności związane z różnymi modelami pamięci mogłyby całkiem ugryźć, chociaż nie jestem pewien, ile jest w specyfikacji C#.
  • Nieprawidłowy kod ogólnie nie jest możliwy w Javie
  • Współdziałanie z natywnym kodem różni się bardzo między JNI i P/Invoke. Prawdopodobnie nie stanowi to dla ciebie problemu.
  • Musiałbyś fałszywej przeciążenia operatora i zdefiniowanych przez użytkownika konwersje

można prawdopodobnie Przyłącze A dużo C# - ale chcesz być pozostawione z bardzo niezadowalające doświadczenie, IMO.

Idąc w drugą stronę, czy wiesz o IKVM? Pozwala na uruchamianie kodu Java w .NET.

+0

+1, Minęło trochę czasu, odkąd zrobiłem hardcore Java, ale wierzę również, że JVM nie wspiera deterministycznej finalizacji. Przynajmniej nie w jednym momencie. Konieczna byłaby koncepcja finalizacji/destruktorów, aby poprawnie zaimplementować dobry fragment kodu C#. – JaredPar

+7

Java ma finalizatory, a finalizacja .NET również nie jest deterministyczna. Mogą istnieć pewne subtelne różnice między tymi dwoma, ale nie mogę wymyślić żadnego offhandu. Podejrzewam, że testy osiągalności Java są silniejsze niż.NET jednak: bez finalizacji, podczas gdy inny wątek nadal działa metodą instancji: –

+0

@Jared - ma spróbować/w końcu, więc byłoby całkiem łatwo dodać instrukcję using do Javy. –

7

Spójrz na Grasshopper. Jest to SDK oparty na Visual Studio i opatentowany konwerter .NET na Javę, który umożliwia uruchamianie aplikacji .NET Web i serwera na platformie Linux® i innych platformach obsługujących Java.

+2

Czy masz praktyczne doświadczenie z tym? Należy również zauważyć, że licencja jest dakoniczna dla darmowej wersji. –

+12

Straciłeś moje zainteresowanie w momencie, gdy wypowiedziałeś słowo "opatentowany". Westchnienie. –

+2

Kilka nowości: Grasshopper jest teraz [bezpłatny] (http://dev.mainsoft.com/Default.aspx?tabid=29#top_Licensing), bez wsparcia i gwarancji (jak większość produktów z otwartym kodem źródłowym). – fernacolo

9

Łatwiejsze byłoby napisanie konwertera z IL do bajtodu. W ten sposób automatycznie uzyskasz wsparcie dla dowolnego języka .NET na JVM.

Jest to jednak tak oczywisty pomysł, że jeśli nie zostało to już zrobione, prawdopodobnie jest bardzo trudne lub trudne do zrobienia dobrze/użytecznie.

+6

Napotkasz większość problemów na liście - różne generyczne itd. –

+1

http://jsc.sourceforge.net/ – mcintyre321

+8

To jest dokładnie to, co robi Grasshopper (patrz odpowiedź @ alexa powyżej) jest naprawdę bardzo trudne do zrobienia dobrze (kiedyś pracowałem na Grasshopper). – Motti

39

Odwiedź http://code.google.com/p/stab-language

Kod poniżej jeśli Stab kodów języków na 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

Stab dostarcza dużo mięsa języka C# na JVM, ale robi to w sposób, który jest bardzo interoperacyjny w Javie. Nie jest to więc kod źródłowy kompatybilny z kodem C# napisanym dla .NET CLR, ale umożliwia programistom Java cieszenie się językiem bardzo podobnym do języka C#, a jednocześnie generuje ten sam kod jakości bajtów i zapewnia bezproblemową współdziałanie z bibliotekami i frameworkami Java.Jest to właściwe podejście do uzyskania C# na JVM. – RogerV

+0

Dobry język, na dobrej platformie ... chciałbym wpaść na to lata temu. –

11

Bytecode transpilers

Grasshopper można pobrać kod bajtowy CLR i przenieść go do JVM. Przeznaczony głównie dla aplikacji internetowych, nie zapewnia np. Implementacja JVM klas Windows Forms. Wydaje się jednak nieco przestarzały. Internet mówi o ASP.NET 2.0, Visual Studio 2008 i tak dalej. Pierwsza wspomniana przez @alex

XMLVM może przyjmować kod bajtowy CLR lub JVM jako dane wejściowe i wytwarzać jako wyjście. Dodatkowo może wyprowadzać JavaScript lub Objective-C. Brak wersji, tylko Subversion. "Eksperymentalna wersja rozwojowa, której nie można używać w środowisku produkcyjnym."

IKVM idzie w innym kierunku niż OP chce. Zapewnia implementację JVM działającą na CLR, transpilator kodu bajtowego JVM do CLR i generator kodu biblioteki biblioteki CLR dla języka Java. http://www.ikvm.net/uses.html Wspomniany przez @Jon Skeet

RPC

Dlaczego nie ma CLR i JVM uruchomiony równolegle i uczynić komunikację tyle tarcia, jak to możliwe? To nie jest to, co chce OP, ale niektóre inne odpowiedzi są już dość różne na różne sposoby, więc omówmy to.

RabbitMQ, ma wolną opcję, jest to serwer RPC napisany w Erlang z bibliotekami API dla C#, Java i innych.

jnBridge, licencja może być zbyt kosztowna dla niektórych potencjalnych użytkowników.

gRPC i podobne nowoczesne biblioteki RPC oferują szerokie wsparcie językowe, generowanie kodu dla bibliotek klienckich w tych językach, niezależny od języka format drutu dla danych, zaawansowane funkcje, takie jak kaskadowanie anulowania połączenia i tak dalej.

Języki programowania

napisz raz, uruchom wszędzie;)

Haxe, kompiluje do C#/CLR, Java/JVM, JavaScript, Flash, Python, ... Zapewnia mechanizmy międzyoperacyjne dla każdej tarczy Języki. Można w pewnym stopniu myśleć o następcy ActionScript3. Wydaje się być dość solidnym materiałem, z co najmniej jedną firmą, która jest w rzeczywistości zależna od tego. O wiele bardziej godne zaufania niż Stab, wspomniane dalej.

Stab wprowadza niektóre funkcje C# i interoperacyjność Java. Niezbyt przydatny, masz kilka funkcji C#, ale to, z czym współpracujesz, to kod Java, który ich nie używa. https://softwareengineering.stackexchange.com/a/132080/45826 Język jest stosunkowo mało znany, prawdopodobnie porzucony, z małą obietnicą, że stanie się lepszy. Najpierw wspomniane tutaj przez @Vns.

Gust świeżego powietrza dla platformy JVM;)

Scala, Kotlin, inni są dość ładne języków działających na górze JVM które wprowadzają funkcje C# programista może brakuje w Javie. Szczególnie Kotlin wydaje się rozsądną alternatywą dla C# w świecie JVM. Scala może być nieco zbyt dużym językiem, aby programista mógł się w krótkim czasie zadomowić.

Mono

Jest to z pewnością również opcja. Po co przemieszczać się do JVM, jeśli Mono może go uruchomić tak, jak jest. Pierwsze wzmianki o @ferhrosa

NEW YORK - 12 listopada 2014 r - W środę, Microsoft Corp. wzmocnione swoje zobowiązanie do doświadczeń deweloperskich cross-platformowych przez otwarte pozyskiwania pełnej stronie serwera .NET stos i rozszerzanie .NET do działania na platformach Linux i Mac OS.

Zgodnie z this press release, z którego pochodzi oferta, Visual Studio 2015 doda Linux/Mono jako obsługiwaną platformę.

To jest blog napisany przez ludzi projektu Mono na ten temat, z drugiej strony: .NET Source Code Integration (listopad 2014).

NET Rdzeń

z systemem Windows/Linux wieloplatformowy wersja (niektóre) .Net regulowane przez Microsoft. "Nuff powiedział https://github.com/dotnet/core.

Wnioski

Byłoby teraz konieczne podawanie tych narzędzi/Ramki spróbować i zobaczyć, ile tam jest tarcie. OP chce napisać w języku C# dla maszyny JVM, która może całkiem dobrze pracować, używając Grasshopper.

Dokonanie tego w celu wymieszania bibliotek światowych C# i Java w jednej bazie kodów może nie działać tak dobrze.

Źródła

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

+0

Świetna odpowiedź! Jako programista C#, który jest niezadowolony z konieczności przejścia na Javę (jak możesz żyć bez właściwości ?!) i jest wątpliwy wobec Scali, to naprawdę dobrze określa opcje. – Gilthans

0

Ta odpowiedź może być późno dla ciebie, ale ten jest po prostu nowe. Możesz wypróbować język programowania Kotlin. Oferuje syntaktyczne cukry, które ma C# i jest najbliższe składni C#, inne niż dowolny język JVM inny niż Java. Jest to od JetBrains.

0

Widzę dwa powody, dla których nie ma to dużego entuzjazmu.

Pierwszą rzeczą, jaką należy sobie uświadomić, jest to, że jeśli chodzi o rzeczywiste funkcje języka, C# i Java są bardzo bliskie. Nie tylko C# amd Java jest zamknięta, ale także poruszają się w podobnych kierunkach. Istnieje kilka funkcji, które JVM nie obsługuje obecnie po wyjęciu z pudełka, ale to nie jest prawdziwy problem. Zawsze możesz udawać, że czegoś brakuje. Myślę, że ludzie wolą czekać na Javę, aby uzyskać więcej cukru, niż stworzyć od podstaw niemalże Javę. Do czasu gdy port jest gotowy, Java może zdecydować się nadrobić zaległości.

Po drugie, powodem, dla którego programiści preferują C#, jest nie tyle sam język, co narzędzia wokół niego, ich dwukierunkowa relacja z C# i to, jak Microsoft wspiera całość.Na przykład combo C# -XAML jest bardziej przyjazne niż JavaFX, ponieważ C# i XAML zostały zhakowane dla siebie nawzajem (np. Częściowe klasy w C#, powiązania w XAML i więcej). Korzystanie z C# na JavaFX nie poprawia się znacznie. Aby uzyskać doświadczenie języka C# w maszynie JVM, trzeba również przenieść narzędzia i to znacznie większy projekt. Nawet nie będzie to przeszkadzało Mono.

Tak więc, moja rada dla programisty Java, który chce użyć bardziej zaawansowanego języka znanych narzędzi, to sprawdzenie istniejącego JVM languages.

Mono też jest opcją, ale zawsze byłem do tego sceptyczny. Mimo że jest to C# - .NET i wieloplatformowy, rzeczy zbudowane przy użyciu narzędzi Microsoftu zazwyczaj nie działają na Mono. Jest to w gruncie rzeczy jego własna rzecz. Zobaczymy, co stanie się teraz, gdy Microsoft powiedział, że będą współpracować.

0

Możesz użyć source-to-source compiler, aby przetłumaczyć język C# na język niż na JVM. Na przykład istnieje kilka wersji C# to Java converters, które umożliwiają uruchamianie aplikacji języka C# na maszynie JVM po przetłumaczeniu na język Java.