Тип данных

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

Тип данных (тип) — множество значений и операций на этих значениях (IEEE Std 1320.2-1998)[1].

Другие определения:

  • Тип данных — класс данных, характеризуемый членами класса и операциями, которые могут быть к ним применены (ISO/IEC/IEEE 24765-2010)[2].
  • Тип данных — категоризация абстрактного множества возможных значений, характеристик и набор операций для некоторого атрибута (IEEE Std 1320.2-1998)[3].
  • Тип данных — категоризация аргументов операций над значениями, как правило, охватывающая как поведение, так и представление (ISO/IEC 19500-2:2003)[4].
  • Тип данных — допустимое множество значений[5].

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





Определение

Тип данных характеризует одновременно:

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

Первое свойство можно рассматривать как теоретико-множественное определение понятия типа; второе — как процедурное (или поведенческое) определение.

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

Теоретико-множественное определение, особенно в низкоуровневом варианте, чаще всего используется в императивном программировании. Процедурное определение в большей степени связывается с параметрическим полиморфизмом. Объектно-ориентированное программирование использует процедурное определение при описании взаимодействия компонентов программы, и теоретико-множественное — при описании реализации этих компонентов на ЭВМ, соответственно, рассматривая «класс-как-поведение» и «класс-как-объект в памяти»К:Википедия:Статьи без источников (тип: не указан)[источник не указан 3351 день].

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

Типы позволяют избежать парадокса Рассела, в частности, Чёрч ввёл типы в лямбда-исчисление именно с этой целью[6].

Единообразная обработка данных разных типов называется полиморфизмом[7][8].

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

К неполным по Тьюрингу языкам описания данных (таким как SGML) процедурное определение обычно неприменимоК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3351 день].

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

Существуют различные классификации типов и правил их назначения.

По аналогии с математикой, типы данных делят на скалярные (примитивные) и нескалярные (агрегатные). Значение нескалярного типа (нескалярное значение) имеет множество видимых пользователю компонентов, а значение скалярного типа (скалярное значение) не имеет такового.[9] Примерами нескалярного типа являются массивы, списки и т.д.; примеры скалярного типа — «целое», «логическое» и т.д.

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

По другой классификации типы делятся на самостоятельные и зависимые. Важными разновидностями последних являются ссылочные типы, частным случаем которых, в свою очередь, являются указатели. Ссылки (в том числе и указатели) представляют собой несоставной зависимый тип, значения которого являются адресом в памяти ЭВМ другого значения. Например, в языке Си тип «указатель на целое без знака» записывается как «unsigned *», в языке ML тип «ссылка на целое без знака» записывается как «word ref».

Также типы делятся на мономорфные и полиморфные (см. переменная типа).

Некоторые распространённые типы данных

Логический тип

Логические, или булевы значения (по фамилии их изобретателя — Буля), могут иметь лишь одно из двух состояний — «истина» или «ложь». В разных языках обозначаются bool, BOOL, или boolean. «Истина» может обозначаться как true, TRUE или #T. «Ложь», соответственно, false, FALSE или #F. В языках C и C++ любое ненулевое число трактуется как «истина», а ноль — как «ложь». В Python некоторым единичным типам[en] также назначается то или иное «логическое значение». В принципе, для реализации типа достаточно одного бита, однако из-за особенностей микропроцессоров, на практике размер булевых величин обычно равен размеру машинного слова.

Целочисленные типы

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

Числа с плавающей запятой

Используются для представления вещественных (не обязательно целых) чисел. В этом случае число записывается в виде x=a*10^b. Где 0<=a<1, а b — некоторое целое число из определённого диапазона. a называют мантиссой, b — порядком. У мантиссы хранятся несколько цифр после запятой, а b — хранится полностью.

Строковые типы

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

Указатели

Указатель — переменная, диапазон значений которой состоит из адресов ячеек памяти или специального значения для обозначения того, что в данный момент в переменной ничего не записано.

Идентификационные типы

Идентификационные типы интерпретируются не как число, а как уникальный идентификатор объекта.

Абстрактные типы данных

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

Примеры

Самоприменение

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

