Pull to refresh

Проект dot42 переходит на новый формат (C# 2 Java)

Reading time 3 min
Views 14K
Original author: Frank Rem

Проект dot42


image
Основная цель проекта dot42 — создание Android-приложений с использованием языка C#, без необходимости устанавливать интерпретатор Mono, используя Microsoft Visual Studio или SharpDevelop. Проект вызвал сильный интерес со стороны разработчиков мобильного програмного обеспечения с момента публикации технического превью в январе 2013. К сожалению, в связи со сложностью предметной области, начиная с января 2014 года, активность сообщества начала значительно снижаться.


Основная функция и одновременно фундоментальная проблема проекта — это конвертация скомпилированного C# кода (IL код) в байт-код Java, который исполняется в системе Android на виртуальной машине Davlik или ART. Разработка и поддержка такого проекта требует глубоких и узкоспециализированных знаний в обоих форматах скомпилированного байт-кода и уверенных знаний в области создания и поддержки компиляторов и кросс-компиляторов. Количество специалистов в этой области на данный момент невелико.

Конвертация в DEX

Существует множество недостатков в перекодировании IL-кода в Dex, которые постепенно устраняются в процессе разработки проекта dot42. В настоящее время принято решение расширить .Net SDK с помощью добавления Java. Команда dot42 привлекла PhD-специалиста в области кросс-компиляции и программной конвертации для анализа текущего состояния проекта. Его первой задачей является принятие решения, каким образом осуществлять конвертацию C# кода к Java-коду.

Принципиально, существует два подхода:
  • Конвертация на уровне байт-кода (из IL в Java байт-код);
  • Конвертация на уровне исходных кодов (из C# в Java);

image

Конвертация байт-кода против Конвертация исходного кода


Проблема отладки

Ошибка в конвертации байт-кода из IL в Dex часто приводит к тому, что виртуальная машина Java генерирует исключение «java.lang.VerifyError». Данное исключение создается, когда интерпретатор Java замечает, что делается попытка загрузить класс, который ранее не проходил фазу проверки. Нахождение ошибок в этом коде — это как попытаться определить, что было испорчено в обеде, ковыряясь в туалете ресторана. Типичным примером в этом случае является то, что DEX-код успешно исполняется в виртуальной машине Davlik, но падает внутри ART.
Конвертация исходных кодов не обладает этим недостатком, компилятор Java позаботиться о корректном расположении байт-кода приложения.

Эксперименты с реализацией

Представьте, что команде dot42 необходимо добавить новую функциональность в проект, например, поддержать async/await из C#. Работа по PoC в байт-кодах в этом случае, намного труднее и затратнее, чем аналогичные доработки при конвертации исходных кодов с C# на Java.

Использование компилятора

Компиляторы для различных виртуальных машин и архитектурны CPU используют различные механизмы оптимизации кода. IL-код, генерируемый C# компилятором, использует стековую архитектуру. С другой стороны, виртуальные машины Davlik и ART используют регистровую модель. Скомпилированный C# компилятором IL-код уже не содержит информация, которая была бы полезна для компилятора Java. Напротив, при конвертации исходных кодов, мы позволяем Java компилятору генерировать более эффективный байт-код.

Roslyn

Теперь, когда Microsoft предоставляет C# компилятор с открытым исходным кодом «Roslyn», содержащий богатый API по анализу кода, у команды dot42 появился мощный инструмент, позволяющий конвертировать исходный код из C# в Java.

Прозрачная разработка

В конечном итоге, для разработчиков, использующих dot42, конвертация исходного кода из C# в Java сделает процесс более прозрачным и поддерживаемым. Этот процесс позволит открывать готовый Java код в популярных IDE Eclipse или Android Studio.

Дальнейшее развитие проекта

Команда dot42 планирует выпуск утилит компилятора под лицензией GPLv2. Следует отметить, что лицензия GPL не распространяется на программное обеспечение, созданное с помощью dot42. Таким образом, благодаря проекту, у разработчиков появится возможность создавать нативные Android приложения с помощью C#.
Код исполнения библиотеки уже выложен в Git под лицензий Apache License 2.0. Любой желающий может создать форк проекта dot42 и расширить подход к конвертации IL-кода в DEX.
Пользователям больше не нужно иметь Professional-лицензию для создания коммерческих приложний с использованием dot42. В следующем обновлении планируется удаление активации.

Команда dot42 собирается заменить конвертер байт-кодов конвертором исходных кодов. Все утилиты разрабатываемы утилиты также будут использовать лицензию GPLv2, а код исполнения бибиотеки — Apache License 2.0.

Большое спасибо, что дочитали до конца!
Tags:
Hubs:
+23
Comments 9
Comments Comments 9

Articles