Implementazione di C # per JVM


91

Qualcuno sta tentando di implementare C # per la JVM? Come sviluppatore Java, ho guardato C # con invidia, ma non sono disposto a rinunciare alla portabilità e alla maturità della JVM, per non parlare della vasta gamma di strumenti per esso.

So che ci sono alcune differenze importanti tra JVM e CLR, ma c'è qualcosa che è uno spettacolo?


3
Ho anche scritto molte, molte app completamente multipiattaforma in Java: è una cosa quotidiana per me e il mio team. Di solito eseguiamo il piano di test su ogni piattaforma che ufficialmente "qualifichiamo", ma penso che siano passati anni da quando un bug di test è stato attribuito a una differenza di piattaforma.
Jared

1
Il nostro prodotto principale funziona su Windows, OS X e Linux senza modifiche. Non è davvero difficile da fare.
Thorbjørn Ravn Andersen

1
Faccio il mio Java in Windows, l'altro fa la sua parte in OSX, CI sgranocchia tutti i test sotto Linux e abbiamo distribuito il software su un'ampia varietà di server Windows e Linux e persino Solaris. Quindi credo di poter dire che ho scritto programmi Java veramente, completamente e multipiattaforma per un po 'di tempo.
Esko

1
JavaVM implementato in .NET; Implementazione .NET di Java LIBS; interoperabilità di entrambi i mondi -> IKVM.NET ( ikvm.net )
gsscoder

1
Mi sembra che se puoi convertire .NET in JavaScript (JSIL lo fa per esempio), dovresti essere in grado di convertirlo in Java ...
BrainSlugs83

Risposte:


93

Esistono differenze molto significative tra CLR e JVM.

Alcuni esempi:

  • Java non ha tipi di valore definiti dall'utente
  • I generici Java sono completamente diversi dai generici .NET
  • Molti aspetti di C # dipendono da elementi del framework - delegati, ecc. Dovresti portare anche la libreria, anche per gli aspetti linguistici .
  • Java non supporta cose come proprietà ed eventi a livello di JVM. Potresti fingere un po 'di questo, ma non sarebbe lo stesso.
  • Non credo che Java abbia alcun equivalente ai parametri di riferimento, anche a livello di JVM
  • Le sottigliezze da fare con i diversi modelli di memoria potrebbero mordere, anche se non sono sicuro di quanto ci sia nelle specifiche C #.
  • Il codice non sicuro in generale probabilmente non è possibile in Java
  • L'interoperabilità con il codice nativo è molto diversa tra JNI e P / Invoke. Questo probabilmente non è un grosso problema per te.
  • Dovresti simulare il sovraccarico dell'operatore e le conversioni definite dall'utente

Probabilmente potresti portare un sacco di C #, ma rimarrai con un'esperienza piuttosto insoddisfacente, IMO.

Andando dall'altra parte, conosci IKVM ? Ti consente di eseguire codice Java in .NET.


7
Java ha finalizzatori e nemmeno la finalizzazione .NET non è deterministica. Potrebbero esserci alcune sottili differenze tra i due, ma non riesco a pensare a nessuna improvvisa. Sospetto che i test di raggiungibilità di Java siano più forti di quelli di .NET: nessuna finalizzazione mentre un altro thread sta ancora eseguendo un metodo di istanza
Jon Skeet

3
Penso che potresti mappare i tipi di valore sui tipi di riferimento. Basta fare in modo che ogni incarico faccia un clone superficiale!
Daniel Earwicker

3
@Earwicker: ... e cambiare l'allocazione dell'array e vari altri punti in cui la semantica fa la differenza? Sospetto che sarebbe molto difficile farlo funzionare, se possibile, e il risultato non sarebbe qualcosa che vorresti usare.
Jon Skeet

4
Penso che anche i generici sarebbero risolvibili. Dovresti generare una classe java con campi extra per contenere gli oggetti Class per i parametri di tipo, quindi aggiungerebbe un po 'di overhead, ma sarebbero disponibili nuovi T () e typeof (T).
Daniel Earwicker

30
@ Jon Skeet: Questo ti dà il peggio di entrambi i mondi: il linguaggio un po 'obsoleto di Java sulla piattaforma proprietaria di Microsoft.
Bart van Heukelom

43

Visita http://code.google.com/p/stab-language

