Полиморфизм (информатика)

Поделись знанием:
Перейти к: навигация, поиск
Парадигмы программирования
 • Императивная
(контрастирует с декларативной)
Процедурная
Структурная
Аспектно-ориентированная
Объектно-ориентированная
Агентно-ориентированная
Компонентно-ориентированная
Прототипно-ориентированная
Обобщённое программирование

 • Декларативная
(контрастирует с императивной)

Чистота языка
Чистота функции
Функциональная
В терминах Рефал-машины
Аппликативная
Комбинаторная
Бесточечная
(чистая конкатенативная)
Логическая
Ограничениями

 • Конкатенативная
 • Векторная[en]
 • Метапрограммирование

Языково-ориентированная
Предметно-ориентированная
Пользователями[en]
Автоматизация процесса программирования
Рефлексивность
Гомоиконность[en]

 • Связанные темы

Программирование в крупном и мелком масштабе[en]
Модульность
Полиморфизм
Продолжения и CPS
Параллелизм и конкурентность

 • Методы и алгоритмы

Автоматное
Динамическое
Потоков данных
Событийно-ориентированное
Реактивное
Сервис-ориентированное

В языках программирования и теории типов полиморфизмом называется способность функции обрабатывать данные разных типов[1][2][3].

Существует несколько разновидностей полиморфизма. Две наиболее различных из них были описаны Кристофером Стрэчи[en] в 1967 году: это ad hoc полиморфизм>>> и параметрический полиморфизм>>>.

Параметрический полиморфизм подразумевает исполнение одного и того же кода для всех допустимых типов аргументов, тогда как ad hoc полиморфизм подразумевает исполнение потенциально разного кода для каждого типа или подтипа аргумента.

Определение полиморфизма как «один интерфейс — много реализаций», популяризованное Бьерном Страуструпом[4], относится к ad hoc полиморфизму, но в действительности, ad hoc полиморфизм не является истинным полиморфизмом[5]>>>.





Общие сведения

Полиморфизм является фундаментальным свойством системы типов. Различают[6] статическую неполиморфную типизацию (потомки Алгола и BCPL), динамическую типизацию (потомки Lisp, Smalltalk, APL) и статическую полиморфную типизацию (потомки ML). Использование ad hoc полиморфизма наиболее характерно для неполиморфной типизации. Параметрический полиморфизм и динамическая типизация намного существеннее, чем ad hoc полиморфизм, повышают коэффициент повторного использования кода, поскольку определенная единственный раз функция реализует без дублирования заданное поведение для бесконечного множества вновь определяемых типов, удовлетворяющих требуемым в функции условиям. С другой стороны, временами возникает необходимость обеспечить различное поведение функции в зависимости от типа параметра, и тогда необходимым оказывается специальный полиморфизм.

Параметрический полиморфизм>>> является синонимом абстракции типа[7]. Он повсеместно используется в функциональном программировании, где он обычно обозначается просто как «полиморфизм».

В сообществе объектно-ориентированного программирования под термином «полиморфизм» обычно подразумевают наследование, а использование параметрического полиморфизма называют обобщённым программированием[8], или иногда «статическим полиморфизмом».

Классификация

Впервые классификацию разновидностей полиморфизма осуществил Кристофер Стрэчи[en]>>>.

Если параметру функции сопоставлен ровно один тип, то такая функция называется мономорфной. Многие языки программирования предоставляют синтаксический механизм для назначения нескольким мономорфным функциям единого имени (идентификатора). В этом случае, в исходном коде становится возможным осуществлять вызов функции с фактическими параметрами разных типов, но в скомпилированном коде фактически происходит вызов различных функций (см. перегрузка процедур и функций). Стрэчи[en] назвал такую возможность «ad hoc полиморфизмом»>>>.

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

В дальнейшем классификацию уточнил Лука Карделли[en][9], выделив четыре разновидности полиморфизма:

Джон Митчел[10] выделяет три разновидности полиморфизма как независимые: параметрический>>>, ad hoc>>> и подтипов>>>[11].

Латинский фразеологизм «ad hoc» (буквально «к случаю») имеет двойственное значение:

  • 1) спонтанный, непродуманный, сделанный «на коленке»
  • 2) специальный, устроенный конкретно для данной цели или данного случая

Двойственность содержания термина «ad hoc полиморфизм» долгие годы была заслуженной[12]. Стрэчи выбрал этот термин, руководствуясь первым значением — в работе он подчеркивает, что при ad hoc полиморфизме нет единого систематичного способа вывести тип результата из типа аргументов, и хотя возможно построение определённого набора правил для сужения спектра его поиска, но эти правила по своей природе являются спонтанными как по содержанию, так и по контексту применения[1].

Действительно, ad hoc полиморфизм не является истинным полиморфизмом[5]. Перегрузка функций даёт не «значение, имеющее множество типов», а «символ, имеющий множество типов», но значения, идентифицируемые этим символом, имеют разные (потенциально не совместимые) типы. Аналогично, приведение типов не является истинным полиморфизмом: кажется, будто оператор принимает значения множества типов, но значения должны быть преобразованы к некоторому представлению до того, как он сможет их использовать, так что на самом деле оператор работает лишь над одним типом (то есть имеет один тип). Более того, тип возвращаемого значения здесь не зависит от типа входного параметра, как в случае параметрического полиморфизма.

Тем не менее, определение специальных реализаций функций для разных типов в некоторых случаях является необходимостью, а не случайностью. Классическими примерами служат реализация арифметических операций (физически различная для целых и чисел с плавающей запятой) и равенства типов[en], которые на протяжении десятилетий не имели общепринятой универсальной формализации. Решением стали классы типов>>>, представляющие собой механизм явного дискретного перечисления допустимых значений переменных типа для статической диспетчеризации в слое типов. Они сводят воедино две разновидности полиморфизма, разделённые Стречи, «делая ad hoc полиморфизм менее ad hoc»[12] (игра на двойственности смысла). Дальнейшее обобщение классов типов привело к построению теории квалифицированных типов, единообразно формализующей самые экзотичные системы типов, включая расширяемые записи>>> и подтипы.

