D (язык программирования)

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

мультипарадигмальный: императивное, объектно-ориентированное, контрактное[1], обобщённое программирование

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

компилируемый

Появился в:

2001

Автор:

Уолтер Брайт

Выпуск:

2.072 (2016-10-30; 2706 дней тому назад[2])

Тестовая версия:

2.072.0-b2 (2016-10-09; 2727 дней тому назад)

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

строгая, статическая, с выводом типов

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

Digital Mars D (эталонная реализация), [github.com/ldc-developers/ldc LDC], [bitbucket.org/goshawk/gdc/ GDC]

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

Си, C++, Python, Ruby, C#, Java, Eiffel

Сайт:

[dlang.org/ rg]

D (Ди) — мультипарадигмальный компилируемый язык программирования, созданный Уолтером Брайтом из компании Digital Mars. Начиная с 2006 г. соавтором также является Андрей Александреску. Изначально D был задуман как реинжиниринг языка C++, однако, несмотря на значительное влияние С++, не является его вариантом. Также язык испытал влияние концепций из языков программирования Python, Ruby, C#, Java, Eiffel.

При создании языка D была сделана попытка соединить производительность компилируемых языков программирования с безопасностью и выразительностью динамических.

Стабильная версия компилятора 1.0 вышла 2 января 2007[3].

Стабильная версия компилятора 2.0 (последняя на сегодняшний день мажорная версия) выпущена 17 июня 2007 года[4].

D доступен для операционных систем Windows, Linux, Mac OS, FreeBSD. Ведётся работа по портированию на Android[5].





Обзор языка

Синтаксис

D относится к семейству C-подобных языков с фигурными скобками, в общих чертах его синтаксис похож на C/C++/C#, Java. При разработке языка соблюдается принцип: код, одинаково валидный и в C, и в D, должен вести себя одинаково.

"Hello, world!" на D:

import std.stdio;

void main() {
    writeln ("Hello, world!");
}

Также как в C, функция main() является точкой входа.

Универсальный синтаксис вызова функций (UFCS)

В D реализован механизм UFCS (Uniform function call syntax), позволяющий вызывать функции для любого объекта так, как будто они являются его методами. Например:

import std.stdio;
import std.algorithm;
import std.array;

void main()
{
    auto a = [2, 4, 1, 3];
 
    // все три следующих варианта корректны и работают одинаково
    writeln(a); // "классический" C-подобный вариант
    a.writeln(); // функция вызывается так, как будто является методом объекта "a", хотя и не является таковой
    a.writeln; // функцию без параметров можно вызывать без скобок
 
    // это позволяет использовать цепочки вызовов, характерные для функциональных языков
    int[] e = a.sort().reverse;

    // многострочная цепочка вызовов также возможна
    stdin
        .byLine(KeepTerminator.yes)
        .map!(a => a.idup)
        .array
        .sort;
}

Атрибуты функций

Функции в D могут быть определены с дополнительными необязательными атрибутами, которые позволяют явно указывать некоторые аспекты поведения этих функций. Например, функция, помеченная атрибутом pure гарантированно является функционально чистой (с некоторыми оговорками)[6]. Функциональная чистота при этом проверяется на этапе компиляции. Пример объявления функции с атрибутом:

pure int sum (int first, int second) 
{
    return first + second;
}

int sum (int first, int second) pure // атрибуты можно указывать и после списка аргументов
{
    return first + second;
}

Примеры атрибутов функций:

  • pure - функциональная чистота
  • @safe - гарантия безопасной работы с памятью
  • nothrow - функция гарантированно не генерирует исключений
  • @nogc - гарантия того, что функция не содержит операций, требующих сборки мусора
  • @property - атрибут метода класса, позволяющий избежать использования "наивных" геттеров-сеттеров

Встроенные юнит-тесты

В D юнит-тесты являются частью языка, их можно использовать без подключения дополнительных библиотек или фреймворков.

import std.stdio;

int first (int[] arr) {
    return arr[0];
}

unittest {
    int[] arr1 = [1, 2, 3];
    int[] arr2 = [10, 15, 20];

    assert(first(arr1) == 1);
    assert(first(arr2) == 10);
}

void main() {
    // ...
}


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

Парадигмы программирования

D реализует пять основных парадигм программирования—императивное, ООП, метапрограммирование, функциональное программирование и параллельные вычисления (модель акторов).

