Visual Basic

Поделись знанием:
Перейти к: навигация, поиск
Visual Basic
Класс языка:

Процедурный, Объектно-ориентированный, Компонентно-ориентированный, Событийно-ориентированный

Тип исполнения:

Компилируемый, Интерпретируемый

Появился в:

1991

Расширение файлов:

.bas, .cls, .frm, .vbp, .vbg

Выпуск:

6.0 (1998-04-25; 9497 дней тому назад)

Система типов:

Статическая типизация, Строгая типизация, Динамическая типизация

Основные реализации:

Microsoft Visual Studio

Диалекты:

Visual Basic for Applications, Visual Basic Script

Испытал влияние:

QuickBasic, BASIC

Повлиял на:

Visual Basic .NET, REALbasic, Gambas, Xojo, Basic4ppc

Сайт:

[msdn.microsoft.com/ru-RU/vstudio/ms788229.aspx crosoft.com/ru-RU/vstudio/ms788229.aspx]

Microsoft Visual Basic — язык программирования, а также интегрированная среда разработки программного обеспечения, разрабатываемое корпорацией Microsoft. Язык Visual Basic унаследовал дух, стиль и отчасти синтаксис своего предка — языка BASIC, у которого есть немало диалектов. В то же время Visual Basic сочетает в себе процедуры и элементы объектно-ориентированных и компонентно-ориентированных языков программирования. Интегрированная среда разработки VB включает инструменты для визуального проектирования пользовательского интерфейса, редактор кода с возможностью IntelliSense и подсветкой синтаксиса, а также инструменты для отладки приложений.

Visual Basic также является хорошим средством быстрой разработки (RAD) приложений баз данных для операционных систем семейства Microsoft Windows. Множество готовых компонентов, поставляемых вместе со средой, призваны помочь программисту сразу же начать разрабатывать бизнес-логику приложения, не отвлекая его внимание на написание кода запуска программы, подписки на события и других механизмов, которые VB реализует автоматически.

Первое признание серьёзными разработчиками Visual Basic получил после выхода версии 3. Окончательное признание как полноценного средства программирования для Windows — при выходе версии 5. Версия VB6, входящая в состав Microsoft Visual Studio 6.0, стала по-настоящему зрелым и функционально богатым продуктом.





История развития

Дата выпуска Версия Описание
Май 1991 1.0 Visual Basic 1.0 для Microsoft Windows. За основу языка был взят синтаксис QBasic, а новшеством, принесшим затем языку огромную популярность, явился принцип связи языка и графического интерфейса. Этот принцип был разработан Аланом Купером (Alan Cooper) и реализован в прототипе Tripod (также известном как Ruby)
Сентябрь 1992 1.0 Visual Basic 1.0 под DOS. Он не был полностью совместим с Windows-версией VB, поскольку являлся следующей версией QuickBASIC и работал в текстовом режиме экрана. Интересно отметить, что в составе была специальная утилита, которая конвертировала проекты данной версии в проекты Visual Basic 1.0 для Windows. Она делала код максимально совместимым с Windows-версией, конвертировала формы (хотя результат получался неудовлетворительным из-за различий текстового и графического режима), а также давала в коде комментарии с подсказками по дальнейшему улучшению.
Ноябрь 1992 2.0 Visual Basic 2.0. Среда разработки стала проще в использовании и работала быстрее. Окно "Свойства" переместилось в отдельный список. Добавлена подсветка исходного кода.
1993 3.0 Вышел в свет Visual Basic 3.0 в версиях Standard и Professional. Ко всему прочему, в состав поставки добавился движок для работы с базами данных Access.
Август 1995 4.0 Visual Basic 4.0 — версия, которая могла создавать как 32-х так и 16-разрядные Windows-приложения. Кроме того, появилась возможность писать на VB классы, а также Visual Basic наконец-то стал полноценным компилятором, что значительно увеличило скорость выполнения программ. Добавлена поддержка OLE Controls (OCX), взамен старым элементам управления VBX
Февраль 1997 5.0 Visual Basic 5.0 — начиная с этой версии, стало возможно, наряду с обычными приложениями, разрабатывать свои COM-компоненты. Скомпилировав такой компонент в OCX-файл и поставляя его, можно было предоставить свой объект управления не только конечному пользователю, но и другим разработчикам, после чего они могли интегрировать этот объект в свои приложения. В составе с интегрированной средой входят P-Code и Native компиляторы. Исполнением приложений занимается новая виртуальная машина реализованная в динамической библиотеке MSVBVM50.DLL. Также в 1 квартале этого года, Microsoft выпускает продукт в специальной редакции Visual Basic 5 Control Creation Edition (VB5CCE), который специализируется только над проектированием ActiveX элементов управления.
Середина 1998 6.0 Visual Basic 6.0 — Оптимизирована работы виртуальной машины и вынесена в MSVBVM60.dll. Улучшена работа Native-компилятора. Добавлены новые функции для работы со строками и массивами. Данная версия языка является последней в линейке классического VB. Microsoft изменила политику в отношении языков семейства Basic и вместо развития Visual Basic, был создан абсолютно новый язык Visual Basic .NET.
2002 7.0 Первый выпуск Visual Basic .NET. Наиболее важная особенность заключается в том, что код полностью управляем платформой .NET Framework Common Language Runtime. Нарушена обратная совместимость с классической версией Visual Basic.
Апрель 2003 7.1 Microsoft модернизирована Visual Basic .NET, оптимизировала работу компилятора. Выпущен совместно с обновлённой версией .NET Framework 1.1.
2005 8.0 Входит в состав Visual Studio 2005. Требует .NET Framework 2.0. После выхода Visual Basic .NET 2003, Microsoft убрала приставку ".NET" из названия продукта и следующая версия называется Visual Basic 2005.
2008 9.0 Входит в состав Visual Studio 2008. Требует .NET Framework 3.5
2010 10.0 Входит в состав Visual Studio 2010. Требует .NET Framework 4
2012 11.0 Входит в состав Visual Studio 2012. Требует .NET Framework 4.5
2013 12.0 Входит в состав Visual Studio 2013. Требует .NET Framework 4.5.1
2015 14.0 Входит в состав Visual Studio 2015 RC. Обновлен .NET Framework до версии 4.6

После выхода Visual Basic версии 6.0, разработчики из Microsoft существенно изменили направление развития данной технологии. Visual Basic .NET не позволяет программировать по-старому, потому что по сути является совершенно другим языком, таким же, как и любой другой язык программирования для платформы .NET. Индивидуальность языка, так же как и его преимущества (простота, скорость создания программ, лёгкость использования готовых компонентов) при использовании в среде .NET не имеют такого значения, как раньше — всё сосредоточено на возможностях самой платформы .NET, на её библиотеках классов. На данный момент (июнь 2015) нужно говорить о Visual Basic, как о классических версиях языка 4.0 - 6.0, его диалектах: Visual Basic for Applications (VBA) и Visual Basic Scripting Edition (VBScript) и о языке для платформы .NET — Visual Basic .NET.

Элементы языка

Типы данных

Переменные в Visual Basic объявляются оператором Dim после которого указывается имя, затем ключевое слово As и тип переменной. Если тип опущен, то ключевое слово As не указывается и переменная объявляется как Variant. Если не указать конструкцию Option Explicit в разделе деклараций, то явного объявления переменных не требуется и они автоматически будут созданы при первом использовании. Данное поведение может привести к снижению скорости выполнения программы, так как необъявленные переменные будут иметь тип Variant, а также возможны логические ошибки связанные с неверным вводом имени имеющейся переменной или риска конфликтов в приложении, когда область определения переменной не совсем ясна.

Dim strMessage As String 'объявление переменной символьного типа 
Dim iProductCount As Integer 'объявление переменной целочисленного типа 
Dim dt70YearsOfVictory As Date 'объявление переменной для хранения даты и времени
Dim otherValue ' тип не указан, переменная типа Variant

Public Sub Main()
    strMessage = "Привет, Мир!" 
    iProductCount = 125 
    dt70YearsOfVictory  = #5/9/2015 2:00:00 PM# ' дата 9 мая 2015 14:00:00

    otherValue = 12.5 ' тип переменной Variant, подтип Double.
    otherValue = "Википедия" ' тип переменной Variant, подтип String.
End Sub

Таблица основных типов Visual Basic 6.0

Наименование Размер типа Описание типа данных
Byte 1 байт Байт. Предназначен для хранения целых чисел от 0 до 255. Если переменной такого типа присвоить значение, выходящее за эти пределы, то Visual Basic сгенерирует ошибку времени выполнения.
Integer 2 байта Целое. Предназначен для хранения целых чисел в диапазоне −32 768 до 32 767. Суффикс для обозначения типа «%».
Long 4 байта Длинное целое. Предназначен для хранения целых чисел в диапазоне −2 147 483 648 до 2 147 483 647. Суффикс для обозначения типа «&».
Single 4 байта С плавающей точкой одинарной точности. Диапазон от -3,402823E38 до -1,401298E-45 для отрицательных значений; от 1,401298E-45 до 3,402823E38 для положительных значений. Суффикс для обозначения типа «!»
Double 8 байт С плавающей точкой двойной точности. Переменные этого типа позволяют хранить числа с точностью до 16 цифр и длиной до 300 символов. Диапазон значений варьируется от −1.80E+308 до 1.80E+308. Суффиксом является «#». Вычисления с ним являются приблизительными, так как используется бинарное представление числа согласно стандарта IEEE 754.
Decimal 16 байт Масштабируемое целое. Этот тип использует десятичное представление чисел. Вычисления с ним, также как с типом Currency являются точными. Диапазон значений от −7.92E+28 до 7.92E+28. Нельзя напрямую объявить переменную с типом Decimal. Он может использоваться только как подтип для Variant и переменную можно привести к данному типу с помощью функции кастования CDec.
Boolean 2 байта Булев тип данных может хранить только два значения: True либо False, истина или ложь. Истинное значение в VB соответствует целочисленной −1, а ложь равна 0, а при неявном приведении типа, любое численное значение отличное от нуля рассматривается как истина. Такое поведение позволяет использовать логические операторы AND, OR, NOT, XOR не только для булевой алгебры, но также и для битовых операций.[1]
String 10 + 2*N байт Строка переменной длины. Предназначен для хранения строковой (символьной) информации. Сама строка хранится в кодировке Unicode, поэтому каждый символ кодируется 2-мя байтами. Если посмотреть тип изнутри, то используется дополнительно 4 байта для хранения указателя на строку, 4 байта для размера строки, а сама строка завершается нуль-символами (ещё 2 байта). Таким образом максимальный размер строки может достигать до 2 Гбайт. Суффикс типа «$».
String*N 2*N байт Строка постоянной длины. Также как и тип String хранит символьные данные, за исключением того, что размер данных фиксированный и указывается при объявлении переменной. Если значение строки слишком большое, то она усекается до необходимого размера. Если строка меньше чем требуется, то происходит выравнивание размера добавлением символа "пробела". Следует заметить, что фиксированные строки и массивы, а также структуры не могут быть больше 64 кб.
Date 8 байт Тип данных позволяет хранить значения времени и даты в промежутке от полуночи 1 января 100 года до полуночи 31 декабря 9999 года. Если переменной присвается только значение даты, то время равняется 00:00. Целочисленная единица представляет собой одни сутки. Это позволяет добавлять и вычитать даты используя только математические операторы, но для выполнения этих целей VB предоставляет специализированные функции работы с датами.
Object 4 байта Используется для хранения ссылки на объект. Присваивание переменной для этого типа происходит с помощью оператора Set. Сам тип является аналогом IDispatch, в нем хранится ссылка на интерфейс IDispatch. Для любого объекта нужно использовать IUnknown.
Currency 8 байт Денежный. Данный тип может иметь до 4 цифр после запятой, и до 14 — перед ней. Значение представляют собой числа в десятичной системе счисления, а не в двоичной, как это происходит для типов с плавающей запятой одинарной и двойной точности. Таким образом вычисления будут произведены точно. Диапазон значений от −922 337 203 685 477,5808 до 922 337 203 685 477,5807. Данный тип является предпочтительным для проведения финансовых расчетов. Суффикс «@»
Variant 16 байт / 22 байта+N байт / N-байт Переменная типа Variant может содержать данные любого типа, включая ссылки на объекты, пользовательские типы и массивы. Visual Basic автоматически производит необходимые преобразования данных. Подтип содержащий число требует 16 байт памяти, а для хранения строковых данных 22 байта + длина самой строки. Диапазон значений равен диапазону значений подтипа. Данный тип самый медленный по скорости выполнения, так как требуется время на распаковку и упаковку значений.

