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

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

императивный

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

интерпретатор/компилятор

Появился в:

1971

Автор:

Чарльз Х. Мур

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

бестиповый

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

gForth, pForth, kForth, SP-Forth[1], win32forth[2]

Диалекты:

FORTH-79, FORTH-83, ANSI FORTH 1994 года, ColorForth, RetroForth.

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

АПЛ, Лисп

Повлиял на:

PostScript, Factor и другие конкатенативные языки

Форт (англ. Forth) — один из первых конкатенативных языков программирования, в котором программы записываются последовательностью лексем («слов» в терминологии языка Форт). Математические выражения представляются постфиксной записью при использовании стековой нотации. Поддерживает механизмы метарасширения семантики и синтаксиса языка для адаптации к нужной предметной области. Синтаксис базового уровня в Форте прост и состоит из единственного правила: «все определения разделяются пробелами». Определения Форта могут иметь любое сочетание символов.

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





История

Создание

Язык Форт был создан Чарльзом X. Муром в конце 1960-х — начале 1970-х годов. Мур назвал свой язык Fourth, считая, что это будет язык для ЭВМ четвёртого (англ. fourth) поколения. Но так как он работал на машине IBM 1130 (англ.), которая допускала имена, составленные не более чем из пяти прописных букв, название было преобразовано в FORTH (англ. forth — вперёд). Впрочем, первые эксперименты Мура по созданию простого интерпретатора, облегчающего написание программ управления астрономическим оборудованием относятся ещё к концу 1950-х годов.[3]

С 1971 года Мур работал в Национальной радиоастрономической обсерватории (англ.), участвуя в разработке программ сбора и обработки получаемых радиотелескопом данных. Именно тогда появилась первая реализация языка Форт. В этой работе также участвовала сотрудница Мура Элизабет Ратер (англ. Elizabeth Rather), которую можно считать вторым в мире форт-программистом.

Вновь созданный язык был принят в качестве основного языка программирования в Американском астрономическом обществе. Позднее, в 1973 году, Чарльз Мур и Элизабет Ратер основали компанию FORTH, Inc[4], в ходе работы которой в течение следующего десятилетия язык был портирован на множество платформ.

В конце 1970-х годов программистами, заинтересованными в развитии языка, была создана группа FORTH Interest Group (FIG). Этой группой разработана концепция FIG Forth Model — общедоступной форт-системы, которая может быть легко перенесена на популярные компьютерные архитектуры. Эту эталонную форт систему — FIG-FORTH часто рассматривают как первоначальный стандарт языка.

Стандартизация

Идея официальной стандартизации Форта первоначально возникла в рамках Международного объединения астрономов (англ. Astronomical Sciences, AST). В мае 1977 года на встрече в Национальной обсерватории Китт-Пик (США) был выработан глоссарий языка Форт, обозначенный как AST.01.

В феврале 1978 года в Утрехте был принят стандарт FORTH-77, ориентированный на реализацию на микрокомпьютеры.

В октябре 1979 года встреча на острове Санта-Каталина (Калифорния) закончилась разработкой стандарта FORTH-79, который распространяется на ЭВМ всех типов.

Осенью 1983 года состоялась встреча по разработке следующего стандарта, утверждённого в 1984 году как FORTH-83. Стандарт Форт-83 отличается от стандарта Форт-79 некоторыми деталями, но не по существу.

В 1988 году в составе ACM была организована группа SIGFORTH[5]; была и соответствующая Российская группа ACM (председатель — проф. С. Н. Баранов (Санкт-Петербург, СПИИРАН)). Сейчас SIGFORTH существует в составе более общей группы SIGPLAN (англ.).

Наконец в 1994 году после продолжительного согласования, в котором участвовали многие заинтересованные фирмы, был принят ANSI стандарт языка Форт.[6]

Дальнейшее развитие и примеры использования

Известный пример успешного применения Форта — его использование в программном обеспечении глубоководного спускаемого аппарата, при поисках «Титаника» в 1985 году. Также Форт был применён в программном обеспечении спектрографа на Шаттле, в микромодулях управления искусственными спутниками Земли, для системы управления в аэропорту Эр-Рияда, системах компьютерного зрения, автоматизации анализа крови и кардиологического контроля, карманных переводчиках.

Диалект языка Форт используется в OpenBoot — базовом программном обеспечении ЭВМ на базе процессоров SPARC и PowerPC.

В начале 1980-x на основе языка Форт Джон Уорнок и Чак Гешке из Adobe Systems создали язык PostScript[7], широко используемый для управления устройствами печати и послуживший основой для создания формата PDF.

Существуют процессоры и контроллеры, поддерживающие вычислительную модель языка на аппаратном уровне. Создано множество открытых реализаций Форта для различных аппаратных платформ. Отдельные фирмы (среди которых следует отметить прежде всего основанную Чарльзом Муром FORTH, Inc и британскую компанию MicroProcessor Engineering Ltd.[8]) поставляют различные по своим возможностям коммерческие версии языка.

