- PVSM.RU - https://www.pvsm.ru -

dot42 — компилятор C# для Dalvik Runtime

Главным недостатком Mono для Android является то, что для работы приложений требуется отдельная среда выполнения, отличная от Dalvik. И хотя полный доступ к CLR выглядит весьма привлекательно, проксирование и маршаллинг вызовов от одной среды выполнения к другой могут сильно повлиять на производительность. Так почему бы не убрать промежуточную компиляцию в IL-код и получать сразу рабочий Dex-код? Этим и занимается проект dot42 [1].

dot42 — компилятор C# для Dalvik Runtime

В январе, после 1 года разработки, авторы [2] проекта dot42 наконец-то перешли от обещаний к пряникам [3]. И, хотя проект еще не дотягивает до состояния боевого продукта-конкурента Mono, стоит, как минимум, его рассмотреть и попробовать.

Признаюсь, я немного слукавил, сказав, что компилятор dot42 «убирает» IL-код. Это не совсем так. Вместо этого он читает IL-код и конвертирует его в новый язык Register Language или, если короче, RL. Главная разница между IL и RL в том, что IL-код работает на стековой модели выполнения [4] (как и байт-код у Java [5]), а RL-код на регистровой [6], так же как Dalvik. После получения RL-кода, dot42 производит ряд оптимизаций и наступает этап финальной компиляции. Именно после последнего этапа и получается dex-код, язык среды Dalvik. В чем отличие RL от Dex написано в самом первом [7] посте в блоге разработчиков.

На каждом этапе работы компилятора оригинальная дебаг-информация сохраняется, разумеется, компилятору приходится конвертировать ее из формата PDB в дебаг-формат для dex-кода. dot42 использует adb (Android Debug Bridge) для подключения отладчика в Visual Studio.

После компиляции библиотеки Android'а используются напрямую. Компилятор понимает большинство типов, например, java.lang.Boolean сопоставляется с System.Nullable<bool>. Правда, кое-какие телодвижения с типами данных все-таки придется сделать [7]. Поскольку dot42 оперирует непосредственно с dex-кодом, есть несколько ограничений на функции и возможности C# и .NET. Пожалуй самое главное из них — это отсутствие пользовательских value-типов (структур). В виртуальной машине Dalvik просто нет поддержки таких типов, поэтому и сопоставить структуры никак не получится.

Частый вопрос при использовании dot42: какие структуры данных использовать, .NET или Android? Например, что использовать, System.Collections.Generic.List<T> или java.util.ArrayList<E>? Один из разработчиков dot42, Ewout Prangsma, советует [8] отдавать предпочтение Java-классам. Даже несмотря на то, что List<T> — тонкая надстройка над ArrayList<E>, это по-прежнему дополнительный код, который необходимо будет включить в сборку и выполнять в дальнейшем.

dot42 — коммерческий продукт [9] (профессиональная версия стоит 399 $), однако, существует Community License, позволяющая не только протестировать продукт, но и опубликовать готовые приложения в Google.Play и аналогичных магазинах. Правда, публикуемые таким образом приложения должны быть бесплатны.

Попробуем?

Для начала работы необходимо зарегистрироваться [10]. У проекта есть документация [11], которой вполне хватит для знакомства.

После установки, можно поиграться с примерами из Samples.zip в корневой директории dot42. Так же есть Hello World Tutorial [12].

У меня не получилось подключить свой HTC One X (с прошивкой Jelly Bean) в Device Center [13], поэтому я создал новый эмулятор, с теми же программными характеристиками:
dot42 — компилятор C# для Dalvik Runtime

Создал проект, все как в Hello World Tutorial [12]. Запустил в виртуальной машине и все действительно заработало:
dot42 — компилятор C# для Dalvik Runtime
dot42 — компилятор C# для Dalvik Runtime

К сожалению, заявленная поддержка отладки пока хромает. Visual Studio 2012 после любых махинаций с дебагом просто падает и предлагает перезапустить себя. Попробовать на 2010 у меня нет возможности. В любом случае, я думаю, что это временное явление.

Кстати, на реальном устройстве все выглядит примерно так же:
dot42 — компилятор C# для Dalvik Runtime

В общем, лично я с интересом буду следить за проектом. :o)

Если вы видите какие-то ошибки, пожалуйста, сообщите о них в пм.

Автор: gouranga

Источник [14]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/android/26652

Ссылки в тексте:

[1] dot42: http://dot42.com/

[2] авторы: https://www.dot42.com/team.aspx

[3] наконец-то перешли от обещаний к пряникам: http://blog.dot42.com/2013/01/technology-preview-setting-expectations.html

[4] стековой модели выполнения: http://en.wikipedia.org/wiki/Stack_machine

[5] байт-код у Java: http://habrahabr.ru/post/111456/

[6] регистровой: http://en.wikipedia.org/wiki/Register_machine

[7] самом первом: http://blog.dot42.com/2012/12/mapping-net-il-code-to-androids-dex-code.html

[8] советует: http://blog.dot42.com/2013/02/choosing-between-two-api-flavors.html

[9] коммерческий продукт: https://www.dot42.com/licensemodel.aspx

[10] зарегистрироваться: https://www.dot42.com/download.aspx

[11] документация: http://docs.dot42.com/

[12] Hello World Tutorial: http://docs.dot42.com/tutorial1

[13] Device Center: http://docs.dot42.com/device-center

[14] Источник: http://habrahabr.ru/post/168689/