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

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

Типобезопасность
Вывод типов
Статическая типизация
Динамическая типизация
Сильная и слабая типизация
Зависимые типы
Утиная типизация

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





Определение

По Пирсу[en], система типов — разрешимый синтаксический метод доказательства отсутствия определённых поведений программы путём классификации конструкций в соответствии с видами вычисляемых значений[2].

Описание

Пример простой системы типов можно видеть в языке Си. Части программы на Си оформляются в виде определений функций. Функции вызывают друг друга. Интерфейс функции задаёт имя функции и список значений, которые передаются её телу. Вызывающая функция постулирует имя функции, которую хочет вызвать, и имена переменных, хранящих значения, которые требуется передать. Во время исполнения программы значения помещаются во временное хранилище, и затем исполнение передаётся в тело вызываемой функции. Код вызываемой функции осуществляет доступ к значениям и использует их. Если инструкции в теле функции написаны в предположении, что им на обработку должно быть передано целое значение, но вызывающий код передал число с плавающей точкой, то вызванная функция вычислит неверный результат. Компилятор Си проверяет типы, заданные для каждой переданной переменной, в отношении к типам, заданным для каждой переменной в интерфейсе вызываемой функции. Если типы не совпадают, компилятор порождает ошибку времени компиляции.

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

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

Компилятор также может использовать статический тип значения для оптимизации хранилища и для выбора алгоритмической реализации операций над этим значением. Например, во многих компиляторах Си тип float представляется 32 битами, в соответствии со спецификацией IEEE для операций с плавающей точкой одинарной точности. На основании этого будет использоваться специальный набор инструкций микропроцессора для значений этого типа (сложение, умножение и другие операции).

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

Формальное обоснование

Формальным обоснованием для систем типов служит теория типов. В состав языка программирования включается система типов для осуществления проверки типов во время компиляции[en] или во время исполнения[en], требующая явного провозглашения типов или выводящая их самостоятельно. Марк Мэнесси (англ. Mark Manasse) сформулировал проблему так[3]:

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

— Марк Мэнесси[3]

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


Проверка согласования типов

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


Статическая проверка типов

Динамическая проверка типов и информация о типах

Строгий и нестрогий контроль типов

Типобезопасность и защита адресации памяти

Типизированные и бестиповые языки

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

Особый случай типизированных языков представляют однотиповые языки (англ. single-type language), то есть языки с единственным типом. Обычно это языки сценариев или разметки, такие как REXX и SGML, единственным типом данных в которых является символьная строка, используемая для представления как символьных, так и числовых данных.

Бестиповые языки, в противоположность типизированным, позволяют осуществлять любую операцию над любыми данными, которые в них представляются цепочками бит произвольной длины[4]. Бестиповыми является большинство языков ассемблера. Примерами высокоуровневых бестиповых языков служат BCPL, BLISS[en], Forth, Рефал.

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

Типы и полиморфизм

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

Утиная типизация

Специальные системы типов

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


Экзистенциальные типы

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

Понятие экзистенциального типа часто используется совместно с понятием типа записи для представления модулей и абстрактных типов данных, что обусловлено их назначением — отделением реализации от интерфейса. Например, тип T = ∃X { a: X; f: (X → int); } описывает интерфейс модуля (семейства модулей с одинаковой сигнатурой), имеющий в своём составе значение данных типа X и функцию, принимающую параметр в точности этого же типа X и возвращающую целое число. Реализация может быть различной:

  • intT = { a: int; f: (int → int); }
  • floatT = { a: float; f: (float → int); }

Оба типа являются подтипами более общего экзистенциального типа T и соответствуют конкретно реализованным типам, так что любое значение, принадлежащее любому из них, принадлежит также к типу T. Если t — значение типа T, то t.f(t.a) проходит проверку типов, вне зависимости от того, к какому абстрактному типу принадлежит X. Это даёт гибкость при выборе типов, подходящих для конкретной реализации, так как пользователи извне обращаются только к значениям интерфейсного (экзистенциального) типа и изолированы от этих вариаций.

В общем случае механизм проверки согласования типов не способен определить, к какому именно экзистенциальному типу принадлежит данный модуль. В примере выше intT { a: int; f: (int → int); } также мог бы иметь тип ∃X { a: X; f: (int → int); }. Простейшим решением является явное указание для каждого модуля подразумеваемого в нём типа, например:

  • intT = { a: int; f: (int → int); } as ∃X { a: X; f: (X → int); }