Ежегодно проводятся конференции ЕвроФорт (EuroForth), в том числе в России, Англии, Австрии, Германии, Испании, Чехии (ранее в Чехословакии).[9]

Основные понятия классической Форт-системы

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

Структура «типичной» статьи словаря Форта:

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

Условно статьи Форта можно разделить на две категории: низкоуровневые статьи и форт-статьи. Статьи первого типа содержат в поле кода указатель на процедуру в кодах целевого процессора, непосредственно выполняющую семантику слова. В поле параметров таких статей располагаются передаваемые процедуре параметры, либо сам её код. Форт-статьи содержат в поле параметров указатели на другие статьи, а поле кода указывает на специальную процедуру, называемую интерпретатором ссылок. На практике структура статьи зависит от реализации, но, как правило, похожа на рассмотренную выше. Принцип, используемый внутри поля параметров форт-статьи, называется шитый код (англ. threaded code), а интерпретатор ссылок — виртуальной Форт-машиной.

Грамматически текст, обрабатываемый транслятором Форта, представляет собой последовательность лексем (англ. token), разделённых пробелами и символами конца строки. Транслятор входной строки выбирает очередной токен и производит его поиск в текущем словаре, причём поиск ведётся от более новых слов к старым. Если слово не найдено, предпринимается попытка интерпретировать токен в качестве записи числа, которое, в случае успеха, помещается на вершину стека. Если же токен соответствует слову Форта, анализируется текущее состояния флага compile Форт-системы. Если флаг сброшен, то слово исполняется — управление передаётся по указателю поля кода найденной статьи. Если флаг установлен, слово компилируется, то есть указатель на его поле кода дописывается в текущую создаваемую статью. Если было оттранслировано число, оно снимается со стека и компилируется в литеральный код, исполнение которого внутри словарной статьи помещает число на вершину стека. Кроме того, слова могут содержать флаг immediate («немедленный»), в этом случае они всегда исполняются.

Механизм передачи параметров между словами:

  • через стек данных;
  • через ячейки памяти;
  • через именованные локальные переменные (стандарт 1994 года).

Язык предоставляет способ работы с памятью системы, как с линейной областью.

Обязательным компонентом системы является также стек возвратов. Доступен программно для изменения потока управления программы.

Всё вышесказанное относится к понятию Форт только в первом приближении. Форт — это не совсем язык программирования; вернее, он перекрывает понятие языка программирования. Форт в большей степени является виртуальной машиной и операционной системой ForthOS.[10]

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

Типы кода Форта

В качестве машинного представления скомпилированной форт-программы используется тот или иной вид шитого кода.

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

При использовании шитого кода, отличающегося от подпрограммного, определения Форта, состоящие только из машинного кода, называются примитивы. В таком шитом коде часто стараются использовать основной стек процессора в качестве стека данных, а обращения к данным, лежащим на нём, в виде машинных команд pop и push.

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

Форт системы могут также использовать байт-код, как логическое завершение развития косвенного шитого кода и свёрнутого шитого кода с адресной таблицей. В этом случае код программы (Форта) представляет собой последовательность байтов, или код некоторого придуманного виртуального процессора. Для исполнения этого кода должна существовать таблица на 256 адресов (2-байтовых, 4- или 8-байтовых), по которым расположены примитивы Форта или сложные определения.

Этот вариант сильно отличается от других видов кода и заслуживает особого внимания.

  • Как и в косвенном шитом коде, примитивы Форта могут быть расположены в едином сегменте кода, защищённом от вмешательства, прошитом в ПЗУ. Примитивы зависят от конкретной платформы и могут быть выполнены в виде отдельного блока. Вся остальная часть Форта является платформонезависимой и переносимой на любую машину.
  • Вокруг таблицы на 256 определений группируется отдельный словарь, лексикон, предназначенный для конкретной задачи или группы задач. Эти 256 определений занимают места не более 64К, то есть таблица может содержать 2-байтовые адреса (смещения относительно начала словаря).
  • Байтовый код позволяет расширить количество определений за счет древовидной структуры словарей до любой величины, сохраняя минимальные размеры программы.
  • Байтовый код может быть стандартизован. Как и для Java, такой код может быстро пересылаться по сети и исполняться на машинах с любой платформой.
  • Байтовый код позволяет эмулировать любой процессор или программную систему и выполнять отладку разработанных для них программ.

Примеры программ

.( Привет Мир)

Пример определения слова .SIGN, печатающего соответствующую фразу в зависимости от знака числа на вершине стека:

\ Напечатать знак числа
: .SIGN ( n -- )
   ?DUP 0= IF
     ." НОЛЬ"
   ELSE
     0> IF
     ." ПОЛОЖИТЕЛЬНОЕ ЧИСЛО"  ELSE
     ." ОТРИЦАТЕЛЬНОЕ ЧИСЛО"  THEN
   THEN
;

Пример реального кода, создающего строчную константу в принятом в Форт виде (со счётчиком):

