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

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

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

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

Параметрический полиморфизм лежит в основе систем типов языков семейства ML; такие системы типов называют полиморфными. В сообществах языков с неполиморфными системами типов (потомки Алгола и BCPL[4]) параметрически полиморфные функции и типы называют «обобщёнными».





Содержание

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

Термин «параметрический полиморфизм» традиционно используется для обозначения типобезопасного параметрического полиморфизма, хотя существуют и нетипизированные его формы (см. параметрический полиморфизм в Си и С++)[4]. Ключевым понятием типобезопасного параметрического полиморфизма, помимо полиморфной функции, является полиморфный тип.

Полиморфный тип (англ. polymorphic type), или политип (англ. polytype) — это тип, параметризованный другим типом. Параметр в слое типов называется переменной типа (или ти́повой переменной).

Формально полиморфизм типов изучается в полиморфно типизированном лямбда-исчислении, называемом Системой F.

Например, функция append, сцепляющая два списка в один, может быть построена независимо от типа элементов списка. Пусть ти́повая переменная a описывает тип элементов списка. Тогда функция append может быть типизирована как «forall a. [a] × [a] -> [a]» (здесь конструкция [a] означает тип «список, каждый элемент которого имеет тип a» — синтаксис, принятый в языке Haskell). В этом случае говорят, что тип параметризован переменной a для всех значений a. В каждом месте применения append к конкретным аргументам значение a разрешается, причём каждое её упоминание в сигнатуре типа[en] подменяется значением, соответствующим контексту применения. Таким образом, в данном случае сигнатура функционального типа требует идентичности типов элементов обоих списков и результата.

Множество допустимых значений переменной типа задаётся посредством квантификации. Простейшими кванторами являются универсальный (как в примере с append) и экзистенциальный (см. далее).

Квалифицированный тип (англ. qualified type) — это полиморфный тип, дополнительно снабжённый набором предикатов, регламентирующих спектр допустимых значений параметра этого типа. Иначе говоря, квалификация типа позволяет управлять квантификацией произвольным образом. Теорию квалифицированных типов построил Марк Джонс (Mark P. Jones) в 1992 году[5]. Она предоставляет общее обоснование для самых экзотичных систем типов, включая классы типов, расширяемые записи>>> и подтипы[en] и позволяет точно формулировать особые ограничения для конкретных полиморфных типов, устанавливая таким образом отношения между параметрическим и ad hoc полиморфизмом (перегрузкой), а также между явной и неявной перегрузкой. Связь типа с предикатом в этой теории называется свидетельством (англ. evidence). Для свидетельств сформулирована алгебра, аналогичная лямбда-исчислению, включающая абстракцию свидетельств, применение свидетельств и т. д. Соотнесение терма этой алгебры с явно перегруженной функцией называется трансляцией свидетельства (англ. evidence translation).

Мотивирующими примерами для разработки обобщённой теории послужили классы типов Вадлера — Блотта и типизация расширяемых записей посредством предикатов Харпера — Пирса[5][6].

Классификация полиморфных систем

Параметрически полиморфные системы типов принципиально классифицируются по рангу>>> и по свойству предикативности>>>. Кроме того, различаются явный и неявный полиморфизм[7] и ряд других свойств. Неявный полиморфизм обеспечивается за счёт выведения типов, что существенно повышает удобство использования, но имеет ограниченную выразительность. Многие практические параметрически полиморфные языки разделяют фазы внешнего неявно типизированного языка (англ. external implicitly typed language) и внутреннего явно типизированного (англ. internal explicitly typed language).

Наиболее общей формой полиморфизма является «импредикативный полиморфизм высших рангов». Наиболее популярными ограничениями этой формы являются полиморфизм 1-го ранга, называемый «пренексным»>>>, и предикативный полиморфизм>>>. Вместе они образуют «предикативный пренексный полиморфизм», близкий к реализованному в ML и в ранних версиях Хаскела.

С усложнением систем типов сигнатуры типов становятся настолько сложными, что полное или почти полное их выведение начинает рассматриваться многими исследователями как критичное свойство, отсутствие которого сделает язык непригодным для практики[8][9]. Например, для традиционного комбинатора map полная сигнатура типа (с учётом родовой квантификации) в условиях типобезопасного отслеживания потока исключений>>> принимает следующий вид[10][8] (как и выше>>>, [a] означает список элементов типа a):
<math>val\;map \colon \forall\alpha\colon\star _\cdot \forall\beta\colon\star _\cdot \forall\gamma\colon\emptyset _\cdot \forall\delta\colon\emptyset _\cdot (\; \alpha \xrightarrow{\gamma} \beta\; )\; \xrightarrow{\delta} \;(\; \left [ \alpha \right ] \xrightarrow{\gamma} \left [ \beta \right ] \;)</math>

Ранг

Ранг полиморфизма показывает допустимую в рамках системы глубину вложения кванторов переменных типа. «Полиморфизм ранга k» (при k > 1) позволяет конкретизировать переменные типа полиморфными типами ранга не выше (k — 1). «Полиморфизм высших рангов» позволяет ставить кванторы переменных типа слева от произвольного числа стрелок в типах высших порядков.

Джо Уэллс (англ. Joe Wells) доказал[11], что выведение типов для Системы F, типизированной по Карри, неразрешимо для рангов выше 2-го, так что при использовании более высоких рангов необходимо использовать явное аннотирование типами[en][12].

Существуют системы типов с частичным выведением, требующие аннотирования только невыводимых ти́повых переменных[13][14][15].

Пренексный полиморфизм

Полиморфизм ранга 1 часто называется пренексным (от слова «пренекс» — см. пренексная нормальная форма[en]). В пренексно полиморфной системе переменные типа не могут конкретизироваться полиморфными типами. Это ограничение делает различие между мономорфными и полиморфными типами существенным, из-за чего в пренексной системе полиморфные типы нередко называют «схемами типизации» (англ. type schemas) для отличения их от «обычных» (мономорфных) типов (монотипов). Как следствие, все типы могут быть записаны в форме, когда все кванторы переменных типа вынесены в самую внешнюю (пренексную) позицию, что и называется пренексной нормальной формой[en]. Проще говоря, разрешается полиморфное определение функций, но запрещается передавать полиморфные функции в качестве аргументов другим функциям[16][17] — полиморфно определённые функции должны быть инстанцированы монотипом перед использованием.

Близким эквивалентом является так называемый «Let-полиморфизм» или «полиморфизм в стиле ML» Дамаса — Милнера. Технически, Let-полиморфизм в ML имеет дополнительные синтаксические ограничения, такие как «ограничение на значения» (value restriction), связанное с проблемой типобезопасности при использовании ссылок (не возникающих в чистых языках, таких как Haskell и Clean)[18][19].

Предикативность

Предикативный полиморфизм

Предикативный (ограниченный условием) полиморфизм требует, чтобы переменная типа была конкретизирована монотипом (не политипом).

К предикативным системам относятся интуиционистская теория типов[en] и Nuprl[en].

Импредикативный полиморфизм

Импредикативный (безусловный) полиморфизм разрешает конкретизировать переменную типа произвольным типом — как мономорфным, так и полиморфным, включая сам определяемый тип. (Разрешение в рамках некоего исчисления рекурсивного включения системы в саму себя называется импредикативностью[en]. Потенциально это может приводить к парадоксам типа Расселовского или Канторовского[20], но в случае с тщательно продуманной системой типов этого не происходит[21].)

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

Примером импредикативной системы является Система F и её расширения (см. лямбда-куб)[22].

Поддержка рекурсии

Традиционно в потомках ML функция может быть полиморфной только при взгляде «извне» (то есть её можно применять к аргументам различных типов), но её определение может содержать только мономорфную рекурсию (то есть разрешение типов осуществляется до вызова). Распространение реконструкции типов по ML на рекурсивные типы не представляет серьезных трудностей. С другой стороны, сочетание реконструкции типов с рекурсивно определенными термами порождает сложную проблему, известную под названием полиморфной рекурсии[en]. Майкрофт (Mycroft) и Мейртенс (Meertens) предложили полиморфное правило типизации, позволяющее конкретизировать различными типами рекурсивные вызовы рекурсивной функции из ее собственного тела. В этом исчислении, известном как исчисление Милнера — Майкрофта, выведение типов неразрешимо.[23]

Полиморфизм структурных типов

Типы-произведения (также известные как «записи») служат формальной базой для объектно-ориентированного и модульного программирования. Их двойственную[en] пару составляют типы-суммы (также известные как «варианты[en]»)[24][25][19]:
<math>\neg \lbrace a \and b \rbrace = \langle \neg a \or \neg b \rangle</math>
<math>\neg \langle a \or b \rangle = \lbrace \neg a \and \neg b \rbrace</math>
Вместе они являются средством выражения любых сложных структур данных и некоторых аспектов поведения программ>>>.

Исчисление записей (англ. record calculi) — обобщённое название проблемы и ряда её решений, касающихся вопросов гибкости типов-произведений в языках программирования при условии типобезопасности[26][27][28]. Термин нередко распространяется и на типы-суммы, а границы понятия «тип записи» могут варьироваться от исчисления к исчислению (как и само понятие «тип»). Применяются также термины «полиморфизм записей» (что, опять же, зачастую включает в себя полиморфизм вариантов)[27], «исчисление модулей»[9] и «структурный полиморфизм».

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

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

Классическим примером может служить язык Standard ML, система типов которого была умышленно ограничена ровно настолько, чтобы сочетать простоту реализуемости с выразительностью и математически доказуемой типобезопасностью.

Пример определения записи:

> val r = {name = "Foo", used = true};
(* val r : {name : string, used : bool} = {name = "Foo", used = true} *)

Доступ к значению поля по его имени осуществляется префиксной конструкцией вида #field record:

> val r1 = #name r;
(* val r1 : string = "Foo" *)

Следующее определение функции над записью является корректным:

> fun name1 (x: {name : string, age : int}) = #name x

А следующее порождает ошибку компилятора о том, что тип не разрешён полностью:

