Впровадження C # для JVM


91

Хтось намагається застосувати C # для JVM? Як розробник Java, я дивився на C # із заздрістю, але не хочу відмовлятися від мобільності та зрілості JVM, не кажучи вже про різноманітний набір інструментів для неї.

Я знаю, що є деякі важливі відмінності між JVM та CLR, але чи є щось, що є шоустопом?


3
Я також написав багато-багато повністю платформних програм на Java - це повсякденна справа для мене та моєї команди. Зазвичай ми запускаємо план тестування на кожній платформі, на яку офіційно «претендуємо», але, думаю, минули роки з того часу, як помилку тесту приписували різниці в платформі.
Джаред,

1
Наш основний продукт працює у Windows, OS X та Linux без змін. Це насправді не важко зробити.
Thorbjørn Ravn Andersen

1
Я роблю свою Java в Windows, інший хлопець виконує свою роботу в OSX, CI хрумтить всі тести під Linux, і ми розгорнули програмне забезпечення для широкого спектру серверів як Windows, так і Linux і навіть Solaris. Тож, мабуть, я міг би сказати, що вже давно пишу справді, повністю, багатоплатформні програми Java.
Еско

1
JavaVM, реалізований у .NET; .NET реалізація Java LIBS; сумісність обох світів -> IKVM.NET ( ikvm.net )
gsscoder

1
Мені здається, що якщо ви можете перетворити .NET на JavaScript (наприклад, це робить JSIL), ви зможете перетворити його на Java ...
BrainSlugs83

Відповіді:


93

Існують дуже суттєві відмінності між CLR та JVM.

Кілька прикладів:

  • Java не має визначених користувачем типів значень
  • Узагальнення Java абсолютно відрізняються від узагальнень .NET
  • Багато аспектів C # залежать від елементів фреймворку - делегатів тощо. Вам також потрібно буде перенести бібліотеку, навіть для мовних аспектів.
  • Java не підтримує такі речі, як властивості та події на рівні JVM. Ви могли б підробити щось із цього, але це не те саме.
  • Я не вірю, що Java має якісь еквіваленти параметрам передачі-посилання, навіть на рівні JVM
  • Тонкощі, пов’язані з різними моделями пам’яті, цілком можливо, кусають, хоча я не впевнений, скільки міститься в специфікації C #.
  • Небезпечний код загалом, можливо, неможливий на Java
  • Сумісність із власним кодом сильно відрізняється між JNI та P / Invoke. Це, мабуть, не становить великих проблем для вас.
  • Вам доведеться підробляти перевантаження оператора та визначені користувачем перетворення

Можливо, ви могли б перенести багато C # - але у вас залишився б досить незадовільний досвід, IMO.

Ідучи іншим шляхом, чи знаєте ви про IKVM ? Це дозволяє запускати код Java у .NET.


7
Java має фіналізатори, і доопрацювання .NET теж не є детермінованим. Між ними можуть бути деякі тонкі відмінності, але я не можу придумати жодної випадкової ситуації. Я підозрюю, що тести на доступність Java сильніші, ніж тести .NET, однак: ніякого доопрацювання, поки інший потік все ще запускає метод екземпляра
Джон Скіт,

3
Я думаю, ви могли б зіставити типи значень на еталонні типи. Просто змусіть кожне завдання робити неглибокий клон!
Даніель Ервікер

3
@Earwicker: ... і змінити розподіл масивів та різні інші місця, де семантика має значення? Я підозрюю, що було б дуже важко змусити його працювати, якщо це можливо, і результат не був би тим, що ви хотіли б використовувати.
Джон Скіт,

4
Я думаю, що дженерики теж можна вирішити. Вам потрібно було б створити клас Java з додатковими полями для зберігання об’єктів Class для параметрів типу, щоб він додав трохи накладних витрат, але тоді нові T () і typeof (T) будуть доступні.
Даніель Ервікер

30
@ Джон Скіт: Це дає вам найгірше з обох світів: дещо застаріла мова Java на фірмовій платформі Microsoft.
Барт ван Хейкелом,

43

Відвідайте 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);
        }
    }
}

7
stab доставляє велику частину мови мови C # на JVM, але робить це таким чином, що дуже взаємодіє з Java. Отже, це не суворо вихідний код, сумісний з кодом C #, написаний для .NET CLR, але він дозволяє програмісту Java насолоджуватися дуже схожою на C # мовою, отримуючи при цьому однаковий якісний байтовий код та несуперечливу взаємодію з бібліотеками та фреймворками Java. Це правильний підхід для отримання C # на JVM.
RogerV

Хороша мова, на хорошій платформі ... хоч би я натрапив на це багато років тому.
Печера Джеффрі

14

Транспілятори байт-кодів

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