Хотя абстрактные типы данных и модули использовались в языках программирования довольно давно, формальная модель экзистенциальных типов была построена лишь к 1988 году[5]. Теория представляет собой типизированное лямбда-исчисление второго порядка, аналогичное Системе F, но с экзистенциальной квантификацией вместо универсальной.

Экзистенциальные типы явным образом доступны в качестве экспериментального расширения языка Haskell, где они представляют собой специальный синтаксис, позволяющий использовать переменную типа в определении алгебраического типа, не вынося её в сигнатуру конструктора типов, то есть не повышая его арность[6]. Язык Java предоставляет ограниченную форму экзистенциальных типов посредством джокера[en]. В языках, реализующих классический let-полиморфизм в стиле ML, экзистенциальные типы могут быть симулированы посредством так называемых «значений, индексированных типами»[7].

Явное и неявное назначение типов

Многие статические системы типов, например, такие как в языках Си и Java, требуют провозглашения типа: программист должен явно назначать каждой переменной конкретный тип. Другие, такие как система типов Хиндли — Милнера, применяемая в языках ML и Haskell, осуществляют выведение типов: компилятор выстраивает заключение о типах переменных на основании того, как программист использует эти переменные.

Например, для функции f(x,y), осуществляющей сложение x и y, компилятор может сделать вывод, что x и y должны быть числами — поскольку операция сложения определена только для чисел. Следовательно, вызов где-либо в программе функции f для параметров, отличных от числовых, (например, для строки или списка) сигнализирует об ошибке.

Числовые и строковые константы и выражения обычно зачастую выражают тип в конкретном контексте. Например, выражение 3.14 может подразумевать вещественное число, тогда как [1,2,3] может быть списком целых — обычно массивом.

Вообще говоря, выведение типов возможно, если оно принципиально разрешимо в теории типов. Более того, даже если выведение неразрешимо для данной теории типов, выведение зачастую возможно для многих реальных программ. Система типов языка Haskell, являющаяся разновидностью системы типов Хиндли — Милнера, представляет собой ограничение Системы Fω[en] для так называемых полиморфных типов первого ранга, на которых выведение разрешимо. Многие компиляторы Хаскела предоставляют полиморфизм произвольного ранга в качестве расширения, но это делает выведение типов неразрешимым, так что требуется явное провозглашение типов. Однако, проверка согласования типов остаётся разрешимой и для программ с полиморфизмом первого ранга типы по-прежнему выводимы.

Унифицированные системы типов

Некоторые языки, например, C#, имеют унифицированную системы типов[8]. Это означает, что все типы языка вплоть до примитивных наследуются от единого корневого объекта (в случае с C# — от класса Object). В Java есть несколько примитивных типов, не являющихся объектами. Наряду с ними Java также предоставляет обёрточные объектные типы, так что разработчик может использовать примитивные или объектные типы по своему усмотрению.

Совместимость типов

Механизм проверки согласования типов в языке со статической типизацией проверяет, что всякое выражение соответствует типу, ожидаемому тем контекстом, в котором оно присутствует. Например, в операторе присваивания вида x := e выведенный для выражения e тип должен соответствовать типу, который провозглашён или выведен для переменной x. Нотация соответствия, называемая совместимостью, специфична для каждого языка.

Если e и x имеют единый тип, и присваивание разрешено для этого типа, то это выражение является корректным. Поэтому в простейших системах типов вопрос совместимости двух типов упрощается до вопроса их равенства (эквивалентности). Однако разные языки имеют разные критерии для определения совместимости типов двух выражений. Эти теории эквивалентности варьируются между двумя крайними случаями: структурными системами типов (англ. structural type system), в которых два типа эквивалентны, если описывают одинаковую внутреннюю структуру значения; и номинативными системами типов (англ. nominative type system), в которых синтаксически различные типы никогда не эквивалентны (то есть два типа равны только в том случае, если равны их идентификаторы).

В языках с подтипами[en] правила совместимости более сложные. Например, если A является подтипом B, то значение, принадлежащее типу A, может быть использовано в контексте, ожидающем значение типа B, даже если обратное неверно. Как и в случае эквивалентности, отношения подтипов различаются в разных языках, и здесь возможно много вариантов правил. Наличие в языке параметрического или ситуативного полиморфизма может также влиять на совместимость типов.