\ Создать "константу" из строки
: S-CONSTANT ( c-addr u "<spaces>name" -- )
   CREATE 
     DUP , 0 ?DO
       DUP C@ C, CHAR+
     LOOP DROP 0 C,
   DOES>
     DUP CELL+ SWAP @
;

В этом примере создаётся определение слова name с помощью слова CREATE. При исполнении слова name на стек будет положен адрес указателя области памяти, который был во время компиляции слова. Для того, чтобы его можно было как-то использовать, туда записывается («компилируется» строка). При выполнении слова выполняются слова, указанные после слова DOES>.

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

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

Примеры таких стандартных слов:

[ — Временное переключение в режим исполнения (фактически, часто просто записывает 0 в переменную STATE).

] — Переключиться обратно в режим компиляции.

LITERAL — Компилировать число, в данный момент лежащее на вершине стека, как константу. Также является словом немедленного исполнения.

Пример кода, где используются эти слова:

\ Некоторый размер данных в килобайтах
16 CONSTANT size
 
\ Напечатать отчёт о пересчёте килобайтов в байты
: report ( -- )
   size . ."  килобайт эквивалентны "
   [ size 1024 * ] LITERAL . ." байтам"
;

Особенности языка Forth

К:Википедия:Статьи без источников (тип: не указан)

Одна из постоянных тем споров вокруг языка Форт — это место, которое он занимает среди «классических» императивных языков. Программы на Форте имеют крайне непривычный вид:

  • Программа состоит из необычной последовательности слов, среди которых отсутствуют так называемые «ключевые» слова, которые распознаются и обрабатываются в других языках программирования специальным образом.
    С выходом сериала «Звёздные войны» по этому поводу появилась шутка, ставшая ныне классической, которая хорошо иллюстрирует данную особенность Форта:

Тайна речи магистра Йоды открыта:
Старым программистом на Форте он был…

  • Приведённый пример заодно указывает на уникальную особенность Форта: отсутствие списка параметров в скобках и возможность программировать на родном языке. Использование словарных конструкций родного языка позволяет сделать программу понятной, что повышает её надёжность К:Википедия:Статьи без источников (тип: не указан)[источник не указан 3288 дней].
  • «Обратная польская запись» арифметических выражений и наличие нескольких стеков.
  • Двойственная природа компилятора Форта. Нельзя утверждать однозначно, является ли Форт компилятором или интерпретатором. Практически всегда его можно использовать в двух режимах, за исключением редких случаев вроде «целевой компиляции» (трансляции в машинный код программы для системы с иной архитектурой).
  • Отсутствие системы типов. Подобно языкам ассемблера, в Форте нет встроенной системы типов. Нет возможности узнать, что лежит на вершине стека — число со знаком, число без знака, указатель на строку, символ, или два числа, рассматриваемых как одно длинное число. Контроль типов возлагается на программиста. При этом используются специальные наборы слов (например, запись и чтение ячеек памяти производят словами ! и @, а символов — словами C! и C@), некоторые сущности выносятся в специальные стеки (например, стек чисел с плавающей запятой, согласно стандарту ANSI FORTH 94; он может быть, а может и не быть, реализован с помощью основного стека).

Эти особенности и определяют преимущества и недостатки языка Форт:

  • Опытный программист, знакомый с системой команд и архитектурой процессора, может написать "ядро" форт-системы за несколько дней.
  • Свобода, предоставляемая программисту, требует сильного самоконтроля. Входной порог для программирования на Форте ниже, чем у классических языков программирования, но требует привыкания и понимания не только возможностей и особенностей синтаксиса Форта, но, также, понимания философии, лежащей в его основе.
  • Форт не поддерживает никакую парадигму программирования и поддерживает их все одновременно. Написать набор слов для организации ООП в программе на Форте (а их может быть одновременно несколько и они будут отлично уживаться вместе) гораздо проще, чем решить, какие возможности от этого набора слов требуются.
  • Разбиение программы на множество мелких слов позволяет легко и быстро проверять их по отдельности, передавая им нужные наборы входных параметров и контролируя то, что остаётся на стеке. Фактически, это означает, что для тестирования какого-то компонента программы можно не загружать все зависимые компоненты целиком.
  • Большинство реализаций форта позволяют сделать декомпиляцию программы. Полученный текст мало отличается от исходного.
  • Форт позволяет реализовать любую технологию программирования, доступную в других языках и системах. В нём также допустимы приёмы, запрещённые в других языках (например — самомодификация кода). Устранение негативных последствий этих приёмов путём создания правильного лексикона, стимулирующего грамотную методику их использования, также возложено на программиста.
  • Размер кода Форта для 16-разрядных систем, при грамотном написании программы, иногда в 10-20 раз меньше кода, скомпилированного из программы на Си. Для 32-разрядных систем этот разрыв ещё больше. В операционных системах общий выигрыш может составлять уже сотни, а то и тысячи крат. Причина очень простая — готовая задача на Форте имеет размер несколько байт, все вспомогательные подпрограммы реализованы в виде определений, доступных всем. Система на Форте вместится в процессор, в который другие системы влезть в принципе не способны.
  • Синхронизация процессов и потоков в многозадачных системах, переключение контекста, реализация доступа к ограниченным ресурсам — сложнейшие проблемы при написании ОС. Для поддержки этих возможностей даже создаются специальные команды в микропроцессорах. Для интерпретатора это вообще не проблема, поскольку он эмулирует любой процессор и любую необходимую команду.

