Язык C#: новинка от Microsoft для разработчиков

В последнее время внимание сообщества специалистов IT-индустрии приковано к новой инициативе компании Microsoft — .NET. Однако в своем восприятии этой технологии профессионалы напоминают героев притчи о трех слепых, пытавшихся на ощупь выяснить, что же такое слон. Определение .NET всецело зависит от концептуальных взглядов того или иного специалиста. Одни трактуют ее как очередное поколение сервисов Windows (NGWS), другие — как новую среду для обмена данными и сообщениями (протокол SOAP и формат XML). Третьи же полагают, что суть .NET заключается в появлении нового языка программирования — C#. И хотя в действительности новой платформе присущи все вышеперечисленные свойства, именно последнее в наибольшей степени будоражит умы профессионалов. В этой статье мы попытаемся вкратце остановиться на особенностях новой "музыкальной тональности" Microsoft — языке C#.

Вступление

Язык C# появился на свет в июне 2000 г. в результате кропотливой работы большой группы разработчиков компании Microsoft, возглавляемой Андерсом Хейлсбергом (Anders Hejlsberg). Этот человек известен как автор одного из первых компилируемых языков программирования для персональных компьютеров IBM — Turbo Pascal. Наверное, на территории бывшего Советского Союза многие разработчики со стажем, да и просто люди, обучавшиеся в той или иной форме программированию в вузах, испытали на себе очарование и удобство использования этого продукта. Кроме того, во время работы в корпорации Borland Андерс Хейлсберг прославился созданием интегрированной среды Delphi (он руководил этим проектом вплоть до выхода версии 4.0).

Появление языка C# и инициативы .NET отнюдь не случайно пришлось на начало лета 2000 г. Именно к этому моменту компания Microsoft подготовила промышленные версии новых компонентных технологий и решений в области обмена сообщениями и данными, а также создания Internet-приложений (COM+, ASP+, ADO+, SOAP, Biztalk Framework). Несомненно, лучшим способом продвижения этих новинок является создание инструментария для разработчиков с их полноценной поддержкой. В этом и заключается одна из главных задач нового языка C#.

Кроме того, проигранный недавно судебный процесс с Sun Microsystems и последовавшее за этим решение отказаться от дальнейшей поддержки Java вынудили компанию Microsoft искать альтернативу, которая была бы столь же привлекательна и удобна для разработчиков, как и детище Sun. И хотя архитекторы C# в своих публичных выступлениях не упоминают о конкурентной борьбе с Java, анализ функциональных свойств и синтаксических особенностей нового языка наталкивает на мысль о присутствии этого мотива при создании C# (см. ниже тексты простейших программ Hello World на обоих языках).

Появление C# и .NET означает также и новый поворот маркетинговой стратегии компании Microsoft. Если ранее она боролась, и не безуспешно, за продвижение своих платформ и технологий главным образом на уровне высшего руководства организаций (подчеркивая низкую совокупную стоимость владения системной платформой Windows, надежность и эффективность построения корпоративных решений на основе продуктов Microsoft), то теперь акцент сделан на разработчиках приложений. Действительно, в .NET и языке C# появился ряд средств, существенно облегчающих работу программистов (простой доступ к компонентам и низкоуровневым библиотекам платформы Win32, возможность использования интегрированной системы обмена сообщениями с объектами и компонентами на базе XML и протокола SOAP и пр.).

