Санкт-Петербургский государственный университет
Опубликован: 25.07.2014 | Доступ: свободный | Студентов: 1041 / 80 | Длительность: 17:26:00
Лекция 6:

Обзор языков программирования, предоставляемых Visual Studio 2013

Аннотация: В данной лекции рассмотрены следующие вопросы: обзор языков C#, VB, Managed C++, JavaScript, F# и других, предоставляемых средой Visual Studio, и их новых возможностей, реализованных в Visual Studio 2013.

Цель лекции

Ознакомление с языками C#, VB, Managed C++, JavaScript, F# и другими, предоставляемыми средой Visual Studio, и их новыми возможностями, реализованными в среде Visual Studio 2013.

7.1. Введение. Набор языков программирования, поддерживаемых в Visual Studio 2013

Языки программирования для платформы .NET, поддерживаемые в Visual Studio, стремительно развиваются - расширяются возможности уже существующих языков, а также появляются новые языки. Основные языки программирования, поддерживаемые первоначальной версией VS 2013, - это Visual C#, Visual Basic, Visual C++, JavaScript (объектно-ориентированные языки) и Visual F# (функциональный язык). В обновлении 2 к Visual Studio 2013, выпущенном 12 мая 2014 г., появился еще один язык - TypeScript, расширение известного языка Web-разработки JavaScript, созданное фирмой Microsoft (в отличие от первоначальной версии JavaScript, TypeScript - язык со строгой типизацией). Кроме того, имеется еще один интересный язык - Spec#, разработки Microsoft Research, расширение языка C# формальными спецификациями в стиле design-by-contract Мейера. Имеется его реализация для Visual Studio 2010 как add-in, который необходимо отдельно скачивать и инсталлировать. Однако для Visual Studio 2013 он в данный момент (июнь 2014 г.) пока не реализован.

Перечисленный набор из 6 языков - это только разработки Microsoft. Имеется еще целый ряд реализаций языков, (порядка 30) для платформы .NET, разработанных другими компаниями и университетами (например, Eiffel, Active Oberon и др.), однако не все они совместимы с новыми версиями Visual Studio.

7.2. Язык C# и его новые возможности в VS 2013.

Краткий обзор языка C# приведен в "Обзор возможностей .NET" . Рассмотрим особенности и возможности данного языка более подробно, в том числе - новые возможности, введенный в Visual Studio 2013.

Отметим, что, как и платформа .NET в целом, язык C# имеет международный стандарт, который развивается вместе с развитием языка.

Язык C# содержит очень много оригинальных идей, однако часть его возможностей заимствованы из других языков и технологий. Это неизбежно: как и язык Java, с точки зрения воплощенных в нем идей, язык C# - "вершина айсберга", создававшегося многими поколениями программистов. С точки зрения удобства программирования и разнообразия возможностей, язык C#, по моему мнению (даже несмотря на мою склонность и интерес к Java) является уникальным. В нем есть такие возможности - например, индексаторы (представление класса в виде абстрактной таблицы с абстрактными индексами), свойства (как бы виртуальные поля с операциями get (взять значение свойства) и set (установить новое значение свойства) - которых в языке Java просто нет, и их приходится моделировать вызовами методов, без поддержки "синтаксическим сахаром" (по меткому выражению проф. Б. Лисков). Более того, некоторые возможности в C# реализованы в более полном и "правильном" виде, чем в Java, - например, параметризованные типы данных (generics) [8].

Из множества книг по языку C# рекомендую книгу [18], по-видимому, одно из наиболее полных руководств по языку. Отметим также двухтомник [19] - поистине энциклопедию по C#, хотя и не самой новой версии. Разумеется, язык C# описан также на страницах MSDN.

Прежде всего, C# является чисто объектно-ориентированным языком и отражает возможности и особенности .NET. В нем доступна вся обширная библиотека классов .NET Framework Base Class Library. Кроме того, C# - язык компонентного программирования, основной мотивировкой и целью которого является разработка программных компонент многократного использования (reusable software components). В роли таких компонент выступают классы и интерфейсы (наборы заголовков методов). Они структурированы с помощью пространств имен (namespaces), которые обеспечивают удобство обращения к группе тех или иных возможностей, сосредоточенных в одном пространстве имен, с одной стороны, и отсутствие конфликтов имен с прочими пространствами имен, с другой стороны. Имя компоненты в общем случае имеет вид N1.N2. … C, где N1, N2, … - префикс в виде имен вложенных друг в друга namespaces.