Влияние на стиль программирования

Одни программисты предпочитают статические системы типов, другие — динамические. Статически типизированные языки сигнализируют об ошибках согласования типов на этапе компиляции[en], и могут порождать более эффективно исполняемый код. Сторонники динамической типизации утверждают, что они лучше подходят для быстрого прототипирования, и что ошибки согласования типов составляют лишь малую часть возможных ошибок в программах[9][10]. С другой стороны, в статически типизированных языках явная декларации типов обычно не требуется, если язык поддерживает вывод типов, а некоторые динамически типизированные языки производят оптимизацию на этапе выполнения программы[11][12], зачастую посредством применения частичного вывода типов[13].

См. также

Напишите отзыв о статье "Система типов"

Примечания

  1. Cardelli, 2004, p. 1.
  2. Pierce, 2002, p. 1.
  3. 1 2 Pierce, 2002, с. 208.
  4. 1 2 3 Andrew Cooke. [www.acooke.org/comp-lang.html Introduction To Computer Languages]. Проверено 13 июля 2012.
  5. John C. Mitchell, Gordon Plotkin [theory.stanford.edu/~jcm/papers/mitch-plotkin-88.pdf Abstract [data] types have existential type] // ACM Transactions on Programming Languages and Systems. — 1988. — Т. 10, № 3. — С. 470–502.
  6. [www.haskell.org/haskellwiki/Existential_types Existential types on HaskellWiki]
  7. [www.mlton.org/TypeIndexedValues Type-Indexed Values]
  8. [www.ecma-international.org/publications/standards/Ecma-334.htm Standard ECMA-334], 8.2.4 Type system unification.
  9. Erik Meijer, Peter Drayton. [research.microsoft.com/en-us/um/people/emeijer/Papers/RDL04Meijer.pdf Static Typing Where Possible, Dynamic Typing When Needed: The End of the Cold War Between Programming Languages] (англ.). Microsoft Corporation.
  10. Amanda Laucher, Paul Snively. [www.infoq.com/presentations/Types-Tests Types vs Tests] (англ.). InfoQ.
  11. [www.mozilla.com/en-US/press/mozilla-2006-11-07.html Adobe and Mozilla Foundation to Open Source Flash Player Scripting Engine].
  12. [psyco.sourceforge.net/introduction.html Psyco, a Python specializing compiler].
  13. [www.cython.org/ C-Extensions for Python]. Cython (2013-05-11). Retrieved on 2013-07-17

Литература

  • Luca Cardelli, Peter Wegner [lucacardelli.name/Papers/OnUnderstanding.A4.pdf On Understanding Types, Data Abstraction, and Polymorphism]. — ACM Computing Surveys, 1985. — С. 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].
  • Benjamin C. Pierce. Types and Programming Languages. — MIT Press, 2002. — ISBN 978-0-262-16209-8.
  • Luca Cardelli. [lucacardelli.name/Papers/TypeSystems.pdf CRC Handbook of Computer Science and Engineering]. — 2nd. — CRC Press, 2004. — ISBN 158488360X.
  • Tratt, Laurence [tratt.net/laurie/research/publications/html/tratt__dynamically_typed_languages/ Dynamically Typed Languages]. — Advances in Computers, 2009. — С. 149–184.
  • Gonzalez, T.; Diaz-Herrera, J.; Tucker, A. Type Systems (by Stephania Weirich) // Computing Handbook, Third Edition: Computer Science and Software Engineering. — CRC Press, 2015. — 2326 p. — ISBN 9781439898536.

Ссылки

  • Smith, Chris [cdsmith.wordpress.com/2011/01/09/an-old-article-i-wrote/ What To Know Before Debating Type Systems].
  • [habrahabr.ru/post/161205/ Ликбез по типизации в языках программирования]  (рус.)

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