> fun name2 x = #name x
(* unresolved type in declaration:
      {name : '1, ...} *)

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

fun select r l = #l r

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

Суммы типов составляют основу выражения ветвления, причём за счёт строгости системы типов компилятор обеспечивает контроль за полнотой разбора. Например, для следующего типа-суммы:

datatype 'a foo = A of 'a
                | B of ('a * 'a)
                | C

всякая функция над ним будет иметь вид

fun bar (p:'a foo) =
   case p of
        A x => ...
      | B (x,y) => ...
      | C => ...

и при удалении любого из предложений компилятор выдаст предупреждение о неполноте разбора («match nonexhaustive»). Для случаев, когда из множества вариантов лишь некоторые требуют анализа в данном контексте, можно организовать default-ветвление при помощи т. н. «джокера» — универсального образца, с которым сопоставимы все допустимые (согласно типизации) значения. Для его записи используется символ подчёркивания («_»). Например:

fun bar (p:'a foo) =
   case p of
        C => ...
      | _ => ...

Следует отметить, что в некоторых языках (в Standard ML, в Haskell) даже «более простая» конструкция if-then-else является лишь синтаксическим сахаром над частным случаем ветвления, то есть выражение

if A
   then B
   else C

уже на этапе грамматического разбора представляется в виде

case A of
     true => B
   | false => C

либо

case A of
     true => B
   | _ => C

Синтаксический сахар

В Standard ML записи и варианты являются мономорфными, однако, поддерживается синтаксический сахар для работы с записями со множеством полей, называемый «универсальным образцом»[32]:

> val r = {name = "Foo", used = true};
(* val r : {name : string, used : bool} = {name = "Foo", used = true} *)
> val {used = u, ...} = r;
(* val u : bool = true *)

Многоточие в типе «{used, ...}» означает, что в данной записи существуют и другие поля, помимо упомянутых. Однако полиморфизм записей как таковой отсутствует (даже пренексный>>>): требуется полное статическое разрешение информации о мономорфном типе записи (посредством выведения или явного аннотирования[en]).

Расширение и функциональное обновление записей

Термин расширяемые записи (extensible records) используется для обобщённого обозначения таких операций, как расширение (построение новой записи на основе имеющейся с добавлением новых полей), обрезание (взятие указанной части от имеющейся записи) и др. В частности, он подразумевает возможность так называемого «функционального обновления записей» (functional record update) — операции построения нового значения записи на основе имеющегося путём копирования имён и типов его полей, при которой одно или несколько полей в новой записи получают новые значения, отличающиеся от исходных (и, возможно, имеющие другой тип).[33][34][19][35][36][37]

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

Пример простейшего варианта конструкции реализован в Alice ML (согласно действующим соглашениям по successor ML)[36]. Универсальный образец (многоточие>>>) имеет расширенные возможности: посредством его можно осуществлять «захват ряда» с тем, чтобы работать с «оставшейся» частью записи как со значением:

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

Функциональное обновление реализуется как производная форма от захвата ряда с помощью служебного слова where. Например, следующий код:

> let
     val r = { a = 1, c = 3.0, d = "not a list", f = [1], p = ["not a string"], z = NONE }
  in
     { r where d = nil, p = "hello" }
  end

будет автоматически переписан в форме:

> let
     val r = { a = 1, c = 3.0, d = "not a list", f = [1], p = ["not a string"], z = NONE }
     val { d = _, p = _, ... = tmp } = r
  in
     { ... = tmp, d = nil, p = "hello" }
  end

Конкатенация записей

Одними из первых (конец 1980-х — начало 1990-х) были предложены различные варианты формализации расширяемых записей через операции конкатенации над неполиморфными записями (Харпер — Пирс[38], Ванд[39], Сальцманн[40]). Карделли[en] даже использовал операции над записями вместо полиморфизма в языке Amber. Для этих исчислений нет известного способа эффективной компиляции; кроме того, эти исчисления весьма сложны и с точки зрения теоретико-ти́пового анализа.[27][41][42][43]

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

val car = { name = "Toyota"; age = "old"; id = 6678 }
val truck = { name = "Toyota"; id = 19823235 }
...
val repaired_truck = { car and truck }

Ванд (автор рядного полиморфизма>>>) показал, что посредством конкатенации записей можно моделировать множественное наследование[39][33].

Структурная подтипизация Карделли

Лука Карделли (Luca Cardelli  (англ.)) исследовал возможность формализовать «полиморфизм записей» посредством отношений подтипизации на записях: для этого запись рассматривается как «универсальный подтип», то есть разрешается отнесение её значения ко всему множеству её супертипов. Этот подход также поддерживает наследование методов и служит теоретико-ти́повой базой для наиболее распространённых форм объектно-ориентированного программирования.[44][45][27]

Карделли представил вариант метода компиляции полиморфизма записей через их подтипы посредством предопределения смещения всех возможных меток в потенциально огромной структуре со множеством пустых слотов[31].

Метод имеет существенные недостатки. Поддержка подтипизации в системе типов существенно усложняет механизм проверки согласования типов[46]. Кроме того, в её присутствии статический тип выражения перестаёт предоставлять полную информацию о динамической структуре значения записи. Например, при использовании только подтипов, следущий терм:

> if true then {A = 1, B = true} else {B = false, C = "Cat"}
(* val it : {B : bool} *)

имеет тип {B : bool}, но его динамическое значение равно {A = 1, B = true}, то есть информация о типе расширяемой записи теряется[43], что представляет серьёзную проблему для проверки операций, требующих для своего исполнения полной информации о структуре значения (таких как сравнение на равенство)[19]. Наконец, при наличии подтипов выбор между упорядоченным и неупорядоченным представлением записей серьёзно влияет на производительность[47].

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

Рядный полиморфизм Ванда

Митчел Ванд (Mitchell Wand  (англ.)) в 1987 году предложил идею захватывать информацию об «оставшейся» (не указанной явно) части записи посредством того, что он назвал рядной ти́повой переменной (row type variable)[49].

Рядная переменная — это переменная типа, пробегающая множество конечных наборов (рядов) типизированных полей (пар «(значение : тип)»). В результате появляется возможность реализовать «наследование вширину» непосредственно на основе параметрического полиморфизма, лежащего в основе ML,— без усложнения системы типов правилами подтипизации[en]. Получаемую разновидность полиморфизма называют рядным полиморфизмом (row polymorphism). Рядный полиморфизм распространяется как на произведения типов, так и на суммы типов.

Замечание — Ванд заимствовал термин «row» (рус. ряд, цепочка, строка) из Алгола-68, где он означал набор представлений. В русскоязычной литературе этот термин в контексте Алгола традиционно переводился как «мультивид». Встречается также вариант перевода «row variables» как «строчные переменные»[41], который может вызвать путаницу со строчными буквами в строковых типах.

Пример (язык OCaml; синтаксис постфиксный, record#field)[50]:

# let send_m a = a#m ;;
(* value send_m : < m : a; .. > -> a = <fun> *)

Здесь многоточие (из двух точек) — это принятый в OCaml синтаксис для безымянной рядной ти́повой переменной. За счёт такой типизации, функция send_m может быть применена к объекту любого (заранее не известного) объектного типа, в состав которого входит метод m соответствующей сигнатуры.

Выведение типов для исчисления Ванда в первоначальной версии было неполным: из-за отсутствия ограничений на расширение ряда, добавление поля при совпадении имени подменит существующее — в результате не все программы имеют главный тип[6][43]. Однако, эта система была первым конкретным предложением по расширению ML записями, поддерживающими наследование[51]. В последующие годы был предложен целый ряд различных доработок, в том числе, делающих его полным[51][27].

Наиболее заметный след оставил Дидье́ Реми́ (фр. Didier Rémy). Он построил практичную систему типов с расширяемыми записями, включающую полный и эффективный алгоритм реконструкции типов[52][53]. Реми расслаивает язык типов на сорта, формулируя сортированную алгебру типов (англ. sorted algebra of types, sorted language of types). Различаются сорт собственно типов (в том числе типов полей) и сорт полей; вводятся отображения между ними и на их основе формулируются правила типизации расширяемых записей как простое расширение классических правил ML. Информация о присутствии (англ. presence) поля определяется как отображение из сорта типов в сорт полей. Рядные ти́повые переменные переформулируются как переменные, принадлежащие сорту полей и равные константе отсутствия (англ. absence), являющейся элементом сорта полей, не имеющим соответствия в сорте типов. Операция вычисления типа для записи из n полей определяется как отображение n-арного поля в тип (где каждое поле в кортеже либо вычисляется функцией присутствия, либо задаётся константой отсутствия).

Упрощённо идею исчисления можно трактовать как расширение типа всякого поля записи флагом присутствия/отсутствия и представление записи в виде кортежа со слотом для каждого возможного поля[6]. В прототипе реализации синтаксис языка типов был сделан приближенным к теоретико-ти́повой формулировке, например[52]:

# let car = { name = "Toyota"; age = "old"; id = 7866 } ;;
(* car : ∏ (name : pre (string); id : pre (num); age : pre (string); abs) *)

# let truck = { name = "Blazer"; id = 6587867567 } ;;
(* truck : ∏ (name : pre (string); id : pre (num); abs) *)

# let person = { name = "Tim"; age = 31; id = 5656787 } ;;
(* person : ∏ (name : pre (string); id : pre (num); age : pre (num); abs) *)

(символ у Реми означает операцию вычисления типа)

Добавление нового поля записывается с помощью конструкции with:

# let driver = { person with vehicle = car } ;;
(* driver : ∏ (vehicle : pre (∏ (name : pre (string); id : pre (num); age : pre (string); abs));
              name : pre (string); id : pre (num); age : pre (num); abs) *)

Функциональное обновление>>> записывается идентично, с той разницей, что упоминание уже существующего поля переопределяет его:

#let truck_driver = { driver with vehicle = truck };;
(* truck driver : ∏ (vehicle : pre (∏ (name : pre (string); id : pre (num); abs));
                    name : pre (string); id : pre (num); age : pre (num); abs) *)

Эта схема формализует ограничение, необходимое для проверки операций над записями и выведения главного типа, но не ведёт к очевидной и эффективной реализации[6][43]. Реми использует хеширование, что довольно эффективно в среднем, но неизбежно накладывает оверхед на райнтайм даже для исходно мономорфных программ и плохо подходит для записей с большим числом полей[31].

В дальнейшем Реми исследовал использование рядного полиморфизма совместно с выделением подтипов данных[en], подчеркнув, что это ортогональные понятия, и показав, что записи становятся наиболее выразительными при их одновременном использовании[54]. На этой основе он совместно с Жеромом Вуйоном (фр. Jérôme Vouillon) предложил легковесное объектно-ориентированное расширение для ML[55]. Это расширение было реализовано в языке «Caml Special Light» Ксавье Леруа (Xavier Leroy  (англ.)), превратив его в OCaml[56]. Объектная модель OCaml тесно сплетает использование структурной подтипизации>>> и рядного полиморфизма[48], из-за чего порой их ошибочно отождествляют. Рядный полиморфизм произведений в OCaml лежит в основе выведения типов; отношения подтипизации не являются необходимыми в языке с его поддержкой, но дополнительно повышают гибкость на практике[55][50][48]. В OCaml реализован более простой и наглядный синтаксис для информации о типах.

Жак Гарри́га (фр. Jacques Garrigue) реализовал[25] практичную систему полиморфных сумм. Он совместил теоретические работы Реми и Охори>>>, построив систему, пролегающую посередине: информация о наличии меток в записи представляется посредством использования родо́в, а информация об их типах использует рядные переменные. Чтобы компилятор мог отличать полиморфные суммы от мономорфных, Гаррига использует специальный синтаксис (обратный апостроф, предваряющий тег). При этом исчезает необходимость в объявлении типа — можно сразу писать функции над ним, и компилятор будет выводить минимальный список тегов по мере композиции этих функций. Эта система стала частью OCaml около 2000 года, но не вместо, а в дополнение к мономорфным суммам, так как они несколько менее эффективны, и из-за невозможности контроля полноты разбора затрудняют поиск ошибок (в отличие от решения Блюма>>>).[25][57]

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

Просвечивающие суммы Харпера — Лилибриджа

Наиболее сложной разновидностью записей являются зависимые записи. Такие записи могут включать в себя типы наравне с «обычными» значениями (материализованные типы, reified  (англ.) types[9]), причём термы и типы, следующие далее по порядку в теле записи, могут быть определены на основе предшествующих им. Такие записи соответствуют «слабым суммам» из теории зависимых типов, также известным как «экзистенциалы», и служат наиболее общим обоснованием систем модулей языков программирования[58][59]. Карделли[en] рассматривал[60] аналогичные по свойствам типы как один из основных типов в полнотиповом программировании (но называл их «кортежами»).

Роберт Харпер (Robert Harper  (англ.)) и Марк Лилибридж (Mark Lillibridge) построили[61][59] исчисление просвечивающих сумм (англ. translucent sums) для формального обоснования языка модулей первого класса высшего порядка — наиболее развитой системы модулей среди известных. Это исчисление, в том числе, применяется в семантике Харпера — Стоуна, представляющей теоретико-ти́повое обоснование для Standard ML.

Просвечивающие суммы обобщают слабые суммы за счёт меток и набора равенств, описывающих конструкторы типов. Термин «просвечивающие» (англ. translucent) означает, что в составе типа записи могут присутствовать как типы с явно экспортированной структурой, так и полностью абстрактные. Слой родо́в в исчислении имеет простой классический состав: различаются род всех типов <math>\star</math> и функциональные рода́ вида <math>k_1 => k_2</math>, типизирующие конструкторы типов (ML не поддерживает полиморфизма в высших рода́х>>>, все переменные типа принадлежат к роду <math>\star</math>, и абстракция конструкторов типов возможна лишь посредством функторов[62]). Исчисление различает правила подтипизации для записей как основных типов и для полей записей как их составляющих, соответственно, рассматривая «подтипы» и «подполя», а затемнение (абстрагирование) сигнатур полей является отдельным от подтипизации понятием. Подтипизация здесь формализует сопоставление модулей с интерфейсами.[61][9]

Исчисление Харпера — Лилибриджа неразрешимо даже в части проверки согласования типов (диалекты языка модулей, реализованные в Standard ML и OCaml, используют ограниченные подмножества этого исчисления). Однако позже Андреас Россберг (англ. Andreas Rossberg) на основе их идей построил язык «1ML», в котором традиционные записи уровня ядра языка и стуктуры уровня модулей являются одной и той же первоклассной конструкцией[9] (существенно более выразительной, чем у Карделли — см. критика языка модулей ML). За счёт подключения идеи Харпера и Митчела[63] о подразделении всех типов на вселенные[en] «маленьких» и «больших» типов (упрощённо, это похоже на фундаментальное разделение типов на простые и агрегатные, с неодинаковыми правилами типизации), Россберг обеспечил разрешимость не только проверки согласования, но и почти полного выведения типов. Более того, 1ML допускает импредикативный>>> полиморфизм[64]. При этом внутренний язык>>> в 1ML основан на плоской Системе Fω[en] и не требует использования зависимых типов в качестве метатеории. На 2015 год Россберг оставил открытым вопрос о возможности добавления в 1ML рядного полиморфизма>>>, отметив лишь, что это должно обеспечить более полное выведение типов[9]. Спустя год он добавил[65] в 1ML полиморфизм эффектов>>>.

Полиморфное исчисление записей Охори

Атсуши Охори (англ. Atsushi Ohori) совместно со своим научным руководителем Питером Бьюнеманом (Peter Buneman  (англ.)) в 1988 году предложил идею ограничивать спектр возможных значений обычных типовых переменных в полиморфной типизации самих записей. В дальнейшем Охори формализовал эту идею посредством родо́в записей, построив к 1995 году полноценное исчисление и способ его эффективной компиляции[19][30]. Прототип реализации был создан в 1992 году как расширение компилятора SML/NJ[en][66], затем Охори возглавил разработку собственного компилятора SML#, реализующего одноимённый диалект языка Standard ML. В SML# полиморфизм записей служит основой для бесшовного встраивания конструкций на SQL в программы на SML. SML# применяется крупными японскими компаниями для решения бизнес-задач, связанных с нагруженными базами данных[67]. Пример такого рода сессии (REPL)[68]:

fun wealthy { Salary = s, ... } = s > 100000;
(* val wealthy = fn : 'a#{ Salary:int, ... } -> bool *)

fun young x = #Age x < 24;
(* val young = fn : 'a#{ Age:int, ... } -> bool *)

fun youngAndWealthy x = wealthy x andalso young x;
(* val youngAndWealthy = fn : 'a#{ Age:int, Salary:int, ... } -> bool *)

fun select display l pred = fold (fn (x,y) => if pred x then (display x)::y else y) l nil;
(* val select = fn : ('a -> 'b) -> 'a list -> ('a -> bool) -> 'b list *)

fun youngAndWealthyEmployees l = select #Name l youngAndWealthy;
(* val youngAndWealthyEmployees = fn : 'b#{ Age:int, Name:'a, Salary:int, ... } list -> 'a list *)

Охори назвал своё исчисление «полиморфизмом записей» (англ. record polymorphism) или «полиморфным исчислением записей» (англ. polymorphic record calculus), одновременно подчеркнув, что он, как и Ванд, рассматривает полиморфизм не только типов-произведений, но и типов-сумм[27].

Исчисление Охори выделяется наиболее интенсивным использованием слоя родо́в[6]. В записи <math>t \colon\colon k</math> (отнесение типа <math>t</math> к роду <math>k</math>) символ <math>k</math> означает либо род всех типов <math>U</math>; либо род записей, имеющих форму <math>\left \{ \left \{ l_1\colon t_1, \dots, l_n\colon t_n \right \} \right \}</math>, обозначающий множество всех записей, содержащих как минимум указанные поля; либо род вариантов, имеющих форму <math>\left \langle \left \langle l_1: t_1, \dots, l_n\colon t_n \right \rangle \right \rangle</math>, обозначающий множество всех вариантных типов, содержащих как минимум указанные конструкторы. В плоском синтаксисе языка ограничение типа некоторым родом записи записывается как t#{...} (см. примеры выше). Решение в некоторой степени схоже с ограниченной квантификацией[en] Карделли — Вегнера[27].

Единственная полиморфная операция, предусмотренная этим исчислением — операция извлечения поля[69]. Однако Охори был первым, кто представил для полиморфизма записей простую и эффективную схему компиляции[43]. Он назвал её «исчислением реализаций» (implementation calculus). Запись представляется вектором, упорядоченным лексикографически по именам полей исходной записи; обращение к полю по имени транслируется в вызов промежуточной функции, возвращающей номер данного поля в данном векторе по запрашиваемому имени, и последующую индексацию вектора по вычисленному номеру позиции. Функция вызывается только при инстанцировании полиморфных термов, что накладывает минимальный оверхед на рантайм при использовании полиморфизма и не накладывает никакого оверхеда при работе с мономорфными типами. Метод работает одинаково хорошо с произвольно большими записями и вариантами. Исчисление обеспечивает выведение типов и находит строгое соответствие с теорией (родовая квантификация напрямую соотносится с обычной индексацией вектора), представляя собой непосредственно расширение лямбда-исчисление второго порядка Жирара — Рейнольдса, что позволяет переносить различные известные свойства полиморфной типизации на полиморфизм записей[31].

На практике, поддержка полиморфных вариантов в SML# не была реализована из-за её несовместимости с механизмом определения типов-сумм в Standard ML (требуется синтаксическое разделение сумм и рекурсивных типов)[70].

Недостатком исчисления Охори является отсутствие поддержки операций расширения или обрезания записей[27][71][43].

Первоклассные метки Гастера — Джонса

В теории квалифицированных типов>>> расширяемые записи описываются предикатами отсутствия поля («lacks» predicate) и присутствия поля («has» predicate). Бенедикт Гастер (Benedict R. Gaster) совместно с автором теории Марком Джонсом (Mark P. Jones) доработал её в части расширяемых записей до практичной системы типов неявно типизированных языков, в том числе, определив способ компиляции[6]. Они вводят термин первоклассные метки (first-class labels), подчёркивающий возможность абстрагировать операции над полями от статически известных меток. В дальнейшем Гастер защитил на построенной системе диссертацию[72].

Исчисление Гастера — Джонса не обеспечивает полное выведение типов. Кроме того, из-за проблем разрешимости было наложено искусственное ограничение: запрет на пустые ряды[73]. Сульцманн предпринял попытку реформулирования исчисления[40], однако построенная им система не может быть расширена до поддержки полиморфного расширения записей, и не имеет универсального метода эффективной компиляции[43].

Да́ан Ле́йен (Daan Leijen) добавил в исчисление Гастера — Джонса предикат рядного равенства (или равенства ряда, англ. row equality predicate) и переместил язык рядов в язык предикатов — это обеспечило полное выведение типов и сняло запрет на пустые ряды[74]. При компиляции записи преобразуются в лексикографически упорядоченный кортеж и применяется трансляция свидетельств>>> по схеме Гастера — Джонса. Система Лейена позволяет выражать такие идиомы, как сообщения высшего порядка[en] (наиболее мощную форму объектно-ориентированного программирования) и первоклассные ветвления>>>.

На основе этих работ реализованы расширения языка Haskell[75].

Результаты Гастера — Джонса очень близки к результатам Охори>>>, несмотря на существенные различия в теоретико-ти́повом обосновании, и основным преимуществом является поддержка операций расширения и обрезания записей[6]. Недостатком исчисления является то, что оно опирается на свойства системы типов, которые отсутствуют в большинстве языков программирования. Кроме того, выведение типов для него представляет серьёзную проблему, из-за чего авторы наложили дополнительные ограничения. И хотя Лейен устранил многие недостатки, использование default-ветвления>>> невозможно.[71]

Полиморфизм управляющих конструкций

С развитием программных систем может увеличиваться количество вариантов в типе-сумме, и добавление каждого варианта требует добавления соответствующего ветвления в каждую функцию над этим типом, даже если эти ветвления в разных функциях идентичны. Таким образом, трудоёмкость наращивания функциональности в большинстве языков программирования нелинейно зависит от декларативных изменений в техническом задании. Эта закономерность известна как проблема выражения[en]. Другой известной проблемой является обработка исключений: на протяжении десятилетий исследования систем типов, все языки, относимые к типобезопасным, могли, тем не менее, завершать работу порождением непойманного исключения — поскольку, несмотря на типизацию самих исключений, механизм их порождения и обработки не типизировался. И хотя были построены средства анализа потока исключений, эти средства всегда являлись внешними по отношению к языку.

Матиас Блюм (англ. Matthias Blume, коллега Эндрю Аппеля[en], работающий над проектом successor ML[76]), его аспирант Вонсёк Чэй (Wonseok Chae) и коллега Юмат Эйкар (Umut Acar) решили обе проблемы, основываясь на математической двойственности[en] произведений и сумм. Воплощением их идей стал язык MLPolyR[71][34][77], основанный на простейшем подмножестве Standard ML и дополняющий его несколькими уровнями типобезопасности[78]. Позже Вонсёк Чэй защитил на этих достижениях диссертацию[78].

Решение состоит в следующем. Согласно принципу двойственности[en], вводная форма (англ. introduction form) для некоего понятия соответствует устраняющей форме (англ. elimination form) двойственного ему[71]. Таким образом, устраняющая форма сумм (разбор ветвлений) соответствует вводной форме записей. Это побуждает наделить ветвления теми же свойствами, что уже доступны для записей — сделать их первоклассными объектами и допустить их расширение.

Например, простейший интерпретатор языка выражений:

fun eval e = case e of
                  `Const i => i
                | `Plus (e1,e2) => eval e1 + eval e2

с введением первоклассной конструкции cases может быть переписан в виде:

fun eval e = match e with
                cases `Const i => i
                    | `Plus (e1,e2) => eval e1 + eval e2

после чего cases-блок может быть вынесен:

fun eval_c eval = cases `Const i => i
                      | `Plus (e1,e2) => eval e1 + eval e2

fun eval e = match e with (eval_c eval)

Это решение допускает default-ветвления (в отличие от исчисления Гастера — Джонса>>>), что важно для композиции первоклассных ветвлений[34]. Завершение композиции ряда осуществляется с помощью слова nocases.

fun const_c d =
    cases `Const i => i
    default: d

fun plus_c eval d =
    cases `Plus (e1,e2) => eval e1 + eval e2
    default: d

fun eval e = match e with
    const_c (plus_c eval nocases)


fun bind env v1 x v2 =
    if v1 = v2 then x else env v2

fun var_c env d =
    cases `Var v => env v
    default: d

fun let_c eval env d =
    cases `Let (v,e,b) => eval (bind env v (eval env e)) b
    default: d

fun eval_var env e = match e with
    const_c (plus_c (eval_var env) (var_c env (let_c eval_var env nocases)))

Как видно, новый код, который необходимо дописывать при качественном усложнении системы, не требует изменения уже написанного кода (функции const_c и plus_c «ничего не знают» о последующем добавлении в интерпретатор языка поддержки переменных и let-блоков). Таким образом, первоклассные расширяемые ветвления (first-class extensible cases) являются принципиальным решением проблемы выражения[en], позволяя говорить о парадигме расширяемого программирования[71][78]. По словам Блюма, это является не чем-то принципиально новым, а просто интересным способом применения рядного полиморфизма>>>, который уже поддерживается в системе типов, и в этом смысле достоинством такого технического решения является его концептуальная простота[34].

Однако расширение программных систем требует также контроля над обработкой исключений, которые могут порождаться на произвольной глубине вложения вызовов. И здесь Блюм с коллегами провозглашают новый слоган типобезопасности в развитие слогана Милнера: «Программы, прошедшие проверку типов, не порождают необработанных исключений». Проблема состоит в том, что если сигнатура функционального типа включает информацию о типах исключений, которые эта функция потенциально может порождать, и эта информация в сигнатуре передаваемой функции должна быть строго согласована с информацией о параметре функции высшего порядка (в том числе, если это пустое множество) — типизация механизма обработки исключений немедленно требует полиморфности типов самих исключений — в противном случае функции высшего порядка перестают быть полиморфными. В то же время, в безопасном языке исключения являются расширяемой суммой[79][80][81], т.е. вариантным типом, конструкторы которого добавляются по ходу программы. Соответственно, типобезопасность потока исключений означает необходимость поддержки типов-сумм, которые являются одновременно расширяемыми и полиморфными. И здесь вновь решением является рядный полиморфизм>>>.

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

MLPolyR использует нетривиальное сочетание нескольких исчислений и двухстадийную трансляцию. Для выведения и согласования типов он использует исчисление Реми>>>, одновременно используя принцип математической двойственности[en] для представления сумм как произведений, далее транслирует язык в промежуточный явно типизированный язык с полиморфными записями, и затем использует эффективный способ компиляции, построенный Охори>>>. Иначе говоря, модель компиляции Охори была обобщена до поддержки исчисления Реми[69]. На теоретико-ти́повом уровне Блюм вводит сразу несколько новых синтаксических нотаций, позволяющих записывать правила для типизации исключений и первоклассных ветвлений. Система типов MLPolyR обеспечивает полное выведение типов, так что авторы отказались от разработки плоского синтаксиса для явной записи типов и от поддержки сигнатур в языке модулей.

В системе типов Лейена>>> также возникает вариант полиморфизма ветвлений: конструкция case может быть представлена в виде функции высшего порядка, получающей запись из функций, каждая из которых соответствует определённой ветви вычислений (синтаксис Хаскела подходит для этого изменения и не требует пересмотра). Например:

data List a = nil  :: {}
            | cons :: { hd :: a, tl :: List a }

snoc xs r = case (reverse xs) r

last xs   = snoc xs { nil  = \r -> _|_,
                      cons = \r -> r.hd }

Поскольку записи в системе Лейена являются расширяемыми, разбор ветвлений обретает гибкость на уровне динамических решений (например, цепочки проверок или использования ассоциативного массива), но обеспечивает гораздо более эффективную реализацию (метка варианта соответствует смещению в записи). Однако, от поддержки ветвления по умолчанию (default) в данном случае приходится отказаться, поскольку единственный default-образец соответствовал бы множеству полей (и, соответственно, множеству смещений). Лейен называет эту конструкцию «первоклассными образцами для сопоставления» (first-class patterns).

Полиморфизм в высших рода́х

Полиморфизм в высших рода́х (англ. higher-kinded polymorphism) означает абстракцию над конструкторами типов высших порядков, т.е. ти́повыми операторами вида

* -> * -> ... -> *

Поддержка этой возможности поднимает полиморфизм на более высокий уровень, обеспечивая абстракцию как над типами, так и над конструкторами типов — подобно тому как функции высших порядков обеспечивают абстракцию как над значениями, так и над другими функциями. Полиморфизм в высших рода́х является естественным компонентом многих идиом функционального программирования, включая монады, свёртки и встраиваемые языки.[62][82]

Например[62], если определить следующую функцию (язык Haskell):

when b m = if b then m else return ()

то для неё будет выведен такой функциональный тип:

when :: forall (m :: * -> *). Monad m => Bool -> m () -> m ()

Сигнатура m :: * -> * говорит о том, ти́повая переменная m является переменной типа, принадлежащего к высшему роду (англ. higher-kinded type variable). Это значит, что она абстрагируется над конструкторами типов (в данном случае унарными, такими как Maybe или []), которые могут применяться к конкретным типам, таким как Int или (), для построения новых типов.

В языках, поддерживающих полную абстракцию типа (Standard ML, OCaml), все ти́повые переменные должны принадлежать к роду *, в противном случае система типов была бы небезопасной. Полиморфизм в высших рода́х, таким образом, обеспечивается за счёт самого механизма абстракции в сочетании с явным аннотированием при инстанцировании, что несколько неудобно. Тем не менее, возможна идиоматическая реализация полиморфизма в высших рода́х, не требующая явного аннотирования — для этого на уровне типов применяется техника, аналогичная дефункциализации[en].[62]

Полиморфизм родо́в

Системы родо́в (англ. kind systems) обеспечивают безопасность самих систем типов, позволяя контролировать смысл ти́повых выражений.

Например, пусть требуется реализовать вместо обычного типа «вектор» (линейный массив) семейство типов «вектор длиной n», иначе говоря, определить тип «вектор, индексированный длиной». Классическая реализация на Haskell выглядит так[83]:

data Zero
data Succ n
data Vec :: * -> * -> * where
    Nil  :: Vec a Zero
    Cons :: a -> Vec a n -> Vec a (Succ n)

Здесь вначале определяются фантомные типы[84], т.е. типы, не имеющие динамического представления. Конструкторы Zero и Succ служат «значениями слоя типов», а переменная n обеспечивает неравенство разных конкретных типов, построенных конструктором Succ. Тип Vec определён как обобщённый алгебраический тип данных (GADT).

Решение условно предполагает, что фантомный тип n будет использоваться для моделирования целочисленного параметра вектора на основе аксиом Пеано — т.е. будут строиться только такие выражения, как Succ Zero, Succ Succ Zero, Succ Succ Succ Zero и т.д. Однако, хотя определения записаны на языке типов, сами по себе они сформулированы бестиповым образом. Это видно по сигнатуре Vec :: * -> * -> *, означающей, что конкретные типы, передаваемые в качестве параметров, принадлежат роду *, а значит, могут быть любым конкретным типом. Иначе говоря, здесь не запрещаются бессмысленные ти́повые выражения вроде Succ Bool или Vec Zero Int.[83]

Более развитое исчисление позволило бы задать область значений параметра типа более точно:

data Nat = Zero | Succ Nat
data Vec :: * -> Nat -> * where
   VNil  :: Vec a Zero
   VCons :: a -> Vec a n -> Vec a (Succ n)

Но обычно такой выразительностью обладают лишь системы с зависимыми типами[85], реализованные в таких языках, как Agda, Coq и др., которые имеют очень высокий порог вхождения и трудоёмки в использовании. Например, с позиции языка Agda запись Vec :: * -> Nat -> * означала бы, что род типа Vec зависит от типа Nat (т.е. элемент одного сорта зависит от элемента другого, более низкого сорта).

В 2012 году было построено[83] расширение языка Haskell, реализующее более развитую систему родо́в и делающее вышеприведённый код корректным кодом на Хаскеле. Решение состоит в том, что все типы (за определёнными ограничениями) автоматически «продвигаются» (англ. promote) на уровень выше, формируя одноимённые рода́, которые можно использовать явным образом. С этой точки зрения, запись Vec :: * -> Nat -> * не является зависимой — она означает лишь, что второй параметр вектора должен принадлежать к именованному роду Nat, а в данном случае единственным элементом этого рода является одноимённый тип.

Решение является весьма простым, как с точки зрения реализации в компиляторе, так и с точки зрения практической доступности. А поскольку полиморфизм типов изначально является естественным элементом семантики Хаскела, продвижение типов приводит к полиморфизму родо́в (англ. kind polymorphism), который одновременно повышает коэффициент повторного использования кода и обеспечивает более высокий уровень типобезопасности. Например, следующий GADT, используемый для верификации равенства типов[en]:

data EqRefl a b where
   Refl :: EqRefl a a

в классическом Хаскеле имеет род * -> * -> *, что не позволяет использовать его для проверки равенства конструкторов типов, таких как Maybe. Система родов, основанная на продвижении типов, выводит полиморфный род forall X. X -> X -> *, делая тип EqRefl более универсальным. Это можно записать явно:

data EqRefl (a :: X) (b :: X) where
   Refl :: forall X. forall(a :: X). EqRefl a a

Полиморфизм эффектов

Системы эффектов (англ. effect systems) были предложены Гиффордом и Лукассеном во второй половине 1980-х[86][87][88] с целью обособления побочных эффектов для более тонкого контроля за безопасностью и эффективностью в конкурентном программировании.

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

Это приобретает особое значение при переходе к функциям над модулями (записями, включающими в свой состав абстрактные типы) — функторам — поскольку в условиях чистоты они имеют право быть аппликативными, но в присутствии побочных эффектов они обязаны быть порождающими для обеспечения типобезопасности (подробнее об этом см. эквивалентность типов в языке модулей ML). Таким образом, в языке модулей первого класса высшего порядка полиморфизм эффектов оказывается необходимой основой для поддержки полиморфизма порождаемости (англ. generativity polymorphism): передача флага чистоты в функтор обеспечивает выбор между аппликативной и порождающей семантикой в единой системе.[65]

Поддержка в языках программирования

Типобезопасный параметрический полиморфизм доступен в языках, типизированных по Хиндли — Милнеру>>> — в диалектах ML (Standard ML, OCaml, Alice, F#) и их потомках (Haskell, Clean, Idris, Mercury, Agda) — а также в наследованных от них гибридных языках (Scala, Nemerle).

Обобщённые типы данных (дженерики) отличаются от параметрически полиморфных систем тем, что используют ограниченную квантификацию[en], и потому не могут иметь ранг выше 1-го>>>. Они доступны в Ada, Eiffel, Java, C#, D; а также в Delphi, начиная с 2009-й версии. Впервые они появились в CLU.

Интенсиональный полиморфизм

Интенсиональный полиморфизм (англ. intensional polymorphism) представляет собой технику оптимизирующей компиляции параметрического полиморфизма на основе сложного теоретико-ти́пового анализа, которая состоит в вычислениях над типами во время выполнения программы. Интенсиональный полиморфизм позволяет реализовывать бестеговую сборку мусора, необёрнутую (unboxed) передачу аргументов в функции и упакованные (оптимизированные по памяти) плоские структуры данных.[89][90][91]

Мономорфизация

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

Хиндли — Милнер

В классическом варианте система типов Хиндли — Милнера (а также просто «Хиндли — Милнер» или «Х-М», англ. HM)[93][94], положенная в основу языка ML, представляет собой подмножество Системы F, ограниченное предикативным>>> пренексным>>> полиморфизмом с целью обеспечения возможности автоматического выведения типов, для чего в состав Хиндли — Милнера традиционно также включался так называемый «Алгоритм W[en]», разработанный Робином Милнером. В дальнейшем Хиндли — Милнер был существенно развит по нескольким направлениям, наиболее заметным из которых являются классы типов[en]*, дальнейшим обобщением которых стали квалифицированные типы>>>.

Многие реализации Х-М являются улучшенной версией системы, представляя собой «систему главной типизации» (англ. principal typing scheme)[93][2], которая за один проход с почти линейной сложностью одновременно выводит наиболее общие полиморфные типы для каждого выражения и строго проверяет их согласование.

С момента своего появления система типов Хиндли — Милнера была расширена по нескольким направлениям[95]. Одним из наиболее известных расширений является поддержка ad hoc полиморфизма посредством классов типов.

Автоматическое выведение типов было сочтено необходимостью при первоначальной разработке языка ML в качестве интерактивной системы доказательства теорем «Logic for Computable Functions[en]», из-за чего и были наложены соответствующие ограничения. В дальнейшем на основе ML был разработан целый ряд эффективно компилируемых языков общего назначения, ориентированных на крупномасштабное программирование[en], а в этом случае необходимость поддержки выведения типов резко снижается, так как интерфейсы модулей в промышленной практике в любом случае необходимо явно аннотировать типами[en][81]. Поэтому было предложено множество вариантов расширения Хиндли — Милнера, отказывающихся от выведения типов ради расширения возможностей, вплоть до поддержки полной Системы F с импредикативным>>> полиморфизмом, таких как язык модулей высшего порядка, изначально основанный на явном аннотировании типов модулей и имеющий множество расширений и диалектов, а также расширения языка Haskell (Rank2Types, RankNTypes и ImpredicativeTypes).

Компилятор MLton языка Standard ML осуществляет мономорфизацию>>>, но за счёт других применимых к Standard ML оптимизаций результирующее увеличение выходного кода не превышает 30 %[92].

Си и С++

В языке Си функции не являются объектами первого класса, но возможно определение указателей на функции, что позволяет строить функции высших порядков[96]. Также доступен небезопасный параметрический полиморфизм за счёт явной передачи необходимых свойств типа через бестиповое подмножество языка, представленное нетипизированным указателем void*[97] (называемым в сообществе языка «обобщённым указателем» (англ. generic pointer). Назначение и удаление информации о типе при приведении типа к void* и обратно не является ad hoc полиморфизмом, так как не меняет представление указателя, однако, его записывают явно для обхода системы типов компилятора[96].

Например, стандартная функция qsort способна обрабатывать массивы элементов любого типа, для которого определена функция сравнения[96].

struct segment { int start; int end; };

int seg_cmpr( struct segment *a, struct segment *b )
{ return abs( a->end - a->start ) - abs( b->end - b->start ); }

int str_cmpr( char **a, char **b )
{ return strcmp( *a, *b ); }

struct segment segs[] = { {2,5}, {4,3}, {9,3}, {6,8} };
char* strs[] = { "three", "one", "two", "five", "four" };

main()
{
    qsort( strs, sizeof(strs)/sizeof(char*), sizeof(char*),
                 (int (*)(void*,void*))str_cmpr );

    qsort( segs, sizeof(segs)/sizeof(struct segment), sizeof(struct segment),
                 (int (*)(void*,void*))seg_cmpr );
    ...
}

Тем не менее, в Си возможно идиоматическое воспроизведение типизированного параметрического полиморфизма без использования void*[98].

Язык С++ предоставляет подсистему шаблонов, использование которых внешне похоже на параметрический полиморфизм, но семантически реализуется сочетанием ad hoc-механизмов:

template <typename T> T max(T x, T y)
{
    if (x < y)
        return y;
    else
        return x;
}

int main()
{
    int a = max(10,15);
    double f = max(123.11, 123.12);
    ...
}

Мономорфизация>>> при компиляции шаблонов C++ является неизбежной, так как в системе типов языка отсутствует поддержка полиморфизма — полиморфный язык здесь является статической[en] надстройкой над мономорфным ядром языка[99]. Это приводит к кратному увеличению объёма получаемого машинного кода, что получило известность как «раздувание кода»[100].

История

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

Впервые параметрический полиморфизм был представлен в языке ML в 1973[41][105]. Независимо от него параметрические типы были реализованы в CLU (1974 год)[41].

См. также

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

Примечания

  1. 1 2 Strachey, "Fundamental Concepts", 1967.
  2. 1 2 Пирс, 2002.
  3. Cardelli, Wegner, "On Understanding Types", 1985, 1.3. Kinds of Polymorphism, с. 6.
  4. 1 2 Appel, "Critique of SML", 1992.
  5. 1 2 Jones, "Theory of Qualified Types", 1992.
  6. 1 2 3 4 5 6 7 Gaster, Jones, "Polymorphic Extensible Records and Variants", 1996.
  7. Cardelli, "Basic Polymorphic Typechecking", 1987.
  8. 1 2 Wonseok Chae (Ph.D. Thesis), 2009, с. 91-92.
  9. 1 2 3 4 5 6 Rossberg, "1ML – Core and Modules United (F-ing First-class Modules)", 2015.
  10. Blume, "Exception Handlers", 2008, с. 11.
  11. Wells, 1994.
  12. Пирс, 2002, 22 Реконструкция типов, с. 361.
  13. Пирс, 2002, 23.6 Стирание, типизируемость и реконструкция типов, с. 378-381.
  14. Remy, "ML with abstract and record types", 1994.
  15. Garrigue, Remy, "Semi-Explicit First-Class Polymorphism for ML", 1997.
  16. Reynolds, "Theories of programming languages", 1998, 17. Polymorphism. Bibliographic Notes, с. 393.
  17. [www.mlton.org/FirstClassPolymorphism First-class polymorphism on MLton]
  18. Пирс, 2002, 22.7 Полиморфизм через let, с. 354-359.
  19. 1 2 3 4 5 Ohori, "Polymorphic Record Calculus and Its Compilation", 1995.
  20. Душкин, "Мономорфизм, полиморфизм и экзистенциальные типы", 2010.
  21. Cardelli, "Typeful programming", 1991, с. 20.
  22. Пирс, 2002, 23.10 Импредикативность, с. 385.
  23. Пирс, 2002, Глава 22. Реконструкция типов. Раздел 22.8. Дополнительные замечания, с. 361-362.
  24. Wonseok Chae (Ph.D. Thesis), 2009, с. 14.
  25. 1 2 3 Garrigue, "Polymorphic Variants", 1998.
  26. Blume, "Extensible Programming with First-Class Cases", 2006, с. 10.
  27. 1 2 3 4 5 6 7 8 9 Ohori, "Polymorphic Record Calculus and Its Compilation", 1995, 1.1 Static Type System for Record Polymorphism, с. 3-6.
  28. Leijen, "First-class Labels", 2004, с. 1.
  29. Gaster, Jones, "Polymorphic Extensible Records and Variants", 1996, Abstract, с. 1.
  30. 1 2 Paulson, "ML for the Working Programmer", 1996, 2.9 Records, с. 35.
  31. 1 2 3 4 Ohori, "Polymorphic Record Calculus and Its Compilation", 1995, 1.2 Compilation Method for Record Polymorphism, с. 6-8.
  32. Harper, "Intro to SML", 1986.
  33. 1 2 3 Remy, "Type Inference for Records", 1991, с. 2.
  34. 1 2 3 4 5 Blume, "Row polymorphism at work", 2007.
  35. [www.mlton.org/FunctionalRecordUpdate Functional record update]
  36. 1 2 [www.ps.uni-saarland.de/alice/manual/sugar.html#records Alice ML syntactic enhancements]
  37. [sml-family.org/successor-ml/OldSuccessorMLWiki/Functional_record_extension_and_row_capture.html Functional record extension and row capture]
  38. Harper, Pierce, "Record calculus based on symmetric concatenation", 1991.
  39. 1 2 Wand, "Type inference for record concatenation and multiple inheritance", 1991.
  40. 1 2 Sulzmann, 1997.
  41. 1 2 3 4 Пирс, 2002, 1.4 Краткая история, с. 11-13.
  42. Remy, "Type Inference for Records", 1991, с. 2-3.
  43. 1 2 3 4 5 6 7 Leijen, "First-class Labels", 2004, с. 13-14.
  44. Cardelli, "Semantics of Multiple Inheritance", 1988.
  45. Cardelli, Wegner, "On Understanding Types", 1985.
  46. Пирс, 2002, 16. Метатеория подтипов, с. 225.
  47. Пирс, 2002, 11.8 Записи, с. 135.
  48. 1 2 3 Мински в переводе ДМК, 2014, Подтипизация и рядный полиморфизм, с. 267-268.
  49. Wand, "Type inference for objects", 1987.
  50. 1 2 Мински в переводе ДМК, 2014, Полиморфизм объектов, с. 255-257.
  51. 1 2 Remy, "Type Inference for Records", 1991, Related work, с. 3.
  52. 1 2 Remy, "Type Inference for Records", 1991.
  53. Blume, "Extensible Programming with First-Class Cases", 2006, с. 11.
  54. Remy, "Subtypes and Row polymorphism", 1995.
  55. 1 2 Remy, Vouillon, "Objective ML", 1998.
  56. Пирс, 2002, 15.8 Дополнительные замечания, с. 223.
  57. Мински в переводе ДМК, 2014, Полиморфные варианты, с. 149-158.
  58. Пирс, 2002, 24 Экзистенциальные типы, p. 404.
  59. 1 2 Reynolds, "Theories of programming languages", 1998, 18. Module Specification, с. 401-410.
  60. Cardelli, "Typeful programming", 1991, 4.4. Tuple types, с. 20-23.
  61. 1 2 Harper, Lillibridge, "Type-Theoretic Approach to Higher-Order Modules with Sharing", 1993.
  62. 1 2 3 4 Yallop, White, "Lightweight higher-kinded polymorphism", 2014.
  63. Harper, Mitchell, "Type Structure of SML", 1993.
  64. Rossberg, "1ML – Core and Modules United (F-ing First-class Modules)", 2015, Impredicativity Reloaded, с. 6.
  65. 1 2 Rossberg, "1ML with Special Effects (F-ing Generativity Polymorphism)", 2016.
  66. Ohori, "Compilation Method for Polymorphic Record Calculi", 1992.
  67. [www.jaist.ac.jp/rcsv/event/20131114-event/Ohori%20slides.pdf Ohori — SML# (presentation)]
  68. Ohori, "Polymorphic Record Calculus and Its Compilation", 1995, с. 38.
  69. 1 2 Blume, "Extensible Programming with First-Class Cases", 2006, с. 9.
  70. Ohori, "Polymorphic Record Calculus and Its Compilation", 1995, 5 Implementaion, с. 37.
  71. 1 2 3 4 5 Blume, "Extensible Programming with First-Class Cases", 2006.
  72. Gaster (Ph.D. Thesis), 1998.
  73. Leijen, "First-class Labels", 2004, с. 7.
  74. Leijen, "First-class Labels", 2004.
  75. [wiki.haskell.org/Extensible_records Extensible records on Haskell-Wiki]
  76. [people.cs.uchicago.edu/~blume/ Blume personal page]
  77. Blume, "Exception Handlers", 2008.
  78. 1 2 3 Wonseok Chae (Ph.D. Thesis), 2009.
  79. Paulson, "ML for the Working Programmer", 1996, 4.6 Declaring exceptions, с. 135.
  80. Harper, "Practical Foundations for Programming Languages", 2012, 28.3 Exception Type, с. 258-260.
  81. 1 2 ML2000 Preliminary Design, 1999.
  82. Harper, "Practical Foundations for Programming Languages", 2012, Chapter 22. Constructors and Kinds, с. 193.
  83. 1 2 3 Weirich et al, "Giving Haskell a promotion", 2012.
  84. Fluet, Pucella, "Phantom Types and Subtyping", 2006.
  85. Пирс, 2002, 30.5 Идем дальше: зависимые типы, с. 489-490.
  86. Gifford, Lucassen, "Effect systems", 1986.
  87. Lucassen, Gifford, "Polymorphic Effect Systems", 1988.
  88. Talpin, Jouvelot, 1992.
  89. Harper, Morrisett, "Intensional Type Analysis", 1995.
  90. Crary, Weirich, Morrisett, "Intensional polymorphism", 1998.
  91. Пирс, 2002, 23.2 Разновидности полиморфизма, с. 364-365.
  92. 1 2 Weeks, "Whole-Program Compilation in MLton", 2006.
  93. 1 2 Hindley, "Principal Type Scheme", 1969.
  94. Milner, "Theory of Type Polymorphism", 1978.
  95. Jones, "FP with Overloading and H-O Polymorphism", 1995.
  96. 1 2 3 Керниган Б., Ритчи Д. Язык программирования Си = The C programming language. — 2-е изд. — Вильямс, 2007. — С. 304. — ISBN 0-13-110362-8., Глава 5.11. Указатели на функции
  97. Appel, "Critique of SML", 1992, с. 5.
  98. [okmij.org/ftp/cpp-digest/poly-list.html Truly polymorphic lists in C]
  99. Mitchell, "Concepts in Programming Languages", 2004, 6.4. Polymorphism and overloading, с. 145-151.
  100. Scott Meyers. [groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/2b00649a935997f5/5feec243078c5fd8 Code Bloat due to Templates]. comp.lang.c++.moderated. Usenet (16 мая 2002). Проверено 19 января 2010.
  101. Girard, "Extension of Type Theory", 1971.
  102. Girard, "Higher-order calculus", 1972.
  103. Reynolds, "Theory of Type Structure", 1974.
  104. Пирс, 2002, 23.3 Система F, с. 365-366.
  105. Milner et al, "LCF", 1975.

Литература

  • 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.
  • Milner R., Morris L., Newey M. A Logic for Computable Functions with reflexive and polymorphic types // Arc-et-Senans. — Proc. Conference on Proving and Improving Programs, 1975.
  • Luca Cardelli[en], John С. Mitchell. [lucacardelli.name/Papers/SRC-048.pdf Operations on Records] // Mathematical Structures in Computer Science. — 1991. — Т. 1, вып. 1.
  • Лука Карделли[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.
  • Роберт Харпер[en]. Введение в Стандартный ML. — Carnegie Mellon University, 1986. — 97 с. — ISBN PA 15213-3891.
  • John M. Lucassen, David K. Gifford. [dl.acm.org/citation.cfm?id=319848 Integrating Functional and Imperative Programming]. — 1986.
  • Luca Cardelli[en]. [lucacardelli.name/Papers/BasicTypechecking.A4.pdf Basic Polymorphic Typechecking]. — 1987.
  • 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.
  • Martín Abadi, Luca Cardelli[en], Pierre-Louis Curien. [lucacardelli.name/Papers/FPP%20%28POPL%29.pdf Formal Parametric Polymorphism]. — POPL, 1993.
  • Luca Cardelli[en]. [lucacardelli.name/Papers/Inheritance.A4.pdf A Semantics of Multiple Inheritance] ( (англ.)) // Inf. Comput. 76. — 1988. — С. 138–164.
  • John M. Lucassen, David K. Gifford. [groups.csail.mit.edu/pag/OLD/parg/lucassen88effects.pdf Polymorphic Effect Systems]. — POPL, 1988.
  • Didier Rémy. [gallium.inria.fr/~remy/ftp/type-inf-records.pdf Type Inference for Records in a natural Extension of ML] // Research Report 1431. — Institut National de Recherche en Informatique et Automatisme, 1991.
  • Лука Карделли[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.
  • Роберт Харпер[en], Benjamin Pierce. [www.cis.upenn.edu/~bcpierce/papers/merge.ps Record calculus based on symmetric concatenation] // CMU-CS-90-157R. — Carnegie Mellon University, supported and monitored by Naval Research, 1991.
  • Mitchell Wand[en]. [www.sciencedirect.com/science/article/pii/089054019190050C Type inference for record concatenation and multiple inheritance] // Selections from 1989 IEEE Symposium on Logic in Computer Science. — Information and Computation,, 1991. — Т. 93, вып. 1. — DOI:10.1016/0890-5401(91)90050-C.
  • Andrew W. Appel. [www.cs.princeton.edu/research/techreps/TR-364-92 A Critique of Standard ML]. — Princeton University, 1992.
  • Mark P. Jones. [web.cecs.pdx.edu/~mpj/pubs/esop92.html A Theory of Qualified Types]. — ESOP, Springer-Verlag Lecture Notes in Computer Science, 1992.
  • Atsushi Ohori. [citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.105.7655 A Compilation Method for ML-Style Polymorphic Record Calculi] // POPL: Proceedings of the 19th ACM SIGPLAN-SIGACT symposium on Principles of programming languages,. — Kyoto University, ACM, 1992. — С. 154—165. — DOI:10.1.1.105.7655.
  • J.-P. Talpin, P. Jouvelot. [www.irisa.fr/prive/talpin/papers/jfp92.pdf Polymorphic Type, Region and Effect Inference] // 2(3):245271. — JFP, 1992.
  • Robert Harper[en], John С. Mitchell. [crypto.stanford.edu/~jcm/papers/harper-mitch-TOPLAS-93.pdf On The Type Structure of Standard ML]. — ACM TOPLAS, 1993. — С. 211 — 252.
  • Robert Harper[en], Mark Lillibridge. [citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.14.3595 Type-Theoretic Approach to Higher-Order Modules with Sharing]. — ACM Press, POPL, 1993. — ISBN CMU-CS-93-197. — DOI:10.1.1.14.3595
  • Didier Rémy. [gallium.inria.fr/~remy/ftp/tacs94.pdf Programming objects with ML-ART: An extension to ML with abstract and record types]. — International Symposium on Theoretical Aspects of Computer Software, Springer-Verlag, 1994. — С. 321–346.
  • J. B. Wells. [www.macs.hw.ac.uk/~jbw/papers/Wells:Typability-and-Type-Checking-in-the-Second-Order-Lambda-Calculus-Are-Equivalent-and-Undecidable:LICS-1994.ps.gz Typability and Type Checking in the Second-Order Lambda-Calculus are Equivalent and Undecidable] ( (англ.)) // Proceedings of the 9th Annual IEEE. — Symposium on Logic in Computer Science (LICS), 1994. — С. 176—185.
  • Robert Harper[en], . Compiling Polymorphism Using Intensional Type Analysis. — 1995.
  • Atsushi Ohori. [www.pllab.riec.tohoku.ac.jp/~ohori/research/toplas95.pdf A Polymorphic Record Calculus and Its Compilation]. — Kyoto University, ACM, 1995. — С. 844 — 895.
  • Didier Rémy. [gallium.inria.fr/~remy/work/record_types.dvi.gz Better Subtypes and Row Variables for Record Types] // Presented at the workshop on Advances in types for computer science at the Newton Institute. — Cambridge, UK, 1995.
  • Lawrence C. Paulson[en]. ML for the Working Programmer. — 2nd. — Cambridge, Great Britain: Cambridge University Press, 1996. — 492 с. — ISBN 0-521-57050-6 (hardback), 0-521-56543-X (paperback).
  • Benedict R. Gaster, Mark P. Jones. [research.microsoft.com/pubs/64501/fclabels.pdf A Polymorphic Type System for Extensible Records and Variants] // Technical Report NOTTCS-TR-96-3. — University of Nottingham, 1996.
  • Jacques Garrigue, Didier Rémy. [www.sciencedirect.com/science/article/pii/S0890540199928304 Semi-Explicit First-Class Polymorphism for ML] // Academic Press. — Information and Computation, 1997.
  • M. Sulzmann. [citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.17.6563&rep=rep1&type=pdf Designing Record Systems] // Technical Report YALEU/DCS/RR-1128. — Yale University, 1997. — DOI:10.1.1.17.6563.
  • Karl Crary, Stephanie Weirich, J. Gregory Morrisett. [www.seas.upenn.edu/~sweirich/papers/typepass/typepass-tr.pdf Intensional polymorphism in type-erasure semantics]. — ICFP, 1998.
  • Benedict R. Gaster. [www.cs.nott.ac.uk/Research/fop/gaster-thesis.pdf Records, variants and qualified types] // Technical report NOTTCS-TR-98-3. — Ph.D. Thesis, 1998.
  • Jacques Garrigue. [caml.inria.fr/pub/papers/garrigue-polymorphic_variants-ml98.pdf Programming with Polymorphic Variants]. — Kyoto University, 1998.
  • Didier Rémy, Jérôme Vouillon. [gallium.inria.fr/~remy/ftp/objective-ml!popl97.pdf Objective ML: An effective object-oriented extension to ML]. — Theory And Practice of Object Systems, ACM, 1998. — Т. 4(1). — С. 27 — 50.
  • John C. Reynolds. Theories of programming languages. — Cambridge University Press, 1998. — ISBN 978-0-521-59414-1 (hardback), 978-0-521-10697-9 (paperback).
  • The ML2000 Working Group. [www.cs.cmu.edu/~rwh/papers/ml2000/ml2000.pdf Principles and a Preliminary Design for ML2000] ( (англ.)). — 1999.
  • 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, 2004. — ISBN 0-511-04091-1 (eBook in netLibrary); 0-521-78098-5 (hardback).
  • Jens Palsberg, Tian Zhao. [ftp.cs.ucla.edu/~palsberg/paper/ic04.pdf Type Inference for Record Concatenation and Subtyping]. — 2004.
  • Daan Leijen. [research.microsoft.com/apps/pubs/default.aspx?id=64501 First-class Labels for Extensible Rows] // TechReport UU-CS-2004-51. — Universiteit Utrecht, 2004.
  • Matthias Blume, Umut A. Acar, Wonseok Chae. [people.cs.uchicago.edu/~blume/papers/icfp06.pdf Extensible Programming with First-Class Cases]. — ICFP, 2006.
  • Matthew Fluet, Riccardo Pucella. [www.cs.rit.edu/~mtf/research/phantom-subtyping/jfp06/jfp06.pdf Phantom Types and Subtyping] ( (англ.)). — JFP, 2006.
  • Stephen Weeks. [mlton.org/pages/References/attachments/060916-mlton.pdf Whole-Program Compilation in MLton] ( (англ.)). — 2006.
  • Matthias Blume. [www.microsoft.com/en-us/research/video/records-sums-cases-and-exceptions-row-polymorphism-at-work/ Records, Sums, Cases and Exceptions: Row polymorphism at work] : speech video. — Microsoft, 2007.
  • Matthias Blume, Umut A. Acar, Wonseok Chae. [people.cs.uchicago.edu/~blume/papers/aplas08-exceptions.pdf Exception Handlers as Extensible Cases]. — Toyota Technological Institute at Chicago, APLAS, 2008.
  • Wonseok Chae. [arxiv.org/pdf/0910.2654.pdf Type Safe Extensible Programming] // Ph.D. Thesis. — Toyota Technological Institute at Chicago, 2009.
  • Роман Душкин. [www.fprog.ru/2010/issue4/roman-dushkin-existentials/ Мономорфизм, полиморфизм и экзистенциальные типы]. — 2010.
  • Jeremy Yallop, Leo White. [www.cl.cam.ac.uk/~jdy22/papers/lightweight-higher-kinded-polymorphism.pdf Lightweight higher-kinded polymorphism]. — International Symposium on Functional and Logic Programming, 2014.
  • 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 с.
  • Stephanie Weirich, Brent A. Yorgey, Julien Cretin, Simon Peyton Jones, Dimitrios Vytiniotis, and Jose P. Magalhães. [repository.upenn.edu/cgi/viewcontent.cgi?article=1664&context=cis_papers Giving Haskell a promotion] // In Proceedings of the 8th ACM SIGPLAN Workshop on Types in Language Design and Implementation. — NY, USA: TLDI, 2012. — С. 53–66.
  • 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.
  • Andreas Rossberg. [www.mpi-sws.org/~rossberg/1ml/1ml.pdf 1ML – Core and Modules United (F-ing First-class Modules)]. — ICFP, 2015.
  • Andreas Rossberg. [www.mpi-sws.org/~rossberg/1ml/1ml-effects.pdf 1ML with Special Effects (F-ing Generativity Polymorphism)]. — WadlerFest, Google, 2016.
  • [wiki.haskell.org/Existential_type Haskell-Wiki: Existential types].
  • [wiki.haskell.org/Rank-N_types Haskell-Wiki: Rank-N types].
  • [wiki.haskell.org/Impredicative_types Haskell-Wiki: Impredicative types].
  • Jacques Garrigue. [caml.inria.fr/pub/docs/manual-ocaml/lablexamples.html OCaml manual: Polymorphic variants].

Отрывок, характеризующий Параметрический полиморфизм

– А! Граф Ростов! – радостно заговорил Пьер. – Так вы его сын, Илья. Я, можете себе представить, в первую минуту не узнал вас. Помните, как мы на Воробьевы горы ездили c m me Jacquot… [мадам Жако…] давно.
– Вы ошибаетесь, – неторопливо, с смелою и несколько насмешливою улыбкой проговорил Борис. – Я Борис, сын княгини Анны Михайловны Друбецкой. Ростова отца зовут Ильей, а сына – Николаем. И я m me Jacquot никакой не знал.
Пьер замахал руками и головой, как будто комары или пчелы напали на него.
– Ах, ну что это! я всё спутал. В Москве столько родных! Вы Борис…да. Ну вот мы с вами и договорились. Ну, что вы думаете о булонской экспедиции? Ведь англичанам плохо придется, ежели только Наполеон переправится через канал? Я думаю, что экспедиция очень возможна. Вилльнев бы не оплошал!
Борис ничего не знал о булонской экспедиции, он не читал газет и о Вилльневе в первый раз слышал.
– Мы здесь в Москве больше заняты обедами и сплетнями, чем политикой, – сказал он своим спокойным, насмешливым тоном. – Я ничего про это не знаю и не думаю. Москва занята сплетнями больше всего, – продолжал он. – Теперь говорят про вас и про графа.
Пьер улыбнулся своей доброю улыбкой, как будто боясь за своего собеседника, как бы он не сказал чего нибудь такого, в чем стал бы раскаиваться. Но Борис говорил отчетливо, ясно и сухо, прямо глядя в глаза Пьеру.
– Москве больше делать нечего, как сплетничать, – продолжал он. – Все заняты тем, кому оставит граф свое состояние, хотя, может быть, он переживет всех нас, чего я от души желаю…
– Да, это всё очень тяжело, – подхватил Пьер, – очень тяжело. – Пьер всё боялся, что этот офицер нечаянно вдастся в неловкий для самого себя разговор.
– А вам должно казаться, – говорил Борис, слегка краснея, но не изменяя голоса и позы, – вам должно казаться, что все заняты только тем, чтобы получить что нибудь от богача.
«Так и есть», подумал Пьер.
– А я именно хочу сказать вам, чтоб избежать недоразумений, что вы очень ошибетесь, ежели причтете меня и мою мать к числу этих людей. Мы очень бедны, но я, по крайней мере, за себя говорю: именно потому, что отец ваш богат, я не считаю себя его родственником, и ни я, ни мать никогда ничего не будем просить и не примем от него.
Пьер долго не мог понять, но когда понял, вскочил с дивана, ухватил Бориса за руку снизу с свойственною ему быстротой и неловкостью и, раскрасневшись гораздо более, чем Борис, начал говорить с смешанным чувством стыда и досады.
– Вот это странно! Я разве… да и кто ж мог думать… Я очень знаю…
Но Борис опять перебил его:
– Я рад, что высказал всё. Может быть, вам неприятно, вы меня извините, – сказал он, успокоивая Пьера, вместо того чтоб быть успокоиваемым им, – но я надеюсь, что не оскорбил вас. Я имею правило говорить всё прямо… Как же мне передать? Вы приедете обедать к Ростовым?
И Борис, видимо свалив с себя тяжелую обязанность, сам выйдя из неловкого положения и поставив в него другого, сделался опять совершенно приятен.
– Нет, послушайте, – сказал Пьер, успокоиваясь. – Вы удивительный человек. То, что вы сейчас сказали, очень хорошо, очень хорошо. Разумеется, вы меня не знаете. Мы так давно не видались…детьми еще… Вы можете предполагать во мне… Я вас понимаю, очень понимаю. Я бы этого не сделал, у меня недостало бы духу, но это прекрасно. Я очень рад, что познакомился с вами. Странно, – прибавил он, помолчав и улыбаясь, – что вы во мне предполагали! – Он засмеялся. – Ну, да что ж? Мы познакомимся с вами лучше. Пожалуйста. – Он пожал руку Борису. – Вы знаете ли, я ни разу не был у графа. Он меня не звал… Мне его жалко, как человека… Но что же делать?
– И вы думаете, что Наполеон успеет переправить армию? – спросил Борис, улыбаясь.
Пьер понял, что Борис хотел переменить разговор, и, соглашаясь с ним, начал излагать выгоды и невыгоды булонского предприятия.
Лакей пришел вызвать Бориса к княгине. Княгиня уезжала. Пьер обещался приехать обедать затем, чтобы ближе сойтись с Борисом, крепко жал его руку, ласково глядя ему в глаза через очки… По уходе его Пьер долго еще ходил по комнате, уже не пронзая невидимого врага шпагой, а улыбаясь при воспоминании об этом милом, умном и твердом молодом человеке.
Как это бывает в первой молодости и особенно в одиноком положении, он почувствовал беспричинную нежность к этому молодому человеку и обещал себе непременно подружиться с ним.
Князь Василий провожал княгиню. Княгиня держала платок у глаз, и лицо ее было в слезах.
– Это ужасно! ужасно! – говорила она, – но чего бы мне ни стоило, я исполню свой долг. Я приеду ночевать. Его нельзя так оставить. Каждая минута дорога. Я не понимаю, чего мешкают княжны. Может, Бог поможет мне найти средство его приготовить!… Adieu, mon prince, que le bon Dieu vous soutienne… [Прощайте, князь, да поддержит вас Бог.]
– Adieu, ma bonne, [Прощайте, моя милая,] – отвечал князь Василий, повертываясь от нее.
– Ах, он в ужасном положении, – сказала мать сыну, когда они опять садились в карету. – Он почти никого не узнает.
– Я не понимаю, маменька, какие его отношения к Пьеру? – спросил сын.
– Всё скажет завещание, мой друг; от него и наша судьба зависит…
– Но почему вы думаете, что он оставит что нибудь нам?
– Ах, мой друг! Он так богат, а мы так бедны!
– Ну, это еще недостаточная причина, маменька.
– Ах, Боже мой! Боже мой! Как он плох! – восклицала мать.


Когда Анна Михайловна уехала с сыном к графу Кириллу Владимировичу Безухому, графиня Ростова долго сидела одна, прикладывая платок к глазам. Наконец, она позвонила.
– Что вы, милая, – сказала она сердито девушке, которая заставила себя ждать несколько минут. – Не хотите служить, что ли? Так я вам найду место.
Графиня была расстроена горем и унизительною бедностью своей подруги и поэтому была не в духе, что выражалось у нее всегда наименованием горничной «милая» и «вы».
– Виновата с, – сказала горничная.
– Попросите ко мне графа.
Граф, переваливаясь, подошел к жене с несколько виноватым видом, как и всегда.
– Ну, графинюшка! Какое saute au madere [сотэ на мадере] из рябчиков будет, ma chere! Я попробовал; не даром я за Тараску тысячу рублей дал. Стоит!
Он сел подле жены, облокотив молодецки руки на колена и взъерошивая седые волосы.
– Что прикажете, графинюшка?
– Вот что, мой друг, – что это у тебя запачкано здесь? – сказала она, указывая на жилет. – Это сотэ, верно, – прибавила она улыбаясь. – Вот что, граф: мне денег нужно.
Лицо ее стало печально.
– Ах, графинюшка!…
И граф засуетился, доставая бумажник.
– Мне много надо, граф, мне пятьсот рублей надо.
И она, достав батистовый платок, терла им жилет мужа.
– Сейчас, сейчас. Эй, кто там? – крикнул он таким голосом, каким кричат только люди, уверенные, что те, кого они кличут, стремглав бросятся на их зов. – Послать ко мне Митеньку!
Митенька, тот дворянский сын, воспитанный у графа, который теперь заведывал всеми его делами, тихими шагами вошел в комнату.
– Вот что, мой милый, – сказал граф вошедшему почтительному молодому человеку. – Принеси ты мне… – он задумался. – Да, 700 рублей, да. Да смотри, таких рваных и грязных, как тот раз, не приноси, а хороших, для графини.
– Да, Митенька, пожалуйста, чтоб чистенькие, – сказала графиня, грустно вздыхая.
– Ваше сиятельство, когда прикажете доставить? – сказал Митенька. – Изволите знать, что… Впрочем, не извольте беспокоиться, – прибавил он, заметив, как граф уже начал тяжело и часто дышать, что всегда было признаком начинавшегося гнева. – Я было и запамятовал… Сию минуту прикажете доставить?
– Да, да, то то, принеси. Вот графине отдай.
– Экое золото у меня этот Митенька, – прибавил граф улыбаясь, когда молодой человек вышел. – Нет того, чтобы нельзя. Я же этого терпеть не могу. Всё можно.
– Ах, деньги, граф, деньги, сколько от них горя на свете! – сказала графиня. – А эти деньги мне очень нужны.
– Вы, графинюшка, мотовка известная, – проговорил граф и, поцеловав у жены руку, ушел опять в кабинет.
Когда Анна Михайловна вернулась опять от Безухого, у графини лежали уже деньги, всё новенькими бумажками, под платком на столике, и Анна Михайловна заметила, что графиня чем то растревожена.
– Ну, что, мой друг? – спросила графиня.
– Ах, в каком он ужасном положении! Его узнать нельзя, он так плох, так плох; я минутку побыла и двух слов не сказала…
– Annette, ради Бога, не откажи мне, – сказала вдруг графиня, краснея, что так странно было при ее немолодом, худом и важном лице, доставая из под платка деньги.
Анна Михайловна мгновенно поняла, в чем дело, и уж нагнулась, чтобы в должную минуту ловко обнять графиню.
– Вот Борису от меня, на шитье мундира…
Анна Михайловна уж обнимала ее и плакала. Графиня плакала тоже. Плакали они о том, что они дружны; и о том, что они добры; и о том, что они, подруги молодости, заняты таким низким предметом – деньгами; и о том, что молодость их прошла… Но слезы обеих были приятны…


Графиня Ростова с дочерьми и уже с большим числом гостей сидела в гостиной. Граф провел гостей мужчин в кабинет, предлагая им свою охотницкую коллекцию турецких трубок. Изредка он выходил и спрашивал: не приехала ли? Ждали Марью Дмитриевну Ахросимову, прозванную в обществе le terrible dragon, [страшный дракон,] даму знаменитую не богатством, не почестями, но прямотой ума и откровенною простотой обращения. Марью Дмитриевну знала царская фамилия, знала вся Москва и весь Петербург, и оба города, удивляясь ей, втихомолку посмеивались над ее грубостью, рассказывали про нее анекдоты; тем не менее все без исключения уважали и боялись ее.
В кабинете, полном дыма, шел разговор о войне, которая была объявлена манифестом, о наборе. Манифеста еще никто не читал, но все знали о его появлении. Граф сидел на отоманке между двумя курившими и разговаривавшими соседями. Граф сам не курил и не говорил, а наклоняя голову, то на один бок, то на другой, с видимым удовольствием смотрел на куривших и слушал разговор двух соседей своих, которых он стравил между собой.
Один из говоривших был штатский, с морщинистым, желчным и бритым худым лицом, человек, уже приближавшийся к старости, хотя и одетый, как самый модный молодой человек; он сидел с ногами на отоманке с видом домашнего человека и, сбоку запустив себе далеко в рот янтарь, порывисто втягивал дым и жмурился. Это был старый холостяк Шиншин, двоюродный брат графини, злой язык, как про него говорили в московских гостиных. Он, казалось, снисходил до своего собеседника. Другой, свежий, розовый, гвардейский офицер, безупречно вымытый, застегнутый и причесанный, держал янтарь у середины рта и розовыми губами слегка вытягивал дымок, выпуская его колечками из красивого рта. Это был тот поручик Берг, офицер Семеновского полка, с которым Борис ехал вместе в полк и которым Наташа дразнила Веру, старшую графиню, называя Берга ее женихом. Граф сидел между ними и внимательно слушал. Самое приятное для графа занятие, за исключением игры в бостон, которую он очень любил, было положение слушающего, особенно когда ему удавалось стравить двух говорливых собеседников.
– Ну, как же, батюшка, mon tres honorable [почтеннейший] Альфонс Карлыч, – говорил Шиншин, посмеиваясь и соединяя (в чем и состояла особенность его речи) самые народные русские выражения с изысканными французскими фразами. – Vous comptez vous faire des rentes sur l'etat, [Вы рассчитываете иметь доход с казны,] с роты доходец получать хотите?
– Нет с, Петр Николаич, я только желаю показать, что в кавалерии выгод гораздо меньше против пехоты. Вот теперь сообразите, Петр Николаич, мое положение…
Берг говорил всегда очень точно, спокойно и учтиво. Разговор его всегда касался только его одного; он всегда спокойно молчал, пока говорили о чем нибудь, не имеющем прямого к нему отношения. И молчать таким образом он мог несколько часов, не испытывая и не производя в других ни малейшего замешательства. Но как скоро разговор касался его лично, он начинал говорить пространно и с видимым удовольствием.
– Сообразите мое положение, Петр Николаич: будь я в кавалерии, я бы получал не более двухсот рублей в треть, даже и в чине поручика; а теперь я получаю двести тридцать, – говорил он с радостною, приятною улыбкой, оглядывая Шиншина и графа, как будто для него было очевидно, что его успех всегда будет составлять главную цель желаний всех остальных людей.
– Кроме того, Петр Николаич, перейдя в гвардию, я на виду, – продолжал Берг, – и вакансии в гвардейской пехоте гораздо чаще. Потом, сами сообразите, как я мог устроиться из двухсот тридцати рублей. А я откладываю и еще отцу посылаю, – продолжал он, пуская колечко.
– La balance у est… [Баланс установлен…] Немец на обухе молотит хлебец, comme dit le рroverbe, [как говорит пословица,] – перекладывая янтарь на другую сторону ртa, сказал Шиншин и подмигнул графу.
Граф расхохотался. Другие гости, видя, что Шиншин ведет разговор, подошли послушать. Берг, не замечая ни насмешки, ни равнодушия, продолжал рассказывать о том, как переводом в гвардию он уже выиграл чин перед своими товарищами по корпусу, как в военное время ротного командира могут убить, и он, оставшись старшим в роте, может очень легко быть ротным, и как в полку все любят его, и как его папенька им доволен. Берг, видимо, наслаждался, рассказывая всё это, и, казалось, не подозревал того, что у других людей могли быть тоже свои интересы. Но всё, что он рассказывал, было так мило степенно, наивность молодого эгоизма его была так очевидна, что он обезоруживал своих слушателей.
– Ну, батюшка, вы и в пехоте, и в кавалерии, везде пойдете в ход; это я вам предрекаю, – сказал Шиншин, трепля его по плечу и спуская ноги с отоманки.
Берг радостно улыбнулся. Граф, а за ним и гости вышли в гостиную.

Было то время перед званым обедом, когда собравшиеся гости не начинают длинного разговора в ожидании призыва к закуске, а вместе с тем считают необходимым шевелиться и не молчать, чтобы показать, что они нисколько не нетерпеливы сесть за стол. Хозяева поглядывают на дверь и изредка переглядываются между собой. Гости по этим взглядам стараются догадаться, кого или чего еще ждут: важного опоздавшего родственника или кушанья, которое еще не поспело.
Пьер приехал перед самым обедом и неловко сидел посредине гостиной на первом попавшемся кресле, загородив всем дорогу. Графиня хотела заставить его говорить, но он наивно смотрел в очки вокруг себя, как бы отыскивая кого то, и односложно отвечал на все вопросы графини. Он был стеснителен и один не замечал этого. Большая часть гостей, знавшая его историю с медведем, любопытно смотрели на этого большого толстого и смирного человека, недоумевая, как мог такой увалень и скромник сделать такую штуку с квартальным.
– Вы недавно приехали? – спрашивала у него графиня.
– Oui, madame, [Да, сударыня,] – отвечал он, оглядываясь.
– Вы не видали моего мужа?
– Non, madame. [Нет, сударыня.] – Он улыбнулся совсем некстати.
– Вы, кажется, недавно были в Париже? Я думаю, очень интересно.
– Очень интересно..
Графиня переглянулась с Анной Михайловной. Анна Михайловна поняла, что ее просят занять этого молодого человека, и, подсев к нему, начала говорить об отце; но так же, как и графине, он отвечал ей только односложными словами. Гости были все заняты между собой. Les Razoumovsky… ca a ete charmant… Vous etes bien bonne… La comtesse Apraksine… [Разумовские… Это было восхитительно… Вы очень добры… Графиня Апраксина…] слышалось со всех сторон. Графиня встала и пошла в залу.
– Марья Дмитриевна? – послышался ее голос из залы.
– Она самая, – послышался в ответ грубый женский голос, и вслед за тем вошла в комнату Марья Дмитриевна.
Все барышни и даже дамы, исключая самых старых, встали. Марья Дмитриевна остановилась в дверях и, с высоты своего тучного тела, высоко держа свою с седыми буклями пятидесятилетнюю голову, оглядела гостей и, как бы засучиваясь, оправила неторопливо широкие рукава своего платья. Марья Дмитриевна всегда говорила по русски.
– Имениннице дорогой с детками, – сказала она своим громким, густым, подавляющим все другие звуки голосом. – Ты что, старый греховодник, – обратилась она к графу, целовавшему ее руку, – чай, скучаешь в Москве? Собак гонять негде? Да что, батюшка, делать, вот как эти пташки подрастут… – Она указывала на девиц. – Хочешь – не хочешь, надо женихов искать.
– Ну, что, казак мой? (Марья Дмитриевна казаком называла Наташу) – говорила она, лаская рукой Наташу, подходившую к ее руке без страха и весело. – Знаю, что зелье девка, а люблю.
Она достала из огромного ридикюля яхонтовые сережки грушками и, отдав их именинно сиявшей и разрумянившейся Наташе, тотчас же отвернулась от нее и обратилась к Пьеру.
– Э, э! любезный! поди ка сюда, – сказала она притворно тихим и тонким голосом. – Поди ка, любезный…
И она грозно засучила рукава еще выше.
Пьер подошел, наивно глядя на нее через очки.
– Подойди, подойди, любезный! Я и отцу то твоему правду одна говорила, когда он в случае был, а тебе то и Бог велит.
Она помолчала. Все молчали, ожидая того, что будет, и чувствуя, что было только предисловие.
– Хорош, нечего сказать! хорош мальчик!… Отец на одре лежит, а он забавляется, квартального на медведя верхом сажает. Стыдно, батюшка, стыдно! Лучше бы на войну шел.
Она отвернулась и подала руку графу, который едва удерживался от смеха.
– Ну, что ж, к столу, я чай, пора? – сказала Марья Дмитриевна.
Впереди пошел граф с Марьей Дмитриевной; потом графиня, которую повел гусарский полковник, нужный человек, с которым Николай должен был догонять полк. Анна Михайловна – с Шиншиным. Берг подал руку Вере. Улыбающаяся Жюли Карагина пошла с Николаем к столу. За ними шли еще другие пары, протянувшиеся по всей зале, и сзади всех по одиночке дети, гувернеры и гувернантки. Официанты зашевелились, стулья загремели, на хорах заиграла музыка, и гости разместились. Звуки домашней музыки графа заменились звуками ножей и вилок, говора гостей, тихих шагов официантов.
На одном конце стола во главе сидела графиня. Справа Марья Дмитриевна, слева Анна Михайловна и другие гостьи. На другом конце сидел граф, слева гусарский полковник, справа Шиншин и другие гости мужского пола. С одной стороны длинного стола молодежь постарше: Вера рядом с Бергом, Пьер рядом с Борисом; с другой стороны – дети, гувернеры и гувернантки. Граф из за хрусталя, бутылок и ваз с фруктами поглядывал на жену и ее высокий чепец с голубыми лентами и усердно подливал вина своим соседям, не забывая и себя. Графиня так же, из за ананасов, не забывая обязанности хозяйки, кидала значительные взгляды на мужа, которого лысина и лицо, казалось ей, своею краснотой резче отличались от седых волос. На дамском конце шло равномерное лепетанье; на мужском всё громче и громче слышались голоса, особенно гусарского полковника, который так много ел и пил, всё более и более краснея, что граф уже ставил его в пример другим гостям. Берг с нежной улыбкой говорил с Верой о том, что любовь есть чувство не земное, а небесное. Борис называл новому своему приятелю Пьеру бывших за столом гостей и переглядывался с Наташей, сидевшей против него. Пьер мало говорил, оглядывал новые лица и много ел. Начиная от двух супов, из которых он выбрал a la tortue, [черепаховый,] и кулебяки и до рябчиков он не пропускал ни одного блюда и ни одного вина, которое дворецкий в завернутой салфеткою бутылке таинственно высовывал из за плеча соседа, приговаривая или «дрей мадера», или «венгерское», или «рейнвейн». Он подставлял первую попавшуюся из четырех хрустальных, с вензелем графа, рюмок, стоявших перед каждым прибором, и пил с удовольствием, всё с более и более приятным видом поглядывая на гостей. Наташа, сидевшая против него, глядела на Бориса, как глядят девочки тринадцати лет на мальчика, с которым они в первый раз только что поцеловались и в которого они влюблены. Этот самый взгляд ее иногда обращался на Пьера, и ему под взглядом этой смешной, оживленной девочки хотелось смеяться самому, не зная чему.
Николай сидел далеко от Сони, подле Жюли Карагиной, и опять с той же невольной улыбкой что то говорил с ней. Соня улыбалась парадно, но, видимо, мучилась ревностью: то бледнела, то краснела и всеми силами прислушивалась к тому, что говорили между собою Николай и Жюли. Гувернантка беспокойно оглядывалась, как бы приготавливаясь к отпору, ежели бы кто вздумал обидеть детей. Гувернер немец старался запомнить вое роды кушаний, десертов и вин с тем, чтобы описать всё подробно в письме к домашним в Германию, и весьма обижался тем, что дворецкий, с завернутою в салфетку бутылкой, обносил его. Немец хмурился, старался показать вид, что он и не желал получить этого вина, но обижался потому, что никто не хотел понять, что вино нужно было ему не для того, чтобы утолить жажду, не из жадности, а из добросовестной любознательности.


На мужском конце стола разговор всё более и более оживлялся. Полковник рассказал, что манифест об объявлении войны уже вышел в Петербурге и что экземпляр, который он сам видел, доставлен ныне курьером главнокомандующему.
– И зачем нас нелегкая несет воевать с Бонапартом? – сказал Шиншин. – II a deja rabattu le caquet a l'Autriche. Je crains, que cette fois ce ne soit notre tour. [Он уже сбил спесь с Австрии. Боюсь, не пришел бы теперь наш черед.]
Полковник был плотный, высокий и сангвинический немец, очевидно, служака и патриот. Он обиделся словами Шиншина.
– А затэ м, мы лосты вый государ, – сказал он, выговаривая э вместо е и ъ вместо ь . – Затэм, что импэ ратор это знаэ т. Он в манифэ стэ сказал, что нэ можэ т смотрэт равнодушно на опасности, угрожающие России, и что бэ зопасност империи, достоинство ее и святост союзов , – сказал он, почему то особенно налегая на слово «союзов», как будто в этом была вся сущность дела.
И с свойственною ему непогрешимою, официальною памятью он повторил вступительные слова манифеста… «и желание, единственную и непременную цель государя составляющее: водворить в Европе на прочных основаниях мир – решили его двинуть ныне часть войска за границу и сделать к достижению „намерения сего новые усилия“.
– Вот зачэм, мы лосты вый государ, – заключил он, назидательно выпивая стакан вина и оглядываясь на графа за поощрением.
– Connaissez vous le proverbe: [Знаете пословицу:] «Ерема, Ерема, сидел бы ты дома, точил бы свои веретена», – сказал Шиншин, морщась и улыбаясь. – Cela nous convient a merveille. [Это нам кстати.] Уж на что Суворова – и того расколотили, a plate couture, [на голову,] а где y нас Суворовы теперь? Je vous demande un peu, [Спрашиваю я вас,] – беспрестанно перескакивая с русского на французский язык, говорил он.
– Мы должны и драться до послэ днэ капли кров, – сказал полковник, ударяя по столу, – и умэ р р рэ т за своэ го импэ ратора, и тогда всэ й будэ т хорошо. А рассуждать как мо о ожно (он особенно вытянул голос на слове «можно»), как мо о ожно менше, – докончил он, опять обращаясь к графу. – Так старые гусары судим, вот и всё. А вы как судитэ , молодой человек и молодой гусар? – прибавил он, обращаясь к Николаю, который, услыхав, что дело шло о войне, оставил свою собеседницу и во все глаза смотрел и всеми ушами слушал полковника.
– Совершенно с вами согласен, – отвечал Николай, весь вспыхнув, вертя тарелку и переставляя стаканы с таким решительным и отчаянным видом, как будто в настоящую минуту он подвергался великой опасности, – я убежден, что русские должны умирать или побеждать, – сказал он, сам чувствуя так же, как и другие, после того как слово уже было сказано, что оно было слишком восторженно и напыщенно для настоящего случая и потому неловко.
– C'est bien beau ce que vous venez de dire, [Прекрасно! прекрасно то, что вы сказали,] – сказала сидевшая подле него Жюли, вздыхая. Соня задрожала вся и покраснела до ушей, за ушами и до шеи и плеч, в то время как Николай говорил. Пьер прислушался к речам полковника и одобрительно закивал головой.
– Вот это славно, – сказал он.
– Настоящэ й гусар, молодой человэк, – крикнул полковник, ударив опять по столу.
– О чем вы там шумите? – вдруг послышался через стол басистый голос Марьи Дмитриевны. – Что ты по столу стучишь? – обратилась она к гусару, – на кого ты горячишься? верно, думаешь, что тут французы перед тобой?
– Я правду говору, – улыбаясь сказал гусар.
– Всё о войне, – через стол прокричал граф. – Ведь у меня сын идет, Марья Дмитриевна, сын идет.
– А у меня четыре сына в армии, а я не тужу. На всё воля Божья: и на печи лежа умрешь, и в сражении Бог помилует, – прозвучал без всякого усилия, с того конца стола густой голос Марьи Дмитриевны.
– Это так.
И разговор опять сосредоточился – дамский на своем конце стола, мужской на своем.
– А вот не спросишь, – говорил маленький брат Наташе, – а вот не спросишь!
– Спрошу, – отвечала Наташа.
Лицо ее вдруг разгорелось, выражая отчаянную и веселую решимость. Она привстала, приглашая взглядом Пьера, сидевшего против нее, прислушаться, и обратилась к матери:
– Мама! – прозвучал по всему столу ее детски грудной голос.
– Что тебе? – спросила графиня испуганно, но, по лицу дочери увидев, что это была шалость, строго замахала ей рукой, делая угрожающий и отрицательный жест головой.
Разговор притих.
– Мама! какое пирожное будет? – еще решительнее, не срываясь, прозвучал голосок Наташи.
Графиня хотела хмуриться, но не могла. Марья Дмитриевна погрозила толстым пальцем.
– Казак, – проговорила она с угрозой.
Большинство гостей смотрели на старших, не зная, как следует принять эту выходку.
– Вот я тебя! – сказала графиня.
– Мама! что пирожное будет? – закричала Наташа уже смело и капризно весело, вперед уверенная, что выходка ее будет принята хорошо.
Соня и толстый Петя прятались от смеха.
– Вот и спросила, – прошептала Наташа маленькому брату и Пьеру, на которого она опять взглянула.
– Мороженое, только тебе не дадут, – сказала Марья Дмитриевна.
Наташа видела, что бояться нечего, и потому не побоялась и Марьи Дмитриевны.
– Марья Дмитриевна? какое мороженое! Я сливочное не люблю.
– Морковное.
– Нет, какое? Марья Дмитриевна, какое? – почти кричала она. – Я хочу знать!
Марья Дмитриевна и графиня засмеялись, и за ними все гости. Все смеялись не ответу Марьи Дмитриевны, но непостижимой смелости и ловкости этой девочки, умевшей и смевшей так обращаться с Марьей Дмитриевной.
Наташа отстала только тогда, когда ей сказали, что будет ананасное. Перед мороженым подали шампанское. Опять заиграла музыка, граф поцеловался с графинюшкою, и гости, вставая, поздравляли графиню, через стол чокались с графом, детьми и друг с другом. Опять забегали официанты, загремели стулья, и в том же порядке, но с более красными лицами, гости вернулись в гостиную и кабинет графа.


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

Пьер сидел в гостиной, где Шиншин, как с приезжим из за границы, завел с ним скучный для Пьера политический разговор, к которому присоединились и другие. Когда заиграла музыка, Наташа вошла в гостиную и, подойдя прямо к Пьеру, смеясь и краснея, сказала:
– Мама велела вас просить танцовать.
– Я боюсь спутать фигуры, – сказал Пьер, – но ежели вы хотите быть моим учителем…
И он подал свою толстую руку, низко опуская ее, тоненькой девочке.
Пока расстанавливались пары и строили музыканты, Пьер сел с своей маленькой дамой. Наташа была совершенно счастлива; она танцовала с большим , с приехавшим из за границы . Она сидела на виду у всех и разговаривала с ним, как большая. У нее в руке был веер, который ей дала подержать одна барышня. И, приняв самую светскую позу (Бог знает, где и когда она этому научилась), она, обмахиваясь веером и улыбаясь через веер, говорила с своим кавалером.
– Какова, какова? Смотрите, смотрите, – сказала старая графиня, проходя через залу и указывая на Наташу.
Наташа покраснела и засмеялась.
– Ну, что вы, мама? Ну, что вам за охота? Что ж тут удивительного?

В середине третьего экосеза зашевелились стулья в гостиной, где играли граф и Марья Дмитриевна, и большая часть почетных гостей и старички, потягиваясь после долгого сиденья и укладывая в карманы бумажники и кошельки, выходили в двери залы. Впереди шла Марья Дмитриевна с графом – оба с веселыми лицами. Граф с шутливою вежливостью, как то по балетному, подал округленную руку Марье Дмитриевне. Он выпрямился, и лицо его озарилось особенною молодецки хитрою улыбкой, и как только дотанцовали последнюю фигуру экосеза, он ударил в ладоши музыкантам и закричал на хоры, обращаясь к первой скрипке:
– Семен! Данилу Купора знаешь?
Это был любимый танец графа, танцованный им еще в молодости. (Данило Купор была собственно одна фигура англеза .)
– Смотрите на папа, – закричала на всю залу Наташа (совершенно забыв, что она танцует с большим), пригибая к коленам свою кудрявую головку и заливаясь своим звонким смехом по всей зале.
Действительно, всё, что только было в зале, с улыбкою радости смотрело на веселого старичка, который рядом с своею сановитою дамой, Марьей Дмитриевной, бывшей выше его ростом, округлял руки, в такт потряхивая ими, расправлял плечи, вывертывал ноги, слегка притопывая, и всё более и более распускавшеюся улыбкой на своем круглом лице приготовлял зрителей к тому, что будет. Как только заслышались веселые, вызывающие звуки Данилы Купора, похожие на развеселого трепачка, все двери залы вдруг заставились с одной стороны мужскими, с другой – женскими улыбающимися лицами дворовых, вышедших посмотреть на веселящегося барина.
– Батюшка то наш! Орел! – проговорила громко няня из одной двери.
Граф танцовал хорошо и знал это, но его дама вовсе не умела и не хотела хорошо танцовать. Ее огромное тело стояло прямо с опущенными вниз мощными руками (она передала ридикюль графине); только одно строгое, но красивое лицо ее танцовало. Что выражалось во всей круглой фигуре графа, у Марьи Дмитриевны выражалось лишь в более и более улыбающемся лице и вздергивающемся носе. Но зато, ежели граф, всё более и более расходясь, пленял зрителей неожиданностью ловких выверток и легких прыжков своих мягких ног, Марья Дмитриевна малейшим усердием при движении плеч или округлении рук в поворотах и притопываньях, производила не меньшее впечатление по заслуге, которую ценил всякий при ее тучности и всегдашней суровости. Пляска оживлялась всё более и более. Визави не могли ни на минуту обратить на себя внимания и даже не старались о том. Всё было занято графом и Марьею Дмитриевной. Наташа дергала за рукава и платье всех присутствовавших, которые и без того не спускали глаз с танцующих, и требовала, чтоб смотрели на папеньку. Граф в промежутках танца тяжело переводил дух, махал и кричал музыкантам, чтоб они играли скорее. Скорее, скорее и скорее, лише, лише и лише развертывался граф, то на цыпочках, то на каблуках, носясь вокруг Марьи Дмитриевны и, наконец, повернув свою даму к ее месту, сделал последнее па, подняв сзади кверху свою мягкую ногу, склонив вспотевшую голову с улыбающимся лицом и округло размахнув правою рукой среди грохота рукоплесканий и хохота, особенно Наташи. Оба танцующие остановились, тяжело переводя дыхание и утираясь батистовыми платками.
– Вот как в наше время танцовывали, ma chere, – сказал граф.
– Ай да Данила Купор! – тяжело и продолжительно выпуская дух и засучивая рукава, сказала Марья Дмитриевна.


В то время как у Ростовых танцовали в зале шестой англез под звуки от усталости фальшививших музыкантов, и усталые официанты и повара готовили ужин, с графом Безухим сделался шестой удар. Доктора объявили, что надежды к выздоровлению нет; больному дана была глухая исповедь и причастие; делали приготовления для соборования, и в доме была суетня и тревога ожидания, обыкновенные в такие минуты. Вне дома, за воротами толпились, скрываясь от подъезжавших экипажей, гробовщики, ожидая богатого заказа на похороны графа. Главнокомандующий Москвы, который беспрестанно присылал адъютантов узнавать о положении графа, в этот вечер сам приезжал проститься с знаменитым Екатерининским вельможей, графом Безухим.
Великолепная приемная комната была полна. Все почтительно встали, когда главнокомандующий, пробыв около получаса наедине с больным, вышел оттуда, слегка отвечая на поклоны и стараясь как можно скорее пройти мимо устремленных на него взглядов докторов, духовных лиц и родственников. Князь Василий, похудевший и побледневший за эти дни, провожал главнокомандующего и что то несколько раз тихо повторил ему.
Проводив главнокомандующего, князь Василий сел в зале один на стул, закинув высоко ногу на ногу, на коленку упирая локоть и рукою закрыв глаза. Посидев так несколько времени, он встал и непривычно поспешными шагами, оглядываясь кругом испуганными глазами, пошел чрез длинный коридор на заднюю половину дома, к старшей княжне.
Находившиеся в слабо освещенной комнате неровным шопотом говорили между собой и замолкали каждый раз и полными вопроса и ожидания глазами оглядывались на дверь, которая вела в покои умирающего и издавала слабый звук, когда кто нибудь выходил из нее или входил в нее.
– Предел человеческий, – говорил старичок, духовное лицо, даме, подсевшей к нему и наивно слушавшей его, – предел положен, его же не прейдеши.
– Я думаю, не поздно ли соборовать? – прибавляя духовный титул, спрашивала дама, как будто не имея на этот счет никакого своего мнения.
– Таинство, матушка, великое, – отвечало духовное лицо, проводя рукою по лысине, по которой пролегало несколько прядей зачесанных полуседых волос.
– Это кто же? сам главнокомандующий был? – спрашивали в другом конце комнаты. – Какой моложавый!…
– А седьмой десяток! Что, говорят, граф то не узнает уж? Хотели соборовать?
– Я одного знал: семь раз соборовался.
Вторая княжна только вышла из комнаты больного с заплаканными глазами и села подле доктора Лоррена, который в грациозной позе сидел под портретом Екатерины, облокотившись на стол.
– Tres beau, – говорил доктор, отвечая на вопрос о погоде, – tres beau, princesse, et puis, a Moscou on se croit a la campagne. [прекрасная погода, княжна, и потом Москва так похожа на деревню.]
– N'est ce pas? [Не правда ли?] – сказала княжна, вздыхая. – Так можно ему пить?
Лоррен задумался.
– Он принял лекарство?
– Да.
Доктор посмотрел на брегет.
– Возьмите стакан отварной воды и положите une pincee (он своими тонкими пальцами показал, что значит une pincee) de cremortartari… [щепотку кремортартара…]
– Не пило слушай , – говорил немец доктор адъютанту, – чтопи с третий удар шивь оставался .
– А какой свежий был мужчина! – говорил адъютант. – И кому пойдет это богатство? – прибавил он шопотом.
– Окотник найдутся , – улыбаясь, отвечал немец.
Все опять оглянулись на дверь: она скрипнула, и вторая княжна, сделав питье, показанное Лорреном, понесла его больному. Немец доктор подошел к Лоррену.
– Еще, может, дотянется до завтрашнего утра? – спросил немец, дурно выговаривая по французски.
Лоррен, поджав губы, строго и отрицательно помахал пальцем перед своим носом.
– Сегодня ночью, не позже, – сказал он тихо, с приличною улыбкой самодовольства в том, что ясно умеет понимать и выражать положение больного, и отошел.

Между тем князь Василий отворил дверь в комнату княжны.
В комнате было полутемно; только две лампадки горели перед образами, и хорошо пахло куреньем и цветами. Вся комната была установлена мелкою мебелью шифоньерок, шкапчиков, столиков. Из за ширм виднелись белые покрывала высокой пуховой кровати. Собачка залаяла.
– Ах, это вы, mon cousin?
Она встала и оправила волосы, которые у нее всегда, даже и теперь, были так необыкновенно гладки, как будто они были сделаны из одного куска с головой и покрыты лаком.
– Что, случилось что нибудь? – спросила она. – Я уже так напугалась.
– Ничего, всё то же; я только пришел поговорить с тобой, Катишь, о деле, – проговорил князь, устало садясь на кресло, с которого она встала. – Как ты нагрела, однако, – сказал он, – ну, садись сюда, causons. [поговорим.]
– Я думала, не случилось ли что? – сказала княжна и с своим неизменным, каменно строгим выражением лица села против князя, готовясь слушать.
– Хотела уснуть, mon cousin, и не могу.
– Ну, что, моя милая? – сказал князь Василий, взяв руку княжны и пригибая ее по своей привычке книзу.
Видно было, что это «ну, что» относилось ко многому такому, что, не называя, они понимали оба.
Княжна, с своею несообразно длинною по ногам, сухою и прямою талией, прямо и бесстрастно смотрела на князя выпуклыми серыми глазами. Она покачала головой и, вздохнув, посмотрела на образа. Жест ее можно было объяснить и как выражение печали и преданности, и как выражение усталости и надежды на скорый отдых. Князь Василий объяснил этот жест как выражение усталости.
– А мне то, – сказал он, – ты думаешь, легче? Je suis ereinte, comme un cheval de poste; [Я заморен, как почтовая лошадь;] а всё таки мне надо с тобой поговорить, Катишь, и очень серьезно.
Князь Василий замолчал, и щеки его начинали нервически подергиваться то на одну, то на другую сторону, придавая его лицу неприятное выражение, какое никогда не показывалось на лице князя Василия, когда он бывал в гостиных. Глаза его тоже были не такие, как всегда: то они смотрели нагло шутливо, то испуганно оглядывались.
Княжна, своими сухими, худыми руками придерживая на коленях собачку, внимательно смотрела в глаза князю Василию; но видно было, что она не прервет молчания вопросом, хотя бы ей пришлось молчать до утра.
– Вот видите ли, моя милая княжна и кузина, Катерина Семеновна, – продолжал князь Василий, видимо, не без внутренней борьбы приступая к продолжению своей речи, – в такие минуты, как теперь, обо всём надо подумать. Надо подумать о будущем, о вас… Я вас всех люблю, как своих детей, ты это знаешь.
Княжна так же тускло и неподвижно смотрела на него.
– Наконец, надо подумать и о моем семействе, – сердито отталкивая от себя столик и не глядя на нее, продолжал князь Василий, – ты знаешь, Катишь, что вы, три сестры Мамонтовы, да еще моя жена, мы одни прямые наследники графа. Знаю, знаю, как тебе тяжело говорить и думать о таких вещах. И мне не легче; но, друг мой, мне шестой десяток, надо быть ко всему готовым. Ты знаешь ли, что я послал за Пьером, и что граф, прямо указывая на его портрет, требовал его к себе?
Князь Василий вопросительно посмотрел на княжну, но не мог понять, соображала ли она то, что он ей сказал, или просто смотрела на него…
– Я об одном не перестаю молить Бога, mon cousin, – отвечала она, – чтоб он помиловал его и дал бы его прекрасной душе спокойно покинуть эту…
– Да, это так, – нетерпеливо продолжал князь Василий, потирая лысину и опять с злобой придвигая к себе отодвинутый столик, – но, наконец…наконец дело в том, ты сама знаешь, что прошлою зимой граф написал завещание, по которому он всё имение, помимо прямых наследников и нас, отдавал Пьеру.
– Мало ли он писал завещаний! – спокойно сказала княжна. – Но Пьеру он не мог завещать. Пьер незаконный.
– Ma chere, – сказал вдруг князь Василий, прижав к себе столик, оживившись и начав говорить скорей, – но что, ежели письмо написано государю, и граф просит усыновить Пьера? Понимаешь, по заслугам графа его просьба будет уважена…
Княжна улыбнулась, как улыбаются люди, которые думают что знают дело больше, чем те, с кем разговаривают.
– Я тебе скажу больше, – продолжал князь Василий, хватая ее за руку, – письмо было написано, хотя и не отослано, и государь знал о нем. Вопрос только в том, уничтожено ли оно, или нет. Ежели нет, то как скоро всё кончится , – князь Василий вздохнул, давая этим понять, что он разумел под словами всё кончится , – и вскроют бумаги графа, завещание с письмом будет передано государю, и просьба его, наверно, будет уважена. Пьер, как законный сын, получит всё.
– А наша часть? – спросила княжна, иронически улыбаясь так, как будто всё, но только не это, могло случиться.
– Mais, ma pauvre Catiche, c'est clair, comme le jour. [Но, моя дорогая Катишь, это ясно, как день.] Он один тогда законный наследник всего, а вы не получите ни вот этого. Ты должна знать, моя милая, были ли написаны завещание и письмо, и уничтожены ли они. И ежели почему нибудь они забыты, то ты должна знать, где они, и найти их, потому что…
– Этого только недоставало! – перебила его княжна, сардонически улыбаясь и не изменяя выражения глаз. – Я женщина; по вашему мы все глупы; но я настолько знаю, что незаконный сын не может наследовать… Un batard, [Незаконный,] – прибавила она, полагая этим переводом окончательно показать князю его неосновательность.
– Как ты не понимаешь, наконец, Катишь! Ты так умна: как ты не понимаешь, – ежели граф написал письмо государю, в котором просит его признать сына законным, стало быть, Пьер уж будет не Пьер, а граф Безухой, и тогда он по завещанию получит всё? И ежели завещание с письмом не уничтожены, то тебе, кроме утешения, что ты была добродетельна et tout ce qui s'en suit, [и всего, что отсюда вытекает,] ничего не останется. Это верно.
– Я знаю, что завещание написано; но знаю тоже, что оно недействительно, и вы меня, кажется, считаете за совершенную дуру, mon cousin, – сказала княжна с тем выражением, с которым говорят женщины, полагающие, что они сказали нечто остроумное и оскорбительное.
– Милая ты моя княжна Катерина Семеновна, – нетерпеливо заговорил князь Василий. – Я пришел к тебе не за тем, чтобы пикироваться с тобой, а за тем, чтобы как с родной, хорошею, доброю, истинною родной, поговорить о твоих же интересах. Я тебе говорю десятый раз, что ежели письмо к государю и завещание в пользу Пьера есть в бумагах графа, то ты, моя голубушка, и с сестрами, не наследница. Ежели ты мне не веришь, то поверь людям знающим: я сейчас говорил с Дмитрием Онуфриичем (это был адвокат дома), он то же сказал.
Видимо, что то вдруг изменилось в мыслях княжны; тонкие губы побледнели (глаза остались те же), и голос, в то время как она заговорила, прорывался такими раскатами, каких она, видимо, сама не ожидала.
– Это было бы хорошо, – сказала она. – Я ничего не хотела и не хочу.
Она сбросила свою собачку с колен и оправила складки платья.
– Вот благодарность, вот признательность людям, которые всем пожертвовали для него, – сказала она. – Прекрасно! Очень хорошо! Мне ничего не нужно, князь.
– Да, но ты не одна, у тебя сестры, – ответил князь Василий.
Но княжна не слушала его.
– Да, я это давно знала, но забыла, что, кроме низости, обмана, зависти, интриг, кроме неблагодарности, самой черной неблагодарности, я ничего не могла ожидать в этом доме…
– Знаешь ли ты или не знаешь, где это завещание? – спрашивал князь Василий еще с большим, чем прежде, подергиванием щек.
– Да, я была глупа, я еще верила в людей и любила их и жертвовала собой. А успевают только те, которые подлы и гадки. Я знаю, чьи это интриги.
Княжна хотела встать, но князь удержал ее за руку. Княжна имела вид человека, вдруг разочаровавшегося во всем человеческом роде; она злобно смотрела на своего собеседника.
– Еще есть время, мой друг. Ты помни, Катишь, что всё это сделалось нечаянно, в минуту гнева, болезни, и потом забыто. Наша обязанность, моя милая, исправить его ошибку, облегчить его последние минуты тем, чтобы не допустить его сделать этой несправедливости, не дать ему умереть в мыслях, что он сделал несчастными тех людей…
– Тех людей, которые всем пожертвовали для него, – подхватила княжна, порываясь опять встать, но князь не пустил ее, – чего он никогда не умел ценить. Нет, mon cousin, – прибавила она со вздохом, – я буду помнить, что на этом свете нельзя ждать награды, что на этом свете нет ни чести, ни справедливости. На этом свете надо быть хитрою и злою.
– Ну, voyons, [послушай,] успокойся; я знаю твое прекрасное сердце.
– Нет, у меня злое сердце.
– Я знаю твое сердце, – повторил князь, – ценю твою дружбу и желал бы, чтобы ты была обо мне того же мнения. Успокойся и parlons raison, [поговорим толком,] пока есть время – может, сутки, может, час; расскажи мне всё, что ты знаешь о завещании, и, главное, где оно: ты должна знать. Мы теперь же возьмем его и покажем графу. Он, верно, забыл уже про него и захочет его уничтожить. Ты понимаешь, что мое одно желание – свято исполнить его волю; я затем только и приехал сюда. Я здесь только затем, чтобы помогать ему и вам.
– Теперь я всё поняла. Я знаю, чьи это интриги. Я знаю, – говорила княжна.
– Hе в том дело, моя душа.
– Это ваша protegee, [любимица,] ваша милая княгиня Друбецкая, Анна Михайловна, которую я не желала бы иметь горничной, эту мерзкую, гадкую женщину.
– Ne perdons point de temps. [Не будем терять время.]
– Ax, не говорите! Прошлую зиму она втерлась сюда и такие гадости, такие скверности наговорила графу на всех нас, особенно Sophie, – я повторить не могу, – что граф сделался болен и две недели не хотел нас видеть. В это время, я знаю, что он написал эту гадкую, мерзкую бумагу; но я думала, что эта бумага ничего не значит.
– Nous у voila, [В этом то и дело.] отчего же ты прежде ничего не сказала мне?
– В мозаиковом портфеле, который он держит под подушкой. Теперь я знаю, – сказала княжна, не отвечая. – Да, ежели есть за мной грех, большой грех, то это ненависть к этой мерзавке, – почти прокричала княжна, совершенно изменившись. – И зачем она втирается сюда? Но я ей выскажу всё, всё. Придет время!


В то время как такие разговоры происходили в приемной и в княжниной комнатах, карета с Пьером (за которым было послано) и с Анной Михайловной (которая нашла нужным ехать с ним) въезжала во двор графа Безухого. Когда колеса кареты мягко зазвучали по соломе, настланной под окнами, Анна Михайловна, обратившись к своему спутнику с утешительными словами, убедилась в том, что он спит в углу кареты, и разбудила его. Очнувшись, Пьер за Анною Михайловной вышел из кареты и тут только подумал о том свидании с умирающим отцом, которое его ожидало. Он заметил, что они подъехали не к парадному, а к заднему подъезду. В то время как он сходил с подножки, два человека в мещанской одежде торопливо отбежали от подъезда в тень стены. Приостановившись, Пьер разглядел в тени дома с обеих сторон еще несколько таких же людей. Но ни Анна Михайловна, ни лакей, ни кучер, которые не могли не видеть этих людей, не обратили на них внимания. Стало быть, это так нужно, решил сам с собой Пьер и прошел за Анною Михайловной. Анна Михайловна поспешными шагами шла вверх по слабо освещенной узкой каменной лестнице, подзывая отстававшего за ней Пьера, который, хотя и не понимал, для чего ему надо было вообще итти к графу, и еще меньше, зачем ему надо было итти по задней лестнице, но, судя по уверенности и поспешности Анны Михайловны, решил про себя, что это было необходимо нужно. На половине лестницы чуть не сбили их с ног какие то люди с ведрами, которые, стуча сапогами, сбегали им навстречу. Люди эти прижались к стене, чтобы пропустить Пьера с Анной Михайловной, и не показали ни малейшего удивления при виде их.
– Здесь на половину княжен? – спросила Анна Михайловна одного из них…
– Здесь, – отвечал лакей смелым, громким голосом, как будто теперь всё уже было можно, – дверь налево, матушка.
– Может быть, граф не звал меня, – сказал Пьер в то время, как он вышел на площадку, – я пошел бы к себе.
Анна Михайловна остановилась, чтобы поровняться с Пьером.
– Ah, mon ami! – сказала она с тем же жестом, как утром с сыном, дотрогиваясь до его руки: – croyez, que je souffre autant, que vous, mais soyez homme. [Поверьте, я страдаю не меньше вас, но будьте мужчиной.]
– Право, я пойду? – спросил Пьер, ласково чрез очки глядя на Анну Михайловну.
– Ah, mon ami, oubliez les torts qu'on a pu avoir envers vous, pensez que c'est votre pere… peut etre a l'agonie. – Она вздохнула. – Je vous ai tout de suite aime comme mon fils. Fiez vous a moi, Pierre. Je n'oublirai pas vos interets. [Забудьте, друг мой, в чем были против вас неправы. Вспомните, что это ваш отец… Может быть, в агонии. Я тотчас полюбила вас, как сына. Доверьтесь мне, Пьер. Я не забуду ваших интересов.]
Пьер ничего не понимал; опять ему еще сильнее показалось, что всё это так должно быть, и он покорно последовал за Анною Михайловной, уже отворявшею дверь.
Дверь выходила в переднюю заднего хода. В углу сидел старик слуга княжен и вязал чулок. Пьер никогда не был на этой половине, даже не предполагал существования таких покоев. Анна Михайловна спросила у обгонявшей их, с графином на подносе, девушки (назвав ее милой и голубушкой) о здоровье княжен и повлекла Пьера дальше по каменному коридору. Из коридора первая дверь налево вела в жилые комнаты княжен. Горничная, с графином, второпях (как и всё делалось второпях в эту минуту в этом доме) не затворила двери, и Пьер с Анною Михайловной, проходя мимо, невольно заглянули в ту комнату, где, разговаривая, сидели близко друг от друга старшая княжна с князем Васильем. Увидав проходящих, князь Василий сделал нетерпеливое движение и откинулся назад; княжна вскочила и отчаянным жестом изо всей силы хлопнула дверью, затворяя ее.
Жест этот был так не похож на всегдашнее спокойствие княжны, страх, выразившийся на лице князя Василья, был так несвойствен его важности, что Пьер, остановившись, вопросительно, через очки, посмотрел на свою руководительницу.
Анна Михайловна не выразила удивления, она только слегка улыбнулась и вздохнула, как будто показывая, что всего этого она ожидала.
– Soyez homme, mon ami, c'est moi qui veillerai a vos interets, [Будьте мужчиною, друг мой, я же стану блюсти за вашими интересами.] – сказала она в ответ на его взгляд и еще скорее пошла по коридору.
Пьер не понимал, в чем дело, и еще меньше, что значило veiller a vos interets, [блюсти ваши интересы,] но он понимал, что всё это так должно быть. Коридором они вышли в полуосвещенную залу, примыкавшую к приемной графа. Это была одна из тех холодных и роскошных комнат, которые знал Пьер с парадного крыльца. Но и в этой комнате, посередине, стояла пустая ванна и была пролита вода по ковру. Навстречу им вышли на цыпочках, не обращая на них внимания, слуга и причетник с кадилом. Они вошли в знакомую Пьеру приемную с двумя итальянскими окнами, выходом в зимний сад, с большим бюстом и во весь рост портретом Екатерины. Все те же люди, почти в тех же положениях, сидели, перешептываясь, в приемной. Все, смолкнув, оглянулись на вошедшую Анну Михайловну, с ее исплаканным, бледным лицом, и на толстого, большого Пьера, который, опустив голову, покорно следовал за нею.
На лице Анны Михайловны выразилось сознание того, что решительная минута наступила; она, с приемами деловой петербургской дамы, вошла в комнату, не отпуская от себя Пьера, еще смелее, чем утром. Она чувствовала, что так как она ведет за собою того, кого желал видеть умирающий, то прием ее был обеспечен. Быстрым взглядом оглядев всех, бывших в комнате, и заметив графова духовника, она, не то что согнувшись, но сделавшись вдруг меньше ростом, мелкою иноходью подплыла к духовнику и почтительно приняла благословение одного, потом другого духовного лица.
– Слава Богу, что успели, – сказала она духовному лицу, – мы все, родные, так боялись. Вот этот молодой человек – сын графа, – прибавила она тише. – Ужасная минута!
Проговорив эти слова, она подошла к доктору.
– Cher docteur, – сказала она ему, – ce jeune homme est le fils du comte… y a t il de l'espoir? [этот молодой человек – сын графа… Есть ли надежда?]
Доктор молча, быстрым движением возвел кверху глаза и плечи. Анна Михайловна точно таким же движением возвела плечи и глаза, почти закрыв их, вздохнула и отошла от доктора к Пьеру. Она особенно почтительно и нежно грустно обратилась к Пьеру.
– Ayez confiance en Sa misericorde, [Доверьтесь Его милосердию,] – сказала она ему, указав ему диванчик, чтобы сесть подождать ее, сама неслышно направилась к двери, на которую все смотрели, и вслед за чуть слышным звуком этой двери скрылась за нею.
Пьер, решившись во всем повиноваться своей руководительнице, направился к диванчику, который она ему указала. Как только Анна Михайловна скрылась, он заметил, что взгляды всех, бывших в комнате, больше чем с любопытством и с участием устремились на него. Он заметил, что все перешептывались, указывая на него глазами, как будто со страхом и даже с подобострастием. Ему оказывали уважение, какого прежде никогда не оказывали: неизвестная ему дама, которая говорила с духовными лицами, встала с своего места и предложила ему сесть, адъютант поднял уроненную Пьером перчатку и подал ему; доктора почтительно замолкли, когда он проходил мимо их, и посторонились, чтобы дать ему место. Пьер хотел сначала сесть на другое место, чтобы не стеснять даму, хотел сам поднять перчатку и обойти докторов, которые вовсе и не стояли на дороге; но он вдруг почувствовал, что это было бы неприлично, он почувствовал, что он в нынешнюю ночь есть лицо, которое обязано совершить какой то страшный и ожидаемый всеми обряд, и что поэтому он должен был принимать от всех услуги. Он принял молча перчатку от адъютанта, сел на место дамы, положив свои большие руки на симметрично выставленные колени, в наивной позе египетской статуи, и решил про себя, что всё это так именно должно быть и что ему в нынешний вечер, для того чтобы не потеряться и не наделать глупостей, не следует действовать по своим соображениям, а надобно предоставить себя вполне на волю тех, которые руководили им.
Не прошло и двух минут, как князь Василий, в своем кафтане с тремя звездами, величественно, высоко неся голову, вошел в комнату. Он казался похудевшим с утра; глаза его были больше обыкновенного, когда он оглянул комнату и увидал Пьера. Он подошел к нему, взял руку (чего он прежде никогда не делал) и потянул ее книзу, как будто он хотел испытать, крепко ли она держится.
– Courage, courage, mon ami. Il a demande a vous voir. C'est bien… [Не унывать, не унывать, мой друг. Он пожелал вас видеть. Это хорошо…] – и он хотел итти.
Но Пьер почел нужным спросить:
– Как здоровье…
Он замялся, не зная, прилично ли назвать умирающего графом; назвать же отцом ему было совестно.
– Il a eu encore un coup, il y a une demi heure. Еще был удар. Courage, mon аmi… [Полчаса назад у него был еще удар. Не унывать, мой друг…]
Пьер был в таком состоянии неясности мысли, что при слове «удар» ему представился удар какого нибудь тела. Он, недоумевая, посмотрел на князя Василия и уже потом сообразил, что ударом называется болезнь. Князь Василий на ходу сказал несколько слов Лоррену и прошел в дверь на цыпочках. Он не умел ходить на цыпочках и неловко подпрыгивал всем телом. Вслед за ним прошла старшая княжна, потом прошли духовные лица и причетники, люди (прислуга) тоже прошли в дверь. За этою дверью послышалось передвиженье, и наконец, всё с тем же бледным, но твердым в исполнении долга лицом, выбежала Анна Михайловна и, дотронувшись до руки Пьера, сказала:
– La bonte divine est inepuisable. C'est la ceremonie de l'extreme onction qui va commencer. Venez. [Милосердие Божие неисчерпаемо. Соборование сейчас начнется. Пойдемте.]
Пьер прошел в дверь, ступая по мягкому ковру, и заметил, что и адъютант, и незнакомая дама, и еще кто то из прислуги – все прошли за ним, как будто теперь уж не надо было спрашивать разрешения входить в эту комнату.


Пьер хорошо знал эту большую, разделенную колоннами и аркой комнату, всю обитую персидскими коврами. Часть комнаты за колоннами, где с одной стороны стояла высокая красного дерева кровать, под шелковыми занавесами, а с другой – огромный киот с образами, была красно и ярко освещена, как бывают освещены церкви во время вечерней службы. Под освещенными ризами киота стояло длинное вольтеровское кресло, и на кресле, обложенном вверху снежно белыми, не смятыми, видимо, только – что перемененными подушками, укрытая до пояса ярко зеленым одеялом, лежала знакомая Пьеру величественная фигура его отца, графа Безухого, с тою же седою гривой волос, напоминавших льва, над широким лбом и с теми же характерно благородными крупными морщинами на красивом красно желтом лице. Он лежал прямо под образами; обе толстые, большие руки его были выпростаны из под одеяла и лежали на нем. В правую руку, лежавшую ладонью книзу, между большим и указательным пальцами вставлена была восковая свеча, которую, нагибаясь из за кресла, придерживал в ней старый слуга. Над креслом стояли духовные лица в своих величественных блестящих одеждах, с выпростанными на них длинными волосами, с зажженными свечами в руках, и медленно торжественно служили. Немного позади их стояли две младшие княжны, с платком в руках и у глаз, и впереди их старшая, Катишь, с злобным и решительным видом, ни на мгновение не спуская глаз с икон, как будто говорила всем, что не отвечает за себя, если оглянется. Анна Михайловна, с кроткою печалью и всепрощением на лице, и неизвестная дама стояли у двери. Князь Василий стоял с другой стороны двери, близко к креслу, за резным бархатным стулом, который он поворотил к себе спинкой, и, облокотив на нее левую руку со свечой, крестился правою, каждый раз поднимая глаза кверху, когда приставлял персты ко лбу. Лицо его выражало спокойную набожность и преданность воле Божией. «Ежели вы не понимаете этих чувств, то тем хуже для вас», казалось, говорило его лицо.
Сзади его стоял адъютант, доктора и мужская прислуга; как бы в церкви, мужчины и женщины разделились. Всё молчало, крестилось, только слышны были церковное чтение, сдержанное, густое басовое пение и в минуты молчания перестановка ног и вздохи. Анна Михайловна, с тем значительным видом, который показывал, что она знает, что делает, перешла через всю комнату к Пьеру и подала ему свечу. Он зажег ее и, развлеченный наблюдениями над окружающими, стал креститься тою же рукой, в которой была свеча.
Младшая, румяная и смешливая княжна Софи, с родинкою, смотрела на него. Она улыбнулась, спрятала свое лицо в платок и долго не открывала его; но, посмотрев на Пьера, опять засмеялась. Она, видимо, чувствовала себя не в силах глядеть на него без смеха, но не могла удержаться, чтобы не смотреть на него, и во избежание искушений тихо перешла за колонну. В середине службы голоса духовенства вдруг замолкли; духовные лица шопотом сказали что то друг другу; старый слуга, державший руку графа, поднялся и обратился к дамам. Анна Михайловна выступила вперед и, нагнувшись над больным, из за спины пальцем поманила к себе Лоррена. Француз доктор, – стоявший без зажженной свечи, прислонившись к колонне, в той почтительной позе иностранца, которая показывает, что, несмотря на различие веры, он понимает всю важность совершающегося обряда и даже одобряет его, – неслышными шагами человека во всей силе возраста подошел к больному, взял своими белыми тонкими пальцами его свободную руку с зеленого одеяла и, отвернувшись, стал щупать пульс и задумался. Больному дали чего то выпить, зашевелились около него, потом опять расступились по местам, и богослужение возобновилось. Во время этого перерыва Пьер заметил, что князь Василий вышел из за своей спинки стула и, с тем же видом, который показывал, что он знает, что делает, и что тем хуже для других, ежели они не понимают его, не подошел к больному, а, пройдя мимо его, присоединился к старшей княжне и с нею вместе направился в глубь спальни, к высокой кровати под шелковыми занавесами. От кровати и князь и княжна оба скрылись в заднюю дверь, но перед концом службы один за другим возвратились на свои места. Пьер обратил на это обстоятельство не более внимания, как и на все другие, раз навсегда решив в своем уме, что всё, что совершалось перед ним нынешний вечер, было так необходимо нужно.
Звуки церковного пения прекратились, и послышался голос духовного лица, которое почтительно поздравляло больного с принятием таинства. Больной лежал всё так же безжизненно и неподвижно. Вокруг него всё зашевелилось, послышались шаги и шопоты, из которых шопот Анны Михайловны выдавался резче всех.
Пьер слышал, как она сказала:
– Непременно надо перенести на кровать, здесь никак нельзя будет…
Больного так обступили доктора, княжны и слуги, что Пьер уже не видал той красно желтой головы с седою гривой, которая, несмотря на то, что он видел и другие лица, ни на мгновение не выходила у него из вида во всё время службы. Пьер догадался по осторожному движению людей, обступивших кресло, что умирающего поднимали и переносили.
– За мою руку держись, уронишь так, – послышался ему испуганный шопот одного из слуг, – снизу… еще один, – говорили голоса, и тяжелые дыхания и переступанья ногами людей стали торопливее, как будто тяжесть, которую они несли, была сверх сил их.
Несущие, в числе которых была и Анна Михайловна, поровнялись с молодым человеком, и ему на мгновение из за спин и затылков людей показалась высокая, жирная, открытая грудь, тучные плечи больного, приподнятые кверху людьми, державшими его под мышки, и седая курчавая, львиная голова. Голова эта, с необычайно широким лбом и скулами, красивым чувственным ртом и величественным холодным взглядом, была не обезображена близостью смерти. Она была такая же, какою знал ее Пьер назад тому три месяца, когда граф отпускал его в Петербург. Но голова эта беспомощно покачивалась от неровных шагов несущих, и холодный, безучастный взгляд не знал, на чем остановиться.
Прошло несколько минут суетни около высокой кровати; люди, несшие больного, разошлись. Анна Михайловна дотронулась до руки Пьера и сказала ему: «Venez». [Идите.] Пьер вместе с нею подошел к кровати, на которой, в праздничной позе, видимо, имевшей отношение к только что совершенному таинству, был положен больной. Он лежал, высоко опираясь головой на подушки. Руки его были симметрично выложены на зеленом шелковом одеяле ладонями вниз. Когда Пьер подошел, граф глядел прямо на него, но глядел тем взглядом, которого смысл и значение нельзя понять человеку. Или этот взгляд ровно ничего не говорил, как только то, что, покуда есть глаза, надо же глядеть куда нибудь, или он говорил слишком многое. Пьер остановился, не зная, что ему делать, и вопросительно оглянулся на свою руководительницу Анну Михайловну. Анна Михайловна сделала ему торопливый жест глазами, указывая на руку больного и губами посылая ей воздушный поцелуй. Пьер, старательно вытягивая шею, чтоб не зацепить за одеяло, исполнил ее совет и приложился к ширококостной и мясистой руке. Ни рука, ни один мускул лица графа не дрогнули. Пьер опять вопросительно посмотрел на Анну Михайловну, спрашивая теперь, что ему делать. Анна Михайловна глазами указала ему на кресло, стоявшее подле кровати. Пьер покорно стал садиться на кресло, глазами продолжая спрашивать, то ли он сделал, что нужно. Анна Михайловна одобрительно кивнула головой. Пьер принял опять симметрично наивное положение египетской статуи, видимо, соболезнуя о том, что неуклюжее и толстое тело его занимало такое большое пространство, и употребляя все душевные силы, чтобы казаться как можно меньше. Он смотрел на графа. Граф смотрел на то место, где находилось лицо Пьера, в то время как он стоял. Анна Михайловна являла в своем положении сознание трогательной важности этой последней минуты свидания отца с сыном. Это продолжалось две минуты, которые показались Пьеру часом. Вдруг в крупных мускулах и морщинах лица графа появилось содрогание. Содрогание усиливалось, красивый рот покривился (тут только Пьер понял, до какой степени отец его был близок к смерти), из перекривленного рта послышался неясный хриплый звук. Анна Михайловна старательно смотрела в глаза больному и, стараясь угадать, чего было нужно ему, указывала то на Пьера, то на питье, то шопотом вопросительно называла князя Василия, то указывала на одеяло. Глаза и лицо больного выказывали нетерпение. Он сделал усилие, чтобы взглянуть на слугу, который безотходно стоял у изголовья постели.
– На другой бочок перевернуться хотят, – прошептал слуга и поднялся, чтобы переворотить лицом к стене тяжелое тело графа.
Пьер встал, чтобы помочь слуге.
В то время как графа переворачивали, одна рука его беспомощно завалилась назад, и он сделал напрасное усилие, чтобы перетащить ее. Заметил ли граф тот взгляд ужаса, с которым Пьер смотрел на эту безжизненную руку, или какая другая мысль промелькнула в его умирающей голове в эту минуту, но он посмотрел на непослушную руку, на выражение ужаса в лице Пьера, опять на руку, и на лице его явилась так не шедшая к его чертам слабая, страдальческая улыбка, выражавшая как бы насмешку над своим собственным бессилием. Неожиданно, при виде этой улыбки, Пьер почувствовал содрогание в груди, щипанье в носу, и слезы затуманили его зрение. Больного перевернули на бок к стене. Он вздохнул.
– Il est assoupi, [Он задремал,] – сказала Анна Михайловна, заметив приходившую на смену княжну. – Аllons. [Пойдем.]
Пьер вышел.


В приемной никого уже не было, кроме князя Василия и старшей княжны, которые, сидя под портретом Екатерины, о чем то оживленно говорили. Как только они увидали Пьера с его руководительницей, они замолчали. Княжна что то спрятала, как показалось Пьеру, и прошептала:
– Не могу видеть эту женщину.
– Catiche a fait donner du the dans le petit salon, – сказал князь Василий Анне Михайловне. – Allez, ma pauvre Анна Михайловна, prenez quelque сhose, autrement vous ne suffirez pas. [Катишь велела подать чаю в маленькой гостиной. Вы бы пошли, бедная Анна Михайловна, подкрепили себя, а то вас не хватит.]
Пьеру он ничего не сказал, только пожал с чувством его руку пониже плеча. Пьер с Анной Михайловной прошли в petit salon. [маленькую гостиную.]
– II n'y a rien qui restaure, comme une tasse de cet excellent the russe apres une nuit blanche, [Ничто так не восстановляет после бессонной ночи, как чашка этого превосходного русского чаю.] – говорил Лоррен с выражением сдержанной оживленности, отхлебывая из тонкой, без ручки, китайской чашки, стоя в маленькой круглой гостиной перед столом, на котором стоял чайный прибор и холодный ужин. Около стола собрались, чтобы подкрепить свои силы, все бывшие в эту ночь в доме графа Безухого. Пьер хорошо помнил эту маленькую круглую гостиную, с зеркалами и маленькими столиками. Во время балов в доме графа, Пьер, не умевший танцовать, любил сидеть в этой маленькой зеркальной и наблюдать, как дамы в бальных туалетах, брильянтах и жемчугах на голых плечах, проходя через эту комнату, оглядывали себя в ярко освещенные зеркала, несколько раз повторявшие их отражения. Теперь та же комната была едва освещена двумя свечами, и среди ночи на одном маленьком столике беспорядочно стояли чайный прибор и блюда, и разнообразные, непраздничные люди, шопотом переговариваясь, сидели в ней, каждым движением, каждым словом показывая, что никто не забывает и того, что делается теперь и имеет еще совершиться в спальне. Пьер не стал есть, хотя ему и очень хотелось. Он оглянулся вопросительно на свою руководительницу и увидел, что она на цыпочках выходила опять в приемную, где остался князь Василий с старшею княжной. Пьер полагал, что и это было так нужно, и, помедлив немного, пошел за ней. Анна Михайловна стояла подле княжны, и обе они в одно время говорили взволнованным шопотом:
– Позвольте мне, княгиня, знать, что нужно и что ненужно, – говорила княжна, видимо, находясь в том же взволнованном состоянии, в каком она была в то время, как захлопывала дверь своей комнаты.
– Но, милая княжна, – кротко и убедительно говорила Анна Михайловна, заступая дорогу от спальни и не пуская княжну, – не будет ли это слишком тяжело для бедного дядюшки в такие минуты, когда ему нужен отдых? В такие минуты разговор о мирском, когда его душа уже приготовлена…
Князь Василий сидел на кресле, в своей фамильярной позе, высоко заложив ногу на ногу. Щеки его сильно перепрыгивали и, опустившись, казались толще внизу; но он имел вид человека, мало занятого разговором двух дам.
– Voyons, ma bonne Анна Михайловна, laissez faire Catiche. [Оставьте Катю делать, что она знает.] Вы знаете, как граф ее любит.
– Я и не знаю, что в этой бумаге, – говорила княжна, обращаясь к князю Василью и указывая на мозаиковый портфель, который она держала в руках. – Я знаю только, что настоящее завещание у него в бюро, а это забытая бумага…
Она хотела обойти Анну Михайловну, но Анна Михайловна, подпрыгнув, опять загородила ей дорогу.
– Я знаю, милая, добрая княжна, – сказала Анна Михайловна, хватаясь рукой за портфель и так крепко, что видно было, она не скоро его пустит. – Милая княжна, я вас прошу, я вас умоляю, пожалейте его. Je vous en conjure… [Умоляю вас…]
Княжна молчала. Слышны были только звуки усилий борьбы зa портфель. Видно было, что ежели она заговорит, то заговорит не лестно для Анны Михайловны. Анна Михайловна держала крепко, но, несмотря на то, голос ее удерживал всю свою сладкую тягучесть и мягкость.
– Пьер, подойдите сюда, мой друг. Я думаю, что он не лишний в родственном совете: не правда ли, князь?
– Что же вы молчите, mon cousin? – вдруг вскрикнула княжна так громко, что в гостиной услыхали и испугались ее голоса. – Что вы молчите, когда здесь Бог знает кто позволяет себе вмешиваться и делать сцены на пороге комнаты умирающего. Интриганка! – прошептала она злобно и дернула портфель изо всей силы.
Но Анна Михайловна сделала несколько шагов, чтобы не отстать от портфеля, и перехватила руку.
– Oh! – сказал князь Василий укоризненно и удивленно. Он встал. – C'est ridicule. Voyons, [Это смешно. Ну, же,] пустите. Я вам говорю.
Княжна пустила.
– И вы!
Анна Михайловна не послушалась его.
– Пустите, я вам говорю. Я беру всё на себя. Я пойду и спрошу его. Я… довольно вам этого.
– Mais, mon prince, [Но, князь,] – говорила Анна Михайловна, – после такого великого таинства дайте ему минуту покоя. Вот, Пьер, скажите ваше мнение, – обратилась она к молодому человеку, который, вплоть подойдя к ним, удивленно смотрел на озлобленное, потерявшее всё приличие лицо княжны и на перепрыгивающие щеки князя Василья.
– Помните, что вы будете отвечать за все последствия, – строго сказал князь Василий, – вы не знаете, что вы делаете.
– Мерзкая женщина! – вскрикнула княжна, неожиданно бросаясь на Анну Михайловну и вырывая портфель.
Князь Василий опустил голову и развел руками.
В эту минуту дверь, та страшная дверь, на которую так долго смотрел Пьер и которая так тихо отворялась, быстро, с шумом откинулась, стукнув об стену, и средняя княжна выбежала оттуда и всплеснула руками.
– Что вы делаете! – отчаянно проговорила она. – II s'en va et vous me laissez seule. [Он умирает, а вы меня оставляете одну.]
Старшая княжна выронила портфель. Анна Михайловна быстро нагнулась и, подхватив спорную вещь, побежала в спальню. Старшая княжна и князь Василий, опомнившись, пошли за ней. Через несколько минут первая вышла оттуда старшая княжна с бледным и сухим лицом и прикушенною нижнею губой. При виде Пьера лицо ее выразило неудержимую злобу.
– Да, радуйтесь теперь, – сказала она, – вы этого ждали.
И, зарыдав, она закрыла лицо платком и выбежала из комнаты.
За княжной вышел князь Василий. Он, шатаясь, дошел до дивана, на котором сидел Пьер, и упал на него, закрыв глаза рукой. Пьер заметил, что он был бледен и что нижняя челюсть его прыгала и тряслась, как в лихорадочной дрожи.
– Ах, мой друг! – сказал он, взяв Пьера за локоть; и в голосе его была искренность и слабость, которых Пьер никогда прежде не замечал в нем. – Сколько мы грешим, сколько мы обманываем, и всё для чего? Мне шестой десяток, мой друг… Ведь мне… Всё кончится смертью, всё. Смерть ужасна. – Он заплакал.
Анна Михайловна вышла последняя. Она подошла к Пьеру тихими, медленными шагами.
– Пьер!… – сказала она.
Пьер вопросительно смотрел на нее. Она поцеловала в лоб молодого человека, увлажая его слезами. Она помолчала.
– II n'est plus… [Его не стало…]
Пьер смотрел на нее через очки.
– Allons, je vous reconduirai. Tachez de pleurer. Rien ne soulage, comme les larmes. [Пойдемте, я вас провожу. Старайтесь плакать: ничто так не облегчает, как слезы.]
Она провела его в темную гостиную и Пьер рад был, что никто там не видел его лица. Анна Михайловна ушла от него, и когда она вернулась, он, подложив под голову руку, спал крепким сном.
На другое утро Анна Михайловна говорила Пьеру:
– Oui, mon cher, c'est une grande perte pour nous tous. Je ne parle pas de vous. Mais Dieu vous soutndra, vous etes jeune et vous voila a la tete d'une immense fortune, je l'espere. Le testament n'a pas ete encore ouvert. Je vous connais assez pour savoir que cela ne vous tourienera pas la tete, mais cela vous impose des devoirs, et il faut etre homme. [Да, мой друг, это великая потеря для всех нас, не говоря о вас. Но Бог вас поддержит, вы молоды, и вот вы теперь, надеюсь, обладатель огромного богатства. Завещание еще не вскрыто. Я довольно вас знаю и уверена, что это не вскружит вам голову; но это налагает на вас обязанности; и надо быть мужчиной.]
Пьер молчал.
– Peut etre plus tard je vous dirai, mon cher, que si je n'avais pas ete la, Dieu sait ce qui serait arrive. Vous savez, mon oncle avant hier encore me promettait de ne pas oublier Boris. Mais il n'a pas eu le temps. J'espere, mon cher ami, que vous remplirez le desir de votre pere. [После я, может быть, расскажу вам, что если б я не была там, то Бог знает, что бы случилось. Вы знаете, что дядюшка третьего дня обещал мне не забыть Бориса, но не успел. Надеюсь, мой друг, вы исполните желание отца.]
Пьер, ничего не понимая и молча, застенчиво краснея, смотрел на княгиню Анну Михайловну. Переговорив с Пьером, Анна Михайловна уехала к Ростовым и легла спать. Проснувшись утром, она рассказывала Ростовым и всем знакомым подробности смерти графа Безухого. Она говорила, что граф умер так, как и она желала бы умереть, что конец его был не только трогателен, но и назидателен; последнее же свидание отца с сыном было до того трогательно, что она не могла вспомнить его без слез, и что она не знает, – кто лучше вел себя в эти страшные минуты: отец ли, который так всё и всех вспомнил в последние минуты и такие трогательные слова сказал сыну, или Пьер, на которого жалко было смотреть, как он был убит и как, несмотря на это, старался скрыть свою печаль, чтобы не огорчить умирающего отца. «C'est penible, mais cela fait du bien; ca eleve l'ame de voir des hommes, comme le vieux comte et son digne fils», [Это тяжело, но это спасительно; душа возвышается, когда видишь таких людей, как старый граф и его достойный сын,] говорила она. О поступках княжны и князя Василья она, не одобряя их, тоже рассказывала, но под большим секретом и шопотом.


В Лысых Горах, имении князя Николая Андреевича Болконского, ожидали с каждым днем приезда молодого князя Андрея с княгиней; но ожидание не нарушало стройного порядка, по которому шла жизнь в доме старого князя. Генерал аншеф князь Николай Андреевич, по прозванию в обществе le roi de Prusse, [король прусский,] с того времени, как при Павле был сослан в деревню, жил безвыездно в своих Лысых Горах с дочерью, княжною Марьей, и при ней компаньонкой, m lle Bourienne. [мадмуазель Бурьен.] И в новое царствование, хотя ему и был разрешен въезд в столицы, он также продолжал безвыездно жить в деревне, говоря, что ежели кому его нужно, то тот и от Москвы полтораста верст доедет до Лысых Гор, а что ему никого и ничего не нужно. Он говорил, что есть только два источника людских пороков: праздность и суеверие, и что есть только две добродетели: деятельность и ум. Он сам занимался воспитанием своей дочери и, чтобы развивать в ней обе главные добродетели, до двадцати лет давал ей уроки алгебры и геометрии и распределял всю ее жизнь в беспрерывных занятиях. Сам он постоянно был занят то писанием своих мемуаров, то выкладками из высшей математики, то точением табакерок на станке, то работой в саду и наблюдением над постройками, которые не прекращались в его имении. Так как главное условие для деятельности есть порядок, то и порядок в его образе жизни был доведен до последней степени точности. Его выходы к столу совершались при одних и тех же неизменных условиях, и не только в один и тот же час, но и минуту. С людьми, окружавшими его, от дочери до слуг, князь был резок и неизменно требователен, и потому, не быв жестоким, он возбуждал к себе страх и почтительность, каких не легко мог бы добиться самый жестокий человек. Несмотря на то, что он был в отставке и не имел теперь никакого значения в государственных делах, каждый начальник той губернии, где было имение князя, считал своим долгом являться к нему и точно так же, как архитектор, садовник или княжна Марья, дожидался назначенного часа выхода князя в высокой официантской. И каждый в этой официантской испытывал то же чувство почтительности и даже страха, в то время как отворялась громадно высокая дверь кабинета и показывалась в напудренном парике невысокая фигурка старика, с маленькими сухими ручками и серыми висячими бровями, иногда, как он насупливался, застилавшими блеск умных и точно молодых блестящих глаз.
В день приезда молодых, утром, по обыкновению, княжна Марья в урочный час входила для утреннего приветствия в официантскую и со страхом крестилась и читала внутренно молитву. Каждый день она входила и каждый день молилась о том, чтобы это ежедневное свидание сошло благополучно.