Harbour

Поделись знанием:
(перенаправлено с «XHarbour»)
Перейти к: навигация, поиск
Harbour Project
К:Википедия:Статьи без изображений (тип: не указан)
Класс языка:

императивный, структурированный, объектно-ориентированный

Автор:

Antonio Linares

Выпуск:

3.0.0

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

3.2.x доступна из SVN

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

необязательная неявная, динамическая, защищённая, частично строгая

Диалекты:

Clipper, Xbase++, Flagship, FoxPro, xHarbour

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

dBase, Clipper

Повлиял на:

xHarbour

Лицензия:

Open source GPL-совместимая

Сайт:

[harbour.github.io/ .github.io]

Harbour — язык программирования и кроссплатформенный компилятор с препроцессором, полностью совместимый с Clipper. Он позволяет создавать 16-, 32- и 64-разрядные приложения для DOS, Windows, Unix/Linux, OS/2, Mac OS X, Windows CE, BSD, Pocket PC, Symbian, iOS, QNX, VxWorks, Ecomstation, Haiku/BeOS, AIX. Harbour является свободным программным обеспечением.

Кроме работы с локально расположенными данными, Harbour позволяет работать с данными как в режиме «файл-сервер», так и в режиме клиент-сервер (в том числе, в режиме запросов к удалённой системе управления базами данных, поддерживающей SQL).

Язык использует традиционные конструкции Clipper, объектную нотацию, принятую в языке C++, а также дает возможность писать на языке C. Harbour активно развивается и в язык включаются некоторые современные технологии программирования.

xHarbour (англ. extended Harbour) — ответвление проекта Harbour, существует как в коммерческом, так и в свободном вариантах.

Имеются GUI-библиотеки — как коммерческие, так и бесплатные (в частности, MiniGUI — для Windows; HwGUI[1] — для Windows и GNU/Linux).