Возможно, что на самом деле больше всего развитию Форта препятствует «тяжёлое наследство», пришедшее от машин с низкими возможностями, для которых он изначально создавался. В стандарте ANSI FORTH 94 существуют, например, следующие особенности:

  • Переносимая программа должна предполагать, что стек чисел с плавающей запятой может быть реализован с использованием основного стека. К счастью, для большинства современных компиляторов это не так. Но сам факт наличия такого пункта в стандарте создаёт определённые неудобства. При программировании с активным использованием арифметики с плавающей точкой, эту норму стандарта традиционно игнорируют.
  • Аналогичная норма существует относительно стека потока управления. Здесь всё не так просто, так как часто это именно так и есть — в процессе компиляции стек используется самим компилятором. В абсолютном большинстве случаев никакого влияния на программу это не оказывает, но про саму особенность надо помнить. Например, если вы хотите в процессе компиляции вычислить какое-то число, за пределами начала определения, а потом вставить его в слово как константу, то для этого придётся использовать какой-либо обходной путь.
  • Определения многих слов в стандарте слишком низкоуровневые. Например, слово 2* производит не умножение на два, как следует из его названия, а «смещает число на один бит к старшему двоичному разряду, заполняя младший бит нулём». Конечно, на большинстве современных машин — это одно и то же, но сам факт использования особенностей конкретной архитектуры настораживает. (Существуют также более очевидные стандартные слова для сдвига битов — LSHIFT и RSHIFT.)

Многие из этих особенностей — следствие того, что на момент принятия стандарта существовало множество плохо совместимых Форт-систем, которые базировались на двух частично различающихся стандартах 1979 и 1983 годов.

См. также

Диалекты
Приложения

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