Определение функции сортировки как параметрически полиморфной означает, что она сортирует абстрактную последовательность, то есть последовательность из элементов некоторого (неизвестного) типа. Для функции в этом случае требуется знать о своём параметре лишь два свойства — то, что он представляет собой последовательность, и что для её элементов определена операция сравнения. Рассмотрение параметров процедурным, а не декларативным, образом (то есть их использование на основе поведения, а не значения) позволяет использовать одну функцию сортировки для любых последовательностей — для последовательностей целых чисел, для последовательностей строк, для последовательностей последовательностей булевых значений, и так далее — и существенно повышает коэффициент повторного использования кода. Ту же гибкость обеспечивает и динамическая типизация, однако, в отличие от параметрического полиморфизма, первая приводит к накладным расходам. Параметрический полиморфизм наиболее развит в языках, типизированных по Хиндли — Милнеру, то есть потомках языка ML. В объектно-ориентированном программировании параметрический полиморфизм принято называть обобщённым программированием.

Несмотря на очевидные преимущества параметрического полиморфизма, порой возникает необходимость обеспечивать различное поведение для разных подтипов[en] одного общего типа, либо аналогичное поведение для несовместимых типов — то есть в тех или иных формах ad-hoc-полиморфизма. Однако, ему не существует математического обоснования, так что требование типобезопасности долгое время затрудняло его использование. Ad-hoc-полиморфизм реализовывался внутри параметрически полиморфной системы типов посредством различных трюков. Для этой цели использовались либо вариантные типы[en], либо параметрические модули (функторы), либо так называемые «значения, индексированные типами» (англ. type-indexed values), которые, в свою очередь, также имеют ряд реализаций[10]. Классы типов[en]*, появившиеся в языке Haskell, предоставили более изящное решение этой проблемы.

Если рассматриваемой информационной сущностью является тип, то назначение ей типа приведёт к понятию «тип типа» («метатип»). В теории типов это понятие носит название «род типов» (англ. kind of a type или type kind). Например, род «*» включает все типы, а род «* -> *» включает все унарные конструкторы типов. Рода явным образом применяются при полнотиповом программировании — например, в виде конструкторов типов в языках семейства ML.

Расширение безопасной полиморфной системы типов классами[en]* и родами типов сделало Haskell первым типизированным в полной мере языком. Полученная система типов оказала влияние на другие языки (например, Scala, Agda).

Ограниченная форма метатипов присутствует также в ряде объектно-ориентированных языков в форме метаклассов. В потомках языка Smalltalk (например, Python) всякая сущность в программе является объектом, имеющим тип, который сам также является объектом — таким образом, метатипы являются естественной частью языка. В языке C++ отдельно от основной системы типов языка реализована подсистема RTTI, также предоставляющая информацию о типе в виде специальной структуры.

Динамическое выяснение метатипов называется отражением (а также рефлексивностью или интроспекцией).

Представление на ЭВМ

Наиболее заметным отличием реального программирования от формальной теории информации является рассмотрение вопросов эффективности не только в терминах О-нотации, но и с позиций экономической целесообразности воплощения тех или иных требований в физически изготовляемой ЭВМ. И в первую очередь это сказывается на допустимой точности вычислений: понятие «число» в ЭВМ на практике не тождественно понятию числа в арифметике. Число в ЭВМ представляется ячейкой памяти, размер которой определяется архитектурой ЭВМ, и диапазон значений числа ограничивается размером этой ячейки. Например, процессоры архитектуры Intel x86 предоставляют ячейки, размер которых в байтах задаётся степенью двойки: 1, 2, 4, 8, 16 и т. д. Процессоры архитектуры Сетунь предоставляли ячейки, размер которых в трайтах задавался кратным тройке: 1, 3, 6, 9 и т. д.

Попытка записи в ячейку значения, превышающего максимально допустимый для неё предел (который известен) приводит к ошибке переполнения. При необходимости расчётов на более крупных числах используется специальная методика, называемая длинной арифметикой, которая в силу значительной ресурсоёмкости не может осуществляться в реальном времени. Для наиболее распространённых в настоящее время архитектур ЭВМ «родным» является размер ячеек в 32 и 64 бит (то есть 4 и 8 байт).

Кроме того, целые и вещественные числа имеют разное представление в этих ячейках: неотрицательные целые представляются непосредственно, отрицательные целые — в дополнительном коде, а вещественные кодируются особым образом. Из-за этих различий сложение чисел «1» и «0.1», которое в теории даёт значение «1.1», на ЭВМ непосредственно невозможно. Для его осуществления необходимо сперва выполнить преобразование типа, породив на основании значения целого типа «1» новое значение вещественного типа «1.0», и лишь затем сложить «1.0» и «0.1». В силу специфики реализации вещественных чисел на ЭВМ, такое преобразование осуществляется не абсолютно точно, а с некоторой долей приближения. По той же причине сильно типизированные языки (например, Standard ML) рассматривают вещественный тип как «не допускающий проверку на равенство[en]».