Управление памятью

D использует сборщик мусора для управления памятью, однако возможно и ручное управление с помощью перегрузки операторов new и delete, а также с помощью malloc и free, аналогично C. Сборщик мусора можно включать и выключать вручную, можно добавлять и удалять области памяти из его видимости, принудительно запускать частичный или полный процесс сборки. Существует подробное [wiki.dlang.org/Memory_Management руководство], описывающее различные схемы управления памятью в D для тех случаев, когда стандартный сборщик мусора неприменим.

SafeD

SafeD - название подмножества языка D, использование которого гарантирует безопасность доступа к памяти.

Типы данных

Язык имеет богатый набор определённых типов данных и средств для определения новых типов. Типы в языке D разделяются на типы-значения и типы-ссылки.

Базовые типы

Набор базовых типов можно разделить на следующие категории[7]:

  • void — специальный тип для пустых значений
  • bool — логический тип
  • целочисленные типы: знаковые byte, short, int, long и соответствующие им беззнаковые ubyte, ushort, uint, ulong
  • типы для чисел с плавающей точкой: float, double, real. Для типов с плавающей точкой есть соответствующие им варианты для мнимых и комплексных чисел:
    • мнимые: ifloat, idouble, ireal
    • комплексные: сfloat, сdouble, сreal
  • знаковые (символьные) типы: char, wchar, dchar, обозначающие кодовые единицы кодировок UTF-8, UTF-16 и UTF-32 соответственно.

В отличие от C++ все размеры целочисленных типов определены спецификацией. То есть, тип int будет всегда размером 32 бита. Целочисленные литералы можно записывать в десятичной, двоичной (с префиксом 0b) и шестнадцатеричной (с префиксом 0x) системе счисления. Способ записи литералов в восьмеричной системе в стиле C (то есть с префиксом 0) был убран, так как такую запись легко спутать с десятичной. Если всё-таки нужно использовать восьмеричную систему, можно воспользоваться шаблоном std.conv.octal.

Производные типы

  • pointer - указатель
  • array - массив
  • associative array - ассоциативный массив
  • function - функция
  • delegate - делегат
  • string, wstring, dstring – удобные псевдонимы для неизменяемых массивов знаковых (символьных) типов immutable(char)[], immutable(wchar)[] и immutable(dchar)[], обозначающие неизменяемые (квалификатор immutable) строки Юникода в одной из кодировок UTF-8, UTF-16 и UTF-32 соответственно.

Пользовательские типы

  • alias - псевдоним
  • enum - перечисление
  • struct - структура
  • union - объединение
  • class - класс

Вывод типов, ключевые слова "auto", "typeof" и безымянные ("Voldemort") типы

В D реализован механизм вывода типов. Это значит, что тип, как правило, может быть вычислен на этапе компиляции и его не обязательно указывать явно. Например, выражение: auto myVar = 10 на этапе компиляции будет преобразовано в int myVar = 10. Использование вывода типов дает несколько преимуществ:

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

VeryLongTypeName var = VeryLongTypeName(/* ... */);

может быть заменено на

auto var = VeryLongTypeName(/* ... */);

  • с помощью ключевого слова typeof можно создать переменную такого же типа, как у существующей переменной, даже если её тип неизвестен. Пример:
// file1.d
int var1;

// file2.d
typeof(var1) var2; // var2 получает тип int
  • использование безымянных типов. Пример:
// Функция фактически возвращает результат типа TheUnnameable, но, поскольку этот тип определен внутри функции, 
// мы не можем явно задать его как тип возвращаемого значения.
// Тем не менее, мы можем задать возвращаемый тип как "auto", предоставив компилятору вычислить его самостоятельно
auto createVoldemortType(int value)
{
    struct TheUnnameable
    {
        int getValue() { return value; }
    }
    return TheUnnameable();
}

Безымянные типы неофициально называются Voldemort-типы по аналогии с Воланом-де-Мортом («Тот-Кого-Нельзя-Называть»), главным антагонистом серии о Гарри Поттере[8]. Вывод типов не следует путать с динамической типизацией, поскольку хотя тип не задается явно, вычисляется он на этапе компиляции, а не во время выполнения.

