web-dev-qa-db-ja.com

JVM用のC#の実装

JVM用にC#を実装しようとしている人はいますか? Java開発者として、私はC#にen望の目を向けてきましたが、JVMの移植性と成熟度をあきらめようとはしません。

JVMとCLRの間にいくつかの重要な違いがあることは知っていますが、目を見張るものはありますか?

88
Rob

CLRとJVMには非常に大きな違いがあります。

いくつかの例:

  • Javaにはユーザー定義の値型がありません
  • Javaジェネリックは.NETジェネリックとは完全に異なります
  • C#の多くの側面は、フレームワークの要素(デリゲートなど)に依存します。language側面でも、ライブラリを移植する必要があります。
  • Javaは、JVMレベルのプロパティやイベントなどをサポートしていません。これの一部を偽造することもできますが、同じではありません。
  • JVMレベルであっても、Javaは参照渡しのパラメーターと同等のものを持っているとは思わない
  • C#仕様にどの程度含まれているのかはわかりませんが、さまざまなメモリモデルを微妙に調整することは非常に可能性があります。
  • 一般に、安全でないコードはおそらくJavaでは不可能です
  • ネイティブコードとの相互運用性は、JNIとP/Invokeで大きく異なります。これはおそらくあなたにとってあまり問題ではありません。
  • 演算子のオーバーロードとユーザー定義の変換を偽造する必要があります

おそらく、C#のlotを移植できます-しかし、かなり不満足な経験、IMOが残されます。

逆に言えば、 [〜#〜] ikvm [〜#〜] ? .NETでJavaコードを実行できます。

90
Jon Skeet

訪問 http://code.google.com/p/stab-language

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);
        }
    }
}
41
Vns

バイトコードトランスパイラー

Grasshopper は、CLRバイトコードを取得し、それをJVM用に変換できます。主にウェブアプリを対象としていますが、 Windows FormsクラスのJVM実装。しかし、やや時代遅れのようです。 Webでは、ASP.NET 2.0、Visual Studio 2008などについて説明しています。 @alexによる最初の言及

[〜#〜] xmlvm [〜#〜] は、入力としてCLRまたはJVMバイトコードを受け取り、出力として生成できます。さらに、JavascriptまたはObjective-Cを出力できます。まだリリースはなく、Subversionのみ。 「実稼働環境で使用しない実験開発バージョン。」

[〜#〜] ikvm [〜#〜] は、OPが望んでいない方向に進みます。 CLRで実行されるJVM実装、JVMからCLRバイトコードトランスパイラー、およびJava用のCLRライブラリメソッドスタブジェネレーターを提供します。 http://www.ikvm.net/uses.html @Jon Skeetによる言及

RPC

CLRとJVMを一緒に実行して、通信をできるだけ摩擦のないものにしないのはなぜですか?これはOPが望んでいるものではありませんが、他のいくつかの答えはすでにさまざまな方法で話題から外れているので、それをカバーしましょう。

RabbitMQ 、無料オプションがあり、C#用のAPIライブラリを使用してErlangで記述されたRPCサーバー、Javaなど。

jnBridge 、一部の見込みユーザーにとってライセンスが高すぎる可能性があります。

gRPC 、および同様の最新のRPCライブラリは、幅広い言語サポート、これらの言語のクライアントライブラリのコード生成、データの言語に依存しないワイヤフォーマット、カスケードコールキャンセルなどの高度な機能などを提供します。

プログラミング言語

一度書く、どこでも実行;)

Haxe 、C#/ CLR、Java/JVM、Javascript、Flash、Pythonなどにコンパイルします…ターゲット言語ごとに相互運用メカニズムを提供します。ある程度、ActionScript3の後継者と考えることができます。少なくとも1つの会社が実際にそれに依存している、かなり堅実なもののようです。次に説明するスタブよりもはるかに信頼できます。

Stab はいくつかのC#機能とJava相互運用性をもたらします。あまり有用ではありません。C#機能をいくつか入手できますが、やり取りするのはJava =それらを使用しないコード https://softwareengineering.stackexchange.com/a/132080/45826 この言語は比較的曖昧で、おそらく放棄されており、改善される見込みはほとんどありません。 @Vns。

JVMプラットフォームに新鮮な空気を吹き込む;)

