13 Обзор возможностей Visual Studio 2013. Языки программирования

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

В обновлении 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 г.) пока не реализован.

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

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

C#

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

В нем есть такие возможности - например, индексаторы (представление класса в виде абстрактной таблицы с абстрактными индексами), свойства (как бы виртуальные поля с операциями get (взять значение свойства) и set (установить новое значение свойства) - которых в языке Java просто нет, и их приходится моделировать вызовами методов, без поддержки "синтаксическим сахаром". Более того, некоторые возможности в C# реализованы в более полном и "правильном" виде, чем в Java, - например, параметризованные типы данных (generics).

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

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

Приведем пример, использующий параметризованные типы (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 является именем класса, но не является типом, т.е. нельзя описать переменную такого типа. Корректно заданным типом является любая конкретизация, например, 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 Basic

В Visual Basic 2012 реализован целый ряд новых возможностей:
  • Функция Async для разработки асинхронного кода;
  • Итераторы;
  • Получение информации о методе, вызвавшем данный метод;
  • Ключевое слово Global в операторе Namespace, которое позволяет определить пространство имен вне корневого пространства имен вашего проекта;
  • Улучшения в автоматической генерации кода для фактических параметров;
  • Опубликована на страницах MSDN библиотека примеров кода на Visual Basic (online samples).
В данном примере создается пустая форма с заголовком Form1. При этом обрабатывается событие загрузки формы, при котором выдается сообщение "Hello from Visual Basic 2013" в виде "message box".
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

Visual C++

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

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

В данном примере в виде проекта вида Win32 представлено простое приложение с точкой входа - функцией main с аргументом в виде командной строки.
// ConsoleApplication3.cpp : main project file.
#include "stdafx.h"
using namespace System;
int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Hello World");
    return 0;
}

В другом примере определен параметризованный класс (по терминологии C++, шаблон класса - template class):
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 - контроль типов при использовании шаблонов выполняется лишь частично, либо вовсе отсутствует.
  • Шаблоны реализуются дублированием кода. Для каждой конкретизации шаблона конкретным значением константы компилятор C++ генерирует новый экземпляр кода, лишь незначительно отличающегося от кода другой конкретизации.

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

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

JavaScript

В версии Visual Studio 2013 в языке JavaScript реализованы следующие возможности:
  • Операторы let и const для определения переменных и констант в некотором блоке;
  • Операторы создания объектов, коллекций объектов и объектов вида "ключ - значение", в том числе - объектов для представления даты.

Кроме того, появился новый типизированный язык TypeScript - расширение языка JavaScript.

Пример кода на 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>

F#

F# - функциональный язык программирования, сочетающий в себе несколько парадигм - функциональную и объектно-ориентированную.

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

Можно сказать, что начало функциональному подходу было положено в 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.

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

В данном примере определена явно обобщенная (generic) функция с одним обобщенным параметром-типом 'a. В языке F# обобщенный явный параметр-тип обозначается идентификатором со впереди стоящим апострофом.
let function1 (x: 'a) (y: 'a) =
    printfn "%A %A" x y

В примере определена функция печати последовательности. В качестве параметра-типа задан "заполнитель позиции" - символ подчеркивания. В примере используется встроенный итератор последовательности seq.iter, с помощью которого последовательность-параметр sequence1 просматривается, и каждый ее элемент elem печатается.
let printSequence 
     (sequence1: Collections.seq<_>)    
=
   seq.iter 
    (fun elem -> 
     printf "%s " (elem.ToString())) sequence1

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

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

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

Вопросы

  • Каковы основные особенности и возможности языка 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 (реферат).