Реализации

  • DMD — Digital Mars D, эталонный компилятор, разрабатываемый Уолтером Брайтом. Этот компилятор наиболее полно реализует стандарт языка, поддержка всех нововведений появляется в нём в первую очередь. Фронт-энд распространяется под лицензией Boost, бэк-энд - под проприетарной лицензией с доступом к исходным кодам. Часть кода бэк-энда была разработана в Symantec, и не может быть перелицензирована[9].
  • GDC — DMD-Фронт-энд для компилятора GCC.
  • LDC — DMD-Фронт-энд для LLVM
  • SDC — Экспериментальный компилятор (компилятор как библиотека), использующий LLVM в качестве бэк-энда и не основанный на DMD.

Инструменты и средства разработки

IDE и редакторы

Поддержка D в [wiki.dlang.org/IDEs различных IDE], реализованная с помощью плагинов:

IDE Плагин Платформы
IntelliJ IDEA [github.com/kingsleyh/DLanguage DLanguage] кроссплатформенный
Eclipse [ddt-ide.github.io/ DDT] кроссплатформенный
MonoDevelop / Xamarin [wiki.dlang.org/Mono-D Mono-D] кроссплатформенный
Visual Studio [rainers.github.io/visuald/visuald/StartPage.html Visual-D] Windows
Visual Studio Code [marketplace.visualstudio.com/items?itemName=webfreak.code-d Code-D] кроссплатформенный
XCode [michelf.ca/projects/d-for-xcode/ D for Xcode] Mac OS X
Zeus IDE [zeusedit.com/d.html D for Zeus IDE] Windows

Нативные IDE для языка D:

  • [github.com/BBasile/Coedit Coedit] (Windows, Linux)
  • [github.com/buggins/dlangide DLangIDE] (Windows, Linux, OS X) - среда создана на самом D, поддерживает подсветку синтаксиса, автозавершение кода, DUB, различные компиляторы, отладку и многое другое.

D поддерживается [wiki.dlang.org/Editors во множестве] текстовых редакторов: Vim, Emacs, Kate, Notepad++, Sublime Text, TextMate и других[10].

Менеджер пакетов

DUB - официальный менеджер пакетов D. DUB выполняет функции репозитория пакетов и используется для управления зависимостями, а также в качестве системы сборки. Набор зависимостей, метаданные о проекте и флаги компилятора хранятся в формате JSON или SDL. Пример простого файла проекта (JSON):

{
    "name": "myproject",
    "description": "A little web service of mine.",
    "authors": ["Peter Parker"],
    "homepage": "myproject.example.com",
    "license": "GPL-2.0",
    "dependencies": {
        "vibe-d": "~>0.7.23"
    }
}

Утилиты и инструменты

rdmd

rdmd — утилита, идущая в комплекте с компилятором DMD, позволяющая компилировать и запускать файлы с исходным кодом D «на лету». Это позволяет использовать D для небольших программ аналогично bash и perl:

// myprog.d

#!/usr/bin/env rdmd
import std.stdio;
void main()
{
    writeln("Hello, world with automated script running!");
}

Вызов команды ./myprog.dв консоли автоматически скомпилирует и выполнит программу.

DPaste

[dpaste.dzfl.pl/ Dpaste] - онлайн-сервис для запуска программ на D в браузере, похожий на сервисы JSBin и Codepen.

asm.dlang.org

[asm.dlang.org/ asm.dlang.org] - онлайн-компилятор и дизассемблер

Примеры кода

Пример 1

"Hello, world!"
import std.stdio;

void main() {
    writeln("Hello, world!");
}

Пример 2

Программа, которая выводит аргументы командной строки, с которыми была вызвана
import std.stdio: writefln;

void main(string[] args)
{
    foreach (i, arg; args)
        writefln("args[%d] = '%s'", i, arg);
}

Пример 3

Программа, которая построчно считывает список слов из файла и выводит все слова, которые являются анаграммами других слов
import std.stdio, std.algorithm, std.range, std.string;

void main()
{
    dstring[][dstring] signs2words;

    foreach(dchar[] w; lines(File("words.txt")))
    {
        w = w.chomp().toLower();
        immutable key = w.dup.sort().release().idup;
        signs2words[key] ~= w.idup;
    }

    foreach (words; signs2words)
    {
        if (words.length > 1) 
        {
            writefln(words.join(" "));
        }
    }
}

См. также

Напишите отзыв о статье "D (язык программирования)"