ScalaKotlin 、その他は、C#プログラマがJavaで見逃す可能性のある機能を提供するJVM上で実行されるかなり素晴らしい言語です。特にKotlinは、JVMの世界ではC#の合理的な代替手段のように感じています。 Scalaは、プログラマが短期間で慣れるにはちょっと大きすぎる言語かもしれません。

モノ

それも確かに選択肢です。 Monoがそのまま実行できるのに、なぜJVMに移行するのですか。 @ferhrosaによる最初の言及

NEW YORK — 2014年11月12日—水曜日、Microsoft Corp.はサーバーサイド全体をオープンソース化することで、クロスプラットフォーム開発者エクスペリエンスへのコミットメントを強化しましたLinuxおよびMac OSプラットフォームで実行するための.NETスタックおよび拡張.NET。

このプレスリリース によると、引用元はVisual Studio 2015であり、Linux/Monoがサポート対象プラットフォームとして追加されます。

これは、Monoプロジェクトの関係者が反対側から書いたブログです。 。NETソースコード統合 (2014年11月)。

.NET Core

Microsoftが管理する(一部の).NetのWindows/Linuxマルチプラットフォームバージョン。 「ナフは言った https://github.com/dotnet/core

結論

これらのツール/フレームワークを試して、どれだけ摩擦があるかを確認する必要があります。 OPはJVM用にC#で記述したいと考えていますが、実際にはGrasshopperを使用すると非常にうまく機能する可能性があります。

C#とJavaワールドライブラリを単一のコードベースに混在させることを目的としてこれを行うと、うまく機能しない場合があります。

ソース

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

11
user7610

ILからバイトコードへのコンバーターを記述する方が簡単な場合があります。そうすれば、JVM上のあらゆる.NET言語のサポートを自動的に取得できます。

しかし、これは非常に明白な考えであり、これがまだ行われていない場合、おそらく非常に難しいか、うまく/有用に行うのが難しいでしょう。

9

Grasshopper を見てください。これは、Visual StudioベースのSDKであり、特許取得済みの.NET to Javaコンバーターであり、Linux®およびその他のJava対応プラットフォームで.NET Webおよびサーバーアプリケーションを実行できます。

7
alex

C#でのクロスプラットフォーム開発のオプションは、モノにすることができます。 http://www.mono-project.com/

2
ferhrosa

ソースからソースへのコンパイラ を使用して、C#をJVMで実行される言語に翻訳できます。たとえば、いくつかの C#to Java converters があり、C#アプリケーションをJavaに変換した後にJVMで実行できるようになります。

1
Anderson Green

この答えはあなたには遅れるかもしれませんが、これは新しいものです。 Kotlin プログラミング言語をチェックアウトすることもできます。非Java JVM言語を除き、C#が持つ構文糖質と、C#に最も近い構文を提供します。そのfrom JetBrains

0
LEMUEL ADANE

これがあまり熱心になっていない2つの理由がわかります。

最初に実現することは、言語の実際の機能に関しては、C#とJavaは非常に近いということです。 C#AMD Javaが近いだけでなく、同様の方向に移動しています。現在、JVMですぐにサポートされない機能がいくつかありますが、それは実際の問題ではありません。あなたはいつでも足りないものを偽造できます。 Almost-Javaをゼロから作成するよりも、Javaがさらに砂糖を得るのを待つ方が好きだと思います。ポートの準備が整うまでに、Javaが追いつくことに決めたかもしれません。

第二に、開発者がC#を好む理由は、言語そのものではなく、その周辺のツール、C#との双方向の関係、およびMicrosoftがすべてをサポートする方法です。たとえば、C#とXAMLは相互にハッキングされているため(C#の部分クラス、XAMLのバインディングなど)、C#-XAMLコンボはJavaFXよりも使いやすいです。 JavaFXでC#を使用してもそれほど改善されません。 JVMでC#のエクスペリエンスを得るには、ツールも移植する必要がありますが、これは非常に大きなプロジェクトです。でも Mono は気にしません。

したがって、おなじみのツールの上で手の込んだ言語を使用したいJava開発者への私のアドバイスは、既存の JVM言語 をチェックアウトすることです。

モノもオプションですが、私は常に懐疑的でした。 C#-。NETおよびクロスプラットフォームであるにもかかわらず、Microsoftのツールを使用して構築されたものは一般的にMonoで動作しません。それは本質的にそれ自身のものです。マイクロソフトが共同作業を開始すると言った今、何が起こるか見ていきます。

0
Chris