Примечания

  1. [spf.sourceforge.net Проект SP-Forth] на сайте SourceForge.net
  2. [win32forth.org/ Win32Forth Project Group]
  3. C. H. Moore, E. D. Rather, D. R. Colburn. [www.forth.com/resources/evolution/index.html The Evolution of Forth]. ACM SIGPLAN Notices, Volume 28, No. 3. March, 1993 / History of Programming Languages Conference (апрель 1993). [www.webcitation.org/6184coen2 Архивировано из первоисточника 22 августа 2011].
  4. [forth.com Embedded Systems Development and Programming Tools by FORTH, Inc]
  5. [www.complang.tuwien.ac.at/anton/euroforth2006/papers/proceedings.pdf 22nd EuroForth Conference]
  6. [forth.sourceforge.net/standard/dpans DPANS’94]
  7. [www.adobe.com/products/postscript/resources.html Adobe PostScript 3 — Resources]
  8. [www.mpeforth.com/ MPE — MicroProcessor Engineering Limited]
  9. [www.complang.tuwien.ac.at/anton/euroforth/ EuroForth: European Forth Conference]
  10. [wiki.forth.org.ru/ForthOS ForthWiki — ForthOS]
  11. [www.ogre3d.org/forums/viewtopic.php?p=254640#p254640 Ориджин пользователя Aquatix]

Литература

  • Баранов С. Н., Колодин М. Ю. Феномен форта // Системная информатика. — Новосибирск: ВО «Наука». Сибирская издательская фирма, 1995. — Вып. 4. — С. 193—291. — ISBN 5-02-030678-9.
  • Баранов С. Н., Ноздрунов Н. Р. Язык Форт и его реализации. — Л.: Машиностроение, 1988. — 157 с. — (ЭВМ в производстве). — 100 000 экз. — ISBN 5-217-00324-3.
  • Leo Brodie. [thinking-forth.sourceforge.net/ Thinking Forth]. — ISBN 0-9764587-0-5.
  • Броуди Л. Начальный курс программирования на Форте = Starting Forth. An introduction to the Forth language and operating system for beginners and professionals / Пер. с англ.; предисл. И. В. Романовского. — М.: Финансы и статистика, 1990. — 352 с. — 40 000 экз. — ISBN 5-279-00252-6.
  • Броуди Л. [www.enet.ru/win/cherezov/brodie1.html Способ мышления — Форт].
  • Бураго А. Ю., Кириллин В. А., Романовский И. В. Форт — язык для микропроцессоров. — Общество «Знание», Ленинградская организация, 1989. — 36 с. — (В помощь лектору). — 26 000 экз.
  • Дьяконов В. П. Форт-системы программирования персональных ЭВМ. — М.: Наука, 1992. — 352 с. — ISBN 5-02-014460-6.
  • Келли М., Спайс Н. Язык программирования Форт / Пер. с англ. — М.: Радио и связь, 1993. — 320 с. — ISBN 5-256-00438-7.
  • Семёнов Ю. А. Программирование на языке Форт. — М.: Радио и связь. — 240 с. — 50 000 экз. — ISBN 5-256-00547-2.
  • Таунсенд К., Фохт Д. Проектирование и программная реализация экспертных систем на персональных ЭВМ / Пер. с англ. В. А. Кондратенко, С. В. Трубицына. — М.: Финансы и статистика, 1990. — 320 с. — ISBN 5-279-00255-0 (СССР) ISBN 0-8306-2692-1 (США).
Журнальные публикации
  • Stephen Pelc [www.drdobbs.com/embedded-systems/modern-forth/210600604?pgno=1 Modern Forth] // Dr. Dobb's Journal. — 2008, Сентябрь.

Ссылки

  • [www.forth.org/ сайт Forth Interst Group] (англ.)
  • [www.forth.com/ сайт компании Forth Inc.] (англ.)
  • [www.complang.tuwien.ac.at/anton/euroforth/ Конференция ЕвроФорт, есть все доклады]
Стандарт
  • [wiki.forth.org.ru/УчебникиФорта#0 Русский перевод стандарта ANS FORTH 94] (выполнен Сергеем Кадочниковым, в этом переводе известны несколько ошибок, например в описании слова SEARCH)
Русскоязычные ресурсы
  • [forth.org.ru/ Сайт русскоязычных пользователей языка Forth]
  • [fforum.winglion.ru/index.php Активный Форум по языку Форт на winglion]
  • [forum.msyst.ru/index.php Активный Форум по языку Форт на msyst]
  • [www.wrk.ru/forums/viewforum.php?id=29 Активный Форум по языку Форт ]на www.wrk.ru
  • [chernykh.net/content/view/226/239/ История языка Форт] (рус.)
  • [www.enet.ru/win/cherezov/forth_ideas.html Идеи языка Форт (от разработчика eserv)]
  • [www.forth.ru Сайт А.Ларионова]
Коллекции ссылок на форт-ресурсы
  • [wiki.forthfreak.net/ Вики-сайт, посвящённый форт-ресурсам]
  • [forth.sourceforge.net/ Коллекция ссылок на ресуры по Форт на sourceforge.net]


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

– Марья Львовна Карагина с дочерью! – басом доложил огромный графинин выездной лакей, входя в двери гостиной.
Графиня подумала и понюхала из золотой табакерки с портретом мужа.
– Замучили меня эти визиты, – сказала она. – Ну, уж ее последнюю приму. Чопорна очень. Проси, – сказала она лакею грустным голосом, как будто говорила: «ну, уж добивайте!»
Высокая, полная, с гордым видом дама с круглолицей улыбающейся дочкой, шумя платьями, вошли в гостиную.
«Chere comtesse, il y a si longtemps… elle a ete alitee la pauvre enfant… au bal des Razoumowsky… et la comtesse Apraksine… j'ai ete si heureuse…» [Дорогая графиня, как давно… она должна была пролежать в постеле, бедное дитя… на балу у Разумовских… и графиня Апраксина… была так счастлива…] послышались оживленные женские голоса, перебивая один другой и сливаясь с шумом платьев и передвиганием стульев. Начался тот разговор, который затевают ровно настолько, чтобы при первой паузе встать, зашуметь платьями, проговорить: «Je suis bien charmee; la sante de maman… et la comtesse Apraksine» [Я в восхищении; здоровье мамы… и графиня Апраксина] и, опять зашумев платьями, пройти в переднюю, надеть шубу или плащ и уехать. Разговор зашел о главной городской новости того времени – о болезни известного богача и красавца Екатерининского времени старого графа Безухого и о его незаконном сыне Пьере, который так неприлично вел себя на вечере у Анны Павловны Шерер.
– Я очень жалею бедного графа, – проговорила гостья, – здоровье его и так плохо, а теперь это огорченье от сына, это его убьет!
– Что такое? – спросила графиня, как будто не зная, о чем говорит гостья, хотя она раз пятнадцать уже слышала причину огорчения графа Безухого.
– Вот нынешнее воспитание! Еще за границей, – проговорила гостья, – этот молодой человек предоставлен был самому себе, и теперь в Петербурге, говорят, он такие ужасы наделал, что его с полицией выслали оттуда.
– Скажите! – сказала графиня.
– Он дурно выбирал свои знакомства, – вмешалась княгиня Анна Михайловна. – Сын князя Василия, он и один Долохов, они, говорят, Бог знает что делали. И оба пострадали. Долохов разжалован в солдаты, а сын Безухого выслан в Москву. Анатоля Курагина – того отец как то замял. Но выслали таки из Петербурга.
– Да что, бишь, они сделали? – спросила графиня.
– Это совершенные разбойники, особенно Долохов, – говорила гостья. – Он сын Марьи Ивановны Долоховой, такой почтенной дамы, и что же? Можете себе представить: они втроем достали где то медведя, посадили с собой в карету и повезли к актрисам. Прибежала полиция их унимать. Они поймали квартального и привязали его спина со спиной к медведю и пустили медведя в Мойку; медведь плавает, а квартальный на нем.
– Хороша, ma chere, фигура квартального, – закричал граф, помирая со смеху.
– Ах, ужас какой! Чему тут смеяться, граф?
Но дамы невольно смеялись и сами.
– Насилу спасли этого несчастного, – продолжала гостья. – И это сын графа Кирилла Владимировича Безухова так умно забавляется! – прибавила она. – А говорили, что так хорошо воспитан и умен. Вот всё воспитание заграничное куда довело. Надеюсь, что здесь его никто не примет, несмотря на его богатство. Мне хотели его представить. Я решительно отказалась: у меня дочери.
– Отчего вы говорите, что этот молодой человек так богат? – спросила графиня, нагибаясь от девиц, которые тотчас же сделали вид, что не слушают. – Ведь у него только незаконные дети. Кажется… и Пьер незаконный.
Гостья махнула рукой.
– У него их двадцать незаконных, я думаю.
Княгиня Анна Михайловна вмешалась в разговор, видимо, желая выказать свои связи и свое знание всех светских обстоятельств.
– Вот в чем дело, – сказала она значительно и тоже полушопотом. – Репутация графа Кирилла Владимировича известна… Детям своим он и счет потерял, но этот Пьер любимый был.
– Как старик был хорош, – сказала графиня, – еще прошлого года! Красивее мужчины я не видывала.
– Теперь очень переменился, – сказала Анна Михайловна. – Так я хотела сказать, – продолжала она, – по жене прямой наследник всего именья князь Василий, но Пьера отец очень любил, занимался его воспитанием и писал государю… так что никто не знает, ежели он умрет (он так плох, что этого ждут каждую минуту, и Lorrain приехал из Петербурга), кому достанется это огромное состояние, Пьеру или князю Василию. Сорок тысяч душ и миллионы. Я это очень хорошо знаю, потому что мне сам князь Василий это говорил. Да и Кирилл Владимирович мне приходится троюродным дядей по матери. Он и крестил Борю, – прибавила она, как будто не приписывая этому обстоятельству никакого значения.
– Князь Василий приехал в Москву вчера. Он едет на ревизию, мне говорили, – сказала гостья.
– Да, но, entre nous, [между нами,] – сказала княгиня, – это предлог, он приехал собственно к графу Кирилле Владимировичу, узнав, что он так плох.
– Однако, ma chere, это славная штука, – сказал граф и, заметив, что старшая гостья его не слушала, обратился уже к барышням. – Хороша фигура была у квартального, я воображаю.
И он, представив, как махал руками квартальный, опять захохотал звучным и басистым смехом, колебавшим всё его полное тело, как смеются люди, всегда хорошо евшие и особенно пившие. – Так, пожалуйста же, обедать к нам, – сказал он.


Наступило молчание. Графиня глядела на гостью, приятно улыбаясь, впрочем, не скрывая того, что не огорчится теперь нисколько, если гостья поднимется и уедет. Дочь гостьи уже оправляла платье, вопросительно глядя на мать, как вдруг из соседней комнаты послышался бег к двери нескольких мужских и женских ног, грохот зацепленного и поваленного стула, и в комнату вбежала тринадцатилетняя девочка, запахнув что то короткою кисейною юбкою, и остановилась по средине комнаты. Очевидно было, она нечаянно, с нерассчитанного бега, заскочила так далеко. В дверях в ту же минуту показались студент с малиновым воротником, гвардейский офицер, пятнадцатилетняя девочка и толстый румяный мальчик в детской курточке.
Граф вскочил и, раскачиваясь, широко расставил руки вокруг бежавшей девочки.
– А, вот она! – смеясь закричал он. – Именинница! Ma chere, именинница!
– Ma chere, il y a un temps pour tout, [Милая, на все есть время,] – сказала графиня, притворяясь строгою. – Ты ее все балуешь, Elie, – прибавила она мужу.
– Bonjour, ma chere, je vous felicite, [Здравствуйте, моя милая, поздравляю вас,] – сказала гостья. – Quelle delicuse enfant! [Какое прелестное дитя!] – прибавила она, обращаясь к матери.
Черноглазая, с большим ртом, некрасивая, но живая девочка, с своими детскими открытыми плечиками, которые, сжимаясь, двигались в своем корсаже от быстрого бега, с своими сбившимися назад черными кудрями, тоненькими оголенными руками и маленькими ножками в кружевных панталончиках и открытых башмачках, была в том милом возрасте, когда девочка уже не ребенок, а ребенок еще не девушка. Вывернувшись от отца, она подбежала к матери и, не обращая никакого внимания на ее строгое замечание, спрятала свое раскрасневшееся лицо в кружевах материной мантильи и засмеялась. Она смеялась чему то, толкуя отрывисто про куклу, которую вынула из под юбочки.
– Видите?… Кукла… Мими… Видите.
И Наташа не могла больше говорить (ей всё смешно казалось). Она упала на мать и расхохоталась так громко и звонко, что все, даже чопорная гостья, против воли засмеялись.
– Ну, поди, поди с своим уродом! – сказала мать, притворно сердито отталкивая дочь. – Это моя меньшая, – обратилась она к гостье.
Наташа, оторвав на минуту лицо от кружевной косынки матери, взглянула на нее снизу сквозь слезы смеха и опять спрятала лицо.
Гостья, принужденная любоваться семейною сценой, сочла нужным принять в ней какое нибудь участие.
– Скажите, моя милая, – сказала она, обращаясь к Наташе, – как же вам приходится эта Мими? Дочь, верно?
Наташе не понравился тон снисхождения до детского разговора, с которым гостья обратилась к ней. Она ничего не ответила и серьезно посмотрела на гостью.
Между тем всё это молодое поколение: Борис – офицер, сын княгини Анны Михайловны, Николай – студент, старший сын графа, Соня – пятнадцатилетняя племянница графа, и маленький Петруша – меньшой сын, все разместились в гостиной и, видимо, старались удержать в границах приличия оживление и веселость, которыми еще дышала каждая их черта. Видно было, что там, в задних комнатах, откуда они все так стремительно прибежали, у них были разговоры веселее, чем здесь о городских сплетнях, погоде и comtesse Apraksine. [о графине Апраксиной.] Изредка они взглядывали друг на друга и едва удерживались от смеха.
Два молодые человека, студент и офицер, друзья с детства, были одних лет и оба красивы, но не похожи друг на друга. Борис был высокий белокурый юноша с правильными тонкими чертами спокойного и красивого лица; Николай был невысокий курчавый молодой человек с открытым выражением лица. На верхней губе его уже показывались черные волосики, и во всем лице выражались стремительность и восторженность.
Николай покраснел, как только вошел в гостиную. Видно было, что он искал и не находил, что сказать; Борис, напротив, тотчас же нашелся и рассказал спокойно, шутливо, как эту Мими куклу он знал еще молодою девицей с неиспорченным еще носом, как она в пять лет на его памяти состарелась и как у ней по всему черепу треснула голова. Сказав это, он взглянул на Наташу. Наташа отвернулась от него, взглянула на младшего брата, который, зажмурившись, трясся от беззвучного смеха, и, не в силах более удерживаться, прыгнула и побежала из комнаты так скоро, как только могли нести ее быстрые ножки. Борис не рассмеялся.
– Вы, кажется, тоже хотели ехать, maman? Карета нужна? – .сказал он, с улыбкой обращаясь к матери.
– Да, поди, поди, вели приготовить, – сказала она, уливаясь.
Борис вышел тихо в двери и пошел за Наташей, толстый мальчик сердито побежал за ними, как будто досадуя на расстройство, происшедшее в его занятиях.


Из молодежи, не считая старшей дочери графини (которая была четырьмя годами старше сестры и держала себя уже, как большая) и гостьи барышни, в гостиной остались Николай и Соня племянница. Соня была тоненькая, миниатюрненькая брюнетка с мягким, отененным длинными ресницами взглядом, густой черною косой, два раза обвившею ее голову, и желтоватым оттенком кожи на лице и в особенности на обнаженных худощавых, но грациозных мускулистых руках и шее. Плавностью движений, мягкостью и гибкостью маленьких членов и несколько хитрою и сдержанною манерой она напоминала красивого, но еще не сформировавшегося котенка, который будет прелестною кошечкой. Она, видимо, считала приличным выказывать улыбкой участие к общему разговору; но против воли ее глаза из под длинных густых ресниц смотрели на уезжавшего в армию cousin [двоюродного брата] с таким девическим страстным обожанием, что улыбка ее не могла ни на мгновение обмануть никого, и видно было, что кошечка присела только для того, чтоб еще энергичнее прыгнуть и заиграть с своим соusin, как скоро только они так же, как Борис с Наташей, выберутся из этой гостиной.
– Да, ma chere, – сказал старый граф, обращаясь к гостье и указывая на своего Николая. – Вот его друг Борис произведен в офицеры, и он из дружбы не хочет отставать от него; бросает и университет и меня старика: идет в военную службу, ma chere. А уж ему место в архиве было готово, и всё. Вот дружба то? – сказал граф вопросительно.
– Да ведь война, говорят, объявлена, – сказала гостья.
– Давно говорят, – сказал граф. – Опять поговорят, поговорят, да так и оставят. Ma chere, вот дружба то! – повторил он. – Он идет в гусары.
Гостья, не зная, что сказать, покачала головой.
– Совсем не из дружбы, – отвечал Николай, вспыхнув и отговариваясь как будто от постыдного на него наклепа. – Совсем не дружба, а просто чувствую призвание к военной службе.
Он оглянулся на кузину и на гостью барышню: обе смотрели на него с улыбкой одобрения.
– Нынче обедает у нас Шуберт, полковник Павлоградского гусарского полка. Он был в отпуску здесь и берет его с собой. Что делать? – сказал граф, пожимая плечами и говоря шуточно о деле, которое, видимо, стоило ему много горя.
– Я уж вам говорил, папенька, – сказал сын, – что ежели вам не хочется меня отпустить, я останусь. Но я знаю, что я никуда не гожусь, кроме как в военную службу; я не дипломат, не чиновник, не умею скрывать того, что чувствую, – говорил он, всё поглядывая с кокетством красивой молодости на Соню и гостью барышню.
Кошечка, впиваясь в него глазами, казалась каждую секунду готовою заиграть и выказать всю свою кошачью натуру.
– Ну, ну, хорошо! – сказал старый граф, – всё горячится. Всё Бонапарте всем голову вскружил; все думают, как это он из поручиков попал в императоры. Что ж, дай Бог, – прибавил он, не замечая насмешливой улыбки гостьи.
Большие заговорили о Бонапарте. Жюли, дочь Карагиной, обратилась к молодому Ростову:
– Как жаль, что вас не было в четверг у Архаровых. Мне скучно было без вас, – сказала она, нежно улыбаясь ему.
Польщенный молодой человек с кокетливой улыбкой молодости ближе пересел к ней и вступил с улыбающейся Жюли в отдельный разговор, совсем не замечая того, что эта его невольная улыбка ножом ревности резала сердце красневшей и притворно улыбавшейся Сони. – В середине разговора он оглянулся на нее. Соня страстно озлобленно взглянула на него и, едва удерживая на глазах слезы, а на губах притворную улыбку, встала и вышла из комнаты. Всё оживление Николая исчезло. Он выждал первый перерыв разговора и с расстроенным лицом вышел из комнаты отыскивать Соню.
– Как секреты то этой всей молодежи шиты белыми нитками! – сказала Анна Михайловна, указывая на выходящего Николая. – Cousinage dangereux voisinage, [Бедовое дело – двоюродные братцы и сестрицы,] – прибавила она.
– Да, – сказала графиня, после того как луч солнца, проникнувший в гостиную вместе с этим молодым поколением, исчез, и как будто отвечая на вопрос, которого никто ей не делал, но который постоянно занимал ее. – Сколько страданий, сколько беспокойств перенесено за то, чтобы теперь на них радоваться! А и теперь, право, больше страха, чем радости. Всё боишься, всё боишься! Именно тот возраст, в котором так много опасностей и для девочек и для мальчиков.
– Всё от воспитания зависит, – сказала гостья.
– Да, ваша правда, – продолжала графиня. – До сих пор я была, слава Богу, другом своих детей и пользуюсь полным их доверием, – говорила графиня, повторяя заблуждение многих родителей, полагающих, что у детей их нет тайн от них. – Я знаю, что я всегда буду первою confidente [поверенной] моих дочерей, и что Николенька, по своему пылкому характеру, ежели будет шалить (мальчику нельзя без этого), то всё не так, как эти петербургские господа.
– Да, славные, славные ребята, – подтвердил граф, всегда разрешавший запутанные для него вопросы тем, что всё находил славным. – Вот подите, захотел в гусары! Да вот что вы хотите, ma chere!
– Какое милое существо ваша меньшая, – сказала гостья. – Порох!
– Да, порох, – сказал граф. – В меня пошла! И какой голос: хоть и моя дочь, а я правду скажу, певица будет, Саломони другая. Мы взяли итальянца ее учить.
– Не рано ли? Говорят, вредно для голоса учиться в эту пору.
– О, нет, какой рано! – сказал граф. – Как же наши матери выходили в двенадцать тринадцать лет замуж?
– Уж она и теперь влюблена в Бориса! Какова? – сказала графиня, тихо улыбаясь, глядя на мать Бориса, и, видимо отвечая на мысль, всегда ее занимавшую, продолжала. – Ну, вот видите, держи я ее строго, запрещай я ей… Бог знает, что бы они делали потихоньку (графиня разумела: они целовались бы), а теперь я знаю каждое ее слово. Она сама вечером прибежит и всё мне расскажет. Может быть, я балую ее; но, право, это, кажется, лучше. Я старшую держала строго.
– Да, меня совсем иначе воспитывали, – сказала старшая, красивая графиня Вера, улыбаясь.
Но улыбка не украсила лица Веры, как это обыкновенно бывает; напротив, лицо ее стало неестественно и оттого неприятно.
Старшая, Вера, была хороша, была неглупа, училась прекрасно, была хорошо воспитана, голос у нее был приятный, то, что она сказала, было справедливо и уместно; но, странное дело, все, и гостья и графиня, оглянулись на нее, как будто удивились, зачем она это сказала, и почувствовали неловкость.
– Всегда с старшими детьми мудрят, хотят сделать что нибудь необыкновенное, – сказала гостья.
– Что греха таить, ma chere! Графинюшка мудрила с Верой, – сказал граф. – Ну, да что ж! всё таки славная вышла, – прибавил он, одобрительно подмигивая Вере.
Гостьи встали и уехали, обещаясь приехать к обеду.
– Что за манера! Уж сидели, сидели! – сказала графиня, проводя гостей.


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


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