В отличие от перегрузки и приведения типов, полиморфизм подтипов[en]>>> является истинным полиморфизмом: объектами подтипа можно манипулировать единообразно, как если бы они они принадлежали к своим супертипам (но сказанное не верно для языков, реализующих «полиморфизм при наследовании» посредством приведения типов и перегрузки функций, как в случае С++). Наиболее чистым является параметрический полиморфизм>>>: один и тот же объект или функция может единообразно использоваться в разных контекстах типизации без изменений, приведений типов или любых других проверок времени исполнения или преобразований. Однако, для этого требуется некое единообразное представление данных (например, посредством указателей).[13]

Основные разновидности полиморфизма

Ad hoc полиморфизм

Ad hoc полиморфизм (в русской литературе чаще всего переводится как «специальный полиморфизм» или «специализированный полиморфизм», хотя оба варианта не всегда верны>>>) поддерживается во многих языках посредством перегрузки функций и методов, а в слабо типизированных — также посредством приведения типов.

В следующем примере (язык Pascal) функции Add выглядят как реализующие одну и ту же функциональность над разными типами, но компилятор определяет их как две совершенно разные функции.

program Adhoc;

function Add( x, y : Integer ) : Integer;
begin
    Add := x + y
end;

function Add( s, t : String ) : String;
begin
    Add := Concat( s, t )
end;

begin
    Writeln(Add(1, 2));
    Writeln(Add('Hello, ', 'World!'));
end.

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

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

Приведение типов представляет собой семантический механизм, осуществляемый для преобразования фактического типа аргумента к ожидаемому функцией, при отсутствии которого произошла бы ошибка типизации. То есть, при вызове функции с приведением типа происходит исполнение различного кода для различных типов (предваряющего вызов самой функции)[14].

Параметрический полиморфизм

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

Развитые системы типов (такие как Хиндли — Милнер) предоставляют механизмы для определения полиморфных типов, что делает использование полиморфных функций более удобным и обеспечивает статическую типобезопасность. Такие системы являются системами типов второго порядка, добавляющими к системам типов первого порядка (используемым в большинстве процедурных языков) параметризацию типов (посредством ти́повой переменной) и абстракцию типов (посредством экзистенциальной квантификации над ними). В системах типов второго порядка нет непосредственной необходимости в поддержке примитивных типов, так как они могут быть выражены посредством более развитых средств.[15]

Классическим примером полиморфного типа служит список элементов произвольного типа, для которого во многих языках, типизируемых по Хиндли — Милнеру (большинство статически типизируемых функциональных языков программирования), предоставляется синтаксический сахар. Следующий пример демонстрирует определение нового алгебраического типа «параметрически полиморфный список» и двух функций над ним:

data List a = Nil | Cons a (List a)

length :: List a -> Integer
length Nil = 0
length (Cons x xs) = 1 + length xs

map :: (a -> b) -> List a -> List b
map f Nil = Nil
map f (Cons x xs) = Cons (f x) (map f xs)

При подстановке в ти́повую переменную a конкретных типов Int, String и т. д. будут построены, соответственно, конкретные типы List Int, List String и т. д. Эти конкретные типы, в свою очередь, снова могут быть подставлены в эту ти́повую переменную, порождая типы List List String, List (Int, List String) и т. д. При этом для всех объектов всех построенных типов будет использоваться одна и та же физическая реализация функций length и map.

Ограниченные формы параметрического полиморфизма доступны также в некоторых императивных (в частности, объектно-ориентированных) языках программирования, где для его обозначения обычно используется термин «обобщённое программирование». В частности, в языке Си нетипизированный параметрический полиморфизм традиционно обеспечивается за счёт использования нетипизированного указателя void*, хотя возможна и типизированная форма. Использование шаблонов C++ внешне похоже на параметрический полиморфизм, но семантически реализуется сочетанием ad hoc-механизмов; в сообществе С++ его называют «статическим полиморфизмом» (для противопоставления «динамическому полиморфизму»>>>).

Параметричность

Формализация параметрического полиморфизма ведёт к понятию параметричности[en], состоящему в возможности предсказывать поведение программ, глядя только на их типы. Например, если функция имеет тип «forall a. a -> a», то без каких-либо дополняющих язык внешних средств можно доказать, что она может быть только тождественной. Поэтому параметричность часто сопровождается лозунгом «теоремы забесплатно» (англ. theorems for free).[16][17][18]

Важным следствием этого является также независимость представлений (англ. representation independence), означающее, что функции над абстрактным типом нечувствительны к его структуре, и различные реализации этого типа могут свободно подменять друг друга (даже в рамках одной программы), не влияя на поведение этих функций[19].

Наиболее развитые параметрически полиморфные системы (см. лямбда-куб, зависимые типы) доводят идею параметричности[en] до возможности полного доказательства корректности программ: они позволяют записывать программы, которые верны по построению, так что прохождение проверки согласования типов само по себе даёт гарантию, что поведение программы соответствует ожидаемому[20].

Полиморфизм записей и вариантов

Отдельную проблему представляет распространение параметрического полиморфизма на агрегатные типы: размеченные произведения типов (традиционно называемые записями) и размеченные суммы типов (также известные как вариантные типы[en]). Различные «исчисления записей» (англ. record calculi) служат формальной базой для объектно-ориентированного и модульного программирования[21].

val r = {a = 1, b = true, c = "hello"}
val {a = n, ... = r1} = r
val r2 = {d = 3.14, ... = r1}

Многоточие означает некоторый ряд типизированных полей, т.е. абстракцию кода от конкретных типов записей, которые могли бы здесь обрабатываться (причём «длина» этого ряда также может варьироваться). Компиляция полиморфного обращения к полям, которые могут располагаться в разном порядке в разных записях, представляет сложную проблему, как с точки зрения контроля безопасности операций на уровне языка, так и с точки зрения быстродействия на уровне машинного кода. Наивным решением может быть динамический поиск по словарю при каждом обращении (и скриптовые языки его применяют), однако, очевидно, что это чрезвычайно неэффективно. Эта проблема активно исследуется на протяжении уже нескольких десятилетий; построено множество теоретических моделей и практичных систем на их основе, различающихся по выразительной мощности и метатеоретической сложности. Важнейшими достижениями в этой области считаются рядный полиморфизм, предложенный Митчелом Вандом (Mitchell Wand  (англ.)), и полиморфное исчисление записей, построенное Атсуши Охори (англ. Atsushi Ohori). Более распространённой, но отстающей по многим характеристикам моделью является подтипизация на записях>>>.

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

