Проект dot42
Основная цель проекта 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);
Конвертация байт-кода против Конвертация исходного кода
Проблема отладки
Ошибка в конвертации байт-кода из 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.
Большое спасибо, что дочитали до конца!
Автор: Cydoor