Il codice seguente se un codice lingua Stab per 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 fornisce gran parte della carne del linguaggio C # su JVM, ma lo fa in un modo che è molto interoperabile con Java. Quindi non è strettamente codice sorgente compatibile con il codice C # scritto per .NET CLR, ma consente a un programmatore Java di godere di un linguaggio molto simile a C # ottenendo allo stesso tempo la stessa qualità di codice byte generato e avendo interoperabilità senza impedenza con le librerie e i framework Java. È l'approccio giusto da adottare per ottenere C # sulla JVM.
RogerV

Il buon linguaggio, sulla buona piattaforma ... vorrei essermi imbattuto in questo anni fa.
Jefferey Cave

14

Transpilatori Bytecode

Grasshopper può prendere un bytecode CLR e trasferirlo per JVM. Destinato principalmente alle app Web, non fornisce, ad esempio, l'implementazione JVM delle classi Windows Forms. Sembra un po 'datato, però. Il web parla di ASP.NET 2.0, Visual Studio 2008 e così via. Menzionato per la prima volta da @alex

XMLVM può prendere il bytecode CLR o JVM come input e produrlo come output. Inoltre può generare Javascript o Objective-C. Nessun rilascio ancora, solo Subversion. "Versione di sviluppo sperimentale che non deve essere utilizzata in un ambiente di produzione."

IKVM va nella direzione opposta rispetto a quanto vuole OP. Fornisce un'implementazione JVM in esecuzione su CLR, un transpiler bytecode da JVM a CLR e un generatore di stub del metodo della libreria CLR per Java. http://www.ikvm.net/uses.html Menzionato da @Jon Skeet

RPC

Perché non far funzionare CLR e JVM insieme e rendere la comunicazione il più semplice possibile? Questo non è ciò che vuole l'OP, ma alcune altre risposte sono già abbastanza fuori tema in modi diversi, quindi copriamolo.

RabbitMQ , ha un'opzione gratuita, è un server RPC scritto in Erlang con librerie API per C #, Java e altro.

jnBridge , la licenza potrebbe essere troppo costosa per alcuni potenziali utenti.

gRPC e librerie RPC moderne simili offrono ampio supporto linguistico, generazione di codice per librerie client in questi linguaggi, formato wire indipendente dalla lingua per i dati, funzionalità avanzate come l'annullamento delle chiamate a cascata e così via.

Linguaggi di programmazione

Scrivi una volta, corri ovunque;)

Haxe , compila in C # / CLR, Java / JVM, Javascript, Flash, Python, ... Fornisce meccanismi di interoperabilità per ciascuno dei linguaggi di destinazione. Può essere considerato in una certa misura un successore di ActionScript3. Sembra roba abbastanza solida, con almeno un'azienda che dipende da essa. Molto più affidabile di Stab, menzionato dopo.

Stab offre alcune funzionalità C # e l'interoperabilità di Java. Non molto utile, ottieni alcune funzionalità C #, ma ciò con cui interagisci è il codice Java che non le utilizza. https://softwareengineering.stackexchange.com/a/132080/45826 Il linguaggio è relativamente oscuro, forse abbandonato, con poche promesse di miglioramento. Menzionato per la prima volta qui da @Vns.

Raffica di aria fresca per la piattaforma JVM;)

Scala , Kotlin , altri, sono linguaggi abbastanza carini in esecuzione su JVM che offrono funzionalità che un programmatore C # potrebbe perdere in Java. Soprattutto Kotlin sembra una ragionevole alternativa a C # nel mondo JVM. Scala potrebbe essere un linguaggio un po 'troppo vasto per un programmatore con cui sentirsi a proprio agio in breve tempo.

Mono

Anche questa è certamente un'opzione. Perché transpile in JVM se Mono può eseguirlo così com'è. Menzionato per la prima volta da @ferhrosa

NEW YORK - 12 novembre 2014 - Mercoledì, Microsoft Corp. ha rafforzato il proprio impegno a favore di esperienze di sviluppo multipiattaforma rendendo open source l'intero stack .NET lato server e espandendo .NET per l'esecuzione su piattaforme Linux e Mac OS.

Secondo questo comunicato stampa da cui proviene la citazione, Visual Studio 2015 aggiungerà Linux / Mono come piattaforma supportata.

Questo è un blog scritto dalle persone del progetto Mono sull'argomento, dall'altra parte: .NET Source Code Integration (novembre 2014).

.NET Core

Una versione multipiattaforma Windows / Linux di (alcuni di) .Net governata da Microsoft. 'nuff ha detto https://github.com/dotnet/core .