В целом, .NET знаменует ужесточение борьбы Microsoft с альтернативными технологиями программирования (С# вместо Java) и интеграции приложений (CORBA и EJB; достаточно упомянуть, что протокол доступа к объектам SOAP задуман как противовес протоколу IIOP, используемому брокерами объектных вызовов в технологии CORBA).

Особенности языка C#

Данный обзор не претендует на полноту и исчерпывающее изложение. Он касается лишь наиболее важных, с точки зрения автора, особенностей C#. Более подробная информация и детали синтаксиса C# изложены на сайте MSDN. Кроме того, хорошая подборка материалов по .NET и C# имеется на сайте для разработчиков на платформах Microsoft.

Среда исполнения

Компилятор C# (см. ниже) переводит программы на C# в байт-код так называемого промежуточного языка (Intermediate Language — IL), который затем транслируется средой времени исполнения платформы .NET (IL Common Language Runtime). Язык IL является процессоро-независимым, т. е. один раз откомпилированная программа может загружаться на любой .NET-платформе, от Windows 2000 до Windows CE. В перспективе, однако, планируется возможность компиляции программ на C# непосредственно в машинный код.

Синтаксические конструкции

Авторы C# стремились создать язык, сочетающий простоту и выразительность современных объектно-ориентированных языков (вроде Java) c богатством возможностей и мощью C++. По словам Андерса Хейлсберга, C# позаимствовал большинство своих синтаксических конструкций из C++. В частности, в нем присутствуют такие удобные типы данных, как структуры и перечисления (другой потомок C++ — Java — лишен этих элементов, что создает определенные неудобства при программировании).

В то же время некоторые конструкции перекочевали из Java (например, пространства имен и пр.). Более детальную информацию о синтаксисе нового языка можно почерпнуть из документации.

Автоматическая "сборка мусора"

В свое время архитекторы Java много поработали над созданием механизма автоматического управления памятью, получившего название автоматической сборки мусора. Подобный механизм избавляет разработчика от рутинной работы, экономя его творческий потенциал для решения проблемно-ориентированных задач, а также повышает надежность программных продуктов (опытные программисты на С наверняка знают, чем может обернуться малейшая ошибка при выделении и освобождении памяти!).

Создатели C# также взяли на вооружение указанный подход. Разработчики программного обеспечения будут полностью избавлены от головной боли, связанной с управлением памятью, при работе с новым языком. Они могут просто создавать новые экземпляры различных классов в соответствии с логикой разрабатываемых приложений, а система исполнения сама позаботится о выделении памяти для них, а также об ее освобождении после того, как ссылки на эти экземпляры перестают использоваться.

При этом сам механизм сборки мусора в C# выглядит более совершенным, чем реализованный в Java. Так, программистам на Java наверняка приходилось узнавать на собственном горьком опыте, что finalizer-ы (специальные методы классов, используемые средой исполнения для освобождения занятых классом ресурсов) далеко не всегда выполняются при автоматической сборке мусора. Поэтому для гарантированного освобождения памяти приходится создавать специальные методы, а затем вызывать их вручную всякий раз, когда работа с данным экземпляром завершается. В отличие от этого, деструкторы классов C# гарантированно запускаются самой средой исполнения при автоматической сборке мусора.

Интерфейсы

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

Определение интерфейсов в C# ничем не отличается от такового в Java. Однако при их реализации не нужно использовать никаких дополнительных служебных слов, достаточно лишь унаследовать класс от требуемого интерфейса (в Java для этой цели применяется декларация implements):

Типизация данных и автоматическая инициализация переменных

Бывалые программисты на C наверняка помнят, что в этом языке можно работать непосредственно с областями памяти через указатели. Выделив память под какую-то переменную, вполне возможно было обращаться с ее содержимым как с целочисленным значением или как с набором битов, или еще каким-либо иным образом. Такая свобода действий, наряду с преимуществами, таит в себе потенциальный источник ошибок, порой трудно определимых. В C# (как, впрочем, и в Java) эта проблема решена раз и навсегда путем введения жесткой типизации переменных. Иными словами, в этом языке нельзя создать переменную, не указав типа данных для нее.

Кроме того, C# предоставляет еще одну замечательную возможность — автоматическую инициализацию переменных. Это означает, что если программист определил в теле класса или метода какую-то переменную и забыл присвоить ей значение, то при компиляции она все равно получит начальное значение (какое именно, зависит от типа переменной). Это в корне исключает целый ряд ошибок, присущих, например, программам на C++.

К слову, в Java также реализован подобный механизм, однако он менее совершенен. Например, объектные переменные при отсутствии явной инициализации просто получают фиктивное значение null, что вынуждает программиста вести изнурительную борьбу с исключительными ситуациями NullPointerException во время исполнения программ и поиск их причин.

Поддержка COM+ и Windows API

C# включает в себя полноценную поддержку технологии COM+ и Windows API, а также возможность взаимодействия с другими библиотеками для платформы Win32. Достигается это посредством механизмов делегирования (делегаты в чем-то похожи на функциональные указатели C++).

При этом сам C# не имеет даже собственной библиотеки классов. Зато он в полной мере использует багаж других систем программирования Microsoft (Visual C++, Visual Basic, среды исполнения сценариев и пр.).

По удобству и эффективности доступа к платформенно-зависимым библиотекам C# явно превосходит Java. Хотя в этом языке также имеются механизмы взаимодействия с платформенно-зависимым кодом (J/Direct, JNI), их использование является непростым делом даже для опытных разработчиков.

Явное перекрытие методов
при наследовании классов

Во время реализации крупных проектов, требующих привлечения большого количества программистов, зачастую возникает потребность в создании сложных иерархий классов. А если при этом базовые классы и классы-наследники разрабатываются разными людьми, то возможны ситуации, когда либо меняются сигнатуры методов базовых классов и классы-наследники более не перекрывают их в своих реализациях, либо в базовые классы добавляются новые методы с такими же именами и сигнатурами, которые уже реализованы в дочерних классах, и тогда классы-наследники неожиданно для их создателей перекрывают базовую функциональность. Все это порождает целый букет трудно выявляемых ошибок в программных продуктах, с чем, вероятно, знакомы все, кто занимался промышленной разработкой на C++ или Java.

C# снимает эти проблемы путем введения директивы явного перекрытия методов override (узнаете Delphi и ее главного архитектора?). Иными словами, при возникновении ситуаций, описанных в предыдущем абзаце, компилятор незамедлительно выдаст сообщение об ошибке.

Недостатки C#

Однако при всех своих достоинствах С# не лишен и некоторых серьезных недостатков. Во-первых, в обозримом будущем программы на C# смогут работать лишь на платформах Win32 (вероятно, Microsoft умышленно отказалась от кросс-платформенности, хотя мотивы этого могут быть как маркетинговыми, так и чисто техническими) из-за тесной привязки среды исполнения и самого языка к их специфическим возможностям. Во-вторых, в С# оставлена лазейка для написания потенциально небезопасного кода, работающего напрямую с ресурсами операционной системы (для этого используется директива unsafe). В-третьих, в С# нет того разнообразия средств проектирования многопоточных приложений, которыми изобилует Java. В-четвертых, в настоящее время трудно сказать, насколько среда исполнения IL Common Language Runtime и системные механизмы платформы .NET будут эффективны в сравнении с виртуальными машинами Java, имеющими вполне приличную производительность (к слову, в последние несколько лет наблюдается устойчивая тенденция к увеличению производительности этих систем).

Здравствуй, Мир!

Так уж повелось, что для быстрого знакомства с базовыми особенностями какого-либо языка программирования принято писать простейшую программу Hello World. Не отступим от этой традиции и мы. Ниже приводятся тексты такой программы на C# и на Java. Нетрудно заметить, что эти языки имеют много общего.

namespace HelloWorld; // C#
using System;
class Hello
itc_drupal_
  static void Main(String[] args)
    itc_drupal_
      Console.WriteLine("Hello world");
     

package HelloWorld; // Java
import java.lang.*;
class Hello
itc_drupal_
    public static void main(String[] args)
    itc_drupal_
       System.out.println("Hello world");
    

С чего начать

Для того чтобы начать программирование на C#, достаточно иметь обычный текстовый редактор для создания текстов программ, компилятор и среду исполнения IL Common Language Runtime. К сожалению, для этого языка пока не выпущено ни одной интегрированной среды разработки (компания Microsoft анонсировала поддержку C# в следующей версии своего комплекта ПО для разработчиков — Visual Studio.NET).

Компилятор C# и среда IL Common Language Runtime доступны для бесплатной загрузки с Web-узла Microsoft в составе пребета-версии .NET Framework SDK. Кроме компилятора и среды исполнения, в состав упомянутого SDK входят и другие подручные средства для разработчика (компоновщик, отладчик командной строки и пр.), а также документация и примеры.

Для работы с данным пакетом необходим компьютер под управлением Windows 2000 с предустановленными IIS, MS Internet Explorer 5.5 и библиотеками MDAC 2.6.

Заключение

Появление языка C# — заметное событие в мире современных информационных технологий. Он представляет несомненный интерес для разработчиков, особенно тех, кто уже давно работает с платформами Windows. Однако дальнейшая судьба этой технологической новинки будет зависеть от множества факторов, в том числе и неподвластных компании Microsoft. Так, на продвижение нового языка существенно повлияет то, насколько быстро Microsoft устранит имеющиеся серьезные недостатки C# (см. выше). Кроме того, залогом успеха этого языка может стать превращение его в открытый стандарт. Сейчас Microsoft ведет переговоры с ANSI и ECMA о стандартизации C# под эгидой каждой из этих организаций (причем стандарт ECMA C# ориентирован преимущественно на использование C# в технологиях сценариев).

В то же время многое зависит от ответных действий структур, продвигающих альтернативные технологии (Java, EJB, CORBA, компонентную модель OpenDoc и др.). Если им удастся консолидировать усилия по созданию интегрированной платформы, предоставляющей разработчикам такой же уровень сервисов, как Windows DNA и .NET, исход конкурентной борьбы может оказаться и не в пользу нового продукта.

E-mail автора: geovysh@hotmail.com