Harbour распространяется под свободной лицензией, схожей с GNU General Public License, за исключением того, что на Harbour возможно свободно разрабатывать и распространять коммерческие приложения (как пример тиражируемого коммерческого ПО − Система для учёта и управления предприятием БЭСТ-4+ [www.bestnet.ru/programs/best-4plus/#4]). См. также в конце статьи Тиражируемое ПО, написанное на Harbour.





История создания

Основателем проекта является испанский программист Антонио Линарес (исп. Antonio Linares). Первое сообщение о «мыслях, витающих в воздухе» относительно адаптации ПО, написанного для Clipper, к новым реалиям, инициировав тем самым дискуссию, приведшую к созданию Harbour, он опубликовал в Usenet-группе comp.lang.clipper 16 марта 1999 года. [groups.google.com/group/comp.lang.clipper/browse_thread/thread/0fafd0e4650a69ef/5b4996fdf806504f] англ.  Название Harbour (рус. бухта, гавань) было предложено проекту Линаресом по общности «морского контекста» с названием компилятора Clipper (рус. клиппер) (в смысле «безопасная гавань для клиппера»). В том же 1999 году группой разработчиков, среди которых, помимо Линареса, особенно следует отметить Рышарда Глаба (польск. Ryszard Glab), были выпущены первые версии компилятора.

В 2009 году Harbour был глубоко переработан международным сообществом разработчиков под руководством Виктора Сакаца (венг. Viktor Szakáts) и Пшемыслава Черпака (польск. Przemysław Czerpak), по состоянию на настоящее время ведётся активное развитие и разработка, имеются как международное, так и языково-ориентированные (русский, испанский, португальский, итальянский и пр. языки) комьюнити разработчиков и пользователей.

В настоящее время с использованием Harbour создаются как бесплатные, так и коммерческие приложения.

Работа с базами данных

Harbour расширяет возможности использовавшихся в Clipper драйверов баз данных (RDD, англ. Replaceable Database Drivers). Он поддерживает традиционные для Clipper RDD — такие как DBF, DBFNTX, DBFCDX, DBFDBT и DBFFPT. В Harbour использовать разные RDD в одном приложении (например, брать данные из традиционной для Clipper базы данных в формате DBFNTX и записывать их в формате FoxPro — DBFCDX), а также создавать новые («логические») RDD из комбинации нескольких имеющихся. Архитектура RDD разрешает наследование, то есть новый RDD может использовать функциональные возможности уже имеющихся RDD. Для Harbour переписаны наиболее популярные RDD сторонних производителей: RDDSQL, RDDSIX, RMDBFCDX, ADS (англ. Advantage Database Server), Mediator. Такие RDD, как NETIO и LetoDB[2] дают возможность удаленного доступа к базам данных через TCP-протокол путём создания Web-приложений, функционирующих на стороне сервера локальной сети либо Web-сервера, с доступом пользователя к данным через сеть, используя любой Интернет-браузер и любую операционную систему.


Harbour также обеспечивает доступ к данным посредством ODBC и ADO. Созданы специальные библиотеки для доступа к некоторым популярным СУБД: MySQL, PostgreSQL, SQLite, Firebird, Oracle Database, используя C - API.

Концепции

В проекте Harbour стремятся к обеспечению кроссплатформенности на уровне исходных кодов при специфической компиляции под каждую платформу (написано однажды — компилируется везде, англ. write once, compile anywhere, в сравнении с написано однажды — работает везде, Write once, run anywhere (англ.) в языке Java). Если для некоего набора операционных систем есть подходящие для использования с Harbour компиляторы, то нет препятствий к тому чтобы создавать идентичные программы для всех этих платформ, написав исходный текст один раз — за исключением случаев, когда используются возможности, специфичные для разных операционных систем. Кросс-компиляция возможна благодаря MinGW32. Для переноса Clipper-приложения, работающего под DOS на другие платформы, например, Linux или Windows Mobile, требуется сравнительно небольшая адаптацияК:Википедия:Статьи без источников (тип: не указан)[источник не указан 4674 дня]. Большое количество программ, исходный код которых ранее написан для работы с Xbase++, Flagship[уточнить], FoxPro, xHarbour и другими диалектами xBase, могут быть также достаточно легко адаптированы для компиляции через Harbour.

Harbour может использовать многие компиляторы Си, в частности: GCC, MinGW, Clang, ICC, Microsoft Visual C++ (6.0+), Borland C++, Watcom C, Pelles C и Sun Studio.

Harbour может использовать эмуляцию многих графических терминалов, включая драйверы консоли, а также гибридные консольно-графические — такие как GTWvt и GTWvg.

Harbour поддерживает внешние библиотеки графического пользовательского интерфейса, как свободно распространяемые (наиболее известные — HWGui[1], MiniGUI и Qt), так и коммерческие (например, FiveWin или Xailer). Взаимодействие с Qt производится через библиотеку HBQt.

Разработчиками проекта утверждается, что Harbour на 100 % совместим с Clipper на уровне исходного кода[3].

Макро-оператор (компилятор времени выполнения)

Одна из наиболее мощных возможностей xBase-языков — это Макро-оператор '&'. Реализация макро-оператора в Harbour позволяет создавать любое допустимое в Harbour выражение прямо во время выполнения программы (компиляция времени выполнения). Такое скомпилированное выражение может быть использовано как значение, то есть в правой части операции присваивания (rvalue), но также — что более интересно — и как левая часть операции присваивания (lvalue), то есть как PRIVATE или PUBLIC переменная, или как поле (FIELD) базы данных.

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

Последний макро-компилятор может компилировать любой допустимый в Harbour код, включая код для препроцессора, обрабатываемый до компиляции.

Синтаксис макро-оператора:

 &( ...)

Текстовое значение выражения в скобках '…' будет скомпилировано во время выполнения программы, а результатом макроса будет значение, полученное в результате выполнения скомпилированного кода.

 &SomeId

это более короткая форма макро-оператора &(SomeId).

 &SomeId.postfix

это более короткая форма макро-оператора &(SomeId + «postfix»).

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

Например, представим ситуацию, когда программа должна считывать в переменную «data1» некие данные из поля «FIELD1» одной из многочисленных имеющихся баз данных (например, различающихся только именами, но одинаковых по структуре, баз-справочников). Имя базы-источника данных вводится пользователем (или получается каким-либо иным путём) в переменную «bd».

Не используя макро-оператор, нам пришлось бы расписать в исходном коде программы все возможные значения, которые могла бы получать в ходе работы программы переменная «bd», и описывать, какую базу открыть в данном конкретном случае — нечто вроде:

  if bd == "BAZA1"
     use BAZA1 alias BAZASP new
  endif
  if bd == "BAZA2"
     use BAZA2 alias BAZASP new
  endif
  ....    (и так много-много раз, для всех возможных значений)
  ....
  data1 := BAZASP->FIELD1
  ....

В случае же применения макро-оператора нам достаточно написать просто:

  use &(bd) alias BAZASP new
  data1 := BAZASP->FIELD1

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

  if .not. file( bd + ".DBF" )
     ? "База данных с именем " + bd + ".DBF не найдена!"
     ... (и здесь обработка этой ситуации -
     ...  что при этом должны делать программа или пользователь)
  endif

Объектно-ориентированное программирование

Программирование в ООП (объектно-ориентированном; OOP) стиле — это более широкая тема, чем конкретная библиотека или конкретный интерфейс, но OOP-программирование — это то, чего ожидали многие Clipper-программисты. В CA-Clipper 5.2 (и особенно в 5.3) было добавлено некоторое количество базовых классов, а также соответствующий ООП-синтаксис. Библиотеки — такие, как CLASSy, Fivewin, Clip4Win и TopClass добавляли функциональные возможности для ООП-программирования.

В Harbour наличествуют расширения, базирующиеся на синтаксисе CLASSy, для ООП-программирования с полной поддержкой классов, включая наследование. ООП-синтаксис в Harbour практически одинаков с тем, что ранее использовался в библиотеках классов для Clipper, в т. ч. вполне возможно без особых переделок использовать «унаследованный» Clipper-код.

Синтаксис и семантика языка

Harbour — как любой xBase-язык — регистронезависим (то есть команды или имена переменных воспринимаются одинаково при написании заглавными или строчными буквами: например, «sStr», «sstr» и «SStr» — это одна и та же переменная; «DbCreate()» и «dbCREATE()» — одна и та же функция) и содержит опцию распознавания зарезервированных ключевых слов (например, команды) по первым четырём буквам (например, вместо команды «COPY STRUCTURE EXTENDED …» можно писать просто «COPY STRU EXTE …»).

Встроенные типы данных

В Harbour есть 6 скалярных типов данных: ничто Nil, строка String, дата Date, логический тип Logical, число Number, указатель Pointer, и 4 составных типа: массив Array, объект Object, блок кода CodeBlock и хэш Hash. Скалярные данные содержат единичное значение — такое как строка, число или ссылка на переменную любого другого типа. Массивы — это упорядоченные списки скалярных или составных значений (то есть элементом массива может быть в том числе и другой массив, а его элементом — другой и т. п.), индексированный по номеру, начиная с 1 (а не с 0, как в некоторых других языках). Хэш-таблицы, или ассоциативные массивы — неупорядоченные собрания значений любых типов, индексируемые по ключу, связанному с каждым значением, который может быть любого скалярного или составного типа.

Литеральное (статическое) представление скалярных типов:

  • Nil: NIL
  • String: «hello», 'hello', [hello], E"hello\n"
  • Date: 0d20100405
  • Logical: .T., .F.
  • Number: 1, 1.1, −1, 0xFF

Составные типы тоже можно представить в виде значений-литералов:

  • Array: { «Строка», 1, { «Вложенный массив» }, .T., FunctionCall(), @FunctionPointer() }
  • CodeBlock: { |Arg1, ArgN| Arg1 := ArgN + OuterVar + FunctionCall() }
  • Hash: { «Имя» => «Джон», 1 => «Числовой ключ», { «Вложенная» => «Хэш-таблица» } }

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

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

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

Блок кода можно вычислять неограниченное количество раз с помощью функции Eval(Блок кода).

Разработка клиент-серверных и Web-приложений

Leto DB server

Leto DB Server (letodb) — это 32/64-разрядный многоплатформенный сервер Баз Данных, в основном предназначенный для клиентских программ, написанных на языке Harbour, для доступа к файлам dbf. Проект Letodb стартовал в 2008-м году, его автор — Александр Кресин[4]. В 2011-м году Letodb был существенно доработан и продолжает дорабатываться сообществом разработчиков, разработка координируется через сайт проекта LetoDB[2].

Letodb — это высокоэффективный RDBMS клиент-сервер для сетевых, автономных (локальных) и интернет — приложений базы данных. Letodb представлен как Open Source проект, разработанный под лицензией GPL, дающей право на его свободное использование. Преимуществом letodb является объединение традиционных средств xBase для доступа к Базам Данных и клиент-серверной технологии. Сервер letodb ответственен за весь доступ к базе данных (от имени клиентов). С оптимизированной методологией доступа к данным Letodb обеспечивает безопасность, стабильность и целостность данных при минимальных требованиях к обслуживанию.

Сервер Базы данных letodb улучшает работу с базой данных сети. Letodb разгружает большую часть работы, обычно выполняемой каждым автоматизированным рабочим местом клиента. Работая с сетью, letodb обрабатывает запросы данных и возвращает информацию клиентам сети. Сервер Базы данных letodb использует архитектуру клиент-сервер, улучшая многопользовательскую работу, стабильность базы данных, и безопасность базы данных. Сервер letodb поддерживает транзакции. При этом есть гарантия того, что сложная операция обновления Базы данных будет выполнена целиком. Также имеется возможность создания серверных процедур, которые вызываются с клиента и выполняются на сервере. Структурно letodb состоит из серверной и клиентской части. Letodb (как серверная, так и клиентская часть) может использоваться для операционных систем MS Windows, Linux и MacOS. Для MS Windows поддерживаются операционные системы Windows 98/ME, Windows NT/2000/2003, Windows XP 32/64 бит, Windows Vista 32/64 и Windows 7 32/64 бит.

Под управлением MS Windows сервер letodb запускается как служба, но есть возможность собрать его как приложение. Для всей линейки разрядных ОС Windows: от Windows 98 до Windows 7 используется одна и та же сборка сервера. Под управлением ОС Linux сервер letodb запускается как демон. Как правило, для различных версий Linux сервер letodb надо собирать отдельно для каждой. Сервер letodb (как и Harbour) поставляется с исходными текстами и правилами сборки. Сервер letodb прост в настройке: достаточно указать папку, в которой располагаются Базы Данных, и некоторые другие настройки. В процессе работы сервер letodb не требует специального обслуживания. Letodb соединяется с клиентскими приложениями по протоколу TCP/IP. По умолчанию при этом используется порт 2812, хотя допускается работа и через другой порт. Соединение с сервером возможно как через локальную сеть, так и через интернет и интранет сети.

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

Клиентская часть letodb — это библиотека, содержащая драйвер letodb для Harbour — модуль rdd, который удовлетворяет стандарту замещаемых драйверов баз данных языка Harbour, совместимых с драйверами dbfcdx/dbfntx, и поддерживающих их базовую функциональность. Клиентская библиотека letodb также содержит набор функций для управления и администрирования сервером letodb, функции работы с транзакциями, а также набор дополнительных функций для оптимизации работы с Базой данных. Клиентская библиотека letodb позволяет собрать приложение, работающее с сервером letodb, как для ОС MS Windows, так для Linux. Клиентское приложение может работать в гетерогенной сети, в которой используются сервера letodb, работающие под управлением различных ОС: как MS Windows, так и Linux. Для настройки клиентского приложения достаточно указать IP-адрес или имя компьютера, на котором запущен сервер letodb, номер используемого порта, а также папки на сервере, в которых располагается база данных. Для работы с базой данных нет необходимости открывать сетевые ресурсы.

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

Для управления сервером предоставляется отдельная утилита, которую можно запустить как на клиенте, так и на компьютере, на котором запущен сервер. С помощью этой утилиты можно просмотреть все клиентские приложения, которые соединились с сервером letodb, а также открытые таблицы Базы Данных. При необходимости есть возможность управления (отключения) соединениями.

Тиражируемое ПО, написанное на Harbour

В перечень включены разработки (как коммерческие, так и свободные) тиражируемого программного обеспечения, написанного с использованием Harbour (xHarbour).

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

Примечания

  1. 1 2 [sourceforge.net/projects/hwgui/ HwGUI на SourceForge.Net] (англ.)
  2. 1 2 [sourceforge.net/projects/letodb LetoDB на SourceForge.Net] (англ.)
  3. [www.harbour-project.org/ Official Harbour page]
  4. [www.kresin.ru Сайт Александра Кресина, автора Leto DB server.]

Ссылки

  • [sourceforge.net/projects/harbour-project/ Репозиторий дистрибутивов, документации и кода сообщества разработчиков Harbour на Sourceforge] (англ.)
  • [clipper.borda.ru/ Русскоязычное сообщество разработчиков по Clipper, Harbour, MiniGUI, Fivewin] (рус.)
  • [groups.google.com/group/comp.lang.xharbour/topics Usenet-группа по Harbour/xHarbour на Google Groups] (англ.)
  • [www.fivetechsoft.com/harbour-docs/harbour.html On-line документация по Harbour: «Harbour Reference Guide. 1st document to read» (последнее обновление — 28 января 2012)] (англ.)
  • [www.facebook.com/groups/105221025792/ Сообщество xHarbour User Group на Facebook] (англ.)

Отрывок, характеризующий Harbour

– Да, ежели бы он, взяв власть, не пользуясь ею для убийства, отдал бы ее законному королю, – сказал виконт, – тогда бы я назвал его великим человеком.
– Он бы не мог этого сделать. Народ отдал ему власть только затем, чтоб он избавил его от Бурбонов, и потому, что народ видел в нем великого человека. Революция была великое дело, – продолжал мсье Пьер, выказывая этим отчаянным и вызывающим вводным предложением свою великую молодость и желание всё полнее высказать.
– Революция и цареубийство великое дело?…После этого… да не хотите ли перейти к тому столу? – повторила Анна Павловна.
– Contrat social, [Общественный договор,] – с кроткой улыбкой сказал виконт.
– Я не говорю про цареубийство. Я говорю про идеи.
– Да, идеи грабежа, убийства и цареубийства, – опять перебил иронический голос.
– Это были крайности, разумеется, но не в них всё значение, а значение в правах человека, в эманципации от предрассудков, в равенстве граждан; и все эти идеи Наполеон удержал во всей их силе.
– Свобода и равенство, – презрительно сказал виконт, как будто решившийся, наконец, серьезно доказать этому юноше всю глупость его речей, – всё громкие слова, которые уже давно компрометировались. Кто же не любит свободы и равенства? Еще Спаситель наш проповедывал свободу и равенство. Разве после революции люди стали счастливее? Напротив. Mы хотели свободы, а Бонапарте уничтожил ее.
Князь Андрей с улыбкой посматривал то на Пьера, то на виконта, то на хозяйку. В первую минуту выходки Пьера Анна Павловна ужаснулась, несмотря на свою привычку к свету; но когда она увидела, что, несмотря на произнесенные Пьером святотатственные речи, виконт не выходил из себя, и когда она убедилась, что замять этих речей уже нельзя, она собралась с силами и, присоединившись к виконту, напала на оратора.
– Mais, mon cher m r Pierre, [Но, мой милый Пьер,] – сказала Анна Павловна, – как же вы объясняете великого человека, который мог казнить герцога, наконец, просто человека, без суда и без вины?
– Я бы спросил, – сказал виконт, – как monsieur объясняет 18 брюмера. Разве это не обман? C'est un escamotage, qui ne ressemble nullement a la maniere d'agir d'un grand homme. [Это шулерство, вовсе не похожее на образ действий великого человека.]
– А пленные в Африке, которых он убил? – сказала маленькая княгиня. – Это ужасно! – И она пожала плечами.
– C'est un roturier, vous aurez beau dire, [Это проходимец, что бы вы ни говорили,] – сказал князь Ипполит.
Мсье Пьер не знал, кому отвечать, оглянул всех и улыбнулся. Улыбка у него была не такая, какая у других людей, сливающаяся с неулыбкой. У него, напротив, когда приходила улыбка, то вдруг, мгновенно исчезало серьезное и даже несколько угрюмое лицо и являлось другое – детское, доброе, даже глуповатое и как бы просящее прощения.
Виконту, который видел его в первый раз, стало ясно, что этот якобинец совсем не так страшен, как его слова. Все замолчали.
– Как вы хотите, чтобы он всем отвечал вдруг? – сказал князь Андрей. – Притом надо в поступках государственного человека различать поступки частного лица, полководца или императора. Мне так кажется.
– Да, да, разумеется, – подхватил Пьер, обрадованный выступавшею ему подмогой.
– Нельзя не сознаться, – продолжал князь Андрей, – Наполеон как человек велик на Аркольском мосту, в госпитале в Яффе, где он чумным подает руку, но… но есть другие поступки, которые трудно оправдать.
Князь Андрей, видимо желавший смягчить неловкость речи Пьера, приподнялся, сбираясь ехать и подавая знак жене.

Вдруг князь Ипполит поднялся и, знаками рук останавливая всех и прося присесть, заговорил:
– Ah! aujourd'hui on m'a raconte une anecdote moscovite, charmante: il faut que je vous en regale. Vous m'excusez, vicomte, il faut que je raconte en russe. Autrement on ne sentira pas le sel de l'histoire. [Сегодня мне рассказали прелестный московский анекдот; надо вас им поподчивать. Извините, виконт, я буду рассказывать по русски, иначе пропадет вся соль анекдота.]
И князь Ипполит начал говорить по русски таким выговором, каким говорят французы, пробывшие с год в России. Все приостановились: так оживленно, настоятельно требовал князь Ипполит внимания к своей истории.
– В Moscou есть одна барыня, une dame. И она очень скупа. Ей нужно было иметь два valets de pied [лакея] за карета. И очень большой ростом. Это было ее вкусу. И она имела une femme de chambre [горничную], еще большой росту. Она сказала…
Тут князь Ипполит задумался, видимо с трудом соображая.
– Она сказала… да, она сказала: «девушка (a la femme de chambre), надень livree [ливрею] и поедем со мной, за карета, faire des visites». [делать визиты.]
Тут князь Ипполит фыркнул и захохотал гораздо прежде своих слушателей, что произвело невыгодное для рассказчика впечатление. Однако многие, и в том числе пожилая дама и Анна Павловна, улыбнулись.
– Она поехала. Незапно сделался сильный ветер. Девушка потеряла шляпа, и длинны волоса расчесались…
Тут он не мог уже более держаться и стал отрывисто смеяться и сквозь этот смех проговорил:
– И весь свет узнал…
Тем анекдот и кончился. Хотя и непонятно было, для чего он его рассказывает и для чего его надо было рассказать непременно по русски, однако Анна Павловна и другие оценили светскую любезность князя Ипполита, так приятно закончившего неприятную и нелюбезную выходку мсье Пьера. Разговор после анекдота рассыпался на мелкие, незначительные толки о будущем и прошедшем бале, спектакле, о том, когда и где кто увидится.


Поблагодарив Анну Павловну за ее charmante soiree, [очаровательный вечер,] гости стали расходиться.
Пьер был неуклюж. Толстый, выше обыкновенного роста, широкий, с огромными красными руками, он, как говорится, не умел войти в салон и еще менее умел из него выйти, то есть перед выходом сказать что нибудь особенно приятное. Кроме того, он был рассеян. Вставая, он вместо своей шляпы захватил трехугольную шляпу с генеральским плюмажем и держал ее, дергая султан, до тех пор, пока генерал не попросил возвратить ее. Но вся его рассеянность и неуменье войти в салон и говорить в нем выкупались выражением добродушия, простоты и скромности. Анна Павловна повернулась к нему и, с христианскою кротостью выражая прощение за его выходку, кивнула ему и сказала:
– Надеюсь увидать вас еще, но надеюсь тоже, что вы перемените свои мнения, мой милый мсье Пьер, – сказала она.
Когда она сказала ему это, он ничего не ответил, только наклонился и показал всем еще раз свою улыбку, которая ничего не говорила, разве только вот что: «Мнения мнениями, а вы видите, какой я добрый и славный малый». И все, и Анна Павловна невольно почувствовали это.
Князь Андрей вышел в переднюю и, подставив плечи лакею, накидывавшему ему плащ, равнодушно прислушивался к болтовне своей жены с князем Ипполитом, вышедшим тоже в переднюю. Князь Ипполит стоял возле хорошенькой беременной княгини и упорно смотрел прямо на нее в лорнет.
– Идите, Annette, вы простудитесь, – говорила маленькая княгиня, прощаясь с Анной Павловной. – C'est arrete, [Решено,] – прибавила она тихо.
Анна Павловна уже успела переговорить с Лизой о сватовстве, которое она затевала между Анатолем и золовкой маленькой княгини.
– Я надеюсь на вас, милый друг, – сказала Анна Павловна тоже тихо, – вы напишете к ней и скажете мне, comment le pere envisagera la chose. Au revoir, [Как отец посмотрит на дело. До свидания,] – и она ушла из передней.
Князь Ипполит подошел к маленькой княгине и, близко наклоняя к ней свое лицо, стал полушопотом что то говорить ей.
Два лакея, один княгинин, другой его, дожидаясь, когда они кончат говорить, стояли с шалью и рединготом и слушали их, непонятный им, французский говор с такими лицами, как будто они понимали, что говорится, но не хотели показывать этого. Княгиня, как всегда, говорила улыбаясь и слушала смеясь.
– Я очень рад, что не поехал к посланнику, – говорил князь Ипполит: – скука… Прекрасный вечер, не правда ли, прекрасный?
– Говорят, что бал будет очень хорош, – отвечала княгиня, вздергивая с усиками губку. – Все красивые женщины общества будут там.
– Не все, потому что вас там не будет; не все, – сказал князь Ипполит, радостно смеясь, и, схватив шаль у лакея, даже толкнул его и стал надевать ее на княгиню.
От неловкости или умышленно (никто бы не мог разобрать этого) он долго не опускал рук, когда шаль уже была надета, и как будто обнимал молодую женщину.
Она грациозно, но всё улыбаясь, отстранилась, повернулась и взглянула на мужа. У князя Андрея глаза были закрыты: так он казался усталым и сонным.
– Вы готовы? – спросил он жену, обходя ее взглядом.
Князь Ипполит торопливо надел свой редингот, который у него, по новому, был длиннее пяток, и, путаясь в нем, побежал на крыльцо за княгиней, которую лакей подсаживал в карету.
– Рrincesse, au revoir, [Княгиня, до свиданья,] – кричал он, путаясь языком так же, как и ногами.
Княгиня, подбирая платье, садилась в темноте кареты; муж ее оправлял саблю; князь Ипполит, под предлогом прислуживания, мешал всем.
– Па звольте, сударь, – сухо неприятно обратился князь Андрей по русски к князю Ипполиту, мешавшему ему пройти.
– Я тебя жду, Пьер, – ласково и нежно проговорил тот же голос князя Андрея.
Форейтор тронулся, и карета загремела колесами. Князь Ипполит смеялся отрывисто, стоя на крыльце и дожидаясь виконта, которого он обещал довезти до дому.

– Eh bien, mon cher, votre petite princesse est tres bien, tres bien, – сказал виконт, усевшись в карету с Ипполитом. – Mais tres bien. – Он поцеловал кончики своих пальцев. – Et tout a fait francaise. [Ну, мой дорогой, ваша маленькая княгиня очень мила! Очень мила и совершенная француженка.]
Ипполит, фыркнув, засмеялся.
– Et savez vous que vous etes terrible avec votre petit air innocent, – продолжал виконт. – Je plains le pauvre Mariei, ce petit officier, qui se donne des airs de prince regnant.. [А знаете ли, вы ужасный человек, несмотря на ваш невинный вид. Мне жаль бедного мужа, этого офицерика, который корчит из себя владетельную особу.]
Ипполит фыркнул еще и сквозь смех проговорил:
– Et vous disiez, que les dames russes ne valaient pas les dames francaises. Il faut savoir s'y prendre. [А вы говорили, что русские дамы хуже французских. Надо уметь взяться.]
Пьер, приехав вперед, как домашний человек, прошел в кабинет князя Андрея и тотчас же, по привычке, лег на диван, взял первую попавшуюся с полки книгу (это были Записки Цезаря) и принялся, облокотившись, читать ее из середины.
– Что ты сделал с m lle Шерер? Она теперь совсем заболеет, – сказал, входя в кабинет, князь Андрей и потирая маленькие, белые ручки.
Пьер поворотился всем телом, так что диван заскрипел, обернул оживленное лицо к князю Андрею, улыбнулся и махнул рукой.
– Нет, этот аббат очень интересен, но только не так понимает дело… По моему, вечный мир возможен, но я не умею, как это сказать… Но только не политическим равновесием…
Князь Андрей не интересовался, видимо, этими отвлеченными разговорами.
– Нельзя, mon cher, [мой милый,] везде всё говорить, что только думаешь. Ну, что ж, ты решился, наконец, на что нибудь? Кавалергард ты будешь или дипломат? – спросил князь Андрей после минутного молчания.
Пьер сел на диван, поджав под себя ноги.
– Можете себе представить, я всё еще не знаю. Ни то, ни другое мне не нравится.
– Но ведь надо на что нибудь решиться? Отец твой ждет.
Пьер с десятилетнего возраста был послан с гувернером аббатом за границу, где он пробыл до двадцатилетнего возраста. Когда он вернулся в Москву, отец отпустил аббата и сказал молодому человеку: «Теперь ты поезжай в Петербург, осмотрись и выбирай. Я на всё согласен. Вот тебе письмо к князю Василью, и вот тебе деньги. Пиши обо всем, я тебе во всем помога». Пьер уже три месяца выбирал карьеру и ничего не делал. Про этот выбор и говорил ему князь Андрей. Пьер потер себе лоб.
– Но он масон должен быть, – сказал он, разумея аббата, которого он видел на вечере.
– Всё это бредни, – остановил его опять князь Андрей, – поговорим лучше о деле. Был ты в конной гвардии?…
– Нет, не был, но вот что мне пришло в голову, и я хотел вам сказать. Теперь война против Наполеона. Ежели б это была война за свободу, я бы понял, я бы первый поступил в военную службу; но помогать Англии и Австрии против величайшего человека в мире… это нехорошо…
Князь Андрей только пожал плечами на детские речи Пьера. Он сделал вид, что на такие глупости нельзя отвечать; но действительно на этот наивный вопрос трудно было ответить что нибудь другое, чем то, что ответил князь Андрей.
– Ежели бы все воевали только по своим убеждениям, войны бы не было, – сказал он.
– Это то и было бы прекрасно, – сказал Пьер.
Князь Андрей усмехнулся.
– Очень может быть, что это было бы прекрасно, но этого никогда не будет…
– Ну, для чего вы идете на войну? – спросил Пьер.
– Для чего? я не знаю. Так надо. Кроме того я иду… – Oн остановился. – Я иду потому, что эта жизнь, которую я веду здесь, эта жизнь – не по мне!


В соседней комнате зашумело женское платье. Как будто очнувшись, князь Андрей встряхнулся, и лицо его приняло то же выражение, какое оно имело в гостиной Анны Павловны. Пьер спустил ноги с дивана. Вошла княгиня. Она была уже в другом, домашнем, но столь же элегантном и свежем платье. Князь Андрей встал, учтиво подвигая ей кресло.
– Отчего, я часто думаю, – заговорила она, как всегда, по французски, поспешно и хлопотливо усаживаясь в кресло, – отчего Анет не вышла замуж? Как вы все глупы, messurs, что на ней не женились. Вы меня извините, но вы ничего не понимаете в женщинах толку. Какой вы спорщик, мсье Пьер.
– Я и с мужем вашим всё спорю; не понимаю, зачем он хочет итти на войну, – сказал Пьер, без всякого стеснения (столь обыкновенного в отношениях молодого мужчины к молодой женщине) обращаясь к княгине.
Княгиня встрепенулась. Видимо, слова Пьера затронули ее за живое.
– Ах, вот я то же говорю! – сказала она. – Я не понимаю, решительно не понимаю, отчего мужчины не могут жить без войны? Отчего мы, женщины, ничего не хотим, ничего нам не нужно? Ну, вот вы будьте судьею. Я ему всё говорю: здесь он адъютант у дяди, самое блестящее положение. Все его так знают, так ценят. На днях у Апраксиных я слышала, как одна дама спрашивает: «c'est ca le fameux prince Andre?» Ma parole d'honneur! [Это знаменитый князь Андрей? Честное слово!] – Она засмеялась. – Он так везде принят. Он очень легко может быть и флигель адъютантом. Вы знаете, государь очень милостиво говорил с ним. Мы с Анет говорили, это очень легко было бы устроить. Как вы думаете?
Пьер посмотрел на князя Андрея и, заметив, что разговор этот не нравился его другу, ничего не отвечал.
– Когда вы едете? – спросил он.
– Ah! ne me parlez pas de ce depart, ne m'en parlez pas. Je ne veux pas en entendre parler, [Ах, не говорите мне про этот отъезд! Я не хочу про него слышать,] – заговорила княгиня таким капризно игривым тоном, каким она говорила с Ипполитом в гостиной, и который так, очевидно, не шел к семейному кружку, где Пьер был как бы членом. – Сегодня, когда я подумала, что надо прервать все эти дорогие отношения… И потом, ты знаешь, Andre? – Она значительно мигнула мужу. – J'ai peur, j'ai peur! [Мне страшно, мне страшно!] – прошептала она, содрогаясь спиною.
Муж посмотрел на нее с таким видом, как будто он был удивлен, заметив, что кто то еще, кроме его и Пьера, находился в комнате; и он с холодною учтивостью вопросительно обратился к жене:
– Чего ты боишься, Лиза? Я не могу понять, – сказал он.
– Вот как все мужчины эгоисты; все, все эгоисты! Сам из за своих прихотей, Бог знает зачем, бросает меня, запирает в деревню одну.
– С отцом и сестрой, не забудь, – тихо сказал князь Андрей.
– Всё равно одна, без моих друзей… И хочет, чтобы я не боялась.
Тон ее уже был ворчливый, губка поднялась, придавая лицу не радостное, а зверское, беличье выраженье. Она замолчала, как будто находя неприличным говорить при Пьере про свою беременность, тогда как в этом и состояла сущность дела.
– Всё таки я не понял, de quoi vous avez peur, [Чего ты боишься,] – медлительно проговорил князь Андрей, не спуская глаз с жены.
Княгиня покраснела и отчаянно взмахнула руками.
– Non, Andre, je dis que vous avez tellement, tellement change… [Нет, Андрей, я говорю: ты так, так переменился…]
– Твой доктор велит тебе раньше ложиться, – сказал князь Андрей. – Ты бы шла спать.
Княгиня ничего не сказала, и вдруг короткая с усиками губка задрожала; князь Андрей, встав и пожав плечами, прошел по комнате.
Пьер удивленно и наивно смотрел через очки то на него, то на княгиню и зашевелился, как будто он тоже хотел встать, но опять раздумывал.
– Что мне за дело, что тут мсье Пьер, – вдруг сказала маленькая княгиня, и хорошенькое лицо ее вдруг распустилось в слезливую гримасу. – Я тебе давно хотела сказать, Andre: за что ты ко мне так переменился? Что я тебе сделала? Ты едешь в армию, ты меня не жалеешь. За что?
– Lise! – только сказал князь Андрей; но в этом слове были и просьба, и угроза, и, главное, уверение в том, что она сама раскается в своих словах; но она торопливо продолжала:
– Ты обращаешься со мной, как с больною или с ребенком. Я всё вижу. Разве ты такой был полгода назад?
– Lise, я прошу вас перестать, – сказал князь Андрей еще выразительнее.
Пьер, всё более и более приходивший в волнение во время этого разговора, встал и подошел к княгине. Он, казалось, не мог переносить вида слез и сам готов был заплакать.
– Успокойтесь, княгиня. Вам это так кажется, потому что я вас уверяю, я сам испытал… отчего… потому что… Нет, извините, чужой тут лишний… Нет, успокойтесь… Прощайте…
Князь Андрей остановил его за руку.
– Нет, постой, Пьер. Княгиня так добра, что не захочет лишить меня удовольствия провести с тобою вечер.
– Нет, он только о себе думает, – проговорила княгиня, не удерживая сердитых слез.
– Lise, – сказал сухо князь Андрей, поднимая тон на ту степень, которая показывает, что терпение истощено.
Вдруг сердитое беличье выражение красивого личика княгини заменилось привлекательным и возбуждающим сострадание выражением страха; она исподлобья взглянула своими прекрасными глазками на мужа, и на лице ее показалось то робкое и признающееся выражение, какое бывает у собаки, быстро, но слабо помахивающей опущенным хвостом.
– Mon Dieu, mon Dieu! [Боже мой, Боже мой!] – проговорила княгиня и, подобрав одною рукой складку платья, подошла к мужу и поцеловала его в лоб.
– Bonsoir, Lise, [Доброй ночи, Лиза,] – сказал князь Андрей, вставая и учтиво, как у посторонней, целуя руку.


Друзья молчали. Ни тот, ни другой не начинал говорить. Пьер поглядывал на князя Андрея, князь Андрей потирал себе лоб своею маленькою рукой.
– Пойдем ужинать, – сказал он со вздохом, вставая и направляясь к двери.
Они вошли в изящно, заново, богато отделанную столовую. Всё, от салфеток до серебра, фаянса и хрусталя, носило на себе тот особенный отпечаток новизны, который бывает в хозяйстве молодых супругов. В середине ужина князь Андрей облокотился и, как человек, давно имеющий что нибудь на сердце и вдруг решающийся высказаться, с выражением нервного раздражения, в каком Пьер никогда еще не видал своего приятеля, начал говорить:
– Никогда, никогда не женись, мой друг; вот тебе мой совет: не женись до тех пор, пока ты не скажешь себе, что ты сделал всё, что мог, и до тех пор, пока ты не перестанешь любить ту женщину, какую ты выбрал, пока ты не увидишь ее ясно; а то ты ошибешься жестоко и непоправимо. Женись стариком, никуда негодным… А то пропадет всё, что в тебе есть хорошего и высокого. Всё истратится по мелочам. Да, да, да! Не смотри на меня с таким удивлением. Ежели ты ждешь от себя чего нибудь впереди, то на каждом шагу ты будешь чувствовать, что для тебя всё кончено, всё закрыто, кроме гостиной, где ты будешь стоять на одной доске с придворным лакеем и идиотом… Да что!…
Он энергически махнул рукой.
Пьер снял очки, отчего лицо его изменилось, еще более выказывая доброту, и удивленно глядел на друга.
– Моя жена, – продолжал князь Андрей, – прекрасная женщина. Это одна из тех редких женщин, с которою можно быть покойным за свою честь; но, Боже мой, чего бы я не дал теперь, чтобы не быть женатым! Это я тебе одному и первому говорю, потому что я люблю тебя.
Князь Андрей, говоря это, был еще менее похож, чем прежде, на того Болконского, который развалившись сидел в креслах Анны Павловны и сквозь зубы, щурясь, говорил французские фразы. Его сухое лицо всё дрожало нервическим оживлением каждого мускула; глаза, в которых прежде казался потушенным огонь жизни, теперь блестели лучистым, ярким блеском. Видно было, что чем безжизненнее казался он в обыкновенное время, тем энергичнее был он в эти минуты почти болезненного раздражения.
– Ты не понимаешь, отчего я это говорю, – продолжал он. – Ведь это целая история жизни. Ты говоришь, Бонапарте и его карьера, – сказал он, хотя Пьер и не говорил про Бонапарте. – Ты говоришь Бонапарте; но Бонапарте, когда он работал, шаг за шагом шел к цели, он был свободен, у него ничего не было, кроме его цели, – и он достиг ее. Но свяжи себя с женщиной – и как скованный колодник, теряешь всякую свободу. И всё, что есть в тебе надежд и сил, всё только тяготит и раскаянием мучает тебя. Гостиные, сплетни, балы, тщеславие, ничтожество – вот заколдованный круг, из которого я не могу выйти. Я теперь отправляюсь на войну, на величайшую войну, какая только бывала, а я ничего не знаю и никуда не гожусь. Je suis tres aimable et tres caustique, [Я очень мил и очень едок,] – продолжал князь Андрей, – и у Анны Павловны меня слушают. И это глупое общество, без которого не может жить моя жена, и эти женщины… Ежели бы ты только мог знать, что это такое toutes les femmes distinguees [все эти женщины хорошего общества] и вообще женщины! Отец мой прав. Эгоизм, тщеславие, тупоумие, ничтожество во всем – вот женщины, когда показываются все так, как они есть. Посмотришь на них в свете, кажется, что что то есть, а ничего, ничего, ничего! Да, не женись, душа моя, не женись, – кончил князь Андрей.