Conclusione

Sarebbe ora necessario provare questi strumenti / framework e vedere quanto attrito c'è. L'OP vuole scrivere in C # per la JVM, che potrebbe effettivamente funzionare abbastanza bene usando Grasshopper.

Fare questo con l'obiettivo di combinare le librerie del mondo C # e Java in una singola base di codice potrebbe non funzionare così bene.

Fonti

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


Bella risposta! Come sviluppatore C # che non è contento di dover passare a Java (come puoi vivere senza proprietà ?!), ed è dubbioso su Scala, questo espone davvero bene le opzioni.
Gilthans

9

Potrebbe essere più semplice scrivere un convertitore da IL a bytecode. In questo modo otterrai automaticamente il supporto per qualsiasi linguaggio .NET sulla JVM.

Tuttavia, questa è un'idea così ovvia che se ciò non è già stato fatto, probabilmente è estremamente difficile, o difficile da fare bene / utilmente.


6
Ti imbatteresti nella maggior parte dei problemi che ho elencato - diversi generici ecc.
Jon Skeet

8
Questo è esattamente ciò che fa Grasshopper (vedi la risposta di @ alex sopra), è davvero estremamente difficile da fare bene (lavoravo su Grasshopper).
Motti

7

Guarda Grasshopper . È un SDK basato su Visual Studio e un convertitore brevettato da .NET a Java che consente di eseguire applicazioni Web e server .NET su Linux® e altre piattaforme abilitate per Java.


2
Hai esperienza pratica con esso? Nota anche che la licenza è draconica per la versione gratuita.
Thorbjørn Ravn Andersen

13
Hai perso il mio interesse nel momento in cui hai pronunciato la parola "brevettato". Sospiro.
Stephen C

2
Solo alcune novità: Grasshopper è ora gratuito , senza supporto e garanzia (come la maggior parte dei prodotti open-source).
fernacolo

1
Mainsoft sembra essere completamente morto e i collegamenti Grasshopper non funzionano più.
David dato il

1
Ovvio quindi solo un balbettio netto. Entrambi i collegamenti ora funzionano. Sfortunatamente ora non ricordo perché lo volessi ...
David Given



0

Questa risposta potrebbe essere in ritardo per te, ma questa è solo nuova. Potresti voler controllare il linguaggio di programmazione Kotlin . Offre gli zuccheri sintattici che ha C # ed è anche il più vicino alla sintassi C #, oltre a qualsiasi linguaggio JVM non Java. È di JetBrains .


0

Posso vedere due ragioni per cui questo non sta ottenendo molto entusiasmo.

La prima cosa da capire è che, quando si tratta delle effettive caratteristiche del linguaggio, C # e Java sono molto simili. Non solo C # e Java sono vicini, ma si muovono anche in direzioni simili. Ci sono alcune funzionalità che la JVM attualmente non supporta immediatamente, ma non è questo il vero problema. Puoi sempre fingere ciò che manca. Penso che le persone preferiscano aspettare che Java ottenga un po 'più di zucchero, piuttosto che creare un Almost-Java da zero. Quando il port è pronto, Java potrebbe aver deciso di mettersi al passo.

In secondo luogo, il motivo per cui gli sviluppatori preferiscono C # non è tanto il linguaggio stesso, ma gli strumenti che lo circondano, la loro relazione bidirezionale con C # e il modo in cui Microsoft supporta l'intera cosa. Ad esempio, la combinazione C # -XAML è più amichevole di JavaFX, perché C # e XAML sono stati hackerati l'uno per l'altro (ad esempio, classi parziali in C #, associazioni in XAML e altro). L'uso di C # su JavaFX non migliora molto. Per ottenere l'esperienza C # sulla JVM, è necessario portare anche gli strumenti, e questo è un progetto molto più grande. Nemmeno Mono si preoccuperà.

Quindi, il mio consiglio a uno sviluppatore Java, che desidera utilizzare un linguaggio più elaborato in cima a strumenti familiari, è di controllare i linguaggi JVM esistenti .

Anche il mono è un'opzione, ma sono sempre stato scettico al riguardo. Anche se è C # -. NET e multipiattaforma, le cose create con gli strumenti di Microsoft generalmente non funzionano su Mono. È essenzialmente una cosa sua. Vedremo cosa succederà ora che Microsoft ha detto che collaboreranno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.