2009-03-25 4 views
82

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

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

+3

Я также написал много, много полноплатформенных приложений на Java - это повседневная вещь для меня и моей команды. Обычно мы запускаем план тестирования на каждой платформе, которую мы официально «квалифицируем», но я думаю, что прошло много лет с тех пор, как тестовая ошибка была отнесена к разнице в платформе. – Jared

+1

Наш основной продукт работает на Windows, OS X и Linux без изменений. Это действительно не сложно. –

+0

Я сделал внештатное развитие с помощью java, и это было потрясающе. Мой партнер использовал linux, я использовал mac, и наш клиент был на windows ... что еще я могу сказать? – graffic

ответ

84

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

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

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

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

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

+0

+1, Прошло некоторое время с тех пор, как я сделал хардкорную Java, но я также считаю, что JVM не поддерживает детерминированную финализацию. По крайней мере, это не было в какой-то момент. Для того чтобы правильно реализовать хороший кусок кода C#, нужно было бы разработать концепцию финализации/деструктора. – JaredPar

+7

Java имеет финализаторы, а окончание .NET также не является детерминированным. Между ними могут быть некоторые тонкие различия, но я не могу придумать ничего из этого. Я подозреваю, что тесты достижимости Java сильнее, чем.NET: хотя финализация еще не завершена, в то время как другой поток по-прежнему запускает метод экземпляра –

+0

@ Jared - он попытался/наконец, поэтому было бы довольно легко добавить using-statement в Java. –

7

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

+2

Есть ли у вас практический опыт? Также обратите внимание, что лицензия является бесхитростной для бесплатной версии. –

+12

Вы потеряли мой интерес в тот момент, когда вы сказали слово «запатентовано». Вздох. –

+2

Только некоторые новости: Grasshopper теперь [бесплатно] (http://dev.mainsoft.com/Default.aspx?tabid=29#top_Licensing) без поддержки и гарантии (как и большинство продуктов с открытым исходным кодом). – fernacolo

9

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

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

+6

Вы столкнулись с большинством проблем, перечисленные - разные генерики и т. д. –

+1

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

+8

Это именно то, что делает Кузнечик (см. ответ @ alex) выше, это действительно очень сложно сделать хорошо (я работал на Grasshopper). – Motti

39

Визит http://code.google.com/p/stab-language

Код ниже, если Stab код языка для виртуальной машины Java

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 поставляет большую часть мяса языка C# на JVM, но делает это так, что это очень Java-взаимодействие. Таким образом, это не строго исходный код, совместимый с кодом C#, написанным для .NET CLR, но он позволяет программисту Java наслаждаться очень похожим на C# языком, в то же время получая одинаковый качественный байт-код, созданный и имеющий несовместимую функциональность с библиотеками и фреймворками Java.Это правильный подход для получения C# на JVM. – RogerV

+0

Хороший язык, на хорошей платформе ... хотелось бы, чтобы я наткнулся на эти годы назад. –

11

ByteCode transpilers

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

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

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

RPC

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

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

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

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

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

написать один раз, запускай везде;)

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

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

Порыв свежего воздуха для виртуальной машины Java платформы;)

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

Моно

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

Нью-Йорк - 12 ноября 2014 - В среду Microsoft Corp. укрепила свою приверженность кроссплатформенных опыта разработчиков по открытым снабжаем полный серверный стек .NET и расширение .NET для работы на платформах Linux и Mac OS.

В соответствии с this press release, из которого следует цитата, Visual Studio 2015 добавит Linux/Mono в качестве поддерживаемой платформы.

Это блог, написанный людьми из проекта Mono, с другой стороны: .NET Source Code Integration (ноябрь 2014 г.).

.NET Ядро

под управлением Windows/Linux мультиплатформенная версия (некоторые) .Net управляется Microsoft. 'nuff сказал 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

+0

Отличный ответ! Как разработчик C#, который недоволен необходимостью перехода на Java (как вы можете жить без свойств ?!), и это сомнительно в отношении Scala, это действительно хорошо описывает варианты. – Gilthans

0

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

0

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

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

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

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

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

0

Вы можете использовать source-to-source compiler для перевода C# на язык, чем на JVM. Например, существует несколько C# to Java converters, которые позволят запускать приложения C# на JVM после перевода на Java.

Смежные вопросы