Полиморфизм подтипов

Полиморфизм включения (inclusion polymorphism) является обобщённой формализацией подтипизации[en] и наследования[9]. Эти понятия не следует путать: подтипы[en] определяют отношения на уровне интерфейсов, тогда как наследование определяет отношения на уровне реализации[22].

Подтипизация (subtyping), или полиморфизм подтипов (subtype polymorphism), означает, что поведение параметрически полиморфной>>> функции ограничивается множеством типов, ограниченных в иерархию «супертип — подтип»[23][9][24]. Например, если имеются типы Number, Rational и Integer, ограниченные отношениями Number :> Rational и Number :> Integer, то функция, определённая на типе Number, также сможет принять на вход аргументы типов Integer или Rational, и её поведение будет идентичным. Действительный тип объекта может быть скрыт как «чёрный ящик», и предоставляться лишь по запросу идентификации объекта. На самом деле, если тип Number является абстрактным, то конкретного объекта этого типа даже не может существовать (см. абстрактный класс, но не следует путать с абстрактным типом данных). Данная иерархия типов известна (особенно в контексте языка Scheme) как числовая башня[en], и обычно содержит большее количество типов.

Идея подтипов мотивируется увеличением множества типов, которые могут обрабатываться уже написанными функциями, и за счёт этого повышением коэффициента повторного использования кода в условиях сильной типизации (то есть увеличением множества типизируемых программ). Это обеспечивается правилом включения (subsumption rule): «если выражение e принадлежит к типу t' в контексте типизации Г, и выполняется t'<:t, то e принадлежит также и к типу t»[25][26].

Отношения подтипизации возможны на самых разных категориях типов: примитивных типах (как Integer <: Number), типах-суммах, типах-произведениях, функциональных типах и др. Более того, Лука Карделли[en] предложил концепцию степенны́х родо́в («power» kinds) для описания подтипизации[27]: степенью данного типа в слое родо́в (power-kind of the type) он назвал род всех его подтипов[28].

Особое место в информатике занимает подтипизация на записях>>>.

Подтипизация на записях