– А чтобы не разорять край, который мы оставляли неприятелю, – злобно насмешливо сказал князь Андрей. – Это очень основательно; нельзя позволять грабить край и приучаться войскам к мародерству. Ну и в Смоленске он тоже правильно рассудил, что французы могут обойти нас и что у них больше сил. Но он не мог понять того, – вдруг как бы вырвавшимся тонким голосом закричал князь Андрей, – но он не мог понять, что мы в первый раз дрались там за русскую землю, что в войсках был такой дух, какого никогда я не видал, что мы два дня сряду отбивали французов и что этот успех удесятерял наши силы. Он велел отступать, и все усилия и потери пропали даром. Он не думал об измене, он старался все сделать как можно лучше, он все обдумал; но от этого то он и не годится. Он не годится теперь именно потому, что он все обдумывает очень основательно и аккуратно, как и следует всякому немцу. Как бы тебе сказать… Ну, у отца твоего немец лакей, и он прекрасный лакей и удовлетворит всем его нуждам лучше тебя, и пускай он служит; но ежели отец при смерти болен, ты прогонишь лакея и своими непривычными, неловкими руками станешь ходить за отцом и лучше успокоишь его, чем искусный, но чужой человек. Так и сделали с Барклаем. Пока Россия была здорова, ей мог служить чужой, и был прекрасный министр, но как только она в опасности; нужен свой, родной человек. А у вас в клубе выдумали, что он изменник! Тем, что его оклеветали изменником, сделают только то, что потом, устыдившись своего ложного нарекания, из изменников сделают вдруг героем или гением, что еще будет несправедливее. Он честный и очень аккуратный немец…
– Однако, говорят, он искусный полководец, – сказал Пьер.
– Я не понимаю, что такое значит искусный полководец, – с насмешкой сказал князь Андрей.
– Искусный полководец, – сказал Пьер, – ну, тот, который предвидел все случайности… ну, угадал мысли противника.
– Да это невозможно, – сказал князь Андрей, как будто про давно решенное дело.
Пьер с удивлением посмотрел на него.
– Однако, – сказал он, – ведь говорят же, что война подобна шахматной игре.
– Да, – сказал князь Андрей, – только с тою маленькою разницей, что в шахматах над каждым шагом ты можешь думать сколько угодно, что ты там вне условий времени, и еще с той разницей, что конь всегда сильнее пешки и две пешки всегда сильнее одной, a на войне один батальон иногда сильнее дивизии, а иногда слабее роты. Относительная сила войск никому не может быть известна. Поверь мне, – сказал он, – что ежели бы что зависело от распоряжений штабов, то я бы был там и делал бы распоряжения, а вместо того я имею честь служить здесь, в полку вот с этими господами, и считаю, что от нас действительно будет зависеть завтрашний день, а не от них… Успех никогда не зависел и не будет зависеть ни от позиции, ни от вооружения, ни даже от числа; а уж меньше всего от позиции.
– А от чего же?
– От того чувства, которое есть во мне, в нем, – он указал на Тимохина, – в каждом солдате.
Князь Андрей взглянул на Тимохина, который испуганно и недоумевая смотрел на своего командира. В противность своей прежней сдержанной молчаливости князь Андрей казался теперь взволнованным. Он, видимо, не мог удержаться от высказывания тех мыслей, которые неожиданно приходили ему.
– Сражение выиграет тот, кто твердо решил его выиграть. Отчего мы под Аустерлицем проиграли сражение? У нас потеря была почти равная с французами, но мы сказали себе очень рано, что мы проиграли сражение, – и проиграли. А сказали мы это потому, что нам там незачем было драться: поскорее хотелось уйти с поля сражения. «Проиграли – ну так бежать!» – мы и побежали. Ежели бы до вечера мы не говорили этого, бог знает что бы было. А завтра мы этого не скажем. Ты говоришь: наша позиция, левый фланг слаб, правый фланг растянут, – продолжал он, – все это вздор, ничего этого нет. А что нам предстоит завтра? Сто миллионов самых разнообразных случайностей, которые будут решаться мгновенно тем, что побежали или побегут они или наши, что убьют того, убьют другого; а то, что делается теперь, – все это забава. Дело в том, что те, с кем ты ездил по позиции, не только не содействуют общему ходу дел, но мешают ему. Они заняты только своими маленькими интересами.
– В такую минуту? – укоризненно сказал Пьер.
– В такую минуту, – повторил князь Андрей, – для них это только такая минута, в которую можно подкопаться под врага и получить лишний крестик или ленточку. Для меня на завтра вот что: стотысячное русское и стотысячное французское войска сошлись драться, и факт в том, что эти двести тысяч дерутся, и кто будет злей драться и себя меньше жалеть, тот победит. И хочешь, я тебе скажу, что, что бы там ни было, что бы ни путали там вверху, мы выиграем сражение завтра. Завтра, что бы там ни было, мы выиграем сражение!
– Вот, ваше сиятельство, правда, правда истинная, – проговорил Тимохин. – Что себя жалеть теперь! Солдаты в моем батальоне, поверите ли, не стали водку, пить: не такой день, говорят. – Все помолчали.
Офицеры поднялись. Князь Андрей вышел с ними за сарай, отдавая последние приказания адъютанту. Когда офицеры ушли, Пьер подошел к князю Андрею и только что хотел начать разговор, как по дороге недалеко от сарая застучали копыта трех лошадей, и, взглянув по этому направлению, князь Андрей узнал Вольцогена с Клаузевицем, сопутствуемых казаком. Они близко проехали, продолжая разговаривать, и Пьер с Андреем невольно услыхали следующие фразы:
– Der Krieg muss im Raum verlegt werden. Der Ansicht kann ich nicht genug Preis geben, [Война должна быть перенесена в пространство. Это воззрение я не могу достаточно восхвалить (нем.) ] – говорил один.
– O ja, – сказал другой голос, – da der Zweck ist nur den Feind zu schwachen, so kann man gewiss nicht den Verlust der Privatpersonen in Achtung nehmen. [О да, так как цель состоит в том, чтобы ослабить неприятеля, то нельзя принимать во внимание потери частных лиц (нем.) ]
– O ja, [О да (нем.) ] – подтвердил первый голос.
– Да, im Raum verlegen, [перенести в пространство (нем.) ] – повторил, злобно фыркая носом, князь Андрей, когда они проехали. – Im Raum то [В пространстве (нем.) ] у меня остался отец, и сын, и сестра в Лысых Горах. Ему это все равно. Вот оно то, что я тебе говорил, – эти господа немцы завтра не выиграют сражение, а только нагадят, сколько их сил будет, потому что в его немецкой голове только рассуждения, не стоящие выеденного яйца, а в сердце нет того, что одно только и нужно на завтра, – то, что есть в Тимохине. Они всю Европу отдали ему и приехали нас учить – славные учители! – опять взвизгнул его голос.
– Так вы думаете, что завтрашнее сражение будет выиграно? – сказал Пьер.
– Да, да, – рассеянно сказал князь Андрей. – Одно, что бы я сделал, ежели бы имел власть, – начал он опять, – я не брал бы пленных. Что такое пленные? Это рыцарство. Французы разорили мой дом и идут разорить Москву, и оскорбили и оскорбляют меня всякую секунду. Они враги мои, они преступники все, по моим понятиям. И так же думает Тимохин и вся армия. Надо их казнить. Ежели они враги мои, то не могут быть друзьями, как бы они там ни разговаривали в Тильзите.
– Да, да, – проговорил Пьер, блестящими глазами глядя на князя Андрея, – я совершенно, совершенно согласен с вами!
Тот вопрос, который с Можайской горы и во весь этот день тревожил Пьера, теперь представился ему совершенно ясным и вполне разрешенным. Он понял теперь весь смысл и все значение этой войны и предстоящего сражения. Все, что он видел в этот день, все значительные, строгие выражения лиц, которые он мельком видел, осветились для него новым светом. Он понял ту скрытую (latente), как говорится в физике, теплоту патриотизма, которая была во всех тех людях, которых он видел, и которая объясняла ему то, зачем все эти люди спокойно и как будто легкомысленно готовились к смерти.
– Не брать пленных, – продолжал князь Андрей. – Это одно изменило бы всю войну и сделало бы ее менее жестокой. А то мы играли в войну – вот что скверно, мы великодушничаем и тому подобное. Это великодушничанье и чувствительность – вроде великодушия и чувствительности барыни, с которой делается дурнота, когда она видит убиваемого теленка; она так добра, что не может видеть кровь, но она с аппетитом кушает этого теленка под соусом. Нам толкуют о правах войны, о рыцарстве, о парламентерстве, щадить несчастных и так далее. Все вздор. Я видел в 1805 году рыцарство, парламентерство: нас надули, мы надули. Грабят чужие дома, пускают фальшивые ассигнации, да хуже всего – убивают моих детей, моего отца и говорят о правилах войны и великодушии к врагам. Не брать пленных, а убивать и идти на смерть! Кто дошел до этого так, как я, теми же страданиями…
Князь Андрей, думавший, что ему было все равно, возьмут ли или не возьмут Москву так, как взяли Смоленск, внезапно остановился в своей речи от неожиданной судороги, схватившей его за горло. Он прошелся несколько раз молча, но тлаза его лихорадочно блестели, и губа дрожала, когда он опять стал говорить:
– Ежели бы не было великодушничанья на войне, то мы шли бы только тогда, когда стоит того идти на верную смерть, как теперь. Тогда не было бы войны за то, что Павел Иваныч обидел Михаила Иваныча. А ежели война как теперь, так война. И тогда интенсивность войск была бы не та, как теперь. Тогда бы все эти вестфальцы и гессенцы, которых ведет Наполеон, не пошли бы за ним в Россию, и мы бы не ходили драться в Австрию и в Пруссию, сами не зная зачем. Война не любезность, а самое гадкое дело в жизни, и надо понимать это и не играть в войну. Надо принимать строго и серьезно эту страшную необходимость. Всё в этом: откинуть ложь, и война так война, а не игрушка. А то война – это любимая забава праздных и легкомысленных людей… Военное сословие самое почетное. А что такое война, что нужно для успеха в военном деле, какие нравы военного общества? Цель войны – убийство, орудия войны – шпионство, измена и поощрение ее, разорение жителей, ограбление их или воровство для продовольствия армии; обман и ложь, называемые военными хитростями; нравы военного сословия – отсутствие свободы, то есть дисциплина, праздность, невежество, жестокость, разврат, пьянство. И несмотря на то – это высшее сословие, почитаемое всеми. Все цари, кроме китайского, носят военный мундир, и тому, кто больше убил народа, дают большую награду… Сойдутся, как завтра, на убийство друг друга, перебьют, перекалечат десятки тысяч людей, а потом будут служить благодарственные молебны за то, что побили много люден (которых число еще прибавляют), и провозглашают победу, полагая, что чем больше побито людей, тем больше заслуга. Как бог оттуда смотрит и слушает их! – тонким, пискливым голосом прокричал князь Андрей. – Ах, душа моя, последнее время мне стало тяжело жить. Я вижу, что стал понимать слишком много. А не годится человеку вкушать от древа познания добра и зла… Ну, да не надолго! – прибавил он. – Однако ты спишь, да и мне пера, поезжай в Горки, – вдруг сказал князь Андрей.
– О нет! – отвечал Пьер, испуганно соболезнующими глазами глядя на князя Андрея.
– Поезжай, поезжай: перед сраженьем нужно выспаться, – повторил князь Андрей. Он быстро подошел к Пьеру, обнял его и поцеловал. – Прощай, ступай, – прокричал он. – Увидимся ли, нет… – и он, поспешно повернувшись, ушел в сарай.
Было уже темно, и Пьер не мог разобрать того выражения, которое было на лице князя Андрея, было ли оно злобно или нежно.
Пьер постоял несколько времени молча, раздумывая, пойти ли за ним или ехать домой. «Нет, ему не нужно! – решил сам собой Пьер, – и я знаю, что это наше последнее свидание». Он тяжело вздохнул и поехал назад в Горки.
Князь Андрей, вернувшись в сарай, лег на ковер, но не мог спать.
Он закрыл глаза. Одни образы сменялись другими. На одном он долго, радостно остановился. Он живо вспомнил один вечер в Петербурге. Наташа с оживленным, взволнованным лицом рассказывала ему, как она в прошлое лето, ходя за грибами, заблудилась в большом лесу. Она несвязно описывала ему и глушь леса, и свои чувства, и разговоры с пчельником, которого она встретила, и, всякую минуту прерываясь в своем рассказе, говорила: «Нет, не могу, я не так рассказываю; нет, вы не понимаете», – несмотря на то, что князь Андрей успокоивал ее, говоря, что он понимает, и действительно понимал все, что она хотела сказать. Наташа была недовольна своими словами, – она чувствовала, что не выходило то страстно поэтическое ощущение, которое она испытала в этот день и которое она хотела выворотить наружу. «Это такая прелесть был этот старик, и темно так в лесу… и такие добрые у него… нет, я не умею рассказать», – говорила она, краснея и волнуясь. Князь Андрей улыбнулся теперь той же радостной улыбкой, которой он улыбался тогда, глядя ей в глаза. «Я понимал ее, – думал князь Андрей. – Не только понимал, но эту то душевную силу, эту искренность, эту открытость душевную, эту то душу ее, которую как будто связывало тело, эту то душу я и любил в ней… так сильно, так счастливо любил…» И вдруг он вспомнил о том, чем кончилась его любовь. «Ему ничего этого не нужно было. Он ничего этого не видел и не понимал. Он видел в ней хорошенькую и свеженькую девочку, с которой он не удостоил связать свою судьбу. А я? И до сих пор он жив и весел».
Князь Андрей, как будто кто нибудь обжег его, вскочил и стал опять ходить перед сараем.