Операторы

Язык Visual Basic содержит множество операторов, которые отвечают за арифметические операции, операции сравнения и присвоения, а также конкатенации.

Оператор присвоения

  • Знак равенства (=) используется для присвоения значения переменной. Также возможно использование ключевого слова Let перед именем переменной. В ранних версиях языка BASIC его наличие было обязательным, но в Visual Basic он оставлен для совместимости. Для присвоения переменной объектного типа, необходимо наличие ключевого слова Set. Примеры: nVar = 10, Let iCount = 20, Set refDouble = objClass.

Многократное присваивание, так как это реализовано в языке C, невозможно. A = B = C не означает, что A, B и C будут иметь равные значения. VB оценит выражение B = C и в переменную A присвоит результат True или False, 0 или -1, в зависимости от типа.

Арифметические операторы

  • сложение (+), вычитание (-), умножение (*), деление (/)
  • возведение в степень (^). Пример: 2 ^ 3 = 8
  • целочисленное деление (\). Делит первое число на второе, отбрасывая (не округляя) дробную часть. Пример: 5 \ 2 = 2
  • деление по модулю (Mod). Делит первое число на второе, возвращая только остаток от деления. Пример: 5 Mod 2 = 1

Операторы сравнения

  • равенство (=). Пример: If nVar = 10 Then
  • больше, чем и меньше, чем (> и <). Пример: If nVar > 10 Then
  • больше или равно и меньше или равно (>= и <=). Пример: If nVar >= 10 Then
  • не равно (<>). Пример: If nVar <> 10 Then
  • сравнение объектов (Is). Определяет, ссылаются объектные переменные на тот же объект или на разные. Пример: If obj1 Is obj2 Then
  • оператор подобия (Like). Сравнивает строковый объект с шаблоном и определяет, подходит ли шаблон. Пример: If strEmail Like "*@*.*" Then

Логические операторы

  • логическое И (And) — Обе части выражения должны быть истинными, чтобы всё выражение стало истинным. Пример: If (2 * 2 = 4) And (2 * 3 = 6) Then
  • логическое ИЛИ (Or) — должно быть истинным хотя бы одно из выражений. Пример: If (2 * 2 = 5) Or (2 * 2 = 4) Then
  • логическое отрицание (Not) — возвращает True, если условие ложно и наоборот. Пример: If Not(2 * 2 = 5) Then
  • логическое исключение (Xor) — в выражении E1 Xor E2 возвращает True, если только E1 = True или только E2 = True, иначе — False.
  • эквивалентность (Eqv) — оценивает эквивалентность двух выражений, возвращает True, если они имеют одинаковое значение.
  • импликация (Imp) — возвращает False, если E1 = True и E2 = False, иначе — True.

Операторы конкатенации

  • Оператор (+) используется для конкатенации строк. Если обе части выражения имеют символьный тип, то операция склеивания строк будет успешной. Если одна из частей выражения, имеет числовой тип, но другая часть не может быть корректно преобразована к числу, то возникает ошибка приведения типов. Чтобы не допустить таких ситуаций, рекомендуется использовать соответствующие операторы для конвертации типов или применять оператор (&) для соединения строк.
  • Оператор (&) производит автоматическое преобразование выражений и значений в строковой тип. Например, выражение str = "10" & 20 даёт результат "1020", а не "30". Если бы использовали оператор (+) в данном выражении, то VB привел бы выражение "10" к числовому типу 10, и в случае успеха, произвёл бы арифметическое сложение.

Управляющие конструкции

В Visual Basic, как и во многих языках программирования, существуют конструкции, предназначенные для управления порядком выполнения действий. Некоторые из конструкций, такие как GoSub и Return, оставлены для совместимости с ранними версиями языка BASIC, но реализация в виде отдельных процедур может обеспечить более структурированный код.

Оператор ветвления

Общий синтаксис:

'Запись оператора ветвления в одну строку
If <условие> Then [действие_когда_условие_истинно]

'Такая запись позволит выполнить действия в зависимости от истинности условия
If <условие> Then [действие_когда_условие_истинно] Else [действие_когда_условие_ложно]

'Запись оператора ветвления в несколько строк
If <условие> Then
    [действие_когда_условие_истинно]
ElseIf <условие2> Then
    [действие_когда_условие2_истинно]
ElseIf <условиеN> Then
    [действие_когда_условиеN_истинно]
Else
    [действие_когда_условие_ложно]
End If

Оператор выбора

Общий синтаксис:

Select Case <проверяемое_значение> 'Переменная или выражение, которое требуется проверить по одному или нескольким условиям
    Case <значение_1>              'Выполняется действие, если проверяемое значение будет соответствовать значению 1
        [действие_1]
    Case <значение_2>, <значение_3>, <значение_4> 'Проверяет список значений. Если найдено соответствие, то выполняется действие
        [действие_2]
    Case <значение_5> To <значение_6>       'Проверяет диапазон значений
        [действие_3]
    Case Is >= <значение_7>                 'Проверяет значение на истинность с условием
        [действие_4]
    Case Else                               'Выполняется действие, если ни одно из условий не выполнится
        [действие_5]
End Select

Пример: вывод различных сообщений в зависимости от значения переменной

'Введём переменную и дадим ей значение вручную 
Dim X As Double  
X = InputBox("Введите числовое значение переменной Х")  
  
Select Case X 'Проверим, подходит ли некоторой воображаемой функции наше значение  
    Case Is < 5, Is >= 20, 12 To 15 'Диапазон подходящих значений  
        MsgBox "Действительное значение для некоторой функции"  
    Case Else 'Не подходящие значения  
        MsgBox "Значение не может быть использовано в некоторой функции"  
End Select

Цикл со счётчиком

Общий синтаксис:

For <переменная> = <значение> To <конечное_значение> [Step <шаговое_значение>]
    [блок_операторов]
    [Exit For] 'Выход из цикла
Next [переменная]

Пример: подсчёт суммы чётных чисел от 1 до 100

For I = 0 To 100 Step 2
    Sum = Sum + I
Next

Совместный цикл

Общий синтаксис:

For Each <переменная> In <коллекция>
    [блок_операторов]
    [Exit For] 'Принудительный выход из цикла
Next [переменная]

Пример: выводит на экран каждый элемент из массива

Dim strItem As Variant

For Each strItem In Array("Яблоко", "Груша", "Слива")
    Print strItem
Next

Цикл с условием

Общий синтаксис:

Do While <условие> 'Цикл выполняется, когда условие истинно
    [блок_операторов]
    [Exit Do] 'Принудительный выход из цикла
Loop

Do Until <условие> 'Цикл выполняется, когда условие ложно
    [блок_операторов]
    [Exit Do]
Loop

While <условие> 'Цикл выполняется, когда условие истинно
    [блок_операторов]
Wend

Пример: Построчное чтение текстового файла

Open "file.txt" For Input As #1
    Do While Not EOF(1)          'Возвратит True, если ожидается конец файла
        Line Input #1, strBuffer 'Чтение строки в переменную
        Debug.Print strBuffer    'Вывод в окно отладки
    Loop
Close #1

Цикл с постусловием

Общий синтаксис:

Do
    [блок_операторов]
    [Exit Do]
Loop While <условие>

Do
    [блок операторов]
    [Exit Do]
Loop Until <условие>

Процедуры и функции

Подпрограммы являются одними из основных элементов языка. Они представляют собой процедуры и функции.

  • Процедура начинается с оператора Sub и заканчивается End Sub, между которыми и помещается код. Процедуры могут вызываться или самим Visual Basic, например, реализованные в виде обработчиков событий, или другими процедурами и функциями. Имя процедуры обработки события состоит из имени объекта, знака подчёркивания и имени события:
Private Sub Command1_Click() 'Событие будет вызвано при нажатии на элемент управления "Кнопка"
    ...
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 'Вызывается при перемещении указателя мыши в окне формы
    ...
End Sub

На самом деле Visual Basic реализует цикл обработки оконных сообщений Windows. В примере с формой, цикл отфильтрует сообщение WM_MOUSEMOVE и автоматически вызовет процедуру Form_MouseMove с параметрами: какие кнопки мыши были нажаты, координаты указателя. Данный механизм скрывает от разработчика некоторые аспекты программирования в среде Windows, позволяя ему сразу приступить к написанию пользовательского кода. В большинстве случаев, класс решаемых задач не потребует от программиста знаний о сообщениях и оконных функциях. Но Visual Basic не ограничивает программиста самому реализовать обработку оконных сообщений. Это позволяет очень гибко подходить к построению приложений, но и потребует достаточного опыта для написания подобного кода, который может вызвать нестабильную работу программы вплоть до аварийного завершения.

  • Функции в VB начинаются с ключевого слова Function и заканчиваются End Function. Возвращаемое значение функции присваивается переменной, совпадающее с названием функции. Для того, чтобы досрочно прервать выполнение процедуры или функции, существуют специальные операторы Exit Sub и Exit Function. Visual Basic 6.0 содержит встроенные функции для работы с файловой системой, датой и временем, математические функции, функции взаимодействия с системой, функции для работы со строками, функции приведения типов и функции осуществляющие финансовые расчёты. Также существуют недокументированные функции, которые позволяют работать, например, с указателями.

Пример функции для решения квадратного уравнения:

Private Sub Main()
    Dim RetX1 As Double, RetX2 As Double
    Dim strStatus As String
    
    strStatus = SolveQuadraticEquation(4, 6, 2, RetX1, RetX2) 'Решение уравнения 4*X^2 + 6*X - 2 = 0
    
    'Выводим ответ
    MsgBox "Решение: " & strStatus & vbCrLf & _
           "X1 = " & RetX1 & vbCrLf & _
           "X2 = " & RetX2, vbInformation
End Sub

'Функция решения квадратного уравнения
Public Function SolveQuadraticEquation(ByVal A As Double, _
                                       ByVal B As Double, _
                                       ByVal C As Double, _
                                       ByRef X1 As Double, _
                                       ByRef X2 As Double) As String
    Dim D As Double
    D = (B * B) - (4 * A * C) 'Получаем значение дискриминанта
    
    If D >= 0 Then
        X1 = (-B - Sqr(D)) / (2 * A) 'Вычисляем корни уравнения
        X2 = (-B + Sqr(D)) / (2 * A)

        SolveQuadraticEquation = "Решение получено" 'Функция возвращает сообщение о решении
    Else
        SolveQuadraticEquation = "Дискриминант < 0. Корней нет"
    End If
End Function

В этом примере можно заметить модификатор ByVal перед аргументами A, B и C. Это способствует тому, что параметры в функцию будут переданы по значению. Модификатор ByRef, напротив, передаёт значение по ссылке. Для такого типа модификатора, функция может модифицировать значения переменных, переданных в качестве параметров. Visual Basic по-умолчанию всегда передаёт значения по ссылке, если ни один из модификаторов не был указан.

Модули и классы