Для низкоуровневого представления составных типов важное значение имеет понятие о выравнивании данных. Языки высокого уровня обычно изолируют (абстрагируют) программиста от этого свойства, однако, с ним приходится считаться при связывании независимо скомпилированных модулей между собой. Однако, некоторые языки (Си, С++) предоставляют возможность контролировать низкоуровневое представление типов, в том числе и выравнивание. Такие языки временами называют языками среднего уровня.


Напишите отзыв о статье "Тип данных"

Примечания

  1. IEEE Std 1320.2-1998 (R2004) IEEE Standard for Conceptual Modeling Language Syntax and Semantics for IDEF1X97:
    a set of values and operations on those values
  2. [www.iso.org/obp/ui/#iso:std:iso-iec-ieee:24765:ed-1:v1:en ISO/IEC/IEEE 24765-2010 Systems and software engineering — Vocabulary]:
    a class of data, characterized by the members of the class and the operations that can be applied to them
  3. IEEE Std 1320.2-1998 (R2004) IEEE Standard for Conceptual Modeling Language Syntax and Semantics for IDEF1X97:
    a categorization of an abstract set of possible values, characteristics, and set of operations for an attribute
  4. ISO/IEC 19500-2:2003, Information technology — Open Distributed Processing — Part 2: General Inter-ORB Protocol (GIOP)/Internet Inter-ORB Protocol (IIOP):
    a categorization of values operation arguments, typically covering both behavior and representation
  5. С. J. Date. On The Logical Differences Between Types, Values, and Variables // Date on database: Writings 2000—2006, Apress, 2006, ISBN 978-1-59059-746-0
  6. Харрисон Дж. [dspace.nsu.ru:8080/jspui/bitstream/nsu/88/1/Harrison.pdf Введение в Функциональное Программирование] = www.cl.cam.ac.uk/Teaching/Lectures/funprog-jrh-1996/. — 1997.
  7. Strachey - Fundamental Concepts, 3.6.4. Polymorphism, с. 36-37.
  8. Cardelli - Typeful programming, 2.Typeful languages, с. 5.
  9. Дейт К. Дж., 2005.
  10. [www.mlton.org/TypeIndexedValues Type-Indexed Values]

Литература

  • Дейт К. Дж. Введение в системы баз данных = Introduction to Database Systems. — 8-е изд. — М.: Вильямс, 2005. — 1328 с. — ISBN 5-8459-0788-8 (рус.) 0-321-19784-4 (англ.).
  • C. Strachey [www.itu.dk/courses/BPRD/E2009/fundamental-1967.pdf Fundamental Concepts in Programming Languages]. — 1967.
  • 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].
  • Лука Карделли[en] [www.lucacardelli.name/Papers/TypefulProg.pdf Typeful programming] ( (англ.)) // IFIP State-of-the-Art Reports. — Springer-Verlag, 1991. — Вып. Formal Description of Programming Concepts. — С. 431–507.
  • Pierce, Benjamin C. [www.cis.upenn.edu/~bcpierce/tapl/ Types and Programming Languages]. — MIT Press, 2002. — ISBN 0-262-16209-1.
  • Luca Cardelli. [lucacardelli.name/Papers/TypeSystems.pdf CRC Handbook of Computer Science and Engineering]. — 2nd. — CRC Press, 2004. — ISBN 158488360X.
  • Zhe Yang Encoding Types in ML-like Languages. — Department of Computer Science, New York University, (c) ACM, 1998.


Отрывок, характеризующий Тип данных

