Продолжается подписка на наши издания! Вы не забыли подписаться?

Microsoft Visual J# .NET

Михаил Плискин

В данном обзоре мы рассмотрим недавно появившийся инструмент разработки от Microsoft — Visual J# .NET. Нашей основная цель – разобраться, что это за инструмент, и пролить свет на его основные особенности и область применения. Отметим сразу же, что инструмент еще не вышел из стадии Beta-тестирования, поэтому для окончательной версии продукта некоторые сведения, приведенные в данном обзоре, могут оказаться неверными.

Основные особенности

Visual J# .NET представляет собой не что иное, как попытку добавить поддержку языка Java в Microsoft .NET Framework. Однако же, в связи с тем, что Java — это не только язык программирования, но еще и платформа, такой перенос не сводится лишь к написанию компилятора, а требует также реализации, по крайней мере частичной, системы поддержки времени выполнения программ на Java.

С другой стороны, перед Microsoft стояла еще одна задача — предоставить пользователям системы Visual J++ 6.0 возможность перенести свои приложения на платформу .NET. Это потребовало от Visual J# .NET совместимости (опять же, по крайней мере, частичной) с Visual J++.

Наконец, в свете весьма напряженных в последнее время отношений между корпорациями Microsoft и Sun Microsystems становится очевидным, что одной из причин создания Visual J# .NET были и маркетинговые соображения. Новый инструмент должен дать платформе .NET конкурентные преимущества по сравнению с Java и облегчить перенос приложений с одной платформы на другую.

Архитектура продукта

Microsoft Visual J# .NET реализована как add-on к Microsoft Visual Studio .NET и включает следующие основные модули:

Рассмотрим эти модули более подробно.

Компилятор Microsoft Visual J# .NET

