Возможности Visual Studio 2013 и их использование для облачных вычислений

Обзор языков программирования, предоставляемых 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# приведен в лекции 3. Рассмотрим особенности и возможности данного языка более подробно, в том числе - новые возможности, введенный в 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# приведен в лекции 3. В классе определены приватное (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# предоставлен разработчикам в открытый доступ для исследований и преподавания. Как эксперт по компиляторам, могу утверждать, что это - поистине отличная школа современных компиляторов.

7.3. Язык Visual Basic и его новые возможности в VS 2013

Visual Basic - очень простой язык, который часто используется для разработки GUI. Рассмотрим простейший пример, который подтверждает простоту разработки графического интерфейса на этом языке:

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
      Handles MyBase.Load

        MsgBox("Hello from Visual Basic 2013")

    End Sub

End Class
    

В данном примере создается пустая форма с заголовком Form1. При этом обрабатывается событие загрузки формы, при котором выдается сообщение "Hello from Visual Basic 2013" в виде "message box".

Как видно из примера, привлекательной чертой языка является простота и лаконичность, по сравнению, например, с аналогичной программой на языке Java или даже на языке C#.

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

Что касается новых возможностей, то Microsoft не объявил информацию о нововведениях в Visual Basic 2013, однако был реализован целый ряд новых возможностей в Visual Basic 2012:

  • Функция Async для разработки асинхронного кода;
  • Итераторы;
  • Получение информации о методе, вызвавшем данный метод;
  • Ключевое слово Global в операторе Namespace, которое позволяет определить пространство имен вне корневого пространства имен вашего проекта;
  • Улучшения в автоматической генерации кода для фактических параметров;
  • Опубликована на страницах MSDN библиотека примеров кода на Visual Basic (online samples).
  • 7.4. Язык Visual C++ и его новые возможности в VS 2013

    Язык C++ [21] был разработан в первоначальной версии под названием C with Classes в 1979 г. Автор языка Б. Страуструп разработал этот язык как расширение языка C классами в стиле языка Симула-67. Название C++ появилось в 1984 г. Язык был поддержан фирмой ATT и благодаря этому стал активно развиваться. Далее в 1993 г., 1997 г. и т.д. были разработаны новые версии языка, в которые последовательно вводились важные концепции пространства имен (namespace), ссылки (reference), динамической информации о типе (runtime type information, RTTI), исключений (exceptions) и их обработки. Имеется ряд международных стандартов C++, отражающих развития языка, например, C99 и наиболее новый вариант - C++ 11.

    Однако особо выдающийся вклад в развитие C++ внесла фирма Microsoft, которая включила C++ в качестве одного из основных языков в среду Visual Studio. Благодаря этому, язык Visual C++ стал фактически эквивалентным по возможностям языку C#. Программирование на Visual C++ возможно как с использованием управляемого кода (managed code), при выборе видов проектов CLR, так и в более традиционном варианте - неуправляемого кода, без динамического контроля типов, например, при разработке проектов вида Win32.

    Для иллюстрации стиля разработки программ на Visual C++ приведем несколько примеров.

    // ConsoleApplication3.cpp : main project file.
    
    #include "stdafx.h"
    
    using namespace System;
    
    int main(array<System::String ^> ^args)
    {
        Console::WriteLine(L"Hello World");
        return 0;
    }
        

    В данном примере в виде проекта вида Win32 представлено простое приложение с точкой входа - функцией main с аргументом в виде командной строки.

    По сравнению с C# и Visual Basic сразу можно отметить несколько архаичные элементы - например, использование заголовочных файлов.

    В другом примере определен параметризованный класс (по терминологии C++, шаблон класса - template class) [20]:

    template <class T>
    class Stack
    {
    public:
    	Stack(int = 10) ; 
    	~Stack() { delete [] stackPtr ; }
    	int push(const T); 
    	int pop(T) ;  
    	int isEmpty()const 
       { return top == -1 ; } 
    	int isFull() const 
       { return top == size - 1 ; } 
    private:
    	int size ;  
      // number of elements on Stack.
    	int top ;  
    	T* stackPtr ;  
    } ;
        

    Шаблоны в языке C++ широко используются как полезный механизм обобщенного программирования. Широко известна, например, библиотека шаблонов Standard Templates Library (STL), в среде Visual Studio - также Active Templates Library (ATL), поддержанная проектами вида ATL projects. Однако шаблоны C++ имеют ряд недостатков.

    Во-первых, шаблоны менее надежны и безопасны для использования, чем параметризованные типы в языках CLU и Java - контроль типов при использовании шаблонов выполняется лишь частично, либо вовсе отсутствует. Детали описаны в книге [20].

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

    Шаблоны могут быть также использованы в заголовках функций. Например, может быть определен шаблон функции сортировки массива из произвольных элементов.

    Новые возможности Visual C++, реализованные в Visual Studio 2013, следующие:

  • Поддержка некоторых возможностей стандарта C++ 11; фактически обеспечена полная поддержка этого стандарта в среде Visual Studio, что является большим шагом вперед;
  • Поддержка некоторых возможностей стандарта C99, в частности, библиотеки шаблонов Standard Template Library;
  • Улучшение работы среды в части автоматического завершения кода (code completion) для Visual C++;
  • Улучшение производительности программ;
  • Поддержка разработки программ на Visual C++ для магазина Windows (Windows Store).
  • 7.5. Язык JavaScript, его новые возможности в VS 2013 и новый язык TypeScript

    JavaScript - динамический язык, широко используемый для Web-программирования. Он удобен для встраивания в Web-страницы для их анимации. Фирма Microsoft активно использует JavaScript для разработки Web-приложений, несмотря на оболие собственных инструментов для этой цели.

    Пример кода на JavaScript, встроенного в Web-страницу:

    <!DOCTYPE html>
    <html>
    <head>
    <script>
    function myFunction() {
        document.getElementById("demo").innerHTML =
      "Paragraph changed.";
    }
    </script>
    </head>
    
    <body>
    
    <h1>My Web Page</h1>
    
    <p id="demo">A Paragraph.</p>
    
    <button type="button" onclick="myFunction()">Try it</button>
    
    </body>
    </html>
        

    В данном примере код на HTML определяет кнопку с надписью Try It, а код на JavaScript реализует обработчик события нажатия кнопки, в результате которого абзац HTML-кода изменяется: надпись A paragraph преобразуется в Paragraph changed.

    Пример, несмотря на свою простоту, достаточно эффектен, так как HTML-код в браузере изменяется на глазах в результате нажатия кнопки.

    В версии Visual Studio 2013 в языке JavaScript реализованы следующие возможности:

  • Операторы let и const для определения переменных и констант в некотором блоке;
  • Операторы создания объектов, коллекций объектов и объектов вида "ключ - значение", в том числе - объектов для представления даты.
  • Кроме того, появился новый типизированный язык TypeScript - расширение языка JavaScript, рассмотрение которого выходит за рамки данного курса.

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

    F# - функциональный язык программирования, сочетающий в себе несколько парадигм - функциональную и объектно-ориентированную. Он появился как разработка Microsoft Research (автор - Don Syme) и в настоящее время приобрел заслуженную популярность, особенно среди молодых программистов. Несмотря на свою экзотичность, он предоставляет доступ ко всем возможностям .NET Framework.

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

    Можно сказать, что начало функциональному подходу было положено в 1960 г. профессором Дж. Мак-Карти - автором языка обработки список ЛИСП. "Чистый" ЛИСП - его первоначальная версия - является первым из широко известных функциональных языков. Однако достаточно быстро появились диалекты языка ЛИСП, включающие понятия присваивания, переменной, метки и перехода на метку, характерные для процедурных языков. Видимо, многие программисты того времени сочли чисто функциональный стиль программирования не вполне удобным или не вполне привычным.

    Следующим важным этапом развития функционального программирования стала Тьюринговская лекция профессора Джона Бэкуса (в прошлом - автора языка Фортран) "Can programming be liberated from the von Neumann style? A functional style and its algebra of programs" (1977), в которой автор призвал более широко использовать функциональный подход к программированию и предложил свой собственный функциональный язык FP.

    Идеи Дж. Мак-Карти и Дж. Бэкуса были развиты в популярных ныне функциональных языках - ML, Caml, OCaml и, наконец, в языке F#, разработанном Доном Саймом из фирмы Microsoft Research и включенном корпорацией Microsoft в базовый набор языков, реализованных для платформы Microsoft.NET в составе интегрированной среды Visual Studio.

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

    Рассмотрим несколько простых примеров на языке F#.

    let function1 (x: 'a) (y: 'a) =
        printfn "%A %A" x y
        

    В данном примере определена явно обобщенная (generic) функция с одим обобщенным параметром-типом 'a. В языке F# обобщенный явный параметр-тип обозначается идентификатором со впереди стоящим апострофом.

    let printSequence 
         (sequence1: Collections.seq<_>)    
    =
       seq.iter 
        (fun elem -> 
         printf "%s " (elem.ToString())) sequence1
        

    В примере определена функция печати последовательности. В качестве параметра-типа задан "заполнитель позиции" - символ подчеркивания. В примере используется встроенный итератор последовательности seq.iter, с помощью которого последовательность-параметр sequence1 просматривается, и каждый ее элемент elem печатается.

    Данные примеры иллюстрируют особенности и лаконичный математический стиль языка F#.

    В версии Visual Studio 2013 в языке F# реализованы следующие новые возможности:

  • Объединения с ограничениями (discriminated unions). Пример:
    type Shape =
        | Rectangle of width : float * length : float
        | Circle of radius : float
        | Prism of width : float * float * height : float
          
  • Улучшения работы среды для навигации по коду на F#
  • Многомерные массивы.
  • 7.7. Резюме

    В версии Visual Studio 2013 Microsoft предоставляет поистине разнообразные возможности в части реализации языков, так и в части поддержки разработки программ на различных языках интегрированной средой. Реализованы языки Visual C#, Visual C++, JavaScript, TypeScript, Visual Basic, Visual F#. Обеспечивается удобна поддержка среды для программирования на этих языках (навигация, автоматическое завершение кода и др.) Предоставляются онлайн-шаблоны разработки кода на этих языках.

    Ключевые термины

    JavaScript - динамический объектно-ориентированный язык, широко используемый в браузерах для анимации Web-страниц.
    TypeScript - расширение языка JavaScript со строгой типизацией, реализованное фирмой Microsoft в обновлении 2 среды Visual Studio 2013.
    Visual C# - объектно-ориентированный и компонентно-ориентированный язык программирования, уникальный по своим возможностям.
    Visual Basic - простой объектно-ориентированный язык программирования, особенно удобный для разработки GUI.
    Visual C++ - классический объектно-ориентированный язык программирования, имеющий в реализации в среде Visual Studio большое число расширений.
    Visual F# - функциональный язык программирования, сочетающий функциональный стиль с объектно-ориентированным.
    Итератор (iterator) - конструкция в языках программирования для перебора элементов коллекции.
    Параметризованные типы (generics) - возможности обобщенного программирования в современных языках, обеспечивающие разработку в общем виде алгоритмов обработки коллекций.

    Краткие итоги

    В версии Visual Studio 2013 Microsoft предоставляет поистине разнообразные возможности в части реализации языков, так и в части поддержки разработки программ на различных языках интегрированной средой. Реализованы языки Visual C#, Visual C++, JavaScript, TypeScript, Visual Basic, Visual F#. Обеспечивается удобна поддержка среды для программирования на этих языках (навигация, автоматическое завершение кода и др.) Предоставляются онлайн-шаблоны разработки кода на этих языках.

    Набор для практики

    Вопросы

  • Каковы основные особенности и возможности языка Visual C#?
  • Каковы основные особенности и возможности языка Visual C++?
  • Каковы основные особенности и возможности языка Visual F#?
  • Каковы основные особенности и возможности языка Visual Basic?
  • Каковы основные особенности и возможности языка JavaScript?
  • Что такое язык TypeScript?
  • Что такое параметризованные типы?
  • Что такое функциональный стиль программирования и чем он удобен?
  • В чем преимущества параметризованных типов в сравнению в Java?
  • В чем преимущества параметризованных типов в Visual C# 2013, по сравнению с более ранними реализациями C#?
  • Для каких задач удобно использовать язык JavaScript?
  • Для каких задач и алгоритмов удобно использовать язык F#?
  • Упражнения

  • Разработайте простой консольный проект на языке C# в Visual Studio 2013.
  • Разработайте простой Windows-проект на языке Visual Basic в Visual Studio 2013.
  • Разработайте простой проект на языке F# в Visual Studio 2013.
  • Разработайте простой консольный проект на языке Visual C++ в Visual Studio 2013.
  • Разработайте простую анимированную Web-страницу с изменяющимся содержимым, используя язык JavaScript
  • Темы для курсовых работ, рефератов, эссе

  • Обзор языка C# и его развитие (реферат).
  • Обзор языка C++ и его развитие (реферат).
  • Обзор языка Visual Basic и его развитие (реферат).
  • Обзор возможностей языка F# (реферат).
  • Обзор возможностей языка JavaScript (реферат).
  • Обзор возможностей нового языка TypeScript (реферат).
  • Дополнительные материалы, презентации

    Презентация к данной лекции: VS_2013_Course_7.pptx.

    Вернуться к учебному плану