В то время как Пьер, стоя посередине комнаты, рассуждал с собой таким образом, дверь кабинета отворилась, и на пороге показалась совершенно изменившаяся фигура всегда прежде робкого Макара Алексеевича. Халат его был распахнут. Лицо было красно и безобразно. Он, очевидно, был пьян. Увидав Пьера, он смутился в первую минуту, но, заметив смущение и на лице Пьера, тотчас ободрился и шатающимися тонкими ногами вышел на середину комнаты.
– Они оробели, – сказал он хриплым, доверчивым голосом. – Я говорю: не сдамся, я говорю… так ли, господин? – Он задумался и вдруг, увидав пистолет на столе, неожиданно быстро схватил его и выбежал в коридор.
Герасим и дворник, шедшие следом за Макар Алексеичем, остановили его в сенях и стали отнимать пистолет. Пьер, выйдя в коридор, с жалостью и отвращением смотрел на этого полусумасшедшего старика. Макар Алексеич, морщась от усилий, удерживал пистолет и кричал хриплый голосом, видимо, себе воображая что то торжественное.
– К оружию! На абордаж! Врешь, не отнимешь! – кричал он.
– Будет, пожалуйста, будет. Сделайте милость, пожалуйста, оставьте. Ну, пожалуйста, барин… – говорил Герасим, осторожно за локти стараясь поворотить Макар Алексеича к двери.
– Ты кто? Бонапарт!.. – кричал Макар Алексеич.
– Это нехорошо, сударь. Вы пожалуйте в комнаты, вы отдохните. Пожалуйте пистолетик.
– Прочь, раб презренный! Не прикасайся! Видел? – кричал Макар Алексеич, потрясая пистолетом. – На абордаж!
– Берись, – шепнул Герасим дворнику.
Макара Алексеича схватили за руки и потащили к двери.
Сени наполнились безобразными звуками возни и пьяными хрипящими звуками запыхавшегося голоса.
Вдруг новый, пронзительный женский крик раздался от крыльца, и кухарка вбежала в сени.
– Они! Батюшки родимые!.. Ей богу, они. Четверо, конные!.. – кричала она.
Герасим и дворник выпустили из рук Макар Алексеича, и в затихшем коридоре ясно послышался стук нескольких рук во входную дверь.