XMLVM може приймати байт-код CLR або JVM як вхідні дані та створювати їх як вихідні. Крім того, він може виводити Javascript або Objective-C. Поки що немає випусків, лише Subversion. "Експериментальна версія для розробки, яка не повинна використовуватися у виробничому середовищі."

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

RPC

Чому б не запустити CLR та JVM поруч і не зробити комунікацію якомога більшим тертям? Це не те, що хоче ОП, але деякі інші відповіді вже по-різному не відповідають темі, тож давайте це висвітлимо.

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.

Порив свіжого повітря для платформи JVM;)

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

Мононуклеоз

Це, звичайно, теж варіант. Навіщо транспілювати в JVM, якщо Mono може запустити його як є. Вперше згадується @ferhrosa

НЬЮ-ЙОРК - 12 листопада 2014 р. - У середу корпорація Microsoft зміцнила свою прихильність досвіду розробників міжплатформенних платформ, відкривши джерело повного стеку .NET на стороні сервера та розширивши .NET для роботи на платформах Linux і Mac OS.

Згідно з цим прес-релізом, з якого випливає цитата, Visual Studio 2015 додасть Linux / Mono як підтримувану платформу.

Це блог, написаний людьми з проекту Mono з іншого боку: Інтеграція вихідного коду .NET (листопад 2014 р.).

.NET Core

Мультиплатформна версія Windows / Linux (деякі) .Net, керована корпорацією Майкрософт. '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


Чудова відповідь! Як розробник C #, який незадоволений необхідністю переходу на Java (як можна жити без властивостей ?!), і сумнівний щодо Scala, це дійсно добре розкриває варіанти.
Gilthans

9

Може бути простіше написати перетворювач з IL в байт-код. Таким чином ви автоматично отримаєте підтримку будь-якої мови .NET на JVM.

Однак це настільки очевидна ідея, що якщо цього ще не було зроблено, це, мабуть, надзвичайно важко, або важко зробити добре / корисно.


6
Ви б зіткнулися з більшістю перелічених мною проблем - різні дженерики тощо
Джон Скіт

8
Це саме те, що робить Grasshopper (див. Відповідь @ alex вище), насправді надзвичайно важко зробити добре (я раніше працював над Grasshopper).
Мотті

7

Подивіться на Коник . Це SDK на основі Visual Studio та запатентований конвертер .NET to Java, який дозволяє запускати веб-програми та серверні програми .NET на Linux® та інших платформах із підтримкою Java.


2
Чи маєте ви практичний досвід роботи з цим? Також зверніть увагу, що ліцензія є драконічною для безкоштовної версії.
Торбьорн Равн Андерсен

13
Ви втратили мій інтерес у той момент, коли вимовили слово "запатентовано". Зітхайте.
Stephen C,

2
Лише деякі новини: Grasshopper тепер безкоштовний , без підтримки та гарантій (як і більшість продуктів з відкритим кодом).
Фернаколо

1
Mainsoft, здається, повністю мертвий, і посилання Grasshopper більше не працюють.
Девід Дано

1
Тоді очевидний просто мерехтіння. Обидва посилання працюють зараз. На жаль, зараз я не можу згадати, чому я цього хотів ...
Девід Дано



0

Ця відповідь може запізнитися для вас, але ця лише нова. Можливо, ви захочете перевірити мову програмування Kotlin . Він пропонує синтаксичні цукри, які є в C #, і їх найближчий до синтаксису C # теж, крім будь-якої мови JVM, що не є Java. Це від JetBrains .


0

Я бачу дві причини, чому це не викликає особливого ентузіазму.

Перше, що слід усвідомити, це те, що коли мова заходить про фактичні особливості мови, C # і Java дуже близькі. C # і Java не тільки близькі, вони також рухаються в подібних напрямках. Є деякі функції, які JVM наразі не підтримує зразу, але це не справжня проблема. Ви завжди можете підробити те, чого не вистачає. Я думаю, що люди воліють чекати, поки Java отримає трохи більше цукру, ніж створювати майже-Java з нуля. Коли порт буде готовий, Java, можливо, вирішила його наздогнати.

По-друге, причина, чому розробники віддають перевагу C #, полягає не стільки в самій мові, скільки в інструментах навколо неї, їх двосторонньому взаємозв'язку з C # і тому, як Microsoft підтримує все це. Наприклад, комбінація C # -XAML є більш дружньою, ніж JavaFX, тому що C # та XAML були зламані один для одного (наприклад, часткові класи в C #, прив'язки в XAML тощо). Використання C # на JavaFX не значно покращує. Щоб отримати досвід роботи з C # на JVM, вам потрібно також перенести інструменти, і це набагато більший проект. Навіть Моно не потурбує.

Отже, моя порада розробнику Java, який хоче використати вишукану мову поверх знайомих інструментів, - перевірити існуючі мови JVM .

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.