?

Log in

No account? Create an account

elizarov


Блог Романа Елизарова


Previous Entry Share Next Entry
Cross-compile Java bytecode to Objective-C
elizarov
Перед Devexperts стоит задача перевести некий объем бизнес-логики написанный на Java для мобильных приложений на iPhone, где основным языком разработки является Objective-C. Начнем с кода который рисует красивые графики на нашем собственном классе типа Canvas. Речь о GUI в целом сейчас пока не идет -- его мы разрабатываем "с нуля" используя нативные элементы управления на iPhone.

Объем кода для перевода на Objective-C достаточно большой, чтобы у нас не возникало безоговорочного желание написать всё с нуля, так как нам же потом этот код и поддерживать. Хочется вносить все будущие изменения в один code-base. Более того, таких проектов предвидится несколько, то есть в перспективе придется переводить на iPhone несколько различных библиотек и приложений.

Возникла идея разработать кросс-компилятор с Java bytecode в Objective-C и ограничиться пока ref-counting GC, так мы знаем что у нас нет циклов в графе объектов. Занимался ли кто-нибудь чем-нибудь подобным? Нет ли для этого готовых решений? Если готовых решений нет, то на следущей неделе мы официально откроем вакансию на позицию "Senior Developer" под этот проект. Если кому интересно -- пишите.

  • 1
мы маньяки...

а откуда мы так смело знаем, что у нас нет циклов в графе объектов?

Дык, научить кросс-компилятор доказывать это свойство для простых случаев не сложно, а также ругаться на места где этого доказать нельзя, чтобы мог посмотреть девелопер и убедиться что там всё чисто... или не чисто и тогда этот кусок переписать.

Когда iPhone только вышел, Sun заявила, что собирается портировать JVM на него. Потом вышел SDK и в Сан заявили, что его возможностей недостаточно для портирования полноценной виртуальной машины. Или эпл готовит свою платформу-конкурента джавы, флекса и сильверлайта, или более продвинутый сдк всё-таки выйдет и джаву на айфон портируют. И тогда кросс-компилятор будет уже не нужен.
Но задумка прикольная, хотел бы чем-то таким заниматься :)

(no subject) (Anonymous) Expand
если в java коде не используются особенности java не имеющие прямых аналогов в с++ то это не сильно сложная задача. можно взять gc либы для с++ которых есть в ассортименте.


Опорный язык на айфонах - Objective C, а не С++, различия довольно существенные. Все интерфейсы стандартного SDK оформлены только на ObjC (т.е. теоретически на плюсах писать можно, но на практике запаришься), и именно на нём пишется нативная GUI-часть. Мы изначально решили, что без крайней необходимости плюсы вовлекать не будем.

Особенности в Java-коде можно будет выпрямить, переписав его. Наша задача облегчается тем, что можно использовать "кооперативный" подход - подгонять код под способности кросс-компилятора. Перед нами нет цели добиться корректной компиляции произвольного кода на Java, мы планируем работать только с нами же созданными фрагментами. Роман, кстати, перестарался, написав, что трансформировать нужно именно байт-код - при необходимости можно с тем же успехом привлечь исходники, в том числе и аннотированные.

Кросскомпилляция - это, конечно, круто, но не проще ли пропробовать JVM пересобрать? Тем более, что исходный код есть, а MacOS - всеж урожденная BSD.

Ещё раз - лицензионное соглашение Apple по использованию SDK для iPhone явным образом запрещает создание интерпретируемых языков программирования. Зачем нам лицензионные проблемы с полученным продуктом?

Вот, первая ссылка, что нашлась в гугле: Javascript is an interpreted programming language, and thus forbidden as per Apple's terms of service. Also banned from the iPhone: programming languages Ruby, Python, Perl, and Java.

Даже отвлекаясь от этого - нет, JVM пересобрать не так-то просто. Вернее, JVM как таковую может и относительно просто (как минимум есть действующая JVM, собранная на основе GNU classpath ещё под неофициальный toolchain), но кому она нужна без поддержки нативного GUI?

(no subject) (Anonymous) Expand
Очень понравился ваш ЖЖ, я вас зафренжу и было бы круто если бы вы ответили взаимно;)

(Deleted comment)

Re: интересное

Можно писать на elizarov at devexperts точка com.

(Deleted comment)
Можно было бы исходник Java в исходник Objective-C, но:
1. Это сложней. Анализировть bytecode на порядок проще чем source code -- у него просто меньше "семантическое пространство". Многие "сложные" моменты в source cod (например generics, boxing/unboxing, и т.п.) имеют тривиальное представление в bytecode.
2. Это не работает с 3rd party libs к которым нет исходников.
3. Это не работает если после компиляции Java кода используется byte-code processing (aspects и т.п.)

А чем всё закончилось в итоге? Очень любопытно

Пока не закончилось. Процесс идет.

(no subject) (Anonymous) Expand
  • 1