Подтипизация на записях, также известная как включение или вхождение (subsumption — см. принцип подстановки Барбары Лисков), служит наиболее распространённым теоретическим обоснованием объектно-ориентированного программирования (ООП)[29][30][24][31] (но не единственным — см. #полиморфизм записей и вариантов).

Мартин Абади (Martín Abadi) и Лука Карделли[en] формализовали подтипизацию на записях посредством ограниченной квантификации[en] над параметрически полиморфными типами[29][30]; при этом параметр типа задаётся неявно[32].

В подтипизации на записях выделяются две разновидности: в ширину и в глубину.

Подтипизация в ширину (width subtyping) подразумевает добавление в запись новых полей. Например:

type Object  = { age: Int }
type Vehicle = { age: Int; speed: Int }
type Bike    = { age: Int; speed: Int; gear: Int; }
type Machine = { age: Int; fuel: String }

С одной стороны, можно записать отношения подтипизации Vehicle <: Object, Bike <: Vehicle (а поскольку подтипизация транзитивна, то и Bike <: Object) и Machine <: Object. С другой стороны, можно говорить, что типы Vehicle, Bike и Machine включают (наследуют) все свойства типа Object. (Здесь подразумевается структурная[en] семантика системы типов.)

Поскольку интуитивно тип зачастую рассматривается как множество значений, то увеличение количества полей в подтипе может выглядеть контр-интуитивно с точки зрения теории множеств. В действительности, типы — это не множества[33], они предназначены для верификации поведения программ, и идея подтипизации состоит в том, что подтип обладает по меньшей мере свойствами своего супертипа, и таким образом, способен эмулировать его как минимум там, где ожидается объект супертипа[25]. Или иначе: супертип определяет минимальный набор свойств для множества объектов, и тогда тип, обладающий этими свойствами и, возможно, какими-то другими, формирует подмножество этого множества, а следовательно, является его подтипом[30].

Отношения подтипов в терминах множеств выглядят более интуитивно в случае с вариантными типами[34]:

type Day     = mon | tue | wed | thu | fri | sat | sun
type Workday = mon | tue | wed | thu | fri
type WeekEnd = sat | sun

Здесь Workday <: Day и WeekEnd <: Day.

Именование полей позволяет абстрагироваться от порядка их следования в записях (в отличие от кортежей), что даёт возможность строить произвольные направленные ацикличные графы наследования, формализуя множественное наследование[34]:

type Car = { age: Int; speed: Int; fuel: String }

Теперь Car <: Vehicle и одновременно Car <: Machine. Очевидно также, что Car <: Object (см. ромбовидное наследование).

Подтипизация в глубину (depth subtyping) подразумевает, что типы конкретных полей записи могут подменяться на их подтипы:

type Voyage   = { veh: Vehicle; date: Day }
type Sports   = { veh: Bike;    date: Day }
type Vacation = { veh: Car;     date: WeekEnd }

Из определений выше можно вывести, что Sports <: Voyage и Vacation <: Voyage.

Методы в подтипах записей

Полноценная поддержка объектно-ориентированного программирования предполагает включение в число полей записей также функций, обрабатывающих значения типов записей, которым они принадлежат[29][35]. Такие функции традиционно называются «методами». Обобщённой моделью связывания записей с методами является матрица диспетчеризации (dispatch matrix); на практике большинство языков раскладывают её на вектора по строкам либо по столбцам — соответственно, реализуя либо организацию на основе классов (class-based organisation), либо организацию на основе методов (method-based organisation)[36]. При этом следует отличать переопределение методов в подтипах (method overriding) от подтипизации функций (functional subtyping). Переопределение методов не связывает их отношениями подтипизации на функциях, но позволяет изменять сигнатуры их типов. При этом возможны три варианта: инвариантное, ковариантное и контравариантное переопределение, и два последних используют подтипизацию своих параметров[37] (подробнее см. ковариантность и контравариантность). Исчисление Абади — Карделли[29] рассматривает только инвариантные методы, что необходимо для доказательства безопасности.

Многие объектно-ориентированные языки предусматривают встроенный механизм связывания функций в методы, реализуя таким образом организацию программ на основе классов. Языки, рассматривающие функции как объекты первого класса и типизирующие их (см. функции первого класса, функциональный тип — не путать с типом возвращаемого значения функции), позволяют произвольно выстраивать организацию на основе методов, что обеспечивает возможность производить объектно-ориентированное проектирование без прямой поддержки со стороны языка[38]. Некоторые языки (например, OCaml) поддерживают обе возможности.

Языки с системами типов, основанными на формальной теории подтипизации (OCaml, проект successor ML), рассматривают системы объектов и системы классов независимо[39][40]. Это значит, что с объектом связывается прежде всего объектный тип, и лишь при явном указании объектный тип связывается с неким классом. При этом динамическая диспетчеризация[en] осуществляется на уровне объекта, а значит, в таких языках два объекта, относящиеся к одному классу, вообще говоря, могут иметь различный набор методов. Вместе с формально определённой семантикой множественного наследования это даёт непосредственную всестороннюю поддержку примесей.

CLOS реализует матрицу диспетчеризации посредством мультиметодов, то есть динамически диспетчеризуемых[en] методов, полиморфных сразу по нескольким аргументам[41].

Некоторые языки используют своебразные ad hoc-решения. Например, система типов языка С++ предусматривает автоматическое приведение типов (то есть является слабой), не полиморфная, эмулирует выделение подтипов[en] через манифестное[en] наследование с инвариантными сигнатурами методов и не поддерживает абстракцию типов (не путать с сокрытием полей). Наследование в С++ реализуется набором ad hoc-механизмов, однако, его использование называется в сообществе языка «полиморфизмом» (а сокрытие полей — «абстракцией»[42]). Имеется возможность управлять графом наследования: ромбовидное наследование в С++ называется «виртуальным наследованием» и задаётся явным атрибутом virtual; по умолчанию же осуществляется дублирование унаследованных полей с доступом к ним по квалифицированному имени. Использование такого языка может быть небезопасно — нельзя гарантировать устойчивость программ[43][37] (язык называется безопасным, если программы на нём, которые могут быть приняты компилятором как правильно построенные, в динамике никогда не выйдут за рамки допустимого поведения[44]).

Подтипизация высшего порядка

«Система <math>F^\omega_{<:}</math>» (читается «F-саб-омега») является расширением Системы F (не представленным в лямбда-кубе), формализующим ограниченную квантификацию[en] над ти́повыми операторами, распространяя отношения подтипизации с рода * на типы высших родо́в. Существует несколько вариантов системы <math>F^\omega_{<:}</math>, различающихся по выразительной мощности и метатеоретической сложности, но большинство основных идей заложил Лука Карделли[en][45].

Сочетание разновидностей полиморфизма

Классы типов

Класс типов[en]* реализует единую независимую таблицу виртуальных методов для множества (универсально квантифицированных) типов. Этим классы типов отличаются от классов в объектно-ориентированном программировании, где всякий объект всякого (ограниченно[en] квантифицированного) типа сопровождается указателем на таблицу виртуальных методов[46]. Классы типов являются не типами, но категориями типов; их инстансы представляют собой не значения, а типы.

Например[46]:

class Num a where
   (+), (*) :: a -> a -> a
   negate :: a -> a

Это объявление читается так: «Тип a принадлежит классу Num, если на нём определены функции (+), (*) и negate, с заданными сигнатурами».

instance Num Int where
   (+) = addInt
   (*) = mulInt
   negate = negInt

instance Num Float where
   (+) = addFloat
   (*) = mulFloat
   negate = negFloat

Первое объявление читается так: «Существуют функции (+), (*) и negate соответствующих сигнатур, которые определены над типом Int». Аналогично читается второе утверждение.

Теперь можно корректно типизировать следующие функции (причём выведение типов разрешимо):

square :: Num a => a -> a
square x = x * x

squares3 :: Num a, Num b, Num c => (a, b, c) -> (a, b, c)
squares3 (x, y, z) = (square x, square y, square z)

Поскольку операция умножения реализуется физически различным образом для целых и чисел с плавающей запятой, в отсутствии классов типов уже здесь потребовались бы две перегруженные функции square и восемь перегруженных функций squares3, а в реальных программах со сложными структурами данных дублирующегося кода оказывается намного больше. В объектно-ориентированном программировании проблемы такого рода решаются посредством динамической диспетчеризации[en], с соответствующими накладными расходами. Класс типов осуществляет диспетчеризацию статически, сводя параметрический>>> и ad hoc>>> полиморфизм в единую модель[12]. С точки зрения параметрического полиморфизма, класс типов имеет параметр (переменную типа), пробегающий множество типов. С точки зрения ad hoc полиморфизма, это множество не только дискретно, но и задано явным образом до уровня реализации. Благодаря этому, функция типизируется единственным образом, несмотря на обращение к перегруженной функции из её тела.

Встроенная поддержка классов типов[en]* была впервые реализована в языке Haskell, но они также могут быть введены в любой параметрически полиморфный язык путём простого препроцессинга[12], а также реализованы идиоматически (см., например, язык модулей ML#Реализация альтернативных моделей).

Типы, допускающие проверку на равенство (equality types)[en] в Хаскеле реализуются как инстансы класса типов Eq (обобщая переменные типа, допускающего проверку на равенство (equality type variables) из Standard ML):

(==) :: Eq a => a -> a -> Bool

Для снижения рутинного кодирования некоторых часто очевидно необходимых свойств пользовательских типов в Хаскеле дополнительно предусмотрен синтаксический сахар — конструкция deriving, допустимая для ограниченного набора стандартных классов типов (таких как Eq). (В русскоязычном сообществе её использование нередко путается с понятием «наследования» из-за особенностей перевода слова «derive».)

Обобщённые алгебраические типы данных

Политипизм

Иногда используется термин «политипизм» или «обобщённость типа данных». По сути политипизм означает встроенную в язык поддержку полиморфизма конструкторов типов, предназначенную для унификации программных интерфейсов и повышения повторного использования кода. Примером политипизма является обобщённый алгоритм сопоставления с образцом[47].

По определению, в политиповой функции «хотя и возможно наличие конечного числа ad hoc-ветвей для некоторых типов, но ad hoc-комбинатор отсутствует»[48].

Политипизм может быть реализован посредством использования универсального типа данных или полиморфизма высших рангов. Расширение PolyP[49] языка Haskell представляет собой синтаксическую конструкцию, упрощающую определение политиповых функций в Хаскеле.

Политиповая функция является в некотором смысле более обобщённой, чем полиморфная, но, с другой стороны, функция может быть политиповой и при этом не полиморфной, что видно на примере следующих сигнатур функциональных типов:

head   :: [a] -> a
(+)    :: Num a => a -> a -> a
length :: Regular d => d a -> Int
sum    :: Regular d => d Int -> Int

Первая функция (head) является полиморфной (параметрически полиморфной>>>), вторая (инфиксный оператор «+») — перегруженной (ad hoc полиморфной>>>), третья и четвёртая — политиповыми: переменная типа d в их определении варьируется над конструкторами типов. При этом, третья функция (length) является политиповой и полиморфной (предположительно, она вычисляет «длину» для некоторого множества полиморфных агрегатных типов — например, количество элементов в списках и в деревьях), а четвёртая (sum) является политиповой, но не полиморфной (мономорфной над агрегатными типами, принадлежащими классу типов[en]* Regular, для которых она, вероятно, вычисляет сумму целых, образующих объект конкретного агрегатного типа).

Прочее

Динамически типизируемые языки единообразно представляют разновидности полиморфизма, что формирует самобытную идеологию в них и влияет на применяемые методологии декомпозиции задач. Например, в Smalltalk любой класс способен принять сообщения любого типа, и либо обработать его самостоятельно (в том числе посредством интроспекции), либо ретранслировать другому классу — таким образом, любой метод формально является параметрически полиморфным, при этом его внутренняя структура может ветвиться по условию динамического типа аргумента, реализуя специальный полиморфизм. В CLOS мультиметоды одновременно являются функциями первого класса, что позволяет рассматривать их одновременно и как ограниченно квантифицированные[en], и как обобщённые (истинно полиморфные).

Статически полиморфно типизированные языки, напротив, могут реализовать разновидности полиморфизма ортогонально (независимо друг от друга), позволяя выстраивать их хитросплетение типобезопасным образом. Например, OCaml поддерживает параметрические классы (по возможностям аналогичные шаблонам классов C++, но верифицируемые без необходимости инстанцирования), их наследование вширь и вглубь>>> (в том числе множественное), идиоматическую реализацию классов типов[en]*>>> (посредством сигнатур — см. соответствующий пример использования языка модулей ML), рядный полиморфизм>>>, параметрический полиморфизм рангов выше 1-го (посредством так называемых локально-абстрактных типов, реализующих экзистенциальные типы) и обобщённые алгебраические типы данных>>>.

История

Термин «полиморфизм» происходит от др.-греч. πολύς («много») и μορφή («форма, облик, устройство»).

Термины «специализированный полиморфизм» и «параметрический полиморфизм» впервые упоминаются в 1967 году в конспекте лекций Кристофера Стрэчи[en] под названием «Фундаментальные основы языков программирования[en]»[1]. В 1985 году Питер Вегнер[en] и Лука Карделли[en] формализовали полиморфизм включения для моделирования подтипов[en] и наследования[9][27], хотя реализации подтипов и наследования появились намного раньше, в языке Симула в 1967 году. Полиморфизм включения основан на ограниченной квантификации[en].

Нотацию параметрического полиморфизма как развитие лямбда-исчисления (названную полиморфным лямбда-исчислением или Системой F) формально описал логик Жан-Ив Жирар[en][50][51] (1971 год), независимо от него похожую систему описал информатик Джон С. Рейнольдс[en][52] (1974 год).

Первым языком, целиком основанным на полиморфном лямбда-исчислении, был ML (1973 год); независимо от него параметрические типы были реализованы в CLU (1974 год)[27]. Многие современные языки (С++, Java, C#, D и другие) предоставляют параметрические типы в форме, более или менее близкой к их реализации в CLU.

В 1987 году Митчел Уэнд (Mitchel Wand) формализовал рядный полиморфизм>>> и выведение типов для него[53]; эта работа оказала огромное влияние на последующее развитие систем типов.

В 1987 году Филип Вадлер[en] (Philip Wadler) и Стивен Блотт (Stephen Blott) предложили классы типов[en]*>>> для формализации ad hoc полиморфизма>>>.

См. также

Напишите отзыв о статье "Полиморфизм (информатика)"

Примечания

  1. 1 2 3 Strachey - Fundamental Concepts, 1967.
  2. Cardelli - Typeful Programming, с. 3.
  3. Пирс - Типы в языках программирования, 22.7. Полиморфизм через let, с. 354.
  4. [www.stroustrup.com/glossary.html#Gpolymorphism C++ Glossary] (February 19, 2007).
  5. 1 2 Cardelli - On Understanding Types, 1.3. Kinds of Polymorphism, с. 6.
  6. Andrew W. Appel [www.cs.princeton.edu/research/techreps/TR-364-92 A Critique of Standard ML]. — Princeton University, 1992.
  7. Harper - Practical Foundations for Programming Languages, 20.1 System F, с. 172.
  8. Пирс - Типы в языках программирования, 23.2 Разновидности полиморфизма, с. 365.
  9. 1 2 3 4 Cardelli - On Understanding Types.
  10. Mitchell - Concepts in Programming Languages.
  11. Mitchell - Concepts in Programming Languages, 6.4. Polymorphism and overloading, с. 145-151.
  12. 1 2 3 4 Wadler - How to make ad-hoc polymorphism less ad hoc, с. 1-2.
  13. Cardelli - On Understanding Types, с. 6.
  14. 1 2 Cardelli - On Understanding Types, с. 5-6.
  15. Cardelli - Type systems, 5 Second-order Type Systems, с. 25.
  16. Harper - Practical Foundations for Programming Languages, 20.3 Parametricity overview, с. 177.
  17. Harper - Practical Foundations for Programming Languages, 49 Parametricity, с. 495-508.
  18. Пирс - Типы в языках программирования, 23.9 Параметричность, с. 384-385.
  19. Harper - Practical Foundations for Programming Languages, 21.4 Representation Independence, с. 188.
  20. Пирс - Типы в языках программирования, 30.5 Идем дальше: зависимые типы, с. 489-493.
  21. Reynolds - Theories of programming languages, 16. Subtypes and Intersection Types. Bibliographic Notes, с. 376.
  22. Mitchell - Concepts in Programming Languages, 10.2.6 Inheritance Is Not Subtyping, с. 287.
  23. Cardelli - Typeful programming.
  24. 1 2 Пирс - Типы в языках программирования, 15 Подтипы, с. 193.
  25. 1 2 Пирс - Типы в языках программирования, 15. Подтипы, с. 193.
  26. Harper - Practical Foundations for Programming Languages, 23.1. Subsumption, с. 208.
  27. 1 2 3 Пирс - Типы в языках программирования, 1.4 Краткая история, с. 11-13.
  28. Cardelli - Typeful Programming, 6. Power kinds, с. 32.
  29. 1 2 3 4 Abadi, Cardelli - Semantics of Object Types.
  30. 1 2 3 Cardelli - On Understanding Types, 6. Bounded Quantification, с. 28.
  31. Мински в переводе ДМК, Подтипизация, с. 259.
  32. Cardelli - On Understanding Types, с. 9.
  33. Harper - Practical Foundations for Programming Languages, Chapter 16. Recursive Types, с. 132.
  34. 1 2 Cardelli - Typeful Programming, с. 35-37.
  35. Cardelli - On Understanding Types, 2.3. Basic Types, Structured Types and Recursion, с. 12-14.
  36. Harper - Practical Foundations for Programming Languages, Chapter 25. Dynamic Dispatch, с. 229.
  37. 1 2 Joyner, 1996, 3.38 Signature Variance, с. 35.
  38. [www.mlton.org/ObjectOrientedProgramming Object-Oriented Programming in Standard ML]
  39. Мински в переводе ДМК, Глава 11. Объекты, с. 253.
  40. The ML2000 Working Group. [flint.cs.yale.edu/flint/publications/ml2000.pdf Principles and a Preliminary Design for ML2000]. — 1999.
  41. Castagna, Ghelli, Longo. [dl.acm.org/citation.cfm?id=141537 A calculus for overloaded functions with subtyping.] // Information and Computation. — Academic press, 1995. — Т. 117, вып. 1. — С. 115–135. — DOI:10.1006/inco.1995.1033.
  42. Joyner, 1996, 2.8 Encapsulation, с. 8.
  43. Mitchel - Concepts in Programming Languages, 2004, 6.2.1 Type Safety, с. 132-133.
  44. Harper - Practical Foundations for Programming Languages, Chapter 4. Statics, с. 35.
  45. Пирс - Типы в языках программирования, 31. Подтипы высших порядков, с. 495.
  46. 1 2 Wadler - How to make ad-hoc polymorphism less ad hoc, с. 3.
  47. Johan Jeuring [citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.36.5645&rep=rep1&type=pdf Polytypic pattern matching] // FPCA. — 1995. — DOI:10.1.1.36.5645.
  48. Ralf Lammel and Joost Visser, «Typed Combinators for Generic Traversal», in Practical Aspects of Declarative Languages: 4th International Symposium (2002), p. 153.
  49. Patrik Jansson, Johan Jeuring [citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.36.5645&rep=rep1&type=pdf PolyP - A Polytypic programming language extension]. — Sigplan SPPL, 1997.
  50. Girard - Extension of Type Theory.
  51. Girard - Higher-order calculus.
  52. Reynolds - Theory of Type Structure.
  53. Wand - type inference for objects.

Литература

  • Christopher Strachey. [www.itu.dk/courses/BPRD/E2009/fundamental-1967.pdf Fundamental Concepts in Programming Languages] ( (англ.)). — 1967.
  • Jean-Yves Girard. Une Extension de l'Interpretation de Gödel à l'Analyse, et son Application à l'Élimination des Coupures dans l'Analyse et la Théorie des Types ( (фр.)) // Proceedings of the Second Scandinavian Logic Symposium. — Amsterdam, 1971. — С. 63–92. — DOI:10.1016/S0049-237X(08)70843-7.
  • Jean-Yves Girard. Interprétation fonctionnelle et élimination des coupures de l’arithmétique d’ordre supérieur ( (фр.)). — Université Paris 7, 1972.
  • Luca Cardelli[en], Peter Wegner. [lucacardelli.name/Papers/OnUnderstanding.A4.pdf On Understanding Types, Data Abstraction, and Polymorphism] // ACM Computing Surveys. — New York, USA: ACM, 1985. — Т. 17, вып. 4. — С. 471–523. — ISSN [www.sigla.ru/table.jsp?f=8&t=3&v0=0360-0300&f=1003&t=1&v1=&f=4&t=2&v2=&f=21&t=3&v3=&f=1016&t=3&v4=&f=1016&t=3&v5=&bf=4&b=&d=0&ys=&ye=&lng=&ft=&mt=&dt=&vol=&pt=&iss=&ps=&pe=&tr=&tro=&cc=UNION&i=1&v=tagged&s=0&ss=0&st=0&i18n=ru&rlf=&psz=20&bs=20&ce=hJfuypee8JzzufeGmImYYIpZKRJeeOeeWGJIZRrRRrdmtdeee88NJJJJpeeefTJ3peKJJ3UWWPtzzzzzzzzzzzzzzzzzbzzvzzpy5zzjzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzztzzzzzzzbzzzzzzzzzzzzzzzzzzzzzzzzzzzvzzzzzzyeyTjkDnyHzTuueKZePz9decyzzLzzzL*.c8.NzrGJJvufeeeeeJheeyzjeeeeJh*peeeeKJJJJJJJJJJmjHvOJJJJJJJJJfeeeieeeeSJJJJJSJJJ3TeIJJJJ3..E.UEAcyhxD.eeeeeuzzzLJJJJ5.e8JJJheeeeeeeeeeeeyeeK3JJJJJJJJ*s7defeeeeeeeeeeeeeeeeeeeeeeeeeSJJJJJJJJZIJJzzz1..6LJJJJJJtJJZ4....EK*&debug=false 0360-0300]. — DOI:10.1145/6041.6042.
  • Robert Harper[en]. Introduction to Standard ML. — Carnegie Mellon University, 1986. — ISBN PA 15213-3891.
  • Перевод на русский язык: Роберт Харпер[en]. Введение в Стандартный ML. — Carnegie Mellon University, 1986. — 97 с. — ISBN PA 15213-3891.
  • Mitchell Wand[en]. [www.ccs.neu.edu/home/wand/papers/wand-lics-87.pdf Complete type inference for simple objects] ( (англ.)) // In Proc. 2nd IEEE Symposium on Logic in Computer Science. — 1987. — С. 37-44.
  • Philip Wadler, Stephen Blott. [homepages.inf.ed.ac.uk/wadler/papers/class/class.ps How to make ad-hoc polymorphism less ad hoc] ( (англ.)). — 1988.
  • Luca Cardelli[en]. [www.lucacardelli.name/Papers/TypefulProg.pdf Typeful programming] ( (англ.)) // IFIP State-of-the-Art Reports. — New York: Springer-Verlag, 1991. — Вып. Formal Description of Programming Concepts. — С. 431–507.
  • Martín Abadi, Luca Cardelli[en]. [lucacardelli.name/Papers/PrimObjSemLICS.A4.pdf A Semantics of Object Types] ( (англ.)). — LICS[en], 1994.
  • Luca Cardelli[en]. Type systems ( (англ.)) // Handbook of Computer Science and Engineering. — CRC Press, 1996.
  • Ian Joyner. [www.quinn.echidna.id.au/quinn/C++-Critique-3ed.pdf A Critique of C++ and Programming and Language Trends of the 1990s - 3rd Edition.] // [www.emu.edu.tr/aelci/Courses/D-318/D-318-Files/cppcrit/index008.htm копирайт и список изданий]. — 1996.
  • John C. Reynolds. Theories of programming languages. — Cambridge University Press, 1998. — ISBN 978-0-521-59414-1 (hardback), 978-0-521-10697-9 (paperback).
  • Benjamin Pierce. [www.cis.upenn.edu/~bcpierce/tapl/ Types and Programming Languages]. — MIT Press, 2002. — ISBN 0-262-16209-1.
    • Перевод на русский язык: Бенджамин Пирс. Типы в языках программирования. — Добросвет, 2012. — 680 с. — ISBN 978-5-7913-0082-9.
  • John C. Mitchell. Concepts in Programming Languages. — Cambridge University Press, 2002. — 540 с. — ISBN 978-0-521-78098-8.
  • Georg Neis, Derek Dreyer, Andreas Rossberg. [research.google.com/pubs/pub43983.html Non-Parametric Parametricity] ( (англ.)) // ICFP. — ACM, 2009.
  • Robert Harper[en]. [bookfi.org/book/1076504 Practical Foundations for Programming Languages]. — version 1.37 (revised 01.11.2014). — licensed under the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License., 2012. — 544 с.
  • Minsky, Madhavapeddy, Hickey. [realworldocaml.org/ Real World OCaml: Functional Programming for the Masses]. — O'Reilly Media, 2013. — 510 p. — ISBN 9781449324766.
    • Перевод на русский язык: Мински, Мадхавапедди, Хикки. Программирование на языке OCaml. — ДМК, 2014. — 536 с. — (Функциональное программирование). — ISBN 978-5-97060-102-0.

Отрывок, характеризующий Полиморфизм (информатика)

Через неделю князь вышел и начал опять прежнюю жизнь, с особенной деятельностью занимаясь постройками и садами и прекратив все прежние отношения с m lle Bourienne. Вид его и холодный тон с княжной Марьей как будто говорил ей: «Вот видишь, ты выдумала на меня налгала князю Андрею про отношения мои с этой француженкой и поссорила меня с ним; а ты видишь, что мне не нужны ни ты, ни француженка».
Одну половину дня княжна Марья проводила у Николушки, следя за его уроками, сама давала ему уроки русского языка и музыки, и разговаривая с Десалем; другую часть дня она проводила в своей половине с книгами, старухой няней и с божьими людьми, которые иногда с заднего крыльца приходили к ней.
О войне княжна Марья думала так, как думают о войне женщины. Она боялась за брата, который был там, ужасалась, не понимая ее, перед людской жестокостью, заставлявшей их убивать друг друга; но не понимала значения этой войны, казавшейся ей такою же, как и все прежние войны. Она не понимала значения этой войны, несмотря на то, что Десаль, ее постоянный собеседник, страстно интересовавшийся ходом войны, старался ей растолковать свои соображения, и несмотря на то, что приходившие к ней божьи люди все по своему с ужасом говорили о народных слухах про нашествие антихриста, и несмотря на то, что Жюли, теперь княгиня Друбецкая, опять вступившая с ней в переписку, писала ей из Москвы патриотические письма.
«Я вам пишу по русски, мой добрый друг, – писала Жюли, – потому что я имею ненависть ко всем французам, равно и к языку их, который я не могу слышать говорить… Мы в Москве все восторжены через энтузиазм к нашему обожаемому императору.
Бедный муж мой переносит труды и голод в жидовских корчмах; но новости, которые я имею, еще более воодушевляют меня.
Вы слышали, верно, о героическом подвиге Раевского, обнявшего двух сыновей и сказавшего: «Погибну с ними, но не поколеблемся!И действительно, хотя неприятель был вдвое сильнее нас, мы не колебнулись. Мы проводим время, как можем; но на войне, как на войне. Княжна Алина и Sophie сидят со мною целые дни, и мы, несчастные вдовы живых мужей, за корпией делаем прекрасные разговоры; только вас, мой друг, недостает… и т. д.
Преимущественно не понимала княжна Марья всего значения этой войны потому, что старый князь никогда не говорил про нее, не признавал ее и смеялся за обедом над Десалем, говорившим об этой войне. Тон князя был так спокоен и уверен, что княжна Марья, не рассуждая, верила ему.
Весь июль месяц старый князь был чрезвычайно деятелен и даже оживлен. Он заложил еще новый сад и новый корпус, строение для дворовых. Одно, что беспокоило княжну Марью, было то, что он мало спал и, изменив свою привычку спать в кабинете, каждый день менял место своих ночлегов. То он приказывал разбить свою походную кровать в галерее, то он оставался на диване или в вольтеровском кресле в гостиной и дремал не раздеваясь, между тем как не m lle Bourienne, a мальчик Петруша читал ему; то он ночевал в столовой.
Первого августа было получено второе письмо от кня зя Андрея. В первом письме, полученном вскоре после его отъезда, князь Андрей просил с покорностью прощения у своего отца за то, что он позволил себе сказать ему, и просил его возвратить ему свою милость. На это письмо старый князь отвечал ласковым письмом и после этого письма отдалил от себя француженку. Второе письмо князя Андрея, писанное из под Витебска, после того как французы заняли его, состояло из краткого описания всей кампании с планом, нарисованным в письме, и из соображений о дальнейшем ходе кампании. В письме этом князь Андрей представлял отцу неудобства его положения вблизи от театра войны, на самой линии движения войск, и советовал ехать в Москву.
За обедом в этот день на слова Десаля, говорившего о том, что, как слышно, французы уже вступили в Витебск, старый князь вспомнил о письме князя Андрея.
– Получил от князя Андрея нынче, – сказал он княжне Марье, – не читала?
– Нет, mon pere, [батюшка] – испуганно отвечала княжна. Она не могла читать письма, про получение которого она даже и не слышала.
– Он пишет про войну про эту, – сказал князь с той сделавшейся ему привычной, презрительной улыбкой, с которой он говорил всегда про настоящую войну.
– Должно быть, очень интересно, – сказал Десаль. – Князь в состоянии знать…
– Ах, очень интересно! – сказала m llе Bourienne.
– Подите принесите мне, – обратился старый князь к m llе Bourienne. – Вы знаете, на маленьком столе под пресс папье.
M lle Bourienne радостно вскочила.
– Ах нет, – нахмурившись, крикнул он. – Поди ты, Михаил Иваныч.
Михаил Иваныч встал и пошел в кабинет. Но только что он вышел, старый князь, беспокойно оглядывавшийся, бросил салфетку и пошел сам.
– Ничего то не умеют, все перепутают.
Пока он ходил, княжна Марья, Десаль, m lle Bourienne и даже Николушка молча переглядывались. Старый князь вернулся поспешным шагом, сопутствуемый Михаилом Иванычем, с письмом и планом, которые он, не давая никому читать во время обеда, положил подле себя.
Перейдя в гостиную, он передал письмо княжне Марье и, разложив пред собой план новой постройки, на который он устремил глаза, приказал ей читать вслух. Прочтя письмо, княжна Марья вопросительно взглянула на отца.
Он смотрел на план, очевидно, погруженный в свои мысли.
– Что вы об этом думаете, князь? – позволил себе Десаль обратиться с вопросом.
– Я! я!.. – как бы неприятно пробуждаясь, сказал князь, не спуская глаз с плана постройки.
– Весьма может быть, что театр войны так приблизится к нам…
– Ха ха ха! Театр войны! – сказал князь. – Я говорил и говорю, что театр войны есть Польша, и дальше Немана никогда не проникнет неприятель.
Десаль с удивлением посмотрел на князя, говорившего о Немане, когда неприятель был уже у Днепра; но княжна Марья, забывшая географическое положение Немана, думала, что то, что ее отец говорит, правда.
– При ростепели снегов потонут в болотах Польши. Они только могут не видеть, – проговорил князь, видимо, думая о кампании 1807 го года, бывшей, как казалось, так недавно. – Бенигсен должен был раньше вступить в Пруссию, дело приняло бы другой оборот…
– Но, князь, – робко сказал Десаль, – в письме говорится о Витебске…
– А, в письме, да… – недовольно проговорил князь, – да… да… – Лицо его приняло вдруг мрачное выражение. Он помолчал. – Да, он пишет, французы разбиты, при какой это реке?
Десаль опустил глаза.
– Князь ничего про это не пишет, – тихо сказал он.
– А разве не пишет? Ну, я сам не выдумал же. – Все долго молчали.
– Да… да… Ну, Михайла Иваныч, – вдруг сказал он, приподняв голову и указывая на план постройки, – расскажи, как ты это хочешь переделать…
Михаил Иваныч подошел к плану, и князь, поговорив с ним о плане новой постройки, сердито взглянув на княжну Марью и Десаля, ушел к себе.
Княжна Марья видела смущенный и удивленный взгляд Десаля, устремленный на ее отца, заметила его молчание и была поражена тем, что отец забыл письмо сына на столе в гостиной; но она боялась не только говорить и расспрашивать Десаля о причине его смущения и молчания, но боялась и думать об этом.
Ввечеру Михаил Иваныч, присланный от князя, пришел к княжне Марье за письмом князя Андрея, которое забыто было в гостиной. Княжна Марья подала письмо. Хотя ей это и неприятно было, она позволила себе спросить у Михаила Иваныча, что делает ее отец.
– Всё хлопочут, – с почтительно насмешливой улыбкой, которая заставила побледнеть княжну Марью, сказал Михаил Иваныч. – Очень беспокоятся насчет нового корпуса. Читали немножко, а теперь, – понизив голос, сказал Михаил Иваныч, – у бюра, должно, завещанием занялись. (В последнее время одно из любимых занятий князя было занятие над бумагами, которые должны были остаться после его смерти и которые он называл завещанием.)
– А Алпатыча посылают в Смоленск? – спросила княжна Марья.
– Как же с, уж он давно ждет.


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


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


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