Реализация C# для JVM


кто-нибудь пытается реализовать C# для JVM? Как разработчик Java, я с завистью смотрел на C#, но не хочу отказываться от переносимости и зрелости JVM, не говоря уже о разнообразии инструментов для него.

Я знаю, что есть некоторые важные различия между JVM и CLR, но есть ли что-нибудь, что является showstopper?

9 84

9 ответов:

есть очень существенные различия между CLR и JVM.

несколько примеров:

  • Java не имеет пользовательских типов значений
  • Java generics is полностью отличается от .NET generics
  • многие аспекты языка C# зависит от элементов каркаса - делегатов и т. д. Вам также нужно будет перенести библиотеку, даже для язык аспекты.
  • Java не поддерживает такие вещи, как свойства и события на уровне JVM. Вы можете подделать некоторые из них, но это будет не то же самое.
  • Я не верю, что Java имеет какой-либо эквивалент параметров передачи по ссылке, даже на уровне JVM
  • тонкости, связанные с различными моделями памяти, вполне возможно, укусят, хотя я не уверен, сколько в спецификации C#.
  • небезопасный код вообще, вероятно, не возможен в Java
  • совместимость с машинным кодом очень отличается между JNI и P / Invoke. Это, вероятно, не большая проблема для вас.
  • вам придется подделать перегрузку оператора и пользовательские преобразования

вы могли бы, вероятно, порт a много из C# - но вы останетесь с довольно неудовлетворительным опытом, ИМО.

идя в другую сторону, вы знаете о IKVM? Это позволяет запускать Java-код в .NET.

посещение http://code.google.com/p/stab-language

код ниже, если код языка Stab для 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);
        }
    }
}

транспиляторы байт-кода

Кузнечик можно взять байт-код CLR и транспилировать его для JVM. Предназначенный в первую очередь для веб-приложений, он не обеспечивает, например, реализацию JVM классов Windows Forms. Хотя выглядит несколько устаревшим. В Сети говорят о ASP.NET 2.0, Visual Studio 2008 и так далее. Впервые упоминается @alex

XMLVM смогите принять байткод CLR или JVM как входной сигнал и произвести то как выход. Кроме того, он может выводить JavaScript или Цель-C. Пока никаких релизов, только Subversion. "Экспериментальная версия для разработчиков, которая не должна использоваться в производственной среде."

IKVM идет в другом направлении, чем ОП хочет. Он предоставляет реализацию JVM, работающую на CLR, JVM для транспилятора байт-кода CLR и генератор заглушек метода библиотеки CLR для Java. http://www.ikvm.net/uses.html упоминается @Jon Skeet

RPC

почему бы не запустить CLR и JVM вместе и сделать общение как можно больше трения? Это не то, что хочет OP, но некоторые другие ответы уже совсем не по теме по-разному, поэтому давайте рассмотрим это.

RabbitMQ, имеет бесплатный вариант, это сервер RPC, написанный на Erlang с библиотеками API для C#, Java и многое другое.

jnBridge лицензия может быть слишком дорогим для некоторых потенциальных пользователей.

gRPC, и похожее современные библиотеки RPC предлагают широкую языковую поддержку, генерацию кода для клиентских библиотек на этих языках, независимый от языка формат передачи данных, расширенные функции, такие как каскадная отмена вызовов и т. д.

языки программирования

пиши один раз, беги везде;)

Haxe, компилируется в C# / CLR, Java / JVM, Javascript, Flash, Python, ... предоставляет механизмы взаимодействия для каждого из целевых языков. Можно подумать о как преемник ActionScript3 в какой-то степени. Кажется довольно солидным материалом, по крайней мере, одна компания на самом деле зависит от него. Гораздо более надежный, чем удар, упомянутый далее.

удар приносит некоторые функции C# и совместимость Java. Не очень полезно, вы получаете некоторые функции C#, но то, что вы взаимодействуете с Java-кодом, который их не использует. https://softwareengineering.stackexchange.com/a/132080/45826 язык относительно неясен, возможно заброшенный, с небольшим обещанием стать лучше. Впервые упоминается здесь @Vns.

порыв свежего воздуха для платформы JVM;)