Компилятор, доступный как утилита командой строки vjc.exe, предназначен для компиляции исходных текстов на языке Java (точнее, языка J#, который есть, по существу, некоторое надмножество языка Java) в код на Microsoft Intermediate Language для платформы Microsoft .NET. При этом в тексте программы можно использовать как все возможности и классы Common Language Runtime, так и многие библиотеки JDK. Компилятор предоставляет полный спектр возможностей для создания приложений, ориентированных на платформу Microsoft .NET, включая работу со сборками (assemblies), создание исполняемых файлов (.exe), библиотек (.dll) и модулей (.netmodule), и так далее. Исходные тексты программ для Visual J# .NET имеют расширение .jsl.

Конвертер Java byte-code в MSIL

Конвертер, реализованный как утилита командой строки jbimp.exe, предназначен для преобразования откомпилированных модулей Java (.class-файлов) в сборки MSIL. При этом по .class-файлу можно сгенерировать как исполняемый модуль (.exe), так и библиотеку (.dll). Также полностью поддерживается управление сборками и использование существующих сборок .NET, созданных любым компилятором, ориентированным на платформу .NET.

На модули, подлежащие преобразованию, накладываются, впрочем, следующие, весьма существенные ограничения:

В дополнение к возможности преобразования кода, написанного на чистом Java, конвертер поддерживает также расширения, специфичные для Microsoft Visual J++, в числе которых делегаты и J/Direct. При этом технология Java-language/COM Interop не поддерживается.

Библиотека классов

Разработчику приложений на Microsoft Visual J# .NET предоставляется полный набор классов из состава JDK 1.1.4 из числа тех, что были включены в состав Visual J++ 6.0, за исключением классов, предоставляющих указанную выше неподдерживаемую функциональность. Также предоставляется функциональность пакета java.util из JDK 1.2. Помимо этого, предоставляются пакеты из Windows Foundation Classes, а также следующие пакеты вида com.ms.*:

Прочие пакеты, включенные в состав Visual J++, не поддерживаются.

Взаимодействие с .NET Framework

Для того, чтобы программы на Visual J# могли использовать возможности .NET Framework, в язык были добавлены следующие дополнительные средства:

Перечисленные нововведения не обеспечивают, разумеется, полной поддержки всех встроенных в .NET Framework языковых особенностей. Неподдерживаемые напрямую средства можно использовать в режиме «только для чтения», то есть программист на Visual J# может работать лишь с уже определенными средствами через автоматическое отображение их на существующие синтаксические конструкции с использованием, возможно, дополнительных соглашений об именовании, а не создавать свои. К данному классу возможностей относятся следующие:

Средства разработки и распространения приложений

Visual J# устанавливается как дополнение к уже установленной среде разработки Microsoft Visual Studio .NET и требует наличия поддержки по крайней мере для одного из языков C# или Visual Basic .NET. При этом также устанавливается документация к Visual J#, содержащая как общие сведения о продукте, так и дополнительные страницы с информацией об использовании в Visual J# большинства стандартных классов .NET Framework. После установки в среде Visual Studio становится возможной разработка приложений на Visual J# с использованием соответствующих проектов.

Для работоспособности приложений, написанных с использованием Visual J#, необходимо наличие в системе установленного пакета Visual J# .NET Redistributable Package. Он содержит компилятор и библиотеки классов Visual J# .NET.

Пример простейшего приложения

В качестве примера приложения на J# приведем каноническое «Hallo, world!». Оно будет выводить на экран окно с текстом «Hallo, world!» и единственной кнопкой «Close», при нажатии на которую приложение будет завершаться. На рисунке 1 видно, что создание графического интерфейса производится стандартными для Visual Studio .NET методами и не имеет каких-либо особенностей. Приведем также листинг кода, сгенерированного при создании данного приложения:

package JSharpSample;

import System.Drawing.*;
import System.Collections.*;
import System.ComponentModel.*;
import System.Windows.Forms.*;
import System.Data.*;

/**
 * Summary description for Form1.
 */

public class Form1 extends System.Windows.Forms.Form
{
  private System.Windows.Forms.Label label1;
  private System.Windows.Forms.Button button1;
  /**
   * Required designer variable.
   */
  private System.ComponentModel.Container components = null;

  public Form1()

  {
    //
    // Required for Windows Form Designer support
    //
    InitializeComponent();
    //
    // TODO: Add any constructor code after InitializeComponent call
    //
  }
  /**
   * Clean up any resources being used.
   */
  protected void Dispose(boolean disposing)
  {
    if (disposing)
    {
      if (components != null)
      {
        components.Dispose();
      }
    }
    super.Dispose(disposing);
  }

  #region Windows Form Designer generated code // пропущено
  ...
  #endregion

  /**
   * The main entry point for the application.
   */
  /** @attribute System.STAThread() */
  public static void main(String[] args) 
  {
    Application.Run(new Form1());
  }

  private void button1_Click (
       System.Object sender, System.EventArgs e)
  {
    Application.Exit();
  }
}

Здесь опущен блок кода, который был сгенерирован Windows Form Designer и служит для инициализации формы и всех ее компонентов. Нетрудно заметить как использование синтаксиса Java, так и тесную интеграцию с библиотекой классов .NET Framework. Более того, отличия от эквивалентного кода на C# лишь синтаксические, структура кода практически не отличается.

Рисунок 1. Разработка графического интерфейса

Пример переноса Java-приложения под .NET

В данном разделе мы опишем процесс переноса Java-приложения на платформу .NET. В качестве исходной системы мы взяли ANTLR 2.7.1 — средство для автоматического построения синтаксического анализатора по заданной грамматике языка.

Продукт является свободно распространяемым open-source проектом и доступен для загрузки по адресу http://www.antlr.org/. В комплект поставки входят как исходные тексты на Java, так и откомпилированные .class-модули, поэтому у нас была возможность провести преобразование как путем компиляции исходных текстов компилятором Visual J# .NET, так и путем преобразования откомпилированных .class-модулей в сборки на MSIL посредством конвертера байт-кода.

Хотя ANTLR и является консольным приложением, у него есть дополнительные возможности, которые используют графический интерфейс пользователя. Однако эти возможности используются преимущественно для отладки и не влияют на основную функциональность продукта. При их портировании с помощью Visual J# .NET возникли проблемы из-за неподдерживаемого пакета javax.swing. Поэтому эти средства были удалены из дистрибутива и дальнейшие преобразования производились уже без них.

При преобразовании использовались средства командной строки как наиболее простой и эффективный способ работы с исходными текстами на Java, хранящимися в иерархической системе каталогов.

Преобразование Java byte-кода в MSIL было выполнено командой

jbimp /out:antlr.exe /main:antlr.Tool *.class /recurse

Параметр /out указывает имя выходного файла, /main определяет определяет главную функцию, с которой начинается исполнения программы (точку входа), ключ /recurse необходим для рекурсивной обработки дерева каталогов. В результате был создан файл antlr.exe, представляющий собой консольное приложение-сборку с именем antlr.

Компиляция исходных текстов на языке Java в MSIL была выполнена командой

vjc /recurse:*.java /out:antlr.exe /target:exe /optimize+ /main:antlr.Tool

Параметр /target:exe указывает на создаваемое консольное приложение, /optimize+ включает оптимизацию кода, смысл остальных параметров аналогичен предыдущему случаю. В результате был получен файл аналогичный предыдущему файл antlr.exe, хотя и не тождественный, так как размеры файлов слегка различались.

В итоге мы убедились в работоспособности обоих механизмов по переносу Java-приложений в .NET. Разумеется, при переносе более масштабных приложений с графическим интерфейсом пользователя и сложной внутренней архитектурой могут возникнуть проблемы с отсутствием поддержки некоторых классов JDK, но эти проблемы могут быть решены путем переписывания соответствующих модулей с использованием аналогичных классов .NET Framework. При этом сама возможность портировать многие Java-приложения в .NET за несколько минут, разумеется, впечатляет.

Перспективы

Как уже отмечалось в начале статьи, перед разработчиками Visual J# .NET стояло несколько весьма противоречивых задач. Необходимо было объединить в одном продукте три технологии разработки программного обеспечения: платформу Java, систему Microsoft Visual J++ и Microsoft .NET Framework. В результате получился, разумеется, некоторый компромисс между функциональностью и совместимостью. Попытаемся здесь очертить сферу применения и перспективы развития продукта.

Основная цель, ради которых создавался Visual J# .NET — это, без сомнения, перенос приложений из Visual J++ и Java на платформу Microsoft .NET. Для этого разработаны весьма развитые средства: это и компилятор, способный компилировать код большинства приложений после незначительных модификаций, и конвертер откомпилированного кода, позволяющий переносить исполняемые модули даже в отсутствие их исходных текстов, и библиотека классов, добавляющая в .NET Framework функциональность, присущую системам поддержки времени выполнения обоих исходных платформ. И, несмотря на имеющиеся ограничения на использование этих инструментов, они, вероятно, окажутся весьма и весьма полезными в процессе миграции приложений на новую платформу. Особенно это касается приложений, разработанных с использованием Visual J++ 6.0, так как развитие данной системы в Microsoft прекращено.

При этом необходимо отметить, что разрабатывать приложения для .NET Framework «с нуля» при помощи системы Visual J# .NET достаточно неудобно. Степень простоты использования .NET Framework хотя и высока, но все же весьма ограниченна и далека той естественности, которая достигается при разработке на языках C# и Visual Basic .NET, а многие возможности и вовсе доступны лишь в режиме «только для чтения». Не добавляет оптимизма и необходимость установки специальной системы поддержки времени выполнения. Более того, так как система допускает использование в одном проекте сборок, разработанных с использованием разных языков программирования, то и развитие приложений, перенесенных с Java и Visual J++, также удобнее производить не на основе Visual J# .NET, а постепенно переписывая отдельные модули с использованием более удобных средств разработки.

Таким образом, основная область применения Visual J# .NET — это быстрое портирование приложений на платформу Microsoft .NET. В связи с этим перспективы развития продукта весьма туманны: единственным разумным направлением представляется лишь более полная поддержка вновь появляющихся версий платформы Java, что вряд ли повлечет за собой появление кардинально новых возможностей, а, скорее всего, выльется в тщательную шлифовку существующих средств и различные мелкие улучшения.

Подводя итоги, можно дать следующую оценку Microsoft Visual J# .NET: продукт представляет собой, во-первых, маркетинговый ход, ориентированный на переманивание разработчиков с платформы Java на платформу .NET без потери существующих наработок, и, во-вторых, «спасательный круг» для разработчиков на платформе Microsoft Visual J++ 6.0, призванный помочь им перейти с данной, неподдерживаемой более платформы, опять же на платформу .NET. Для использования в любой их этих ролей продукт содержит достаточно развитые и удобные средства. При этом применение продукта за пределами указанных областей представляется весьма проблематичным, а перспективы его развития — туманными.


Copyright © 1994-2016 ООО "К-Пресс"