Пьер, решивший сам с собою, что ему до исполнения своего намерения не надо было открывать ни своего звания, ни знания французского языка, стоял в полураскрытых дверях коридора, намереваясь тотчас же скрыться, как скоро войдут французы. Но французы вошли, и Пьер все не отходил от двери: непреодолимое любопытство удерживало его.
Их было двое. Один – офицер, высокий, бравый и красивый мужчина, другой – очевидно, солдат или денщик, приземистый, худой загорелый человек с ввалившимися щеками и тупым выражением лица. Офицер, опираясь на палку и прихрамывая, шел впереди. Сделав несколько шагов, офицер, как бы решив сам с собою, что квартира эта хороша, остановился, обернулся назад к стоявшим в дверях солдатам и громким начальническим голосом крикнул им, чтобы они вводили лошадей. Окончив это дело, офицер молодецким жестом, высоко подняв локоть руки, расправил усы и дотронулся рукой до шляпы.
– Bonjour la compagnie! [Почтение всей компании!] – весело проговорил он, улыбаясь и оглядываясь вокруг себя. Никто ничего не отвечал.
– Vous etes le bourgeois? [Вы хозяин?] – обратился офицер к Герасиму.
Герасим испуганно вопросительно смотрел на офицера.
– Quartire, quartire, logement, – сказал офицер, сверху вниз, с снисходительной и добродушной улыбкой глядя на маленького человека. – Les Francais sont de bons enfants. Que diable! Voyons! Ne nous fachons pas, mon vieux, [Квартир, квартир… Французы добрые ребята. Черт возьми, не будем ссориться, дедушка.] – прибавил он, трепля по плечу испуганного и молчаливого Герасима.
– A ca! Dites donc, on ne parle donc pas francais dans cette boutique? [Что ж, неужели и тут никто не говорит по французски?] – прибавил он, оглядываясь кругом и встречаясь глазами с Пьером. Пьер отстранился от двери.
Офицер опять обратился к Герасиму. Он требовал, чтобы Герасим показал ему комнаты в доме.
– Барин нету – не понимай… моя ваш… – говорил Герасим, стараясь делать свои слова понятнее тем, что он их говорил навыворот.
Французский офицер, улыбаясь, развел руками перед носом Герасима, давая чувствовать, что и он не понимает его, и, прихрамывая, пошел к двери, у которой стоял Пьер. Пьер хотел отойти, чтобы скрыться от него, но в это самое время он увидал из отворившейся двери кухни высунувшегося Макара Алексеича с пистолетом в руках. С хитростью безумного Макар Алексеич оглядел француза и, приподняв пистолет, прицелился.
– На абордаж!!! – закричал пьяный, нажимая спуск пистолета. Французский офицер обернулся на крик, и в то же мгновенье Пьер бросился на пьяного. В то время как Пьер схватил и приподнял пистолет, Макар Алексеич попал, наконец, пальцем на спуск, и раздался оглушивший и обдавший всех пороховым дымом выстрел. Француз побледнел и бросился назад к двери.
Забывший свое намерение не открывать своего знания французского языка, Пьер, вырвав пистолет и бросив его, подбежал к офицеру и по французски заговорил с ним.
– Vous n'etes pas blesse? [Вы не ранены?] – сказал он.
– Je crois que non, – отвечал офицер, ощупывая себя, – mais je l'ai manque belle cette fois ci, – прибавил он, указывая на отбившуюся штукатурку в стене. – Quel est cet homme? [Кажется, нет… но на этот раз близко было. Кто этот человек?] – строго взглянув на Пьера, сказал офицер.
– Ah, je suis vraiment au desespoir de ce qui vient d'arriver, [Ах, я, право, в отчаянии от того, что случилось,] – быстро говорил Пьер, совершенно забыв свою роль. – C'est un fou, un malheureux qui ne savait pas ce qu'il faisait. [Это несчастный сумасшедший, который не знал, что делал.]
Офицер подошел к Макару Алексеичу и схватил его за ворот.
Макар Алексеич, распустив губы, как бы засыпая, качался, прислонившись к стене.
– Brigand, tu me la payeras, – сказал француз, отнимая руку.
– Nous autres nous sommes clements apres la victoire: mais nous ne pardonnons pas aux traitres, [Разбойник, ты мне поплатишься за это. Наш брат милосерд после победы, но мы не прощаем изменникам,] – прибавил он с мрачной торжественностью в лице и с красивым энергическим жестом.
Пьер продолжал по французски уговаривать офицера не взыскивать с этого пьяного, безумного человека. Француз молча слушал, не изменяя мрачного вида, и вдруг с улыбкой обратился к Пьеру. Он несколько секунд молча посмотрел на него. Красивое лицо его приняло трагически нежное выражение, и он протянул руку.
– Vous m'avez sauve la vie! Vous etes Francais, [Вы спасли мне жизнь. Вы француз,] – сказал он. Для француза вывод этот был несомненен. Совершить великое дело мог только француз, а спасение жизни его, m r Ramball'я capitaine du 13 me leger [мосье Рамбаля, капитана 13 го легкого полка] – было, без сомнения, самым великим делом.
Но как ни несомненен был этот вывод и основанное на нем убеждение офицера, Пьер счел нужным разочаровать его.
– Je suis Russe, [Я русский,] – быстро сказал Пьер.
– Ти ти ти, a d'autres, [рассказывайте это другим,] – сказал француз, махая пальцем себе перед носом и улыбаясь. – Tout a l'heure vous allez me conter tout ca, – сказал он. – Charme de rencontrer un compatriote. Eh bien! qu'allons nous faire de cet homme? [Сейчас вы мне все это расскажете. Очень приятно встретить соотечественника. Ну! что же нам делать с этим человеком?] – прибавил он, обращаясь к Пьеру, уже как к своему брату. Ежели бы даже Пьер не был француз, получив раз это высшее в свете наименование, не мог же он отречься от него, говорило выражение лица и тон французского офицера. На последний вопрос Пьер еще раз объяснил, кто был Макар Алексеич, объяснил, что пред самым их приходом этот пьяный, безумный человек утащил заряженный пистолет, который не успели отнять у него, и просил оставить его поступок без наказания.
Француз выставил грудь и сделал царский жест рукой.
– Vous m'avez sauve la vie. Vous etes Francais. Vous me demandez sa grace? Je vous l'accorde. Qu'on emmene cet homme, [Вы спасли мне жизнь. Вы француз. Вы хотите, чтоб я простил его? Я прощаю его. Увести этого человека,] – быстро и энергично проговорил французский офицер, взяв под руку произведенного им за спасение его жизни во французы Пьера, и пошел с ним в дом.
Солдаты, бывшие на дворе, услыхав выстрел, вошли в сени, спрашивая, что случилось, и изъявляя готовность наказать виновных; но офицер строго остановил их.
– On vous demandera quand on aura besoin de vous, [Когда будет нужно, вас позовут,] – сказал он. Солдаты вышли. Денщик, успевший между тем побывать в кухне, подошел к офицеру.
– Capitaine, ils ont de la soupe et du gigot de mouton dans la cuisine, – сказал он. – Faut il vous l'apporter? [Капитан у них в кухне есть суп и жареная баранина. Прикажете принести?]
– Oui, et le vin, [Да, и вино,] – сказал капитан.