Скала,Котлин, другие, довольно хорошие языки, работающие поверх JVM, которые приносят функции, которые программист C# может пропустить в Java. Особенно Котлин чувствует себя разумной альтернативой C# в мире JVM. Scala может быть слишком большим языком для программиста, чтобы освоиться с ним короткое время.

моно

это, конечно, тоже вариант. Зачем транспилировать в JVM, если Mono может запустить его как есть. Впервые упоминается @ferhrosa

Нью-Йорк-ноябрь. 12, - в среду, корпорация Microsoft подтвердила свою готовность к кросс-платформенный разработчик опыт на открытых источников полной на стороне сервера .Чистая стек и расширяется .Сетка для запуска на ОС Linux и Mac платформ.

по данным этот пресс-релиз из которого приходит цитата, Visual Studio 2015 добавит Linux / Mono в качестве поддерживаемой платформы.

это блог, написанный людьми проекта Mono об этом, с другой стороны: интеграция исходного кода .NET (ноябрь 2014).

.NET Core

мультиплатформенная версия Windows/Linux (некоторые из) .Net, управляемая Microsoft. - сказал нуфф. https://github.com/dotnet/core.

вывод

теперь было бы необходимо дать этим инструментам/фреймворкам попробовать и посмотреть, сколько трения есть. OP хочет писать на C# для JVM, который на самом деле может работать довольно хорошо, используя Grasshopper.

выполнение этого с целью смешивания мировых библиотек C# и Java в одной кодовой базе может не работать так что ж.

источник

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

может быть проще написать конвертер из IL в байт-код. Таким образом, Вы автоматически получите поддержку любого языка .NET на JVM.

однако, это такая очевидная идея, что если это еще не было сделано, это, вероятно, очень трудно, или трудно сделать хорошо/полезно.

посмотреть Кузнечик. Это SDK на основе Visual Studio и запатентованный конвертер .NET в Java, который позволяет запускать веб-приложения .NET и серверные приложения на Linux® и других платформах с поддержкой Java.

вариант кросс-платформенной разработки в C# может быть моно:http://www.mono-project.com/

можно использовать компилятор от источника к источнику для перевода C# на язык, чем работает на JVM. Например, есть несколько конвертеры C# в Java это позволит приложениям C# работать на JVM после перевода на Java.

этот ответ может быть поздно для вас, но это просто новый. Вы можете проверить Котлин язык программирования. Он предлагает синтаксические сахара, которые имеет C#, и его самый близкий к синтаксису C#, кроме любого языка JVM, отличного от Java. Его от JetBrains.

Я вижу две причины, почему это не получает особого энтузиазма.

первое, что нужно понять, это то, что, когда дело доходит до реальных особенностей языка, C# и Java очень близки. Мало того, что C# amd Java близко, они также движутся в аналогичных направлениях. Есть некоторые функции, которые JVM в настоящее время не поддерживает из коробки, но это не настоящая проблема. Вы всегда можете подделать то, что отсутствует. Я думаю, что люди предпочитают ждать Java, чтобы получить больше сахара, чем чтобы создать почти Java с нуля. К тому времени, когда порт будет готов, Java, возможно, решил догнать.

во-вторых, причина, по которой разработчики предпочитают C#, - это не столько сам язык, сколько инструменты вокруг него, их двухсторонние отношения с C# и то, как Microsoft поддерживает все это. Например, C#-XAML combo является более дружественным, чем JavaFX, потому что C# и XAML были взломаны друг для друга (например, частичные классы в C#, привязки в XAML и многое другое). Использование C# на JavaFX не делает намного улучшится. Чтобы получить опыт C# на JVM, вам также нужно перенести инструменты, и это гораздо больший проект. Даже не моно будет беспокоить.

Итак, мой совет разработчику Java, который хочет использовать более причудливый язык поверх знакомых инструментов, - это проверить существующий языки JVM.

моно-это тоже вариант, но я всегда скептически относилась к ней. Даже если это так C#-.NET и кросс-платформенные, вещи, построенные с помощью инструментов Microsoft обычно не работает на моно. Это по сути свое дело. Мы посмотрим, что произойдет теперь, когда Microsoft сказала, что они будут сотрудничать.