Java Language Convertion Assistant 3.0. Портируем Java на C#
Автор:
Alex Nesterov
Опубликовано: 14.08.2005
Источник: "Компьютерная газета"
Введение
Зачастую задачи, с которыми приходится сталкиваться программистам, не уникальны. На сегодняшний день поговорка "все уже написано до нас" действительно имеет место: достаточно заглянуть на такой небезызвестный ресурс, как SourceForge.net , который взял под крыло большинство open source разработок. Казалось бы, дело за малым: нужно всего лишь адаптировать имеющийся исходный код под свои нужды. Но вот именно сам процесс адаптации и является наиболее болезненным, ибо, как вы сами понимаете, подходящий по функциональности проект может быть написан на неподходящем языке, да еще и под другую платформу. Самый печальный исход самоочевиден: потребуется переписывать код с учетом специфики сложившихся обстоятельств. Но считайте, что вам крупно повезло, если вы мало того, что .NET-разработчик, так еще и решили портировать код с Java. Microsoft всегда рада помочь вам "завязать" с конкурирующей платформой от Sun. Для этого у ребят из Редмонда припасена специализированная утилита под названием Java Language Convertion Assistant, которая на данный момент доросла до версии 3.0. Поразительно, но на таких популярных сайтах Рунета, как GotDotNet.ru и RSDN.ru JLCA вообще ни разу не упоминается. Это обстоятельство и побудило меня написать сей обзорчик.
Необходимые приготовления
Разумеется, первым делом необходимо раздобыть собственно JLCA. Дистрибутив Visual Studio 2003 включает в себя первую версию мастера. С сайта Microsoft удается выудить версии 2.0 и 3.0 Beta. Как это ни парадоксально звучит, для работы не годится ни одна из них. Сейчас объясню, почему. По задумке JLCA предназначалась для комфортной пересадки J++ программистов, которые по большому счету оставались не у дел, на C# .NET. Для нас же J++ интереса не представляет: нам требуется поддержка Java 1.4, а значит, все версии младше третьей отпадают сами собой. Логичным кандидатом мог бы стать JLCA 3.0 Beta, но работает он настолько нестабильно, что первая же попытка конвертации закончилась BSOD — и это на Windows Server 2003! Довести же конвертацию до конца мастер не смог ни разу! Другой на моем месте уже бы бился головой об стенку, но только не я. А знаете, почему? Потому, что у меня есть Visual Studio 2005 Beta 2 — самая стабильная бета от Microsoft, которую мне когда-либо доводилось держать в руках. Оказывается, именно в эту версию IDE включен _рабочий_ мастер JLCA 3.0. Достать Visual Studio 2005 Beta 2 сейчас уже сложнее, чем месяц назад. Дело в том, что халява с бесплатной раздачей коробок закончилась, и теперь за доставку требуют $13. Не исключено, что вам удастся отделаться Visual C# 2005 Express Edition, которую можно по-прежнему бесплатно выкачать с сайта Microsoft, но ничего конкретного по этому поводу я вам сказать не могу: у меня попросту нету на руках этого дистрибутива. Судя по официальной документации, JLCA 3.0 поддерживает лишь Java 1.3, но у меня не возникло проблем при конвертации проекта, написанного с использованием Java SDK 1.4.
N.B. Сейчас флагманом Sun является уже Java 1.5, но работа JLCA в таких условиях мною не проверялась.
Заполучить Java SDK можно либо скачав его из Интернета (для JDK 1.4 размер установщика составляет 45 Mb), либо купив диск с записанным пакетом у ближайшего лоточника. Как только вы установите SDK, зайдите в директорию установки. Здесь вам должен броситься в глаза архивчик src.zip. Распаковываем его здесь же в поддиректорию src, где будут аккуратненько уложены исходники Java-классов, чья иерархическая структура и названия весьма схожи с таковыми в .NET Framework.
N.B. Правда, чтобы изучить внутренности классов .NET Framework, приходится прибегать к услугам утилит наподобие Reflector .NET сайт .
Будем надеяться, Visual Studio 2005 и JDK 1.4 успешно установились на вашей машине. Что ж, без лишних экивоков предлагаю посмотреть на нашего ассистента в действии.
Пуск
JLCA представляет собой мастера, интегрирующегося в Visual Studio. Сидит он в меню File -> Open -> Convert... Чтобы развеять скуку мастеру, рядом с ним посадили еще одного, предназначенного для конвертации проектов Visual Basic 6.0.
Жмем кнопку Next. Перед нами раскрывается приветствующее окно мастера, где расписывается, какой он весь из себя умелый. И действительно, мастер может даже то, чего от него и не ждали. А именно осуществляются следующие преобразования:
AWT/Swing -> Windows/Web Forms
RMI -> .NET Remoting
JNDI -> .NET Directory Services
JSP -> ASP
EJB -> COM
JDBC -> ODBC
N.B. Думаю, даже самые завзятые скептики не удержатся от восхищения. Такие возможности реализованы благодаря тому, что JLCA не просто поочередно разбирает файлы и конвертирует языковые конструкции, а производит анализ доступного исходного кода, вследствие чего объем свободной оперативной памяти играет решающую роль, и желательно, чтобы RAM было не меньше 256 Mb.
Далее говорим мастеру, что у нас есть директория с файлами проекта, а с J++ дело иметь не хотим. На следующем шаге указываем эту самую директорию. Обратите внимание на нижнее текстовое поле, куда стоит добавить путь (пути) к дополнительным файлам для обработки. В нашем случае это путь к файлам JDK 1.4. На четвертом шаге нужно указать имя нового проекта и его тип. По первости еще при экспериментах с JLCA 3.0 Beta, выбрав "неправильный" тип проекта, я и вывалился в синий экран. Пятая страница просит показать, куда складывать портированные файлы. Наконец, последнее диалоговое окно показывает все выбранные вами параметры. Просмотрите их на всякий случай (вдруг заметите ошибку) — и щелкайте по кнопке Finish. Теперь в дело вступает автоматика. Процесс этот может оказаться относительно продолжительным. Так, 2 Mb исходников + SDK (файлы из директории src, на которые есть ссылки в проекте, тоже обрабатываются) моя машина (Athlon XP 2200, 1 Gb RAM) "перемолола" за пять минут. Чтобы вы могли представить себе, что такое 2 Mb исходников, доложу, что файл на 2.000 строк кода занимает примерно 200 Kb. А теперь представьте, сколько бы вы затратили времени на "перепахивание" без малого 20 тысяч строк. Уверен, такая работа стоит гораздо больше тех $13, которые нынче просят за VS2005 Beta 2. На выходе имеем портированный проект C# 2005 со всей полагающейся атрибутикой, как-то: файл проекта (*.csproj), информация о сборке (AssemblyInfo.cs), отчет об ошибках (см. ниже) плюс сразу выделяющийся своей непривычностью некий
SupportClass.cs. Этот класс, как оказалось, эмулирует работу тех методов, которым не нашлось аналогов в FCL. Однако нас прямым текстом предупреждают, что логика может быть не 100% идентичной. Преимущество конвертера заключается в том, что он не трогает того, чего не понимает. Поэтому сохраняются все комментарии, а в директорию проекта без изменений копируются, например, html-файлы документации.
N.B. Стоит отметить, что конвертер не поддерживает некоторые пакеты, например, javax.imageio, в силу существенных различий между Java 2D API и System.Drawing. В подобных случаях мастер также оставляет код без изменений, предоставляя вам возможность разобраться, в чем тут дело, самостоятельно. Благо переписывать с нуля придется лишь очень небольшой процент кода.
Завершает свою работу ассистент отчетом об ошибках и предупреждениях. Если вы когда-нибудь занимались портированием VB .NET на C# (или наоборот) с помощью SharpDevelop, то не понаслышке знаете, что компилируется получаемый код далеко не всегда, и его необходимо вручную доводить до ума. При таких же глобальных преобразованиях ожидать от мастера сразу же компилируемого кода было бы по меньшей мере самонадеянно. Ошибки заключаются в том, что мастер просит вас, например, пересмотреть некоторый участок кода, где в результате конвертации могла нарушиться логика алгоритма, т.к. поведение соответствующих классов обеих платформ может несколько разниться. В коде все "недоразумения" снабжены ссылками на соответствующий раздел MSDN, где описано, что необходимо сделать для устранения ошибки.
Делаем выводы
JLCA 3.0 способен кардинально уменьшить количество человекочасов на портирование проекта. То, на что раньше уходили недели и месяцы, теперь занимает считаные минуты. Все, что осталось сделать — это подправить мелкие недочеты, и дело в шляпе — проект снова с вами, только уже на вашей любимой платформе Microsoft .NET.