Французский офицер вместе с Пьером вошли в дом. Пьер счел своим долгом опять уверить капитана, что он был не француз, и хотел уйти, но французский офицер и слышать не хотел об этом. Он был до такой степени учтив, любезен, добродушен и истинно благодарен за спасение своей жизни, что Пьер не имел духа отказать ему и присел вместе с ним в зале, в первой комнате, в которую они вошли. На утверждение Пьера, что он не француз, капитан, очевидно не понимая, как можно было отказываться от такого лестного звания, пожал плечами и сказал, что ежели он непременно хочет слыть за русского, то пускай это так будет, но что он, несмотря на то, все так же навеки связан с ним чувством благодарности за спасение жизни.
Ежели бы этот человек был одарен хоть сколько нибудь способностью понимать чувства других и догадывался бы об ощущениях Пьера, Пьер, вероятно, ушел бы от него; но оживленная непроницаемость этого человека ко всему тому, что не было он сам, победила Пьера.
– Francais ou prince russe incognito, [Француз или русский князь инкогнито,] – сказал француз, оглядев хотя и грязное, но тонкое белье Пьера и перстень на руке. – Je vous dois la vie je vous offre mon amitie. Un Francais n'oublie jamais ni une insulte ni un service. Je vous offre mon amitie. Je ne vous dis que ca. [Я обязан вам жизнью, и я предлагаю вам дружбу. Француз никогда не забывает ни оскорбления, ни услуги. Я предлагаю вам мою дружбу. Больше я ничего не говорю.]
В звуках голоса, в выражении лица, в жестах этого офицера было столько добродушия и благородства (во французском смысле), что Пьер, отвечая бессознательной улыбкой на улыбку француза, пожал протянутую руку.
– Capitaine Ramball du treizieme leger, decore pour l'affaire du Sept, [Капитан Рамбаль, тринадцатого легкого полка, кавалер Почетного легиона за дело седьмого сентября,] – отрекомендовался он с самодовольной, неудержимой улыбкой, которая морщила его губы под усами. – Voudrez vous bien me dire a present, a qui' j'ai l'honneur de parler aussi agreablement au lieu de rester a l'ambulance avec la balle de ce fou dans le corps. [Будете ли вы так добры сказать мне теперь, с кем я имею честь разговаривать так приятно, вместо того, чтобы быть на перевязочном пункте с пулей этого сумасшедшего в теле?]
Пьер отвечал, что не может сказать своего имени, и, покраснев, начал было, пытаясь выдумать имя, говорить о причинах, по которым он не может сказать этого, но француз поспешно перебил его.
– De grace, – сказал он. – Je comprends vos raisons, vous etes officier… officier superieur, peut etre. Vous avez porte les armes contre nous. Ce n'est pas mon affaire. Je vous dois la vie. Cela me suffit. Je suis tout a vous. Vous etes gentilhomme? [Полноте, пожалуйста. Я понимаю вас, вы офицер… штаб офицер, может быть. Вы служили против нас. Это не мое дело. Я обязан вам жизнью. Мне этого довольно, и я весь ваш. Вы дворянин?] – прибавил он с оттенком вопроса. Пьер наклонил голову. – Votre nom de bapteme, s'il vous plait? Je ne demande pas davantage. Monsieur Pierre, dites vous… Parfait. C'est tout ce que je desire savoir. [Ваше имя? я больше ничего не спрашиваю. Господин Пьер, вы сказали? Прекрасно. Это все, что мне нужно.]
Когда принесены были жареная баранина, яичница, самовар, водка и вино из русского погреба, которое с собой привезли французы, Рамбаль попросил Пьера принять участие в этом обеде и тотчас сам, жадно и быстро, как здоровый и голодный человек, принялся есть, быстро пережевывая своими сильными зубами, беспрестанно причмокивая и приговаривая excellent, exquis! [чудесно, превосходно!] Лицо его раскраснелось и покрылось потом. Пьер был голоден и с удовольствием принял участие в обеде. Морель, денщик, принес кастрюлю с теплой водой и поставил в нее бутылку красного вина. Кроме того, он принес бутылку с квасом, которую он для пробы взял в кухне. Напиток этот был уже известен французам и получил название. Они называли квас limonade de cochon (свиной лимонад), и Морель хвалил этот limonade de cochon, который он нашел в кухне. Но так как у капитана было вино, добытое при переходе через Москву, то он предоставил квас Морелю и взялся за бутылку бордо. Он завернул бутылку по горлышко в салфетку и налил себе и Пьеру вина. Утоленный голод и вино еще более оживили капитана, и он не переставая разговаривал во время обеда.
– Oui, mon cher monsieur Pierre, je vous dois une fiere chandelle de m'avoir sauve… de cet enrage… J'en ai assez, voyez vous, de balles dans le corps. En voila une (on показал на бок) a Wagram et de deux a Smolensk, – он показал шрам, который был на щеке. – Et cette jambe, comme vous voyez, qui ne veut pas marcher. C'est a la grande bataille du 7 a la Moskowa que j'ai recu ca. Sacre dieu, c'etait beau. Il fallait voir ca, c'etait un deluge de feu. Vous nous avez taille une rude besogne; vous pouvez vous en vanter, nom d'un petit bonhomme. Et, ma parole, malgre l'atoux que j'y ai gagne, je serais pret a recommencer. Je plains ceux qui n'ont pas vu ca. [Да, мой любезный господин Пьер, я обязан поставить за вас добрую свечку за то, что вы спасли меня от этого бешеного. С меня, видите ли, довольно тех пуль, которые у меня в теле. Вот одна под Ваграмом, другая под Смоленском. А эта нога, вы видите, которая не хочет двигаться. Это при большом сражении 7 го под Москвою. О! это было чудесно! Надо было видеть, это был потоп огня. Задали вы нам трудную работу, можете похвалиться. И ей богу, несмотря на этот козырь (он указал на крест), я был бы готов начать все снова. Жалею тех, которые не видали этого.]
– J'y ai ete, [Я был там,] – сказал Пьер.
– Bah, vraiment! Eh bien, tant mieux, – сказал француз. – Vous etes de fiers ennemis, tout de meme. La grande redoute a ete tenace, nom d'une pipe. Et vous nous l'avez fait cranement payer. J'y suis alle trois fois, tel que vous me voyez. Trois fois nous etions sur les canons et trois fois on nous a culbute et comme des capucins de cartes. Oh!! c'etait beau, monsieur Pierre. Vos grenadiers ont ete superbes, tonnerre de Dieu. Je les ai vu six fois de suite serrer les rangs, et marcher comme a une revue. Les beaux hommes! Notre roi de Naples, qui s'y connait a crie: bravo! Ah, ah! soldat comme nous autres! – сказал он, улыбаясь, поело минутного молчания. – Tant mieux, tant mieux, monsieur Pierre. Terribles en bataille… galants… – он подмигнул с улыбкой, – avec les belles, voila les Francais, monsieur Pierre, n'est ce pas? [Ба, в самом деле? Тем лучше. Вы лихие враги, надо признаться. Хорошо держался большой редут, черт возьми. И дорого же вы заставили нас поплатиться. Я там три раза был, как вы меня видите. Три раза мы были на пушках, три раза нас опрокидывали, как карточных солдатиков. Ваши гренадеры были великолепны, ей богу. Я видел, как их ряды шесть раз смыкались и как они выступали точно на парад. Чудный народ! Наш Неаполитанский король, который в этих делах собаку съел, кричал им: браво! – Га, га, так вы наш брат солдат! – Тем лучше, тем лучше, господин Пьер. Страшны в сражениях, любезны с красавицами, вот французы, господин Пьер. Не правда ли?]
До такой степени капитан был наивно и добродушно весел, и целен, и доволен собой, что Пьер чуть чуть сам не подмигнул, весело глядя на него. Вероятно, слово «galant» навело капитана на мысль о положении Москвы.
– A propos, dites, donc, est ce vrai que toutes les femmes ont quitte Moscou? Une drole d'idee! Qu'avaient elles a craindre? [Кстати, скажите, пожалуйста, правда ли, что все женщины уехали из Москвы? Странная мысль, чего они боялись?]
– Est ce que les dames francaises ne quitteraient pas Paris si les Russes y entraient? [Разве французские дамы не уехали бы из Парижа, если бы русские вошли в него?] – сказал Пьер.
– Ah, ah, ah!.. – Француз весело, сангвинически расхохотался, трепля по плечу Пьера. – Ah! elle est forte celle la, – проговорил он. – Paris? Mais Paris Paris… [Ха, ха, ха!.. А вот сказал штуку. Париж?.. Но Париж… Париж…]
– Paris la capitale du monde… [Париж – столица мира…] – сказал Пьер, доканчивая его речь.
Капитан посмотрел на Пьера. Он имел привычку в середине разговора остановиться и поглядеть пристально смеющимися, ласковыми глазами.
– Eh bien, si vous ne m'aviez pas dit que vous etes Russe, j'aurai parie que vous etes Parisien. Vous avez ce je ne sais, quoi, ce… [Ну, если б вы мне не сказали, что вы русский, я бы побился об заклад, что вы парижанин. В вас что то есть, эта…] – и, сказав этот комплимент, он опять молча посмотрел.
– J'ai ete a Paris, j'y ai passe des annees, [Я был в Париже, я провел там целые годы,] – сказал Пьер.
– Oh ca se voit bien. Paris!.. Un homme qui ne connait pas Paris, est un sauvage. Un Parisien, ca se sent a deux lieux. Paris, s'est Talma, la Duschenois, Potier, la Sorbonne, les boulevards, – и заметив, что заключение слабее предыдущего, он поспешно прибавил: – Il n'y a qu'un Paris au monde. Vous avez ete a Paris et vous etes reste Busse. Eh bien, je ne vous en estime pas moins. [О, это видно. Париж!.. Человек, который не знает Парижа, – дикарь. Парижанина узнаешь за две мили. Париж – это Тальма, Дюшенуа, Потье, Сорбонна, бульвары… Во всем мире один Париж. Вы были в Париже и остались русским. Ну что же, я вас за то не менее уважаю.]
Под влиянием выпитого вина и после дней, проведенных в уединении с своими мрачными мыслями, Пьер испытывал невольное удовольствие в разговоре с этим веселым и добродушным человеком.
– Pour en revenir a vos dames, on les dit bien belles. Quelle fichue idee d'aller s'enterrer dans les steppes, quand l'armee francaise est a Moscou. Quelle chance elles ont manque celles la. Vos moujiks c'est autre chose, mais voua autres gens civilises vous devriez nous connaitre mieux que ca. Nous avons pris Vienne, Berlin, Madrid, Naples, Rome, Varsovie, toutes les capitales du monde… On nous craint, mais on nous aime. Nous sommes bons a connaitre. Et puis l'Empereur! [Но воротимся к вашим дамам: говорят, что они очень красивы. Что за дурацкая мысль поехать зарыться в степи, когда французская армия в Москве! Они пропустили чудесный случай. Ваши мужики, я понимаю, но вы – люди образованные – должны бы были знать нас лучше этого. Мы брали Вену, Берлин, Мадрид, Неаполь, Рим, Варшаву, все столицы мира. Нас боятся, но нас любят. Не вредно знать нас поближе. И потом император…] – начал он, но Пьер перебил его.
– L'Empereur, – повторил Пьер, и лицо его вдруг привяло грустное и сконфуженное выражение. – Est ce que l'Empereur?.. [Император… Что император?..]
– L'Empereur? C'est la generosite, la clemence, la justice, l'ordre, le genie, voila l'Empereur! C'est moi, Ram ball, qui vous le dit. Tel que vous me voyez, j'etais son ennemi il y a encore huit ans. Mon pere a ete comte emigre… Mais il m'a vaincu, cet homme. Il m'a empoigne. Je n'ai pas pu resister au spectacle de grandeur et de gloire dont il couvrait la France. Quand j'ai compris ce qu'il voulait, quand j'ai vu qu'il nous faisait une litiere de lauriers, voyez vous, je me suis dit: voila un souverain, et je me suis donne a lui. Eh voila! Oh, oui, mon cher, c'est le plus grand homme des siecles passes et a venir. [Император? Это великодушие, милосердие, справедливость, порядок, гений – вот что такое император! Это я, Рамбаль, говорю вам. Таким, каким вы меня видите, я был его врагом тому назад восемь лет. Мой отец был граф и эмигрант. Но он победил меня, этот человек. Он завладел мною. Я не мог устоять перед зрелищем величия и славы, которым он покрывал Францию. Когда я понял, чего он хотел, когда я увидал, что он готовит для нас ложе лавров, я сказал себе: вот государь, и я отдался ему. И вот! О да, мой милый, это самый великий человек прошедших и будущих веков.]
– Est il a Moscou? [Что, он в Москве?] – замявшись и с преступным лицом сказал Пьер.
Француз посмотрел на преступное лицо Пьера и усмехнулся.
– Non, il fera son entree demain, [Нет, он сделает свой въезд завтра,] – сказал он и продолжал свои рассказы.
Разговор их был прерван криком нескольких голосов у ворот и приходом Мореля, который пришел объявить капитану, что приехали виртембергские гусары и хотят ставить лошадей на тот же двор, на котором стояли лошади капитана. Затруднение происходило преимущественно оттого, что гусары не понимали того, что им говорили.