Программный код в Visual Basic хранится в модулях. Существуют три вида модулей: модуль формы (Form), стандартный модуль (Module) и модуль класса (Class Module).

  • Модуль формы (расширение файла *.frm) является основой большинства приложений Visual Basic. Модуль формы содержит процедуры обработки события, общие процедуры и объявленные на уровне формы: переменные, константы, типы и внешние процедуры. Если открыть модуль формы в текстовом редакторе, можно увидеть описания формы и её элементов управления, включая их свойства. Код, размещённый в модуле формы, может ссылаться на другие формы или объекты приложения.
  • Стандартный модуль (расширение файла *.bas) является контейнером для процедур, функций и объявлений, к которым обычно получают доступ другие модули приложения. Они могут содержать глобальную переменную (доступную всему приложению) или описанные на уровне модуля: переменные, константы, типы, внешние и глобальные процедуры. Код, размещённый в стандартном модуле, может быть не связан с определенным приложением; если не использовать ссылки на модуль формы или имена элементов управления, стандартный модуль может быть использован в других приложениях.
  • Модуль класса (расширение файла *.cls) является основой объектно-ориентированного программирования в Visual Basic. Модуль класса используется для создания новых объектов. Эти объекты могут иметь собственные свойства, методы и события. Фактически, форма – просто модуль класса, который может содержать элементы управления, помещенные в него, и выводить их на экран. Классы могут содержать специальные процедуры Class_Initialize и Class_Terminate, которые фактически являются конструктором и деструктором.

Объектно-ориентированное программирование

Простое взаимодействие между объектами является одним из базовых составляющих парадигмы Visual Basic. Сам объект называется экземпляром класса. Объектная модель VB предоставляет различные классы для работы с формами, элементами управления, буфером обмена, коллекциями, экраном и т.д. Для взаимодействия с другими объектами, класс предоставлят разработчику интерфейс, состоящий из свойств, методов и событий.

Создание нового объекта из класса возможно ранним или поздним связыванием. Для раннего связывания используется ключевое слово New перед именем класса. Для позднего связывания используется функция CreateObject возвращающая ссылку на созданный объект. Присваивание ссылок осуществляется в переменные с типом Object, используя оператор Set. Доступ к методам и свойствам класса происходит через оператор - точку ., который ставится сразу после имени переменной объектного типа. Если класс содержит события, то переменные объявляются с ключевым словом WithEvents, тем самым будут доступны процедуры обработки событий.

Пример показывает взаимодействие программы с библиотекой Microsoft Scripting Runtime, предоставляющая объекты для работы с файловой системой:

Public Sub Main()
    Dim objFSO As New FileSystemObject 'Создаём экземпляр класса, используя оператор New
    Dim objWindows As Folder
    
    Set objWindows = objFSO.GetFolder(Environ("SYSTEMROOT")) 'Вызываем метод класса GetFolder и присваиваем ссылку на полученный объект
    
    MsgBox "Папка Windows: " & objWindows.Path 'Читаем свойства класса
    MsgBox "Дата создания: " & Format(objWindows.DateCreated, "YYYY-MM-DD H:mm:ss")
    
    Dim sTextFilePath As String
    Dim objTS As TextStream
    
    sTextFilePath = objFSO.BuildPath(Environ("TEMP"), "Тестовый файл.txt") 'Метод с двумя параметрам возвращает значение типа String
    
    Set objTS = objFSO.CreateTextFile(sTextFilePath, True)
    objTS.Write "Привет, Википедия!"
    objTS.Close
        
    objFSO.DeleteFile sTextFilePath, True
    
    Set objFSO = Nothing     'Присваивая Nothing, происходит освобождение ссылки, и объект может вызвать процедуру деструктора
    Set objWindows = Nothing 'VB автоматически вызывает деструктор, если на объект больше не ссылаются
    Set objTS = Nothing
End Sub

Visual Basic позволяет разработчику самому создавать новые классы. В отличие от других языков программирования, таких как Java и C++, Visual Basic имеет неполную поддержку ООП.

Как известно, абстрактный класс необходим, чтобы предоставить шаблон для интерфейса другим классам. В Visual Basic классы имеющие члены класса, но не содержащие реализацию, можно использовать в качестве абстрактных классов, но фактически они ими не являются. Из классов Visual Basic всегда можно создать объекты, даже если они не содержат кода[2]

Принцип инкапсуляции действует в Visual Basic. Чтобы разграничить доступ к членам класса, служат модификаторы Public, Private и Friend, используемые при описании процедур, функций, констант, переменных и пользовательских типов.

Наследование реализации не поддерживается. Visual Basic обеспечивает только поддержку наследования интерфейса через оператор Implements. При наследовании интерфейса любой класс может действовать как базовый класс интерфейса. Вообще любой класс, может выступать как базовый класс интерфейса.

Полиморфизм обеспечивается только через интерфейсы, т.к. наследование VB не поддерживает. Реализация полиморфизма показана на примере классов Автомобиль и Самолёт реализующие интерфейс класса Транспорт.

'Класс ITransport.cls
Public Function GetMaxSpeed() As Long
End Function
'Класс CAuto.cls
Implements ITransport 'Наследуем интерфейс

Private Function ITransport_GetMaxSpeed() As Long 'Реализация метода
    ITransport_GetMaxSpeed = 240
End Function
'Класс CFly.cls
Implements ITransport

Private Function ITransport_GetMaxSpeed() As Long
    ITransport_GetMaxSpeed = 700
End Function
'Стандартный модуль Program.bas
Option Explicit

Public Sub Main()
    Dim T As ITransport 'Объявляем переменную с типом ITransport
    
    Set T = New cAuto
    WhatTransportSpeed T 'Передаем ссылку в процедуру, которая вызовет нужный метод класса, в зависимости от реализации
    
    Set T = New cFly
    WhatTransportSpeed T
End Sub

'Функция имеет аргумент, который принимает ссылку на объект, реализующий интерфейс ITransport
Public Sub WhatTransportSpeed(Transport As ITransport)
    MsgBox "Максимальная скорость: " & Transport.GetMaxSpeed()
End Sub

Дизайнер форм

Редактор кода

Редактор кода представляет собой текстовый редактор с дополнительными функциями для простого и быстрого ввода исходного кода:

  • Подсветка синтаксиса исходного кода.
  • Горизонтальное разделение окна на 2 панели.
  • Показ всего исходного кода или конкретной процедуры.
  • Перечислений объектов используемых в программе со списком событий, которые разработчик может обработать.
  • Автоизменение регистра букв. Первая буква ключевых слов указываются в верхнем регистре, регистр имён переменных автоматически изменяется, чтобы соответствовать регистру, которое было задано при их объявленении.
  • Автодополнение названий функций, процедур, переменных используя IntelliSense.
  • Проверка кода на наличие синтаксических ошибок.
  • Умная табуляция блоков

Отладка

Интегрированная среда разработки предоставляет программисту богатые возможности для отладки программ. Одно из преимуществ Visual Basic, заключается в возможности изменять в значительной мере исходный код программы без её полной перекомпиляции и перезапуска. Во время отладки процедур, разработчику предоставляется возможность перемещать маркер, указывающий на текущую выполняемую инструкцию, как вперёд - пропуская часть кода, так и назад - заставляя VB заново исполнять уже отработанные инструкции.

Кроме всего прочего, среда предоставляет инструменты для отладки, такие как окно немедленного выполнения (Immediate Window), окно локальных переменных (Locals Window), окно наблюдения (Watch Window), окно просмотра стека вызовов процедур (Call Stack). Такие продвинутые средства позволяют программисту более глубже проводить анализ исследуемого алгоритма в отлаживаемом приложении.

Visual Basic переходит в режим отладки при выполнении одного из условий:

  • При выполнении инструкции Stop
  • При выполнении инструкции, на которую установлена точка останова (брейкпоинт)
  • При возникновении ошибки, для которой не найден подходящий обработчик ошибок
  • При нажатии горячих клавиш Ctrl + Break

Компиляция

В комплекте с интегрированной средой разработки идёт компилятор в P-Code (P-код), нативный Back-End x86-совместимый компилятор и линковщик. Наличие двух компиляторов позволяет отнести Visual Basic как компилируемому, так и интерпретируемому языку. Вне зависимости от того, какой из компиляторов будет выбран, приложения требуют для своего запуска виртуальную машину времени выполнения Visual Basic, которая представляет собой библиотеку MSVBVMXX.DLL, где XX-версия языка[3]

  • P-код позволяет выполняться приложению на аппаратно-независимой виртуальной машине, которая в реальном времени будет транслировать псевдо-код программы в машинный код процессора. Теоретически, такой подход позволяет осуществить переносимость приложений на новые аппаратные платформы не требуя доработки исходного кода самих программ. Одно из главных преимуществ, связанное с компиляцией в P-Code, является "горячее" изменение исходого кода в режиме отладки. Visual Basic, находясь в режиме отладки, всегда компилирует программу в P-код, далее выполнение может быть приостановлено, программистом вносятся значительные изменения в исходный код, а затем продолжается выполнение: полная перекомпиляция и перезапуск приложения при этом не требуется. Компилятор создаёт исполняемый файл в формате PE, но вместо инструкций для реального процессора, содержится код инициализирующий виртуальную машину и байт-код приложения. Главным недостатком компиляции в P-код является низкая скорость выполнения программ, т.к. большая часть времени тратится на трансляцию программы в машинный код.
  • Native-компиляция стала возможна с выходом Visual Basic 5.0. Данный компилятор позволяет создавать высокопроизводительный код по сравнению с приложениями, которые были собраны в P-код. В машинный код компилируются большинство инструкций: арифметические операции, управляющие конструкции, но такие действия, как вызов встроенных функций языка, работа со строками, обработка ошибок будут выполняться библиотекой времени выполнения Visual Basic. Таким образом, несмотря на компиляцию в машинный код, приложение для своего выполнения будет требовать виртуальную машину Visual Basic. Также частый вызов функций из библиотеки времени выполнения приводит к ухудшению скорости выполнения приложения. Но несмотря на все недостатки, Native-компилятор обеспечивает приемлимую скорость выполнения кода. Компилятор содержит несколько параметров оптимизации. На вкладке компиляции проекта можно отключить некоторые проверочные операции: выход за пределы массива, целочисленное переполнение и др. Правильная настройка этих параметров позволяет разработчику получить дополнительный прирост производительности в разрабатываемом приложении.

Развертывание

Совместно с Microsoft Visual Basic 6.0 поставляется Package & Deployment Wizard[4], предназначенный для создания инсталляционных пакетов на основе проекта Visual Basic. В сравнении со своим хорошо известным предшественником — Setup Wizard, P&D Wizard предоставляет новую функциональность, но, к сожалению, новый инструмент содержит некоторые ошибки. Одной из проблем данного приложения является ошибка преобразования даты, если локаль установленная в операционной системе пользователя будет отличной от Американской. Существуют сторонние приложения, которые предоставляют более продвинутые средства для управления установочными пакетами.

Также возможен вариант установки VB приложений простым копированием, который сводится к выполнению нескольких шагов:

  • Если в системной папке операционной системы отсутствует файл времени выполнения приложений Visual Basic (MSVBVM60.DLL), то необходимо предварительно его скопировать в неё.
  • Если приложение содержит нестандартные элементы управления, такие как ActiveX Controls, то предварительно необходимо их скопировать в системную директорию и произвести регистрацию в системном реестре Microsoft Windows. Регистрацию компонент можно автоматизировать, например, выполнить команду regsvr32.exe и передать полный путь к файлу или программным способом, непосредственно вызвав метод DllRegisterServer, который реализует COM-совместимая компонента.
  • Создать программную папку, скопировать исполняемый файл, при необходимости создать ярлык приложения на рабочем столе пользователя.

Дополнительные возможности

ActiveX (Элементы управления OCX)

Начиная с версии VB 5.0 разработчику предоставляется возможность не только использовать готовые компоненты ActiveX, но и создавать свои. VB берёт на себя всю работу по созданию вспомогательного кода, который предназначен для регистрации информации о компоненте в системном реестре, реализации интерфейса IDispatch, создания уникальных GUID, используемых в качестве идентификаторов для классов (CLSID), интерфейсов (IID) и библиотек типов (LIBID). Благодаря такому подходу от программиста потребуется только создать классы с необходимым функционалом.