25 го августа, накануне Бородинского сражения, префект дворца императора французов m r de Beausset и полковник Fabvier приехали, первый из Парижа, второй из Мадрида, к императору Наполеону в его стоянку у Валуева.
Переодевшись в придворный мундир, m r de Beausset приказал нести впереди себя привезенную им императору посылку и вошел в первое отделение палатки Наполеона, где, переговариваясь с окружавшими его адъютантами Наполеона, занялся раскупориванием ящика.
Fabvier, не входя в палатку, остановился, разговорясь с знакомыми генералами, у входа в нее.
Император Наполеон еще не выходил из своей спальни и оканчивал свой туалет. Он, пофыркивая и покряхтывая, поворачивался то толстой спиной, то обросшей жирной грудью под щетку, которою камердинер растирал его тело. Другой камердинер, придерживая пальцем склянку, брызгал одеколоном на выхоленное тело императора с таким выражением, которое говорило, что он один мог знать, сколько и куда надо брызнуть одеколону. Короткие волосы Наполеона были мокры и спутаны на лоб. Но лицо его, хоть опухшее и желтое, выражало физическое удовольствие: «Allez ferme, allez toujours…» [Ну еще, крепче…] – приговаривал он, пожимаясь и покряхтывая, растиравшему камердинеру. Адъютант, вошедший в спальню с тем, чтобы доложить императору о том, сколько было во вчерашнем деле взято пленных, передав то, что нужно было, стоял у двери, ожидая позволения уйти. Наполеон, сморщась, взглянул исподлобья на адъютанта.
– Point de prisonniers, – повторил он слова адъютанта. – Il se font demolir. Tant pis pour l'armee russe, – сказал он. – Allez toujours, allez ferme, [Нет пленных. Они заставляют истреблять себя. Тем хуже для русской армии. Ну еще, ну крепче…] – проговорил он, горбатясь и подставляя свои жирные плечи.
– C'est bien! Faites entrer monsieur de Beausset, ainsi que Fabvier, [Хорошо! Пускай войдет де Боссе, и Фабвье тоже.] – сказал он адъютанту, кивнув головой.
– Oui, Sire, [Слушаю, государь.] – и адъютант исчез в дверь палатки. Два камердинера быстро одели его величество, и он, в гвардейском синем мундире, твердыми, быстрыми шагами вышел в приемную.
Боссе в это время торопился руками, устанавливая привезенный им подарок от императрицы на двух стульях, прямо перед входом императора. Но император так неожиданно скоро оделся и вышел, что он не успел вполне приготовить сюрприза.
Наполеон тотчас заметил то, что они делали, и догадался, что они были еще не готовы. Он не захотел лишить их удовольствия сделать ему сюрприз. Он притворился, что не видит господина Боссе, и подозвал к себе Фабвье. Наполеон слушал, строго нахмурившись и молча, то, что говорил Фабвье ему о храбрости и преданности его войск, дравшихся при Саламанке на другом конце Европы и имевших только одну мысль – быть достойными своего императора, и один страх – не угодить ему. Результат сражения был печальный. Наполеон делал иронические замечания во время рассказа Fabvier, как будто он не предполагал, чтобы дело могло идти иначе в его отсутствие.
– Я должен поправить это в Москве, – сказал Наполеон. – A tantot, [До свиданья.] – прибавил он и подозвал де Боссе, который в это время уже успел приготовить сюрприз, уставив что то на стульях, и накрыл что то покрывалом.
Де Боссе низко поклонился тем придворным французским поклоном, которым умели кланяться только старые слуги Бурбонов, и подошел, подавая конверт.
Наполеон весело обратился к нему и подрал его за ухо.
– Вы поспешили, очень рад. Ну, что говорит Париж? – сказал он, вдруг изменяя свое прежде строгое выражение на самое ласковое.
– Sire, tout Paris regrette votre absence, [Государь, весь Париж сожалеет о вашем отсутствии.] – как и должно, ответил де Боссе. Но хотя Наполеон знал, что Боссе должен сказать это или тому подобное, хотя он в свои ясные минуты знал, что это было неправда, ему приятно было это слышать от де Боссе. Он опять удостоил его прикосновения за ухо.
– Je suis fache, de vous avoir fait faire tant de chemin, [Очень сожалею, что заставил вас проехаться так далеко.] – сказал он.
– Sire! Je ne m'attendais pas a moins qu'a vous trouver aux portes de Moscou, [Я ожидал не менее того, как найти вас, государь, у ворот Москвы.] – сказал Боссе.
Наполеон улыбнулся и, рассеянно подняв голову, оглянулся направо. Адъютант плывущим шагом подошел с золотой табакеркой и подставил ее. Наполеон взял ее.
– Да, хорошо случилось для вас, – сказал он, приставляя раскрытую табакерку к носу, – вы любите путешествовать, через три дня вы увидите Москву. Вы, верно, не ждали увидать азиатскую столицу. Вы сделаете приятное путешествие.
Боссе поклонился с благодарностью за эту внимательность к его (неизвестной ему до сей поры) склонности путешествовать.
– А! это что? – сказал Наполеон, заметив, что все придворные смотрели на что то, покрытое покрывалом. Боссе с придворной ловкостью, не показывая спины, сделал вполуоборот два шага назад и в одно и то же время сдернул покрывало и проговорил:
– Подарок вашему величеству от императрицы.
Это был яркими красками написанный Жераром портрет мальчика, рожденного от Наполеона и дочери австрийского императора, которого почему то все называли королем Рима.
Весьма красивый курчавый мальчик, со взглядом, похожим на взгляд Христа в Сикстинской мадонне, изображен был играющим в бильбоке. Шар представлял земной шар, а палочка в другой руке изображала скипетр.
Хотя и не совсем ясно было, что именно хотел выразить живописец, представив так называемого короля Рима протыкающим земной шар палочкой, но аллегория эта, так же как и всем видевшим картину в Париже, так и Наполеону, очевидно, показалась ясною и весьма понравилась.
– Roi de Rome, [Римский король.] – сказал он, грациозным жестом руки указывая на портрет. – Admirable! [Чудесно!] – С свойственной итальянцам способностью изменять произвольно выражение лица, он подошел к портрету и сделал вид задумчивой нежности. Он чувствовал, что то, что он скажет и сделает теперь, – есть история. И ему казалось, что лучшее, что он может сделать теперь, – это то, чтобы он с своим величием, вследствие которого сын его в бильбоке играл земным шаром, чтобы он выказал, в противоположность этого величия, самую простую отеческую нежность. Глаза его отуманились, он подвинулся, оглянулся на стул (стул подскочил под него) и сел на него против портрета. Один жест его – и все на цыпочках вышли, предоставляя самому себе и его чувству великого человека.
Посидев несколько времени и дотронувшись, сам не зная для чего, рукой до шероховатости блика портрета, он встал и опять позвал Боссе и дежурного. Он приказал вынести портрет перед палатку, с тем, чтобы не лишить старую гвардию, стоявшую около его палатки, счастья видеть римского короля, сына и наследника их обожаемого государя.
Как он и ожидал, в то время как он завтракал с господином Боссе, удостоившимся этой чести, перед палаткой слышались восторженные клики сбежавшихся к портрету офицеров и солдат старой гвардии.
– Vive l'Empereur! Vive le Roi de Rome! Vive l'Empereur! [Да здравствует император! Да здравствует римский король!] – слышались восторженные голоса.
После завтрака Наполеон, в присутствии Боссе, продиктовал свой приказ по армии.
– Courte et energique! [Короткий и энергический!] – проговорил Наполеон, когда он прочел сам сразу без поправок написанную прокламацию. В приказе было: