Implementando C # para o JVM

91

Alguém está tentando implementar C # para o JVM? Como desenvolvedor Java, estou de olho no C # com inveja, mas não estou disposto a desistir da portabilidade e maturidade da JVM, sem mencionar a diversidade de ferramentas para ela.

Eu sei que existem algumas diferenças importantes entre o JVM e o CLR, mas há algo que seja um empecilho?

Roubar
fonte
3
Eu também escrevi muitos, muitos aplicativos totalmente multiplataforma em Java - é uma coisa diária para mim e minha equipe. Normalmente executamos o plano de teste em cada plataforma que oficialmente "qualificamos", mas acho que já se passaram anos desde que um bug de teste foi atribuído a uma diferença de plataforma.
Jared,
1
Nosso produto principal funciona no Windows, OS X e Linux inalterado. Realmente não é difícil de fazer.
Thorbjørn Ravn Andersen
1
Eu faço meu Java no Windows, outro cara faz a sua parte no OSX, o CI faz todos os testes no Linux e implantamos o software em uma grande variedade de servidores Windows e Linux e até Solaris. Portanto, posso dizer que já escrevo programas Java verdadeiramente, totalmente e multiplataforma há algum tempo.
Esko
1
JavaVM implementado em .NET; Implementação .NET de Java LIBS; interoperabilidade de ambos os mundos -> IKVM.NET ( ikvm.net )
gsscoder
1
Parece-me que se você pode converter .NET para JavaScript (JSIL faz isso, por exemplo), você deve ser capaz de convertê-lo para Java ...
BrainSlugs83

Respostas:

93

Existem diferenças muito significativas entre o CLR e a JVM.

Alguns exemplos:

  • Java não tem tipos de valor definidos pelo usuário
  • Genéricos Java são completamente diferentes dos genéricos .NET
  • Muitos aspectos do C # dependem de elementos da estrutura - delegados etc. Você também precisaria portar a biblioteca, mesmo para aspectos de linguagem .
  • Java não oferece suporte a coisas como propriedades e eventos em um nível de JVM. Você poderia fingir um pouco disso, mas não seria o mesmo.
  • Não acredito que Java tenha qualquer equivalente a parâmetros de passagem por referência, mesmo no nível de JVM
  • As sutilezas relacionadas aos diferentes modelos de memória possivelmente afetariam, embora eu não tenha certeza de quanto está nas especificações do C #.
  • Código inseguro em geral provavelmente não é possível em Java
  • A interoperabilidade com o código nativo é muito diferente entre JNI e P / Invoke. Isso provavelmente não é um grande problema para você.
  • Você teria que fingir sobrecarga do operador e conversões definidas pelo usuário

Você provavelmente poderia portar muito C # - mas ficaria com uma experiência bastante insatisfatória, IMO.

Por outro lado, você conhece o IKVM ? Ele permite que você execute código Java em .NET.

Jon Skeet
fonte
7
Java tem finalizadores, e a finalização .NET também não é determinística. Pode haver algumas diferenças sutis entre os dois, mas não consigo pensar em nenhuma de improviso. No entanto, suspeito que os testes de acessibilidade do Java são mais fortes do que os do .NET: nenhuma finalização enquanto outro thread ainda está executando um método de instância
Jon Skeet
3
Acho que você poderia mapear tipos de valor em tipos de referência. Basta fazer com que cada atribuição seja um clone superficial!
Daniel Earwicker,
3
@Earwicker: ... e muda a alocação do array, e vários outros lugares onde a semântica faz diferença? Suspeito que seria muito difícil fazê-lo funcionar, se possível, e o resultado não seria algo que você gostaria de usar.
Jon Skeet
4
Acho que os genéricos também podem ser resolvidos. Você teria que gerar uma classe java com campos extras para conter os objetos Class para os parâmetros de tipo, então isso adicionaria alguma sobrecarga, mas então novos T () e typeof (T) estariam disponíveis.
Daniel Earwicker,
30
@Jon Skeet: Isso dá a você o pior dos dois mundos: a linguagem Java um tanto desatualizada na plataforma proprietária da Microsoft.
Bart van Heukelom
43

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

O código abaixo é um código de linguagem Stab para 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);
        }
    }
}
Vns
fonte
7
O stab fornece grande parte da carne da linguagem C # na JVM, mas o faz de uma maneira que é perfeitamente interoperável com Java. Portanto, não é estritamente o código-fonte compatível com o código C # escrito para o .NET CLR, mas permite que um programador Java aproveite uma linguagem muito parecida com o C #, enquanto obtém a mesma qualidade de código de bytes gerado e tem interoperabilidade sem impedância com bibliotecas e estruturas Java. É a abordagem correta a ser adotada para obter C # na JVM.
RogerV
A boa linguagem, na boa plataforma ... gostaria de ter tropeçado nisso anos atrás.
Caverna Jefferey de
14

Transpiladores bytecode

O Grasshopper pode pegar um bytecode CLR e transpilá-lo para JVM. Destinado principalmente a aplicativos da web, ele não fornece, por exemplo, implementação JVM de classes do Windows Forms. Parece um pouco datado, no entanto. A web fala sobre ASP.NET 2.0, Visual Studio 2008 e assim por diante. Mencionado pela primeira vez por @alex

XMLVM pode receber bytecode CLR ou JVM como entrada e produzir como saída. Além disso, pode produzir Javascript ou Objective-C. Ainda não há lançamentos, apenas Subversion. "Versão de desenvolvimento experimental que não deve ser usada em um ambiente de produção."

O IKVM vai na direção oposta à que OP deseja. Ele fornece uma implementação de JVM em execução no CLR, um transpiler de bytecode de JVM para CLR e um gerador de stub de método de biblioteca CLR para Java. http://www.ikvm.net/uses.html Mencionado por @Jon Skeet

RPC

Por que não ter CLR e JVM rodando lado a lado e tornar a comunicação o mais simples possível? Não é isso que o OP deseja, mas algumas outras respostas já estão bastante fora do assunto de maneiras diferentes, então vamos abordá-las.

RabbitMQ , tem uma opção gratuita, é um servidor RPC escrito em Erlang com bibliotecas API para C #, Java e muito mais.

jnBridge , a licença pode ser muito cara para alguns usuários em potencial.

gRPC e bibliotecas RPC modernas semelhantes oferecem amplo suporte de linguagem, geração de código para bibliotecas de cliente nessas linguagens, formato de conexão independente de linguagem para dados, recursos avançados como cancelamento de chamada em cascata e assim por diante.

Linguagens de programação

Escreva uma vez, execute em qualquer lugar;)

Haxe , compila para C # / CLR, Java / JVM, Javascript, Flash, Python,… Fornece mecanismos de interoperabilidade para cada uma das linguagens de destino. Pode ser considerado um sucessor do ActionScript3 até certo ponto. Parece material bastante sólido, com pelo menos uma empresa realmente dependendo disso. Muito mais confiável do que Stab, mencionado a seguir.

Stab traz alguns recursos C # e interoperabilidade Java. Não é muito útil, você obtém alguns recursos C #, mas o que interage é o código Java que não os usa. https://softwareengineering.stackexchange.com/a/132080/45826 A linguagem é relativamente obscura, possivelmente abandonada, com poucas chances de se tornar melhor. Mencionado aqui pela primeira vez por @Vns.

Rajada de ar fresco para a plataforma JVM;)

Scala , Kotlin e outras são linguagens razoavelmente boas rodando em cima da JVM que trazem recursos que um programador C # pode perder em Java. Especialmente o Kotlin parece uma alternativa razoável ao C # no mundo da JVM. Scala pode ser uma linguagem um pouco extensa para um programador se sentir confortável em um curto espaço de tempo.

Mono

Essa é certamente uma opção também. Por que transpilar para JVM se o Mono pode executá-lo como está. Mencionado pela primeira vez por @ferhrosa

NOVA YORK - 12 de novembro de 2014 - Na quarta-feira, a Microsoft Corp. reforçou seu compromisso com as experiências de desenvolvedor de plataforma cruzada abrindo o código-fonte da pilha .NET completa do lado do servidor e expandindo o .NET para rodar nas plataformas Linux e Mac OS.

De acordo com este comunicado de imprensa do qual vem a citação, o Visual Studio 2015 adicionará Linux / Mono como uma plataforma compatível.

Este é um blog escrito pelo pessoal do projeto Mono sobre ele, do outro lado: .NET Source Code Integration (novembro de 2014).

.NET Core

Uma versão multiplataforma Windows / Linux de (alguns de) .Net administrada pela Microsoft. 'nuff disse https://github.com/dotnet/core .

Conclusão

Agora seria necessário dar uma chance a essas ferramentas / estruturas e ver quanta fricção existe. O OP deseja escrever em C # para a JVM, o que pode funcionar muito bem usando o Grasshopper.

Fazer isso com o objetivo de misturar bibliotecas C # e Java world em uma única base de código pode não funcionar tão bem.

Fontes

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

user7610
fonte
Ótima resposta! Como um desenvolvedor C # que está insatisfeito com a transição para Java (como você pode viver sem propriedades ?!) e tem dúvidas sobre Scala, isso realmente apresenta as opções bem.
Gilthans
9

Pode ser mais simples escrever um conversor de IL para bytecode. Dessa forma, você obterá suporte automaticamente para qualquer linguagem .NET na JVM.

No entanto, essa é uma ideia tão óbvia que, se ainda não tiver sido feito, é provavelmente extremamente difícil ou difícil de fazer bem / utilmente.

Daniel Earwicker
fonte
6
Você enfrentaria a maioria dos problemas que listei - genéricos diferentes etc.
Jon Skeet,
8
Isso é exatamente o que o Grasshopper faz (veja a resposta de @ alex acima); na verdade, é extremamente difícil de fazer bem (eu costumava trabalhar no Grasshopper).
Motti
7

Veja o Grasshopper . É um SDK baseado em Visual Studio e um conversor patenteado de .NET para Java que permite que você execute aplicativos .NET Web e de servidor em Linux® e outras plataformas habilitadas para Java.

alex
fonte
2
Você tem experiência prática com isso? Observe também que a licença é dracônica para a versão gratuita.
Thorbjørn Ravn Andersen
13
Você perdeu meu interesse no momento em que disse a palavra "patenteado". Suspiro.
Stephen C de
2
Apenas algumas novidades: o Grasshopper agora é gratuito , sem suporte e garantia (como a maioria dos produtos de código aberto).
fernacolo de
1
A Mainsoft parece estar completamente morta e os links do Grasshopper não funcionam mais.
David Dado
1
Óbvio apenas um wibble net então. Ambos os links funcionam agora. Infelizmente agora eu não consigo me lembrar por que eu queria ...
David dado
2

Uma opção para desenvolvimento de plataforma cruzada em C # pode ser mono: http://www.mono-project.com/

ferhrosa
fonte
0

Esta resposta pode demorar para você, mas esta é apenas nova. Você pode querer verificar a linguagem de programação Kotlin . Ele oferece os açúcares sintáticos que o C # tem e é o mais próximo da sintaxe C # também, exceto qualquer linguagem JVM não Java. É da JetBrains .

LEMUEL ADANE
fonte
0

Posso ver duas razões pelas quais isso não está gerando tanto entusiasmo.

A primeira coisa a perceber é que, no que diz respeito aos recursos reais da linguagem, C # e Java estão muito próximos. Não apenas C # e Java estão próximos, eles também estão se movendo em direções semelhantes. Existem alguns recursos que a JVM não suporta atualmente, mas esse não é o problema real. Você sempre pode fingir o que está faltando. Acho que as pessoas preferem esperar que o Java obtenha um pouco mais de açúcar, do que criar um Quase-Java do zero. Quando a porta estiver pronta, Java pode ter decidido alcançá-la.

Em segundo lugar, a razão pela qual os desenvolvedores preferem C # não é tanto a linguagem em si, mas as ferramentas em torno dela, seu relacionamento bidirecional com C # e como a Microsoft oferece suporte a tudo isso. Por exemplo, a combinação C # -XAML é mais amigável do que JavaFX, porque C # e XAML foram hackeados um para o outro (por exemplo, classes parciais em C #, ligações em XAML e mais). Usar C # no JavaFX não melhora muito. Para obter a experiência C # na JVM, você também precisa portar as ferramentas, e esse é um projeto muito maior. Nem mesmo Mono vai incomodar.

Portanto, meu conselho para um desenvolvedor Java, que deseja usar uma linguagem sofisticada em cima de ferramentas familiares, é verificar as linguagens JVM existentes .

Mono também é uma opção, mas sempre fui cético quanto a isso. Embora seja C # - .net e multiplataforma, as coisas criadas com as ferramentas da Microsoft geralmente não funcionam no Mono. É essencialmente sua própria coisa. Veremos o que acontece agora que a Microsoft anunciou que vai colaborar.

Chris
fonte