Не вполне согласен с мнением уважаемых авторов - "евангелистов" Microsoft, которые называют язык C# "простым для изучения". По-моему, это не так. Однако, по сравнению со своим широко известным идейным предшественником - языком C ++, язык C#, действительно, гораздо проще для изучения.

Если кратко охарактеризовать наиболее популярные языки C++, Java и C# (названные в порядке их появления), то получится примерно следующее.

Язык C++ - это сочетание традиционного процедурного стиля с объектно-ориентированным и соблюдение совместимости с языком Си.

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

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

Разумеется, это мое личное мнение.

Пример удачного заимстовования в языке C#: в языке с абстрактными типами данных CLU [20] в середине 1970-х гг. было введено понятие итератора - особой разновидности модуля, предназначенного для перебора элементов (выражаясь современной терминологией) коллекции. Итератор взаимодействует с циклом как сопрограмма (coroutine), передавая телу цикла очередной элемент коллекции оператором yield (выдать). Если очередной элемент не будет сгенерирован итератором, цикл завершается. В одной из новых версий языка C# был введен оператор yield return с аналогичной семантикой и даже с таким же ключевым словом. Узнаете?

Пример класса на языке C# приведен в "Обзор возможностей .NET" . В классе определены приватное (private) поле, общедоступное (public) свойство и метод.

Приведем еще один пример, использующий параметризованные типы (generics):

// Declare the generic class.
public class GenericList<T>
{
    void Add(T input) { }
}
class TestGenericList
{
    private class ExampleClass { }
    static void Main()
    {
        // Declare a list of type int.
        GenericList<int> list1 =
            new GenericList<int>();
        // Declare a list of type string.
        GenericList<string> list2 = 
            new GenericList<string>();
        // Declare a list of type ExampleClass.

        GenericList<ExampleClass> list3 =
         new GenericList<ExampleClass>();
    }
}
    

В данном примере определен простой параметризованный класс GenericList<T>, где T - параметр-тип. В методе main данного класса созданы и использованы три конкретизации класса GenericList. Внешне пример выглядит очень похоже на Java.

Отметим, что сам по себе идентификатор GenericList является именем класса, но не является типом, т.е. нельзя описать переменную такого типа. Корректно заданным типом является любая конкретизация, например, GenericList<string>. Это видно из описаний переменных в приведенном выше примере.

Вот еще один интересный пример использования generics, который показывает преимущества параметризованных типов C#, по сравнению с Java: различные конкретизации параметризованного типа различимы во время выполнения. В Java, как известно, имеет место эффект стирания типов (type erasure), ввиду реализации всех операций параметра-типа в виде виртуальных методов.

namespace ConsoleApplication1
  {
    class Program
    {

        public class Generic<T>
        {
            public T Field;
        }

        public static void Main()
        {
            Generic<string> g = new Generic<string>();
          g.Field = "A string";
          //...
          Console.WriteLine
                ("Generic.Field           = \"{0}\"", 
                  g.Field);
          Console.WriteLine
                ("Generic.Field.GetType() = {0}", 
                 g.Field.GetType().FullName);
          Console.ReadLine();
        }
     }
  }
    

Вывод данного примера:

Generic.Field                = "A string"
Generic.Field.GetType =  System.String
    

В примере определяется простой параметризованный класс Generic<T> с единственным полем Field, тип которого является типом-параметром T. Затем создается объект, тип которого специфицирован как конкретизация Generic<string>. Наконец, тип и имя типа поля Field извлекается из объекта, типизированного данной конкретизацией. Для извлечения типа из объекта используется стандартный метод GetType. Пример такого рода на языке Java написать принципиально невозможно, так как информация о конкретизации параметризованного типа не хранится во время выполнения в JVM.

Однако интересно заметить следующее: если попытаться извлечь тип-конкретизацию из объекта g типа Generic<string> напрямую:

g.GetType().FullName
    

или:

g.GetType().Name
    

то вывод примера немного изменится, однако в каком-то виде программа сможет выдать информацию о типе конкретной параметризации и с использованием напрямую типа Generic<string>.

Интересно, что я пропускал аналогичный пример в версии Visual Studio 2010 Ultimate. В ней компилятор C# выдал сообщение об ошибке: метод GetType неприменим в данном контексте. Налицо явный прогресс в Visual Studio 2013, по сравнению с предыдущей версией: теперь стало возможно извлекать тип-конкретизацию из объекта, что вполне естественно, с точки зрения предполагаемой программистом семантики данной конструкции.

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

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

Александр Калинин
Александр Калинин

Осенью прошёл курс и получил ключ. Но т.к. уже имел действующую подписку, то ключом не воспользовался. Сейчас захожу сюда, а про DreamSpark вообще ни слова. Где же мой ключ?