Примечания

  1. [dlang.org/dbc.html Описание реализации парадигмы контрактного программирования в языке Ди].
  2. [dlang.org/changelog.html Список изменений в компиляторе языка Ди].
  3. [www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D.announce&artnum=6581 DMD 1.00 — here it is! (digitalmars.D.announce)] (англ.)
  4. [www.digitalmars.com/d/2.0/changelog.html D 2.0 changelog]. Проверено 11 января 2009. [www.webcitation.org/686MLQFHl Архивировано из первоисточника 1 июня 2012]. (англ.)
  5. [forum.dlang.org/thread/ltooqxkdesirocpqrsel@forum.dlang.org D for Android - D Programming Language Discussion Forum]
  6. [dlang.org/function.html#pure-functions Functions - D Programming Language]
  7. [dlang.org/type.html Types - D Programming Language]
  8. [www.drdobbs.com/cpp/voldemort-types-in-d/232901591 Voldemort Types In D | Dr Dobb's]
  9. [www.reddit.com/r/programming/comments/82cgp/new_release_of_the_d_programming_language_now/c082539 Reddit comment by Walter Bright]. Проверено 9 сентября 2014.
  10. [wiki.dlang.org/Editors Editors - D Wiki]

Литература

Ссылки

  • [dlang.org/ D Programming Language] (англ.). — официальный сайт. Проверено 10 мая 2012. [www.webcitation.org/67lN2ID1a Архивировано из первоисточника 19 мая 2012].
  • [github.com/D-Programming-Language D на GitHub].
  • [code.dlang.org/ code.dlang.org] (англ.). — репозиторий пакетов для D и сайт официального менеджера пакетов DUB.
  • [dlang.ru Сайт языка D в России] (14 марта 2013). [www.webcitation.org/6F95smgy1 Архивировано из первоисточника 16 марта 2013].
  • [www.dsource.org/ Open Source Development for the D Programming Language] (англ.). — свободное программное обеспечение на/для языка D. Проверено 8 января 2006. [www.webcitation.org/67lN3UbT7 Архивировано из первоисточника 19 мая 2012].
  • [bitbucket.org/goshawk/gdc/wiki/Home GDC - D Programming Language for GCC] (англ.) (27 мая 2007). — Язык программирования D для GCC. Проверено 17 июля 2011.
  • [www.dsource.org/projects/ldc LDC - D Programming Language for LLVM] (англ.). — Язык программирования D для LLVM. [www.webcitation.org/67lN43Qg0 Архивировано из первоисточника 19 мая 2012].
  • Александреску, Андрей [drdobbs.com/go-parallel/article/showArticle.jhtml?articleID=217801225 The Case for D] (англ.) (15 июня 2009). Проверено 7 января 2011. [www.webcitation.org/67lN6AeDE Архивировано из первоисточника 19 мая 2012].
  • [rosettacode.org/wiki/Category:D Примеры кода на D в проекте Rosetta Code]

,

Отрывок, характеризующий D (язык программирования)

– Я теперь тоже хочу сделаться москвичкой, – говорила Элен. – И как вам не совестно зарыть такие перлы в деревне!
Графиня Безухая, по справедливости, имела репутацию обворожительной женщины. Она могла говорить то, чего не думала, и в особенности льстить, совершенно просто и натурально.
– Нет, милый граф, вы мне позвольте заняться вашими дочерьми. Я хоть теперь здесь не надолго. И вы тоже. Я постараюсь повеселить ваших. Я еще в Петербурге много слышала о вас, и хотела вас узнать, – сказала она Наташе с своей однообразно красивой улыбкой. – Я слышала о вас и от моего пажа – Друбецкого. Вы слышали, он женится? И от друга моего мужа – Болконского, князя Андрея Болконского, – сказала она с особенным ударением, намекая этим на то, что она знала отношения его к Наташе. – Она попросила, чтобы лучше познакомиться, позволить одной из барышень посидеть остальную часть спектакля в ее ложе, и Наташа перешла к ней.
В третьем акте был на сцене представлен дворец, в котором горело много свечей и повешены были картины, изображавшие рыцарей с бородками. В середине стояли, вероятно, царь и царица. Царь замахал правою рукою, и, видимо робея, дурно пропел что то, и сел на малиновый трон. Девица, бывшая сначала в белом, потом в голубом, теперь была одета в одной рубашке с распущенными волосами и стояла около трона. Она о чем то горестно пела, обращаясь к царице; но царь строго махнул рукой, и с боков вышли мужчины с голыми ногами и женщины с голыми ногами, и стали танцовать все вместе. Потом скрипки заиграли очень тонко и весело, одна из девиц с голыми толстыми ногами и худыми руками, отделившись от других, отошла за кулисы, поправила корсаж, вышла на середину и стала прыгать и скоро бить одной ногой о другую. Все в партере захлопали руками и закричали браво. Потом один мужчина стал в угол. В оркестре заиграли громче в цимбалы и трубы, и один этот мужчина с голыми ногами стал прыгать очень высоко и семенить ногами. (Мужчина этот был Duport, получавший 60 тысяч в год за это искусство.) Все в партере, в ложах и райке стали хлопать и кричать изо всех сил, и мужчина остановился и стал улыбаться и кланяться на все стороны. Потом танцовали еще другие, с голыми ногами, мужчины и женщины, потом опять один из царей закричал что то под музыку, и все стали петь. Но вдруг сделалась буря, в оркестре послышались хроматические гаммы и аккорды уменьшенной септимы, и все побежали и потащили опять одного из присутствующих за кулисы, и занавесь опустилась. Опять между зрителями поднялся страшный шум и треск, и все с восторженными лицами стали кричать: Дюпора! Дюпора! Дюпора! Наташа уже не находила этого странным. Она с удовольствием, радостно улыбаясь, смотрела вокруг себя.
– N'est ce pas qu'il est admirable – Duport? [Неправда ли, Дюпор восхитителен?] – сказала Элен, обращаясь к ней.
– Oh, oui, [О, да,] – отвечала Наташа.


В антракте в ложе Элен пахнуло холодом, отворилась дверь и, нагибаясь и стараясь не зацепить кого нибудь, вошел Анатоль.
– Позвольте мне вам представить брата, – беспокойно перебегая глазами с Наташи на Анатоля, сказала Элен. Наташа через голое плечо оборотила к красавцу свою хорошенькую головку и улыбнулась. Анатоль, который вблизи был так же хорош, как и издали, подсел к ней и сказал, что давно желал иметь это удовольствие, еще с Нарышкинского бала, на котором он имел удовольствие, которое не забыл, видеть ее. Курагин с женщинами был гораздо умнее и проще, чем в мужском обществе. Он говорил смело и просто, и Наташу странно и приятно поразило то, что не только не было ничего такого страшного в этом человеке, про которого так много рассказывали, но что напротив у него была самая наивная, веселая и добродушная улыбка.
Курагин спросил про впечатление спектакля и рассказал ей про то, как в прошлый спектакль Семенова играя, упала.
– А знаете, графиня, – сказал он, вдруг обращаясь к ней, как к старой давнишней знакомой, – у нас устраивается карусель в костюмах; вам бы надо участвовать в нем: будет очень весело. Все сбираются у Карагиных. Пожалуйста приезжайте, право, а? – проговорил он.
Говоря это, он не спускал улыбающихся глаз с лица, с шеи, с оголенных рук Наташи. Наташа несомненно знала, что он восхищается ею. Ей было это приятно, но почему то ей тесно и тяжело становилось от его присутствия. Когда она не смотрела на него, она чувствовала, что он смотрел на ее плечи, и она невольно перехватывала его взгляд, чтоб он уж лучше смотрел на ее глаза. Но, глядя ему в глаза, она со страхом чувствовала, что между им и ей совсем нет той преграды стыдливости, которую она всегда чувствовала между собой и другими мужчинами. Она, сама не зная как, через пять минут чувствовала себя страшно близкой к этому человеку. Когда она отворачивалась, она боялась, как бы он сзади не взял ее за голую руку, не поцеловал бы ее в шею. Они говорили о самых простых вещах и она чувствовала, что они близки, как она никогда не была с мужчиной. Наташа оглядывалась на Элен и на отца, как будто спрашивая их, что такое это значило; но Элен была занята разговором с каким то генералом и не ответила на ее взгляд, а взгляд отца ничего не сказал ей, как только то, что он всегда говорил: «весело, ну я и рад».
В одну из минут неловкого молчания, во время которых Анатоль своими выпуклыми глазами спокойно и упорно смотрел на нее, Наташа, чтобы прервать это молчание, спросила его, как ему нравится Москва. Наташа спросила и покраснела. Ей постоянно казалось, что что то неприличное она делает, говоря с ним. Анатоль улыбнулся, как бы ободряя ее.
– Сначала мне мало нравилась, потому что, что делает город приятным, ce sont les jolies femmes, [хорошенькие женщины,] не правда ли? Ну а теперь очень нравится, – сказал он, значительно глядя на нее. – Поедете на карусель, графиня? Поезжайте, – сказал он, и, протянув руку к ее букету и понижая голос, сказал: – Vous serez la plus jolie. Venez, chere comtesse, et comme gage donnez moi cette fleur. [Вы будете самая хорошенькая. Поезжайте, милая графиня, и в залог дайте мне этот цветок.]
Наташа не поняла того, что он сказал, так же как он сам, но она чувствовала, что в непонятных словах его был неприличный умысел. Она не знала, что сказать и отвернулась, как будто не слыхала того, что он сказал. Но только что она отвернулась, она подумала, что он тут сзади так близко от нее.
«Что он теперь? Он сконфужен? Рассержен? Надо поправить это?» спрашивала она сама себя. Она не могла удержаться, чтобы не оглянуться. Она прямо в глаза взглянула ему, и его близость и уверенность, и добродушная ласковость улыбки победили ее. Она улыбнулась точно так же, как и он, глядя прямо в глаза ему. И опять она с ужасом чувствовала, что между ним и ею нет никакой преграды.
Опять поднялась занавесь. Анатоль вышел из ложи, спокойный и веселый. Наташа вернулась к отцу в ложу, совершенно уже подчиненная тому миру, в котором она находилась. Всё, что происходило перед ней, уже казалось ей вполне естественным; но за то все прежние мысли ее о женихе, о княжне Марье, о деревенской жизни ни разу не пришли ей в голову, как будто всё то было давно, давно прошедшее.
В четвертом акте был какой то чорт, который пел, махая рукою до тех пор, пока не выдвинули под ним доски, и он не опустился туда. Наташа только это и видела из четвертого акта: что то волновало и мучило ее, и причиной этого волнения был Курагин, за которым она невольно следила глазами. Когда они выходили из театра, Анатоль подошел к ним, вызвал их карету и подсаживал их. Подсаживая Наташу, он пожал ей руку выше локтя. Наташа, взволнованная и красная, оглянулась на него. Он, блестя своими глазами и нежно улыбаясь, смотрел на нее.

Только приехав домой, Наташа могла ясно обдумать всё то, что с ней было, и вдруг вспомнив князя Андрея, она ужаснулась, и при всех за чаем, за который все сели после театра, громко ахнула и раскрасневшись выбежала из комнаты. – «Боже мой! Я погибла! сказала она себе. Как я могла допустить до этого?» думала она. Долго она сидела закрыв раскрасневшееся лицо руками, стараясь дать себе ясный отчет в том, что было с нею, и не могла ни понять того, что с ней было, ни того, что она чувствовала. Всё казалось ей темно, неясно и страшно. Там, в этой огромной, освещенной зале, где по мокрым доскам прыгал под музыку с голыми ногами Duport в курточке с блестками, и девицы, и старики, и голая с спокойной и гордой улыбкой Элен в восторге кричали браво, – там под тенью этой Элен, там это было всё ясно и просто; но теперь одной, самой с собой, это было непонятно. – «Что это такое? Что такое этот страх, который я испытывала к нему? Что такое эти угрызения совести, которые я испытываю теперь»? думала она.
Одной старой графине Наташа в состоянии была бы ночью в постели рассказать всё, что она думала. Соня, она знала, с своим строгим и цельным взглядом, или ничего бы не поняла, или ужаснулась бы ее признанию. Наташа одна сама с собой старалась разрешить то, что ее мучило.
«Погибла ли я для любви князя Андрея или нет? спрашивала она себя и с успокоительной усмешкой отвечала себе: Что я за дура, что я спрашиваю это? Что ж со мной было? Ничего. Я ничего не сделала, ничем не вызвала этого. Никто не узнает, и я его не увижу больше никогда, говорила она себе. Стало быть ясно, что ничего не случилось, что не в чем раскаиваться, что князь Андрей может любить меня и такою . Но какою такою ? Ах Боже, Боже мой! зачем его нет тут»! Наташа успокоивалась на мгновенье, но потом опять какой то инстинкт говорил ей, что хотя всё это и правда и хотя ничего не было – инстинкт говорил ей, что вся прежняя чистота любви ее к князю Андрею погибла. И она опять в своем воображении повторяла весь свой разговор с Курагиным и представляла себе лицо, жесты и нежную улыбку этого красивого и смелого человека, в то время как он пожал ее руку.


Анатоль Курагин жил в Москве, потому что отец отослал его из Петербурга, где он проживал больше двадцати тысяч в год деньгами и столько же долгами, которые кредиторы требовали с отца.
Отец объявил сыну, что он в последний раз платит половину его долгов; но только с тем, чтобы он ехал в Москву в должность адъютанта главнокомандующего, которую он ему выхлопотал, и постарался бы там наконец сделать хорошую партию. Он указал ему на княжну Марью и Жюли Карагину.
Анатоль согласился и поехал в Москву, где остановился у Пьера. Пьер принял Анатоля сначала неохотно, но потом привык к нему, иногда ездил с ним на его кутежи и, под предлогом займа, давал ему деньги.
Анатоль, как справедливо говорил про него Шиншин, с тех пор как приехал в Москву, сводил с ума всех московских барынь в особенности тем, что он пренебрегал ими и очевидно предпочитал им цыганок и французских актрис, с главою которых – mademoiselle Georges, как говорили, он был в близких сношениях. Он не пропускал ни одного кутежа у Данилова и других весельчаков Москвы, напролет пил целые ночи, перепивая всех, и бывал на всех вечерах и балах высшего света. Рассказывали про несколько интриг его с московскими дамами, и на балах он ухаживал за некоторыми. Но с девицами, в особенности с богатыми невестами, которые были большей частью все дурны, он не сближался, тем более, что Анатоль, чего никто не знал, кроме самых близких друзей его, был два года тому назад женат. Два года тому назад, во время стоянки его полка в Польше, один польский небогатый помещик заставил Анатоля жениться на своей дочери.
Анатоль весьма скоро бросил свою жену и за деньги, которые он условился высылать тестю, выговорил себе право слыть за холостого человека.
Анатоль был всегда доволен своим положением, собою и другими. Он был инстинктивно всем существом своим убежден в том, что ему нельзя было жить иначе, чем как он жил, и что он никогда в жизни не сделал ничего дурного. Он не был в состоянии обдумать ни того, как его поступки могут отозваться на других, ни того, что может выйти из такого или такого его поступка. Он был убежден, что как утка сотворена так, что она всегда должна жить в воде, так и он сотворен Богом так, что должен жить в тридцать тысяч дохода и занимать всегда высшее положение в обществе. Он так твердо верил в это, что, глядя на него, и другие были убеждены в этом и не отказывали ему ни в высшем положении в свете, ни в деньгах, которые он, очевидно, без отдачи занимал у встречного и поперечного.
Он не был игрок, по крайней мере никогда не желал выигрыша. Он не был тщеславен. Ему было совершенно всё равно, что бы об нем ни думали. Еще менее он мог быть повинен в честолюбии. Он несколько раз дразнил отца, портя свою карьеру, и смеялся над всеми почестями. Он был не скуп и не отказывал никому, кто просил у него. Одно, что он любил, это было веселье и женщины, и так как по его понятиям в этих вкусах не было ничего неблагородного, а обдумать то, что выходило для других людей из удовлетворения его вкусов, он не мог, то в душе своей он считал себя безукоризненным человеком, искренно презирал подлецов и дурных людей и с спокойной совестью высоко носил голову.
У кутил, у этих мужских магдалин, есть тайное чувство сознания невинности, такое же, как и у магдалин женщин, основанное на той же надежде прощения. «Ей всё простится, потому что она много любила, и ему всё простится, потому что он много веселился».
Долохов, в этом году появившийся опять в Москве после своего изгнания и персидских похождений, и ведший роскошную игорную и кутежную жизнь, сблизился с старым петербургским товарищем Курагиным и пользовался им для своих целей.
Анатоль искренно любил Долохова за его ум и удальство. Долохов, которому были нужны имя, знатность, связи Анатоля Курагина для приманки в свое игорное общество богатых молодых людей, не давая ему этого чувствовать, пользовался и забавлялся Курагиным. Кроме расчета, по которому ему был нужен Анатоль, самый процесс управления чужою волей был наслаждением, привычкой и потребностью для Долохова.