Создание новых GUID класса и интерфейса зависит от установленного параметра совместимости на вкладке свойств проекта. Он может принимать одно из трех состояний:

  • Без совместимости — Visual Basic создает новые идентификаторы интерфейса и класса каждый раз при построении или компиляции проекта. Каждое построение компоненты может использоваться только с приложениями, созданными для работы с конкретной версией этой компоненты, т.е. если имя класса и проекта не будет изменено во время компиляции, то сгенерируются новые идентификаторы и они перепишут информацию в реестре, таким образом приложения, ссылающиеся на старые идентификаторы, не смогут запуститься.
  • Совместимость на уровне проекта — параметр предназначен для поддержания совместимости во время тестирования, чтобы после создании компоненты было поведение такое же, словно установлен параметр без совместимости.
  • Двоичная совместимость — при компиляции проекта Visual Basic создает новые идентификаторы при необходимости. Сохраняются идентификаторы класса и интерфейса из предыдущих версий компоненты. Изменение реализации метода не меняет идентификаторы. Также добавление нового класса и методов не изменяет существующей интерфейс. Таким образом старые приложения могут использовать старый интерфейс компоненты, а новые приложения могут ссылаться на новую версию интерфейса. Если изменяется метод или удаляется из интерфейса, то VB предупредит о несоответствии с интерфейсом компоненты и рекомендует произвести перекомпиляцию приложений.[5]

После завершения компиляции на выходе будет двоичный файл библиотеки по спецификации COM. Данный компонент реализует как минимум 2 интерфейса: IUnknown и IDispatch. Библиотека типов (TLB) будет интегрированна внутри ресурсов исполняемого файла. Также дополнительно создаются файлы с полезной информацией, такие как EXP и LIB.

Windows API (Прикладной интерфейс программирования)

Visual Basic предоставляет языковые средства для декларации и вызова функции из библиотек динамической компоновки (DLL). Данный механизм позволяет расширять приложения, за счёт использование дополнительных библиотек предоставляемые другими разработчиками, в том числе написанные на различных языках программирования. Один из таких наборов библиотек предоставляется операционной системой Microsoft Windows.

Общий синтаксис декларации функции и процедуры выглядит следующим образом:

[Public|Private] Declare Sub <имя_процедуры> lib "имя_динамической_библиотеки" [Alias "псевдоним"] [(параметры)]

[Public|Private] Declare Function <имя_функциии> lib "имя_динамической_библиотеки" [Alias "псевдоним"] [(параметры)] [As тип_возврата]

Псевдонимы необходимо задавать в ряде случаев: использование в названии функции зарезервированных идентификаторов Visual Basic, название содержат недопустимые символы или не могут быть правильно интерпретированы средой. Вызываемые функции должны поддерживать соглашение о вызове StdCall.

При передаче параметра с типом String в функцию WINAPI, VB осуществляет автоматическую конвертацию кодировки из Unicode в ANSI, после выполнения функции, происходит обратная конвертация из ANSI в Unicode. Чтобы исключить автоматическую конвертацию строк, аргументы функции необходимо задекларировать с типом Long, и передавать указатель на строку, используя функцию StrPtr, таким образом можно оптимизировать производительность приложения выполняющее множественные вызовы функций.

Пример вызова Windows API для получение полного пути к каталогу Windows и вывода сообщения на экран:

Private Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" (ByVal buffer As String, ByVal nSize As Long) As Long
Private Declare Function MessageBox Lib "user32.dll" Alias "MessageBoxA" (ByVal hWnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long

Private Const MB_ICONASTERISK As Long = 64

Public Sub Main()
    Dim buffer As String 'Переменная в которую будет получен результат функции.
    Dim retLen As Long
 
    buffer = String(256, vbNullChar)
    lens = GetWindowsDirectory(buffer, Len(buffer)) 'Вызов функции
    buffer = Left(buffer, lens)
 
    MessageBox 0&, "ОС установлена в каталог: " & buffer, "Информация", MB_ICONASTERISK 'Вызов функции
End Sub

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

Достоинства и недостатки

Достоинства

  • Высокая скорость создания приложений с графическим интерфейсом для Microsoft Windows.
  • Простой синтаксис языка обеспечивает низкий порог вхождения.
  • Возможность компиляции как в машинный код, так и в P-код (по выбору программиста).
  • Безопасность типов обеспечивает защита от ошибок, связанных с применением указателей и доступом к памяти. Этот аспект делает Visual Basic приложения более стабильными, но также является объектом критики.
  • Возможность использования большинства WinAPI функций[6] для расширения функциональных возможностей приложения. Данный вопрос наиболее полно исследован Дэном Эпплманом, написавшим книгу «Visual Basic Programmer’s Guide to the Win32 API».

Недостатки

  • Поддержка операционных систем только семейства Windows и Mac OS X (Исключение — VB1 for DOS).
  • Отсутствие полноценного механизма наследования реализации объектов[7]. Существующее в языке наследование позволяет наследовать только интерфейсы, но не их реализацию.
  • Практически все встроенные функции языка реализованы через библиотеку времени исполнения, которая, в свою очередь, производит много «дополнительной» работы по проверке и/или преобразованию типов, что замедляет скорость работы приложений.

Язык сильно привязан к своей среде разработки и к операционной системе Microsoft Windows, являясь исключительно инструментом написания Windows-приложений. Привязка к среде заключается в том, что существует большое количество средств, предназначенных для помощи и удобства программирования: встроенный отладчик, просмотр переменных и структур данных на лету, окно отладки, всплывающие подсказки при наборе текста программы (IntelliSense). Все эти преимущества делают бесполезным и даже невозможным использование Visual Basic вне среды разработки, например в обычном текстовом редакторе

Критика

  • Часто критике подвергаются такие аспекты Visual Basic, как возможность отключить средства слежения за объявленными переменными, возможность неявного преобразования переменных, наличие типа данных «Variant». По мнению критиков, это даёт возможность писать крайне плохой код. С другой стороны, это можно рассматривать как плюс, так как VB не навязывает «хороший стиль», а даёт больше свободы программисту.
  • Отсутствие указателей, низкоуровневого доступа к памяти, ASM-вставок, невозможность экспорта функций в нативных библиотеках, отсутствие стандартных средств разработки консольных приложений. Несмотря на то, что парадигма Visual Basic позволяет среднему VB-программисту обходиться без всего этого, перечисленные вещи также нередко становятся объектами критики. И хотя, используя недокументированные возможности и определённые ухищрения, всё это можно реализовать и на VB (например, с помощью функций для получения указателей VarPtr, StrPtr и ObjPtr); пользоваться этими трюками иногда сложнее, чем, например, на С++.

Однако стоит отметить, что все недостатки языка вытекают из его основного достоинства — простоты разработки графического интерфейса. Поэтому многие программисты используют Visual Basic для разработки интерфейса пользователя, а функциональность программы реализуют в виде динамически подключаемых библиотек (DLL), написанных на других языках (например, C++).

Реализации и диалекты

Visual Basic for Applications (VBA)

Это среда разработки практически не отличается от классического Visual Basic, которая предназначена для написания макросов и других прикладных программ для конкретных приложений. Наибольшую популярность получил благодаря своему использованию в пакете Microsoft Office. Широкое распространение Visual Basic for Applications в сочетании с изначально недостаточным вниманием к вопросам безопасности привело к широкому распространению макровирусов.

Особенности:

  • Не позволяет компилировать приложения в исполняемые файлы EXE/DLL
  • Для выполнения приложений в современной среде требуются корректные настройки безопасности макросов в приложении, которое является хостом для VBA
  • Отсутствуют некоторые объекты, такие как: Clipboard, App, Form, Timer, Data. Вместо них предоставляются другие классы, реализованные в объектной модели конкретного приложения.

Visual Basic Scripting Edition (VBScript)

Скриптовый язык, являющийся несколько усечённой версией обычного Visual Basic. Используется в основном для автоматизации администрирования систем Microsoft Windows, а также для создания страниц ASP и сценариев для Internet Explorer.

Особенности:

  • Отсутствуют операторы для работы с файловой системой
  • Нет возможности объявить переменную с конкретным типом данных. Все переменные имеют тип Variant
  • Возможно использовать только позднее связывание для работы с внешними библиотеками
  • Компиляция кода в исполняемые файлы отсутствует
  • Исходный код хранится в текстовых файлах с расширением .vbs или .vbe

eMbedded Visual Basic (eVB)

Данный инструмент используется для разработки программного обеспечения под операционные системы Windows CE и Windows Mobile. Включает в себя интегрированную среду разработки, отладчик и эмулятор для тестирования приложений. eMbedded Visual Basic базируется не на полнофункциональном языке программирования Visual Basic, а на языке описания сценариев Visual Basic Scripting Edition. Приложения компилируются в P-код, а исполняемые файлы имеют расширение VB, которые ассоциированы с хост-приложением.

Особенности:

  • Все переменные по умолчанию относятся к виду Variant; строгий контроль типов не поддерживается
  • Разработка ActiveX-элементов управления не поддерживается, но возможно использование готовых
  • Ряд встроенных элементов управления Visual Basic не поддерживается, некоторые свойства отсутствуют
  • Требуется наличие библиотек eMbedded Visual Basic Runtime для запуска приложений

См. также

Напишите отзыв о статье "Visual Basic"

Примечания

  1. msdn.microsoft.com/en-us/library/aa242751(v=vs.60).aspx MSDN, Visual Basic 6.0, Language Reference, оператор And
  2. В. Сергеев. Visual Basic 6.0. Наиболее полное руководство для профессиональной работы в среде Visual Basic. Стр.: 493
  3. support.microsoft.com/en-us/kb/229415 Visual Basic Supports P-Code and Native Code Compilation
  4. msdn.microsoft.com/en-us/library/aa262321(v=vs.60).aspx Package & Deployment Wizard
  5. support.microsoft.com/ru-ru/kb/161137 Использование проектной и бинарной совместимости
  6. 16-разрядные версии могут обращаться к Win16 подсистеме, а 32-разрядные версии — к Win32.
  7. Отсутствие наследования реализации — особенность технологии COM, а не самого VB, который лишь отражает эту особенность.

Рекомендуемая литература

  • Брайан Сайлер, Джефф Споттс. Использование Visual Basic 6. Классическое издание = Special Edition Using Visual Basic 6. — М.: Вильямс, 2007. — 832 с. — ISBN 0-7897-1542-2.
  • Сергеев В. Visual Basic 6.0. Руководство для профессионалов. — Redmond, WA, USA: БХВ-Петербург, 2004. — 974 с. — ISBN 5-8206-0019-3.
  • Maureen Williams Zimmerman. Microsoft Visual Basic 6.0 Reference Library. — Redmond, WA, USA: Microsoft Press, 1998. — 3344 с. — ISBN 1-57231-864-3.
  • Microsoft Official Academic Course Staff. Microsoft Visual Basic 6.0: Programmer's Guide. — Redmond, WA, USA: Microsoft Press, 1998. — 976 с. — ISBN 1-57231-863-5.
  • Джон Кларк Крейг, Уэбб Джефф. Microsoft Visual Basic 6.0. Мастерская разработчика. — Русская Редакция, 2001. — 720 с. — ISBN 1-57231-883-X.
  • Джеймс Купер. Visual Basic Desing Patterns: VB 6.0 and VB.NET. — Addison Wesley, 2002. — 484 с. — ISBN 0-201-70265-7.
  • Дан Эпплман. Win32 API и Visual Basic. Для профессионалов = Dan Appleman's Visual Basic Programmer's Guide to the Win32 API. — Питер. — СПб.: «Питер», 2001. — 1120 с. — ISBN 5-272-00198-2.

Ссылки

  • [bbs.vbstreets.ru/ Конференция VBStreets]
  • [www.sql.ru/forum/visual-basic Форум SQL.RU. Visual Basic]
  • [forum.sources.ru/index.php?showforum=19 Форум на исходниках. Visual Basic]
  • [vbnet.ru/ VBNet — всё о Visual Basic, VB .NET, ASP и .Net]

Отрывок, характеризующий Visual Basic

– Да… да… Ну, Михайла Иваныч, – вдруг сказал он, приподняв голову и указывая на план постройки, – расскажи, как ты это хочешь переделать…
Михаил Иваныч подошел к плану, и князь, поговорив с ним о плане новой постройки, сердито взглянув на княжну Марью и Десаля, ушел к себе.
Княжна Марья видела смущенный и удивленный взгляд Десаля, устремленный на ее отца, заметила его молчание и была поражена тем, что отец забыл письмо сына на столе в гостиной; но она боялась не только говорить и расспрашивать Десаля о причине его смущения и молчания, но боялась и думать об этом.
Ввечеру Михаил Иваныч, присланный от князя, пришел к княжне Марье за письмом князя Андрея, которое забыто было в гостиной. Княжна Марья подала письмо. Хотя ей это и неприятно было, она позволила себе спросить у Михаила Иваныча, что делает ее отец.
– Всё хлопочут, – с почтительно насмешливой улыбкой, которая заставила побледнеть княжну Марью, сказал Михаил Иваныч. – Очень беспокоятся насчет нового корпуса. Читали немножко, а теперь, – понизив голос, сказал Михаил Иваныч, – у бюра, должно, завещанием занялись. (В последнее время одно из любимых занятий князя было занятие над бумагами, которые должны были остаться после его смерти и которые он называл завещанием.)
– А Алпатыча посылают в Смоленск? – спросила княжна Марья.
– Как же с, уж он давно ждет.


Когда Михаил Иваныч вернулся с письмом в кабинет, князь в очках, с абажуром на глазах и на свече, сидел у открытого бюро, с бумагами в далеко отставленной руке, и в несколько торжественной позе читал свои бумаги (ремарки, как он называл), которые должны были быть доставлены государю после его смерти.
Когда Михаил Иваныч вошел, у него в глазах стояли слезы воспоминания о том времени, когда он писал то, что читал теперь. Он взял из рук Михаила Иваныча письмо, положил в карман, уложил бумаги и позвал уже давно дожидавшегося Алпатыча.
На листочке бумаги у него было записано то, что нужно было в Смоленске, и он, ходя по комнате мимо дожидавшегося у двери Алпатыча, стал отдавать приказания.
– Первое, бумаги почтовой, слышишь, восемь дестей, вот по образцу; золотообрезной… образчик, чтобы непременно по нем была; лаку, сургучу – по записке Михаила Иваныча.
Он походил по комнате и заглянул в памятную записку.
– Потом губернатору лично письмо отдать о записи.
Потом были нужны задвижки к дверям новой постройки, непременно такого фасона, которые выдумал сам князь. Потом ящик переплетный надо было заказать для укладки завещания.
Отдача приказаний Алпатычу продолжалась более двух часов. Князь все не отпускал его. Он сел, задумался и, закрыв глаза, задремал. Алпатыч пошевелился.
– Ну, ступай, ступай; ежели что нужно, я пришлю.
Алпатыч вышел. Князь подошел опять к бюро, заглянув в него, потрогал рукою свои бумаги, опять запер и сел к столу писать письмо губернатору.
Уже было поздно, когда он встал, запечатав письмо. Ему хотелось спать, но он знал, что не заснет и что самые дурные мысли приходят ему в постели. Он кликнул Тихона и пошел с ним по комнатам, чтобы сказать ему, где стлать постель на нынешнюю ночь. Он ходил, примеривая каждый уголок.
Везде ему казалось нехорошо, но хуже всего был привычный диван в кабинете. Диван этот был страшен ему, вероятно по тяжелым мыслям, которые он передумал, лежа на нем. Нигде не было хорошо, но все таки лучше всех был уголок в диванной за фортепиано: он никогда еще не спал тут.
Тихон принес с официантом постель и стал уставлять.
– Не так, не так! – закричал князь и сам подвинул на четверть подальше от угла, и потом опять поближе.
«Ну, наконец все переделал, теперь отдохну», – подумал князь и предоставил Тихону раздевать себя.
Досадливо морщась от усилий, которые нужно было делать, чтобы снять кафтан и панталоны, князь разделся, тяжело опустился на кровать и как будто задумался, презрительно глядя на свои желтые, иссохшие ноги. Он не задумался, а он медлил перед предстоявшим ему трудом поднять эти ноги и передвинуться на кровати. «Ох, как тяжело! Ох, хоть бы поскорее, поскорее кончились эти труды, и вы бы отпустили меня! – думал он. Он сделал, поджав губы, в двадцатый раз это усилие и лег. Но едва он лег, как вдруг вся постель равномерно заходила под ним вперед и назад, как будто тяжело дыша и толкаясь. Это бывало с ним почти каждую ночь. Он открыл закрывшиеся было глаза.
– Нет спокоя, проклятые! – проворчал он с гневом на кого то. «Да, да, еще что то важное было, очень что то важное я приберег себе на ночь в постели. Задвижки? Нет, про это сказал. Нет, что то такое, что то в гостиной было. Княжна Марья что то врала. Десаль что то – дурак этот – говорил. В кармане что то – не вспомню».
– Тишка! Об чем за обедом говорили?
– Об князе, Михайле…
– Молчи, молчи. – Князь захлопал рукой по столу. – Да! Знаю, письмо князя Андрея. Княжна Марья читала. Десаль что то про Витебск говорил. Теперь прочту.
Он велел достать письмо из кармана и придвинуть к кровати столик с лимонадом и витушкой – восковой свечкой и, надев очки, стал читать. Тут только в тишине ночи, при слабом свете из под зеленого колпака, он, прочтя письмо, в первый раз на мгновение понял его значение.
«Французы в Витебске, через четыре перехода они могут быть у Смоленска; может, они уже там».
– Тишка! – Тихон вскочил. – Нет, не надо, не надо! – прокричал он.
Он спрятал письмо под подсвечник и закрыл глаза. И ему представился Дунай, светлый полдень, камыши, русский лагерь, и он входит, он, молодой генерал, без одной морщины на лице, бодрый, веселый, румяный, в расписной шатер Потемкина, и жгучее чувство зависти к любимцу, столь же сильное, как и тогда, волнует его. И он вспоминает все те слова, которые сказаны были тогда при первом Свидании с Потемкиным. И ему представляется с желтизною в жирном лице невысокая, толстая женщина – матушка императрица, ее улыбки, слова, когда она в первый раз, обласкав, приняла его, и вспоминается ее же лицо на катафалке и то столкновение с Зубовым, которое было тогда при ее гробе за право подходить к ее руке.
«Ах, скорее, скорее вернуться к тому времени, и чтобы теперешнее все кончилось поскорее, поскорее, чтобы оставили они меня в покое!»


Лысые Горы, именье князя Николая Андреича Болконского, находились в шестидесяти верстах от Смоленска, позади его, и в трех верстах от Московской дороги.
В тот же вечер, как князь отдавал приказания Алпатычу, Десаль, потребовав у княжны Марьи свидания, сообщил ей, что так как князь не совсем здоров и не принимает никаких мер для своей безопасности, а по письму князя Андрея видно, что пребывание в Лысых Горах небезопасно, то он почтительно советует ей самой написать с Алпатычем письмо к начальнику губернии в Смоленск с просьбой уведомить ее о положении дел и о мере опасности, которой подвергаются Лысые Горы. Десаль написал для княжны Марьи письмо к губернатору, которое она подписала, и письмо это было отдано Алпатычу с приказанием подать его губернатору и, в случае опасности, возвратиться как можно скорее.
Получив все приказания, Алпатыч, провожаемый домашними, в белой пуховой шляпе (княжеский подарок), с палкой, так же как князь, вышел садиться в кожаную кибиточку, заложенную тройкой сытых саврасых.
Колокольчик был подвязан, и бубенчики заложены бумажками. Князь никому не позволял в Лысых Горах ездить с колокольчиком. Но Алпатыч любил колокольчики и бубенчики в дальней дороге. Придворные Алпатыча, земский, конторщик, кухарка – черная, белая, две старухи, мальчик казачок, кучера и разные дворовые провожали его.
Дочь укладывала за спину и под него ситцевые пуховые подушки. Свояченица старушка тайком сунула узелок. Один из кучеров подсадил его под руку.
– Ну, ну, бабьи сборы! Бабы, бабы! – пыхтя, проговорил скороговоркой Алпатыч точно так, как говорил князь, и сел в кибиточку. Отдав последние приказания о работах земскому и в этом уж не подражая князю, Алпатыч снял с лысой головы шляпу и перекрестился троекратно.
– Вы, ежели что… вы вернитесь, Яков Алпатыч; ради Христа, нас пожалей, – прокричала ему жена, намекавшая на слухи о войне и неприятеле.
– Бабы, бабы, бабьи сборы, – проговорил Алпатыч про себя и поехал, оглядывая вокруг себя поля, где с пожелтевшей рожью, где с густым, еще зеленым овсом, где еще черные, которые только начинали двоить. Алпатыч ехал, любуясь на редкостный урожай ярового в нынешнем году, приглядываясь к полоскам ржаных пелей, на которых кое где начинали зажинать, и делал свои хозяйственные соображения о посеве и уборке и о том, не забыто ли какое княжеское приказание.
Два раза покормив дорогой, к вечеру 4 го августа Алпатыч приехал в город.
По дороге Алпатыч встречал и обгонял обозы и войска. Подъезжая к Смоленску, он слышал дальние выстрелы, но звуки эти не поразили его. Сильнее всего поразило его то, что, приближаясь к Смоленску, он видел прекрасное поле овса, которое какие то солдаты косили, очевидно, на корм и по которому стояли лагерем; это обстоятельство поразило Алпатыча, но он скоро забыл его, думая о своем деле.
Все интересы жизни Алпатыча уже более тридцати лет были ограничены одной волей князя, и он никогда не выходил из этого круга. Все, что не касалось до исполнения приказаний князя, не только не интересовало его, но не существовало для Алпатыча.
Алпатыч, приехав вечером 4 го августа в Смоленск, остановился за Днепром, в Гаченском предместье, на постоялом дворе, у дворника Ферапонтова, у которого он уже тридцать лет имел привычку останавливаться. Ферапонтов двенадцать лет тому назад, с легкой руки Алпатыча, купив рощу у князя, начал торговать и теперь имел дом, постоялый двор и мучную лавку в губернии. Ферапонтов был толстый, черный, красный сорокалетний мужик, с толстыми губами, с толстой шишкой носом, такими же шишками над черными, нахмуренными бровями и толстым брюхом.
Ферапонтов, в жилете, в ситцевой рубахе, стоял у лавки, выходившей на улицу. Увидав Алпатыча, он подошел к нему.
– Добро пожаловать, Яков Алпатыч. Народ из города, а ты в город, – сказал хозяин.
– Что ж так, из города? – сказал Алпатыч.
– И я говорю, – народ глуп. Всё француза боятся.
– Бабьи толки, бабьи толки! – проговорил Алпатыч.
– Так то и я сужу, Яков Алпатыч. Я говорю, приказ есть, что не пустят его, – значит, верно. Да и мужики по три рубля с подводы просят – креста на них нет!
Яков Алпатыч невнимательно слушал. Он потребовал самовар и сена лошадям и, напившись чаю, лег спать.
Всю ночь мимо постоялого двора двигались на улице войска. На другой день Алпатыч надел камзол, который он надевал только в городе, и пошел по делам. Утро было солнечное, и с восьми часов было уже жарко. Дорогой день для уборки хлеба, как думал Алпатыч. За городом с раннего утра слышались выстрелы.
С восьми часов к ружейным выстрелам присоединилась пушечная пальба. На улицах было много народу, куда то спешащего, много солдат, но так же, как и всегда, ездили извозчики, купцы стояли у лавок и в церквах шла служба. Алпатыч прошел в лавки, в присутственные места, на почту и к губернатору. В присутственных местах, в лавках, на почте все говорили о войске, о неприятеле, который уже напал на город; все спрашивали друг друга, что делать, и все старались успокоивать друг друга.
У дома губернатора Алпатыч нашел большое количество народа, казаков и дорожный экипаж, принадлежавший губернатору. На крыльце Яков Алпатыч встретил двух господ дворян, из которых одного он знал. Знакомый ему дворянин, бывший исправник, говорил с жаром.
– Ведь это не шутки шутить, – говорил он. – Хорошо, кто один. Одна голова и бедна – так одна, а то ведь тринадцать человек семьи, да все имущество… Довели, что пропадать всем, что ж это за начальство после этого?.. Эх, перевешал бы разбойников…
– Да ну, будет, – говорил другой.
– А мне что за дело, пускай слышит! Что ж, мы не собаки, – сказал бывший исправник и, оглянувшись, увидал Алпатыча.
– А, Яков Алпатыч, ты зачем?
– По приказанию его сиятельства, к господину губернатору, – отвечал Алпатыч, гордо поднимая голову и закладывая руку за пазуху, что он делал всегда, когда упоминал о князе… – Изволили приказать осведомиться о положении дел, – сказал он.
– Да вот и узнавай, – прокричал помещик, – довели, что ни подвод, ничего!.. Вот она, слышишь? – сказал он, указывая на ту сторону, откуда слышались выстрелы.
– Довели, что погибать всем… разбойники! – опять проговорил он и сошел с крыльца.
Алпатыч покачал головой и пошел на лестницу. В приемной были купцы, женщины, чиновники, молча переглядывавшиеся между собой. Дверь кабинета отворилась, все встали с мест и подвинулись вперед. Из двери выбежал чиновник, поговорил что то с купцом, кликнул за собой толстого чиновника с крестом на шее и скрылся опять в дверь, видимо, избегая всех обращенных к нему взглядов и вопросов. Алпатыч продвинулся вперед и при следующем выходе чиновника, заложив руку зазастегнутый сюртук, обратился к чиновнику, подавая ему два письма.
– Господину барону Ашу от генерала аншефа князя Болконского, – провозгласил он так торжественно и значительно, что чиновник обратился к нему и взял его письмо. Через несколько минут губернатор принял Алпатыча и поспешно сказал ему:
– Доложи князю и княжне, что мне ничего не известно было: я поступал по высшим приказаниям – вот…
Он дал бумагу Алпатычу.
– А впрочем, так как князь нездоров, мой совет им ехать в Москву. Я сам сейчас еду. Доложи… – Но губернатор не договорил: в дверь вбежал запыленный и запотелый офицер и начал что то говорить по французски. На лице губернатора изобразился ужас.
– Иди, – сказал он, кивнув головой Алпатычу, и стал что то спрашивать у офицера. Жадные, испуганные, беспомощные взгляды обратились на Алпатыча, когда он вышел из кабинета губернатора. Невольно прислушиваясь теперь к близким и все усиливавшимся выстрелам, Алпатыч поспешил на постоялый двор. Бумага, которую дал губернатор Алпатычу, была следующая:
«Уверяю вас, что городу Смоленску не предстоит еще ни малейшей опасности, и невероятно, чтобы оный ею угрожаем был. Я с одной, а князь Багратион с другой стороны идем на соединение перед Смоленском, которое совершится 22 го числа, и обе армии совокупными силами станут оборонять соотечественников своих вверенной вам губернии, пока усилия их удалят от них врагов отечества или пока не истребится в храбрых их рядах до последнего воина. Вы видите из сего, что вы имеете совершенное право успокоить жителей Смоленска, ибо кто защищаем двумя столь храбрыми войсками, тот может быть уверен в победе их». (Предписание Барклая де Толли смоленскому гражданскому губернатору, барону Ашу, 1812 года.)
Народ беспокойно сновал по улицам.
Наложенные верхом возы с домашней посудой, стульями, шкафчиками то и дело выезжали из ворот домов и ехали по улицам. В соседнем доме Ферапонтова стояли повозки и, прощаясь, выли и приговаривали бабы. Дворняжка собака, лая, вертелась перед заложенными лошадьми.
Алпатыч более поспешным шагом, чем он ходил обыкновенно, вошел во двор и прямо пошел под сарай к своим лошадям и повозке. Кучер спал; он разбудил его, велел закладывать и вошел в сени. В хозяйской горнице слышался детский плач, надрывающиеся рыдания женщины и гневный, хриплый крик Ферапонтова. Кухарка, как испуганная курица, встрепыхалась в сенях, как только вошел Алпатыч.
– До смерти убил – хозяйку бил!.. Так бил, так волочил!..
– За что? – спросил Алпатыч.
– Ехать просилась. Дело женское! Увези ты, говорит, меня, не погуби ты меня с малыми детьми; народ, говорит, весь уехал, что, говорит, мы то? Как зачал бить. Так бил, так волочил!
Алпатыч как бы одобрительно кивнул головой на эти слова и, не желая более ничего знать, подошел к противоположной – хозяйской двери горницы, в которой оставались его покупки.
– Злодей ты, губитель, – прокричала в это время худая, бледная женщина с ребенком на руках и с сорванным с головы платком, вырываясь из дверей и сбегая по лестнице на двор. Ферапонтов вышел за ней и, увидав Алпатыча, оправил жилет, волосы, зевнул и вошел в горницу за Алпатычем.
– Аль уж ехать хочешь? – спросил он.
Не отвечая на вопрос и не оглядываясь на хозяина, перебирая свои покупки, Алпатыч спросил, сколько за постой следовало хозяину.
– Сочтем! Что ж, у губернатора был? – спросил Ферапонтов. – Какое решение вышло?
Алпатыч отвечал, что губернатор ничего решительно не сказал ему.
– По нашему делу разве увеземся? – сказал Ферапонтов. – Дай до Дорогобужа по семи рублей за подводу. И я говорю: креста на них нет! – сказал он.
– Селиванов, тот угодил в четверг, продал муку в армию по девяти рублей за куль. Что же, чай пить будете? – прибавил он. Пока закладывали лошадей, Алпатыч с Ферапонтовым напились чаю и разговорились о цене хлебов, об урожае и благоприятной погоде для уборки.
– Однако затихать стала, – сказал Ферапонтов, выпив три чашки чая и поднимаясь, – должно, наша взяла. Сказано, не пустят. Значит, сила… А намесь, сказывали, Матвей Иваныч Платов их в реку Марину загнал, тысяч осьмнадцать, что ли, в один день потопил.
Алпатыч собрал свои покупки, передал их вошедшему кучеру, расчелся с хозяином. В воротах прозвучал звук колес, копыт и бубенчиков выезжавшей кибиточки.
Было уже далеко за полдень; половина улицы была в тени, другая была ярко освещена солнцем. Алпатыч взглянул в окно и пошел к двери. Вдруг послышался странный звук дальнего свиста и удара, и вслед за тем раздался сливающийся гул пушечной пальбы, от которой задрожали стекла.
Алпатыч вышел на улицу; по улице пробежали два человека к мосту. С разных сторон слышались свисты, удары ядер и лопанье гранат, падавших в городе. Но звуки эти почти не слышны были и не обращали внимания жителей в сравнении с звуками пальбы, слышными за городом. Это было бомбардирование, которое в пятом часу приказал открыть Наполеон по городу, из ста тридцати орудий. Народ первое время не понимал значения этого бомбардирования.
Звуки падавших гранат и ядер возбуждали сначала только любопытство. Жена Ферапонтова, не перестававшая до этого выть под сараем, умолкла и с ребенком на руках вышла к воротам, молча приглядываясь к народу и прислушиваясь к звукам.
К воротам вышли кухарка и лавочник. Все с веселым любопытством старались увидать проносившиеся над их головами снаряды. Из за угла вышло несколько человек людей, оживленно разговаривая.
– То то сила! – говорил один. – И крышку и потолок так в щепки и разбило.
– Как свинья и землю то взрыло, – сказал другой. – Вот так важно, вот так подбодрил! – смеясь, сказал он. – Спасибо, отскочил, а то бы она тебя смазала.
Народ обратился к этим людям. Они приостановились и рассказывали, как подле самих их ядра попали в дом. Между тем другие снаряды, то с быстрым, мрачным свистом – ядра, то с приятным посвистыванием – гранаты, не переставали перелетать через головы народа; но ни один снаряд не падал близко, все переносило. Алпатыч садился в кибиточку. Хозяин стоял в воротах.
– Чего не видала! – крикнул он на кухарку, которая, с засученными рукавами, в красной юбке, раскачиваясь голыми локтями, подошла к углу послушать то, что рассказывали.
– Вот чуда то, – приговаривала она, но, услыхав голос хозяина, она вернулась, обдергивая подоткнутую юбку.
Опять, но очень близко этот раз, засвистело что то, как сверху вниз летящая птичка, блеснул огонь посередине улицы, выстрелило что то и застлало дымом улицу.
– Злодей, что ж ты это делаешь? – прокричал хозяин, подбегая к кухарке.
В то же мгновение с разных сторон жалобно завыли женщины, испуганно заплакал ребенок и молча столпился народ с бледными лицами около кухарки. Из этой толпы слышнее всех слышались стоны и приговоры кухарки:
– Ой о ох, голубчики мои! Голубчики мои белые! Не дайте умереть! Голубчики мои белые!..
Через пять минут никого не оставалось на улице. Кухарку с бедром, разбитым гранатным осколком, снесли в кухню. Алпатыч, его кучер, Ферапонтова жена с детьми, дворник сидели в подвале, прислушиваясь. Гул орудий, свист снарядов и жалостный стон кухарки, преобладавший над всеми звуками, не умолкали ни на мгновение. Хозяйка то укачивала и уговаривала ребенка, то жалостным шепотом спрашивала у всех входивших в подвал, где был ее хозяин, оставшийся на улице. Вошедший в подвал лавочник сказал ей, что хозяин пошел с народом в собор, где поднимали смоленскую чудотворную икону.
К сумеркам канонада стала стихать. Алпатыч вышел из подвала и остановился в дверях. Прежде ясное вечера нее небо все было застлано дымом. И сквозь этот дым странно светил молодой, высоко стоящий серп месяца. После замолкшего прежнего страшного гула орудий над городом казалась тишина, прерываемая только как бы распространенным по всему городу шелестом шагов, стонов, дальних криков и треска пожаров. Стоны кухарки теперь затихли. С двух сторон поднимались и расходились черные клубы дыма от пожаров. На улице не рядами, а как муравьи из разоренной кочки, в разных мундирах и в разных направлениях, проходили и пробегали солдаты. В глазах Алпатыча несколько из них забежали на двор Ферапонтова. Алпатыч вышел к воротам. Какой то полк, теснясь и спеша, запрудил улицу, идя назад.
– Сдают город, уезжайте, уезжайте, – сказал ему заметивший его фигуру офицер и тут же обратился с криком к солдатам:
– Я вам дам по дворам бегать! – крикнул он.
Алпатыч вернулся в избу и, кликнув кучера, велел ему выезжать. Вслед за Алпатычем и за кучером вышли и все домочадцы Ферапонтова. Увидав дым и даже огни пожаров, видневшиеся теперь в начинавшихся сумерках, бабы, до тех пор молчавшие, вдруг заголосили, глядя на пожары. Как бы вторя им, послышались такие же плачи на других концах улицы. Алпатыч с кучером трясущимися руками расправлял запутавшиеся вожжи и постромки лошадей под навесом.
Когда Алпатыч выезжал из ворот, он увидал, как в отпертой лавке Ферапонтова человек десять солдат с громким говором насыпали мешки и ранцы пшеничной мукой и подсолнухами. В то же время, возвращаясь с улицы в лавку, вошел Ферапонтов. Увидав солдат, он хотел крикнуть что то, но вдруг остановился и, схватившись за волоса, захохотал рыдающим хохотом.
– Тащи всё, ребята! Не доставайся дьяволам! – закричал он, сам хватая мешки и выкидывая их на улицу. Некоторые солдаты, испугавшись, выбежали, некоторые продолжали насыпать. Увидав Алпатыча, Ферапонтов обратился к нему.
– Решилась! Расея! – крикнул он. – Алпатыч! решилась! Сам запалю. Решилась… – Ферапонтов побежал на двор.
По улице, запружая ее всю, непрерывно шли солдаты, так что Алпатыч не мог проехать и должен был дожидаться. Хозяйка Ферапонтова с детьми сидела также на телеге, ожидая того, чтобы можно было выехать.
Была уже совсем ночь. На небе были звезды и светился изредка застилаемый дымом молодой месяц. На спуске к Днепру повозки Алпатыча и хозяйки, медленно двигавшиеся в рядах солдат и других экипажей, должны были остановиться. Недалеко от перекрестка, у которого остановились повозки, в переулке, горели дом и лавки. Пожар уже догорал. Пламя то замирало и терялось в черном дыме, то вдруг вспыхивало ярко, до странности отчетливо освещая лица столпившихся людей, стоявших на перекрестке. Перед пожаром мелькали черные фигуры людей, и из за неумолкаемого треска огня слышались говор и крики. Алпатыч, слезший с повозки, видя, что повозку его еще не скоро пропустят, повернулся в переулок посмотреть пожар. Солдаты шныряли беспрестанно взад и вперед мимо пожара, и Алпатыч видел, как два солдата и с ними какой то человек во фризовой шинели тащили из пожара через улицу на соседний двор горевшие бревна; другие несли охапки сена.
Алпатыч подошел к большой толпе людей, стоявших против горевшего полным огнем высокого амбара. Стены были все в огне, задняя завалилась, крыша тесовая обрушилась, балки пылали. Очевидно, толпа ожидала той минуты, когда завалится крыша. Этого же ожидал Алпатыч.
– Алпатыч! – вдруг окликнул старика чей то знакомый голос.
– Батюшка, ваше сиятельство, – отвечал Алпатыч, мгновенно узнав голос своего молодого князя.
Князь Андрей, в плаще, верхом на вороной лошади, стоял за толпой и смотрел на Алпатыча.
– Ты как здесь? – спросил он.
– Ваше… ваше сиятельство, – проговорил Алпатыч и зарыдал… – Ваше, ваше… или уж пропали мы? Отец…
– Как ты здесь? – повторил князь Андрей.
Пламя ярко вспыхнуло в эту минуту и осветило Алпатычу бледное и изнуренное лицо его молодого барина. Алпатыч рассказал, как он был послан и как насилу мог уехать.
– Что же, ваше сиятельство, или мы пропали? – спросил он опять.
Князь Андрей, не отвечая, достал записную книжку и, приподняв колено, стал писать карандашом на вырванном листе. Он писал сестре:
«Смоленск сдают, – писал он, – Лысые Горы будут заняты неприятелем через неделю. Уезжайте сейчас в Москву. Отвечай мне тотчас, когда вы выедете, прислав нарочного в Усвяж».
Написав и передав листок Алпатычу, он на словах передал ему, как распорядиться отъездом князя, княжны и сына с учителем и как и куда ответить ему тотчас же. Еще не успел он окончить эти приказания, как верховой штабный начальник, сопутствуемый свитой, подскакал к нему.
– Вы полковник? – кричал штабный начальник, с немецким акцентом, знакомым князю Андрею голосом. – В вашем присутствии зажигают дома, а вы стоите? Что это значит такое? Вы ответите, – кричал Берг, который был теперь помощником начальника штаба левого фланга пехотных войск первой армии, – место весьма приятное и на виду, как говорил Берг.
Князь Андрей посмотрел на него и, не отвечая, продолжал, обращаясь к Алпатычу:
– Так скажи, что до десятого числа жду ответа, а ежели десятого не получу известия, что все уехали, я сам должен буду все бросить и ехать в Лысые Горы.
– Я, князь, только потому говорю, – сказал Берг, узнав князя Андрея, – что я должен исполнять приказания, потому что я всегда точно исполняю… Вы меня, пожалуйста, извините, – в чем то оправдывался Берг.
Что то затрещало в огне. Огонь притих на мгновенье; черные клубы дыма повалили из под крыши. Еще страшно затрещало что то в огне, и завалилось что то огромное.
– Урруру! – вторя завалившемуся потолку амбара, из которого несло запахом лепешек от сгоревшего хлеба, заревела толпа. Пламя вспыхнуло и осветило оживленно радостные и измученные лица людей, стоявших вокруг пожара.
Человек во фризовой шинели, подняв кверху руку, кричал:
– Важно! пошла драть! Ребята, важно!..
– Это сам хозяин, – послышались голоса.
– Так, так, – сказал князь Андрей, обращаясь к Алпатычу, – все передай, как я тебе говорил. – И, ни слова не отвечая Бергу, замолкшему подле него, тронул лошадь и поехал в переулок.


От Смоленска войска продолжали отступать. Неприятель шел вслед за ними. 10 го августа полк, которым командовал князь Андрей, проходил по большой дороге, мимо проспекта, ведущего в Лысые Горы. Жара и засуха стояли более трех недель. Каждый день по небу ходили курчавые облака, изредка заслоняя солнце; но к вечеру опять расчищало, и солнце садилось в буровато красную мглу. Только сильная роса ночью освежала землю. Остававшиеся на корню хлеба сгорали и высыпались. Болота пересохли. Скотина ревела от голода, не находя корма по сожженным солнцем лугам. Только по ночам и в лесах пока еще держалась роса, была прохлада. Но по дороге, по большой дороге, по которой шли войска, даже и ночью, даже и по лесам, не было этой прохлады. Роса не заметна была на песочной пыли дороги, встолченной больше чем на четверть аршина. Как только рассветало, начиналось движение. Обозы, артиллерия беззвучно шли по ступицу, а пехота по щиколку в мягкой, душной, не остывшей за ночь, жаркой пыли. Одна часть этой песочной пыли месилась ногами и колесами, другая поднималась и стояла облаком над войском, влипая в глаза, в волоса, в уши, в ноздри и, главное, в легкие людям и животным, двигавшимся по этой дороге. Чем выше поднималось солнце, тем выше поднималось облако пыли, и сквозь эту тонкую, жаркую пыль на солнце, не закрытое облаками, можно было смотреть простым глазом. Солнце представлялось большим багровым шаром. Ветра не было, и люди задыхались в этой неподвижной атмосфере. Люди шли, обвязавши носы и рты платками. Приходя к деревне, все бросалось к колодцам. Дрались за воду и выпивали ее до грязи.
Князь Андрей командовал полком, и устройство полка, благосостояние его людей, необходимость получения и отдачи приказаний занимали его. Пожар Смоленска и оставление его были эпохой для князя Андрея. Новое чувство озлобления против врага заставляло его забывать свое горе. Он весь был предан делам своего полка, он был заботлив о своих людях и офицерах и ласков с ними. В полку его называли наш князь, им гордились и его любили. Но добр и кроток он был только с своими полковыми, с Тимохиным и т. п., с людьми совершенно новыми и в чужой среде, с людьми, которые не могли знать и понимать его прошедшего; но как только он сталкивался с кем нибудь из своих прежних, из штабных, он тотчас опять ощетинивался; делался злобен, насмешлив и презрителен. Все, что связывало его воспоминание с прошедшим, отталкивало его, и потому он старался в отношениях этого прежнего мира только не быть несправедливым и исполнять свой долг.
Правда, все в темном, мрачном свете представлялось князю Андрею – особенно после того, как оставили Смоленск (который, по его понятиям, можно и должно было защищать) 6 го августа, и после того, как отец, больной, должен был бежать в Москву и бросить на расхищение столь любимые, обстроенные и им населенные Лысые Горы; но, несмотря на то, благодаря полку князь Андрей мог думать о другом, совершенно независимом от общих вопросов предмете – о своем полку. 10 го августа колонна, в которой был его полк, поравнялась с Лысыми Горами. Князь Андрей два дня тому назад получил известие, что его отец, сын и сестра уехали в Москву. Хотя князю Андрею и нечего было делать в Лысых Горах, он, с свойственным ему желанием растравить свое горе, решил, что он должен заехать в Лысые Горы.
Он велел оседлать себе лошадь и с перехода поехал верхом в отцовскую деревню, в которой он родился и провел свое детство. Проезжая мимо пруда, на котором всегда десятки баб, переговариваясь, били вальками и полоскали свое белье, князь Андрей заметил, что на пруде никого не было, и оторванный плотик, до половины залитый водой, боком плавал посредине пруда. Князь Андрей подъехал к сторожке. У каменных ворот въезда никого не было, и дверь была отперта. Дорожки сада уже заросли, и телята и лошади ходили по английскому парку. Князь Андрей подъехал к оранжерее; стекла были разбиты, и деревья в кадках некоторые повалены, некоторые засохли. Он окликнул Тараса садовника. Никто не откликнулся. Обогнув оранжерею на выставку, он увидал, что тесовый резной забор весь изломан и фрукты сливы обдерганы с ветками. Старый мужик (князь Андрей видал его у ворот в детстве) сидел и плел лапоть на зеленой скамеечке.
Он был глух и не слыхал подъезда князя Андрея. Он сидел на лавке, на которой любил сиживать старый князь, и около него было развешено лычко на сучках обломанной и засохшей магнолии.
Князь Андрей подъехал к дому. Несколько лип в старом саду были срублены, одна пегая с жеребенком лошадь ходила перед самым домом между розанами. Дом был заколочен ставнями. Одно окно внизу было открыто. Дворовый мальчик, увидав князя Андрея, вбежал в дом.
Алпатыч, услав семью, один оставался в Лысых Горах; он сидел дома и читал Жития. Узнав о приезде князя Андрея, он, с очками на носу, застегиваясь, вышел из дома, поспешно подошел к князю и, ничего не говоря, заплакал, целуя князя Андрея в коленку.
Потом он отвернулся с сердцем на свою слабость и стал докладывать ему о положении дел. Все ценное и дорогое было отвезено в Богучарово. Хлеб, до ста четвертей, тоже был вывезен; сено и яровой, необыкновенный, как говорил Алпатыч, урожай нынешнего года зеленым взят и скошен – войсками. Мужики разорены, некоторый ушли тоже в Богучарово, малая часть остается.
Князь Андрей, не дослушав его, спросил, когда уехали отец и сестра, разумея, когда уехали в Москву. Алпатыч отвечал, полагая, что спрашивают об отъезде в Богучарово, что уехали седьмого, и опять распространился о долах хозяйства, спрашивая распоряжении.
– Прикажете ли отпускать под расписку командам овес? У нас еще шестьсот четвертей осталось, – спрашивал Алпатыч.
«Что отвечать ему? – думал князь Андрей, глядя на лоснеющуюся на солнце плешивую голову старика и в выражении лица его читая сознание того, что он сам понимает несвоевременность этих вопросов, но спрашивает только так, чтобы заглушить и свое горе.
– Да, отпускай, – сказал он.
– Ежели изволили заметить беспорядки в саду, – говорил Алпатыч, – то невозмежио было предотвратить: три полка проходили и ночевали, в особенности драгуны. Я выписал чин и звание командира для подачи прошения.
– Ну, что ж ты будешь делать? Останешься, ежели неприятель займет? – спросил его князь Андрей.
Алпатыч, повернув свое лицо к князю Андрею, посмотрел на него; и вдруг торжественным жестом поднял руку кверху.
– Он мой покровитель, да будет воля его! – проговорил он.
Толпа мужиков и дворовых шла по лугу, с открытыми головами, приближаясь к князю Андрею.
– Ну прощай! – сказал князь Андрей, нагибаясь к Алпатычу. – Уезжай сам, увози, что можешь, и народу вели уходить в Рязанскую или в Подмосковную. – Алпатыч прижался к его ноге и зарыдал. Князь Андрей осторожно отодвинул его и, тронув лошадь, галопом поехал вниз по аллее.
На выставке все так же безучастно, как муха на лице дорогого мертвеца, сидел старик и стукал по колодке лаптя, и две девочки со сливами в подолах, которые они нарвали с оранжерейных деревьев, бежали оттуда и наткнулись на князя Андрея. Увидав молодого барина, старшая девочка, с выразившимся на лице испугом, схватила за руку свою меньшую товарку и с ней вместе спряталась за березу, не успев подобрать рассыпавшиеся зеленые сливы.
Князь Андрей испуганно поспешно отвернулся от них, боясь дать заметить им, что он их видел. Ему жалко стало эту хорошенькую испуганную девочку. Он боялся взглянуть на нее, по вместе с тем ему этого непреодолимо хотелось. Новое, отрадное и успокоительное чувство охватило его, когда он, глядя на этих девочек, понял существование других, совершенно чуждых ему и столь же законных человеческих интересов, как и те, которые занимали его. Эти девочки, очевидно, страстно желали одного – унести и доесть эти зеленые сливы и не быть пойманными, и князь Андрей желал с ними вместе успеха их предприятию. Он не мог удержаться, чтобы не взглянуть на них еще раз. Полагая себя уже в безопасности, они выскочили из засады и, что то пища тоненькими голосками, придерживая подолы, весело и быстро бежали по траве луга своими загорелыми босыми ножонками.
Князь Андрей освежился немного, выехав из района пыли большой дороги, по которой двигались войска. Но недалеко за Лысыми Горами он въехал опять на дорогу и догнал свой полк на привале, у плотины небольшого пруда. Был второй час после полдня. Солнце, красный шар в пыли, невыносимо пекло и жгло спину сквозь черный сюртук. Пыль, все такая же, неподвижно стояла над говором гудевшими, остановившимися войсками. Ветру не было, В проезд по плотине на князя Андрея пахнуло тиной и свежестью пруда. Ему захотелось в воду – какая бы грязная она ни была. Он оглянулся на пруд, с которого неслись крики и хохот. Небольшой мутный с зеленью пруд, видимо, поднялся четверти на две, заливая плотину, потому что он был полон человеческими, солдатскими, голыми барахтавшимися в нем белыми телами, с кирпично красными руками, лицами и шеями. Все это голое, белое человеческое мясо с хохотом и гиком барахталось в этой грязной луже, как караси, набитые в лейку. Весельем отзывалось это барахтанье, и оттого оно особенно было грустно.
Один молодой белокурый солдат – еще князь Андрей знал его – третьей роты, с ремешком под икрой, крестясь, отступал назад, чтобы хорошенько разбежаться и бултыхнуться в воду; другой, черный, всегда лохматый унтер офицер, по пояс в воде, подергивая мускулистым станом, радостно фыркал, поливая себе голову черными по кисти руками. Слышалось шлепанье друг по другу, и визг, и уханье.
На берегах, на плотине, в пруде, везде было белое, здоровое, мускулистое мясо. Офицер Тимохин, с красным носиком, обтирался на плотине и застыдился, увидав князя, однако решился обратиться к нему:
– То то хорошо, ваше сиятельство, вы бы изволили! – сказал он.
– Грязно, – сказал князь Андрей, поморщившись.
– Мы сейчас очистим вам. – И Тимохин, еще не одетый, побежал очищать.
– Князь хочет.
– Какой? Наш князь? – заговорили голоса, и все заторопились так, что насилу князь Андрей успел их успокоить. Он придумал лучше облиться в сарае.
«Мясо, тело, chair a canon [пушечное мясо]! – думал он, глядя и на свое голое тело, и вздрагивая не столько от холода, сколько от самому ему непонятного отвращения и ужаса при виде этого огромного количества тел, полоскавшихся в грязном пруде.
7 го августа князь Багратион в своей стоянке Михайловке на Смоленской дороге писал следующее:
«Милостивый государь граф Алексей Андреевич.
(Он писал Аракчееву, но знал, что письмо его будет прочтено государем, и потому, насколько он был к тому способен, обдумывал каждое свое слово.)
Я думаю, что министр уже рапортовал об оставлении неприятелю Смоленска. Больно, грустно, и вся армия в отчаянии, что самое важное место понапрасну бросили. Я, с моей стороны, просил лично его убедительнейшим образом, наконец и писал; но ничто его не согласило. Я клянусь вам моею честью, что Наполеон был в таком мешке, как никогда, и он бы мог потерять половину армии, но не взять Смоленска. Войска наши так дрались и так дерутся, как никогда. Я удержал с 15 тысячами более 35 ти часов и бил их; но он не хотел остаться и 14 ти часов. Это стыдно, и пятно армии нашей; а ему самому, мне кажется, и жить на свете не должно. Ежели он доносит, что потеря велика, – неправда; может быть, около 4 тысяч, не более, но и того нет. Хотя бы и десять, как быть, война! Но зато неприятель потерял бездну…
Что стоило еще оставаться два дни? По крайней мере, они бы сами ушли; ибо не имели воды напоить людей и лошадей. Он дал слово мне, что не отступит, но вдруг прислал диспозицию, что он в ночь уходит. Таким образом воевать не можно, и мы можем неприятеля скоро привести в Москву…
Слух носится, что вы думаете о мире. Чтобы помириться, боже сохрани! После всех пожертвований и после таких сумасбродных отступлений – мириться: вы поставите всю Россию против себя, и всякий из нас за стыд поставит носить мундир. Ежели уже так пошло – надо драться, пока Россия может и пока люди на ногах…
Надо командовать одному, а не двум. Ваш министр, может, хороший по министерству; но генерал не то что плохой, но дрянной, и ему отдали судьбу всего нашего Отечества… Я, право, с ума схожу от досады; простите мне, что дерзко пишу. Видно, тот не любит государя и желает гибели нам всем, кто советует заключить мир и командовать армиею министру. Итак, я пишу вам правду: готовьте ополчение. Ибо министр самым мастерским образом ведет в столицу за собою гостя. Большое подозрение подает всей армии господин флигель адъютант Вольцоген. Он, говорят, более Наполеона, нежели наш, и он советует все министру. Я не токмо учтив против него, но повинуюсь, как капрал, хотя и старее его. Это больно; но, любя моего благодетеля и государя, – повинуюсь. Только жаль государя, что вверяет таким славную армию. Вообразите, что нашею ретирадою мы потеряли людей от усталости и в госпиталях более 15 тысяч; а ежели бы наступали, того бы не было. Скажите ради бога, что наша Россия – мать наша – скажет, что так страшимся и за что такое доброе и усердное Отечество отдаем сволочам и вселяем в каждого подданного ненависть и посрамление. Чего трусить и кого бояться?. Я не виноват, что министр нерешим, трус, бестолков, медлителен и все имеет худые качества. Вся армия плачет совершенно и ругают его насмерть…»


В числе бесчисленных подразделений, которые можно сделать в явлениях жизни, можно подразделить их все на такие, в которых преобладает содержание, другие – в которых преобладает форма. К числу таковых, в противоположность деревенской, земской, губернской, даже московской жизни, можно отнести жизнь петербургскую, в особенности салонную. Эта жизнь неизменна.
С 1805 года мы мирились и ссорились с Бонапартом, мы делали конституции и разделывали их, а салон Анны Павловны и салон Элен были точно такие же, какие они были один семь лет, другой пять лет тому назад. Точно так же у Анны Павловны говорили с недоумением об успехах Бонапарта и видели, как в его успехах, так и в потакании ему европейских государей, злостный заговор, имеющий единственной целью неприятность и беспокойство того придворного кружка, которого представительницей была Анна Павловна. Точно так же у Элен, которую сам Румянцев удостоивал своим посещением и считал замечательно умной женщиной, точно так же как в 1808, так и в 1812 году с восторгом говорили о великой нации и великом человеке и с сожалением смотрели на разрыв с Францией, который, по мнению людей, собиравшихся в салоне Элен, должен был кончиться миром.
В последнее время, после приезда государя из армии, произошло некоторое волнение в этих противоположных кружках салонах и произведены были некоторые демонстрации друг против друга, но направление кружков осталось то же. В кружок Анны Павловны принимались из французов только закоренелые легитимисты, и здесь выражалась патриотическая мысль о том, что не надо ездить во французский театр и что содержание труппы стоит столько же, сколько содержание целого корпуса. За военными событиями следилось жадно, и распускались самые выгодные для нашей армии слухи. В кружке Элен, румянцевском, французском, опровергались слухи о жестокости врага и войны и обсуживались все попытки Наполеона к примирению. В этом кружке упрекали тех, кто присоветывал слишком поспешные распоряжения о том, чтобы приготавливаться к отъезду в Казань придворным и женским учебным заведениям, находящимся под покровительством императрицы матери. Вообще все дело войны представлялось в салоне Элен пустыми демонстрациями, которые весьма скоро кончатся миром, и царствовало мнение Билибина, бывшего теперь в Петербурге и домашним у Элен (всякий умный человек должен был быть у нее), что не порох, а те, кто его выдумали, решат дело. В этом кружке иронически и весьма умно, хотя весьма осторожно, осмеивали московский восторг, известие о котором прибыло вместе с государем в Петербург.
В кружке Анны Павловны, напротив, восхищались этими восторгами и говорили о них, как говорит Плутарх о древних. Князь Василий, занимавший все те же важные должности, составлял звено соединения между двумя кружками. Он ездил к ma bonne amie [своему достойному другу] Анне Павловне и ездил dans le salon diplomatique de ma fille [в дипломатический салон своей дочери] и часто, при беспрестанных переездах из одного лагеря в другой, путался и говорил у Анны Павловны то, что надо было говорить у Элен, и наоборот.
Вскоре после приезда государя князь Василий разговорился у Анны Павловны о делах войны, жестоко осуждая Барклая де Толли и находясь в нерешительности, кого бы назначить главнокомандующим. Один из гостей, известный под именем un homme de beaucoup de merite [человек с большими достоинствами], рассказав о том, что он видел нынче выбранного начальником петербургского ополчения Кутузова, заседающего в казенной палате для приема ратников, позволил себе осторожно выразить предположение о том, что Кутузов был бы тот человек, который удовлетворил бы всем требованиям.
Анна Павловна грустно улыбнулась и заметила, что Кутузов, кроме неприятностей, ничего не дал государю.
– Я говорил и говорил в Дворянском собрании, – перебил князь Василий, – но меня не послушали. Я говорил, что избрание его в начальники ополчения не понравится государю. Они меня не послушали.
– Все какая то мания фрондировать, – продолжал он. – И пред кем? И все оттого, что мы хотим обезьянничать глупым московским восторгам, – сказал князь Василий, спутавшись на минуту и забыв то, что у Элен надо было подсмеиваться над московскими восторгами, а у Анны Павловны восхищаться ими. Но он тотчас же поправился. – Ну прилично ли графу Кутузову, самому старому генералу в России, заседать в палате, et il en restera pour sa peine! [хлопоты его пропадут даром!] Разве возможно назначить главнокомандующим человека, который не может верхом сесть, засыпает на совете, человека самых дурных нравов! Хорошо он себя зарекомендовал в Букарещте! Я уже не говорю о его качествах как генерала, но разве можно в такую минуту назначать человека дряхлого и слепого, просто слепого? Хорош будет генерал слепой! Он ничего не видит. В жмурки играть… ровно ничего не видит!
Никто не возражал на это.
24 го июля это было совершенно справедливо. Но 29 июля Кутузову пожаловано княжеское достоинство. Княжеское достоинство могло означать и то, что от него хотели отделаться, – и потому суждение князя Василья продолжало быть справедливо, хотя он и не торопился ого высказывать теперь. Но 8 августа был собран комитет из генерал фельдмаршала Салтыкова, Аракчеева, Вязьмитинова, Лопухина и Кочубея для обсуждения дел войны. Комитет решил, что неудачи происходили от разноначалий, и, несмотря на то, что лица, составлявшие комитет, знали нерасположение государя к Кутузову, комитет, после короткого совещания, предложил назначить Кутузова главнокомандующим. И в тот же день Кутузов был назначен полномочным главнокомандующим армий и всего края, занимаемого войсками.
9 го августа князь Василий встретился опять у Анны Павловны с l'homme de beaucoup de merite [человеком с большими достоинствами]. L'homme de beaucoup de merite ухаживал за Анной Павловной по случаю желания назначения попечителем женского учебного заведения императрицы Марии Федоровны. Князь Василий вошел в комнату с видом счастливого победителя, человека, достигшего цели своих желаний.