Лисп

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

мультипарадигмальный: объектно-ориентированное, функциональное, процедурное программирование

Появился в:

1958

Автор:

Джон Маккарти

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

сильная, динамическая

Диалекты:

Common Lisp (CLOS), Scheme, Arc, Clojure
языки расширения: AutoLisp и ELisp

Повлиял на:

Io, Nemerle, Python, Ruby, Smalltalk, Лого, Factor, Perl

Лисп (LISP, от англ. LISt Processing language — «язык обработки списков»; современное написание: Lisp) — семейство языков программирования, программы и данные в которых представляются системами линейных списков символов. Создатель Лиспа Джон Маккарти занимался исследованиями в области искусственного интеллекта (в дальнейшем ИИ) и созданный им язык по сию пору является одним из основных средств моделирования различных аспектов ИИ.

Это один из старейших (наряду с Фортраном и Коболом) используемых по сей день высокоуровневых языков программирования[1], а также первый из сохранившихся в использовании языков, использующих автоматическое управление памятью и сборку мусора[2].

Традиционный Лисп имеет динамическую систему типов. Язык является функциональным, но начиная уже с ранних версий обладает также чертами императивности, к тому же, имея полноценные средства символьной обработки, позволяет реализовать объектно-ориентированность; примером такой реализации является платформа CLOS.

Является языком системного программирования для так называемых лисп-машин, производившихся в 1980-е годы, например, фирмой Symbolics[en].

Наряду с языком Ада, Лисп прошёл процесс фундаментальной стандартизации для использования в военном деле и промышленности, в результате чего появился стандарт Common Lisp. Его реализации существуют для большинства платформ.





Архитектура и синтаксис

Основные элементы языка

Базовыми элементами языка являются символы, атомы и построенные из них динамические списочные структуры — S-выражения.

Символ в Лиспе — это объект в машинной памяти, представляющий собой совокупность «слотов» — ячеек, хранящих ссылки. Часть слотов имеет изначально определённое языком назначение:

  • Имя — строка знаков, по которой программа может ссылаться на данный символ (основополагающее аристотелево А=А, из которого вырастает лямбда-исчисление).
  • Функциональный слот — лямбда-выражение, связанное с символом. Когда обращение к символу в программе синтаксически соответствует вызову функции, в результате вычисляется лямбда-выражение, связанное с символом.
  • Значение — объект в машинной памяти, который можно трактовать как данные. Когда программа обращается к символу как переменной, она получает значение данного слота.
  • Прочие системные слоты, определяемые реализацией.

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

Атомы — это символы и числа. Числа не являются лисповскими символами, поскольку могут иметь только собственное числовое значение и никакого другого. В то же время числа наравне с символами могут входить в списки. Этим и обусловлено объединение этих двух понятий в одну общую категорию.

Основная структура данных Лиспа — динамический список атомов, определяемый рекурсивно как головной объект и присоединённый к нему список-хвост. Поскольку голова списка тоже может быть списком, список, фактически, является формой представления произвольного дерева (сам список верхнего уровня — корень, входящие в него подсписки второго и следующих уровней — узлы, атомы — листья). Для атомов и списков язык использует крайне примитивный скобочный синтаксис: символ представляется своим именем, число — записью его значения, а список — в виде заключённой в круглые скобки последовательности списков и атомов, в которой идущие подряд атомы при необходимости разделены пробелами.

Список является последовательностью элементов любого рода, в том числе других списков. Например, (1 3/7 'foo #'+) состоит из целого числа, рациональной дроби, символа foo и указателя на функцию сложения. Выражения представляются списками в префиксной записи: первый элемент должен быть формой, то есть функцией, оператором, макросом или специальным оператором; прочие элементы — аргументы этой формы, передаваемые форме для обработки. Арифметические операторы записываются по тому же принципу, например (+ 4 (* 2 3)) выдаёт 10 (в инфиксной записи это 2 * 3 + 4).

Синтаксис в форме Бэкуса — Наура:

s_expression ::= atomic_symbol | "(" s_expression "." s_expression ")" | list 
list ::= "(" s_expression { s_expression } ")" 
atomic_symbol ::= letter atom_part 
atom_part ::= empty | letter atom_part | number atom_part 
letter ::= "a" | "b" | " ..." | "z" 
number ::= "1" | "2" | " ..." | "9" 
empty ::= " "

Характерная особенность программы на Лиспе состоит в том, что абсолютно всё, и данные, и код любой сложности описывается в этом примитивном синтаксисе. Результатов такого подхода два:

  • Внешне лисп-программа выглядит как гигантское нагромождение скобок. Имеющиеся в любой современной системе средства форматированного вывода, позволяющие отобразить список так, чтобы была видна его структура, несколько исправляют ситуацию, но в целом для восприятия лисп-программ «на глаз» требуется определённый навык. Впрочем, редактирование программ значительно упрощается использованием текстового редактора, поддерживающего автоматическое выравнивание кода, подсветку соответствующих пар скобок и такие специальные команды, как «закрыть все открытые скобки», «перейти через список вправо» и т. д.[3]
  • Первичный синтаксический разбор лисп-программы и обрабатываемых ею данных может выполняться одним и тем же простейшим кодом, данные могут без каких-либо трудностей обрабатываться в качестве программы, а программа — в качестве данных. Вследствие этого Лисп позволяет легко создавать мощные программы, динамически порождающие код. Лисп-машина способна воспринимать каждый поступающий на неё список на самом абстрактном уровне, например как мета-лисп-машину, модифицирующую воспринимающую машину. В такой динамичной, высокоабстрактной среде можно реализовать как строго научные системы, так и неисчислимое множество программистских трюков и генераторов всевозможных машин.

Любая программа на языке Лисп состоит из последовательности выражений (форм). Результат работы программы состоит в вычислении этих выражений. Все выражения записываются в виде списков — одной из основных структур Лиспа, поэтому они могут легко быть созданы посредством самого языка. Это позволяет создавать программы, изменяющие другие программы или макросы, позволяющие существенно расширить возможности языка.

Базовые символы, операторы и функции

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

T и NIL
Встроенные символы-константы Лиспа, обозначающие логическую истинность и ложность соответственно. Значения T и NIL возвращают логические операторы и операторы и функции сравнения.
Помимо этого у символа NIL есть ещё одно значение — он может обозначать пустой список.
LIST
Эта функция возвращает список своих аргументов:
(list 1 3/7 'foo) ==>> (1 3/7 'foo)
(здесь и далее в примерах ==>> означает, что в результате вычисления левой части интерпретатор Лиспа выдаёт то, что находится справа)
Если аргументов нет, возвращается пустой список:
(list) ==>> NIL
Если некоторые элементы являются выражениями, то сначала вычисляется их значение:
(list 1 2 (list 1 2)) ==>> (1 2 (1 2)).
QUOTE
Системный оператор QUOTE подавляет вычисление своего аргумента. Если он не используется, то интерпретатор Лиспа, получив на входе список или символ, пытается его вычислить: для символа возвращается его значение, для списка — результат вызова функции, имя которой находится в голове списка, с параметрами — хвостом списка. Если же нужно, чтобы интерпретатор не вычислял значения, а взял символ или список «как есть», к нему применяют QUOTE.
(LIST 1 2 (QUOTE(LIST 1 2))) ==>> (1 2 (LIST 1 2))
(QUOTE (list 1 2 (list 1 2))) ==>> (LIST 1 2 (LIST 1 2))
Поскольку подавление вычислений — очень частая операция, имеется сокращающий её запись синтаксический сахар — вместо полной формы вызова QUOTE можно просто поставить перед выражением апостроф:
(LIST 1 2 '(LIST 1 2)) ==>> (1 2 (LIST 1 2)).
EVAL
Эта функция, по сути, и есть интерпретатор Лиспа. Являясь противоположностью QUOTE, она вычисляет значение своего аргумента.
(EVAL '(LIST 1 2 '(LIST 1 2))) ==>> (1 2 (LIST 1 2))
(EVAL '(LIST 1 2 (EVAL'(LIST 1 2)))) ==>> (1 2 (1 2))
Возможность прямого и непосредственного вызова интерпретатора вкупе с идентичностью структуры программы и данных позволяет без каких-либо ограничений порождать и непосредственно исполнять в системе любые лисп-программы.
CAR
Возвращает голову списка:
(CAR '(A B C D)) ==>> A
(CAR '((A B)(C D))) ==>> (A B)
Специальный случай:
(CAR NIL) ==>> NIL
Формально в чистом функциональном программировании значение головы пустого списка является неопределённым, но в Лиспе (по крайней мере, в большинстве диалектов) принято соглашение, по которому и голова, и хвост пустого списка равны NIL.
CDR
Возвращает хвост списка:
(CDR '(A B C D)) ==>> (B C D)
(CDR '((A B)(C D))) ==>> ((C D))
Следует обратить внимание, что в последнем случае возвращается список в списке: хвост аргумента является списком из одного элемента, который, в свою очередь, сам является списком из двух элементов.
(CDR NIL) ==>> NIL
C*R
Здесь на месте звёздочки «*» в имени функци может стоять от 2 до 4 букв «A» и «D» в любых комбинациях. То есть возможны функции CDDDDR, CADAR, CADDR и так далее. Вызов такой функции эквивалентен вложенному вызову соответствующего набора функций CAR и CDR, например, (CADAR '((A B C) D E F)) соответствует (CAR (CDR (CAR '((A B C) D E F)))) и вернёт значение «B». Необходимость в подобных странных функциях связана с часто повторяющейся задачей: извлечь из списка определённый элемент, положение которого известно.
CONS
Принимает в качестве аргумента голову и хвост и создаёт из них список или точечную пару, если аргументы являются атомами:
(CONS 'A '(B C D)) ==>> (A B C D) — присоединение атома к списку;
(CONS '(A B) '((C D))) ==>> ((A B) (C D)) — добавление списка к голове другого списка;
(CONS 'A 'B) ==>> (A . B) — создание точечной пары из двух атомов.
COND
Обобщённая условная конструкция. Имеет вид:
(COND ((Условие1)(Выражение1)) ((Условие2)(Выражение2)) …)
Последовательно вычисляются Условие1, Условие2 и так далее до тех пор, пока очередное УсловиеN не окажется истинным (станет иметь значение T). Тогда будет выполнено соответствующее ВыражениеN и его значение будет возвращено в качестве значения вызова COND. Если истинного условия не будет найдено, COND вернёт значение NIL. Обычной практикой является ставить в качестве последнего условия в COND значение T, гарантируя тем самым, что при невыполнении всех остальных условий будет вычислено последнее из выражений; так создаётся аналог ветви ELSE условных операторов императивных языков программирования.
DEFUN
Конструкция, позволяющая определить функцию. Общий (упрощённый) формат определения следующий:
(DEFUN Имя (Параметр1 Параметр2 …) Выражение1 Выражение2 …)
Здесь Имя — имя функции. Соответствующий символ, если его ещё нет, будет создан в системе и в его функциональный слот запишется определение функции. В дальнейшем интерпретатор Лиспа, встретив Имя в голове вычисляемого списка, интерпретирует его как вызов данной функции с перечисленными в хвосте параметрами. Параметр1 и так далее — имена формальных параметров функции.
Последовательность Выражение1, Выражение2 и так далее — это последовательность вычислимых выражений, в которых могут использоваться Параметры и глобальные переменные системы. При вызове функции Выражения вычисляются последовательно и в качестве значения функции будет возвращено значение, вычисленное последним по порядку выражением.

Специальные операторы позволяют управлять последовательностью вычислений. С их помощью реализуются ветвления и циклы. Оператор if позволяет вычислить одно из двух выражений в зависимости от выполнения условия, которое тоже является выражением. Если его результат не ЛОЖЬ (не nil), то вычисляется первый аргумент, иначе — второй. Например, (if nil (list 1 2 "foo") (list 3 4 "bar")) всегда возвращает (3 4 "bar").

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

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

Функциональное программирование

Функциональная парадигма является для Лиспа «родной», поскольку основой архитектуры его является лямбда-исчисление Чёрча. Собственно, именно с Лиспа началось функциональное программирование как практическая методология разработки программного обеспечения. Лямбда-выражения являются в Лиспе полноправными языковыми объектами, допускающими не только непосредственный вызов, но и присваивание, сохранение в качестве значения символа, передачу в качестве параметра вызова и возврат в качестве результата. Таким образом, Лисп поддерживает функционалы, то есть функции, принимающие в качестве параметров и возвращающие в результате другие функции.

В разных диалектах Лиспа подход к характеру функций как языковых объектов несколько различается. В Common Lisp функция и лямбда-выражение представляют собой отдельную категорию программных объектов, для которых существуют специфические правила и ограничения; в частности, это выражается в том, что у символа имеются раздельные слоты для значения и для функции, связанной с этим символом, и в этом смысле функция — это не вполне то же самое, что элемент данных. В других диалектах, таких как T-Lisp или Scheme, функции являются так называемыми «полноправными гражданами» — могут без ограничений присваиваться переменным, передаваться в качестве параметров вызова и возвращаться как результаты вызова.

Современный стандарт Лиспа — Common Lisp, — вызывает нарекания сторонников «чистого» функционального программирования тем, что не все его функциональные средства являются теоретически «чистыми». Это действительно так, поскольку Common Lisp разрабатывался как универсальный промышленный язык, и в ряде случаев соображениям практической целесообразности сознательно отдавалось предпочтение перед соображениями теоретической чистоты. Тем не менее, Лисп был и остаётся функциональным языком программирования.

Императивное (операторное) программирование

Исходно в синтаксис Лиспа заложена возможность описания алгоритмов путём перечисления последовательности требуемых действий. Она заключается в так называемом «неявном PROGN», поддерживаемом в структуре лямбда-вызовов Лиспа: в том месте, где должна размещаться команда, составляющая основу лямбда-выражения, может быть записано не одна, а несколько команд, и результатом лямбда-вызова станет результат последней из них. Таким образом, Лисп поддерживает неявное последовательное исполнение операций. Помимо неявного PROGN, поддерживаются явные императивные механизмы императивного программирования:

  • Конструкции PROG1 и PROGN — обеспечивают выполнение команд последовательно.
  • LET — позволяет задать локальные переменные блока и выполнить с ними последовательные операции.
  • Все виды циклов.
  • Конструкции присваивания SET, SETF, SETQ, выполняющие присваивания.
  • Ряд системных структуроразрушающих функций (выполняющих операции с данными «на том же месте»).

В Common Lisp особое место занимает системный макрос LOOP. Он позволяет создать в лисп-программе фрагмент, написанный на языке программирования с привычной императивной структурой и инфиксной записью операторов.

Макропрограммирование

Простейшим средством макропрограммирования, доступным в любой реализации Лиспа, является возможность непосредственного вызова интерпретатора (функции EVAL) с передачей ему любой списочной структуры в качестве программы. Это позволяет программе верхнего уровня выступить в качестве макрогенератора, то есть сформировать исполняемый код, который будет впоследствии исполнен. Однако эта возможность используется редко из-за своей громоздкости. Гораздо чаще используется система макросов Лиспа.

Современные варианты Лиспа, в том числе стандарт Common Lisp, обладают развитыми возможностями создания и использования макросов. Описание макроса в Лиспе синтаксически подобно описанию функции (разница состоит только в использовании ключевого слова defmacro вместо defun в описании), но поведение макроса существенно отличается: каждый вызов макроса «раскрывается» в момент трансляции программы, порождая код, который на этапе исполнения выполняется так, как будто был непосредственно написан в месте вызова. Ещё одним отличием макросов от обычных функций является то, что их аргументы по умолчанию не вычисляются. Кроме того, ряд реализаций Лиспа поддерживает создание так называемых «макросов чтения» — макросов, непосредственно преобразующих текст программы. Макросы позволяют прозрачно определять новые языковые конструкции и даже дополнять синтаксис языка. Последняя возможность активно используется при реализации на Лиспе исходно не поддерживаемых в нём методов и средств программирования.

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

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

Лисп, благодаря наличию в языке свойств (слотов) у символов изначально поддерживает инкапсуляцию. Функциональные свойства Лиспа (поддержка функционалов, присваивание функций переменным и сохранение их в свойствах символов) дают возможность связывать код (методы) с данными (объектами). Наконец, динамический характер языка в сочетании с вышеперечисленными особенностями обеспечивает полиморфное поведение коду и данным в лисп-программе. Единственный компонент ООП-системы, которого нет в базовом Лиспе — наследование, но и оно реализуется без всяких затруднений. Таким образом, Лисп изначально содержит в себе все элементы, на которых базируется технология ООП, и реализация поддержки этой технологии в языке сводится, по сути, лишь к созданию соответствующих синтаксических средств. Благодаря развитому механизму макроописаний ООП-синтаксис в Лисп может быть добавлен средствами самого языка, без необходимости расширения базового синтаксиса и модификации трансляторов. Простой и элегантный пример создания собственной ООП-подсистемы в Лиспе можно найти в книге Пола Грэма «ANSI Common Lisp».

Среди промышленных известных объектно-ориентированных расширений Лиспа прежде всего следует назвать объектную подсистему Flavors, которая была включена в состав системы Зеталисп. Эта подсистема обеспечивала объявление классов (flavors — «ароматов»), единичное и множественное наследование, полиморфные методы классов, Smaltalk-подобную систему взаимодействия объектов путём передачи сообщений (фактически реализованную как вызов методов объекта). Другим примером может служить LOOPS (Lisp Object-Oriented Programming System) — объектная подсистема, реализованная в 1983 году в диалекте Интерлисп.

Объектная система CLOS (Common Lisp Object System), первоначально созданная в дополнение к Common Lisp, а позже вошедшая в стандарт языка, подобна Flavors и поддерживает принципиально тот же набор возможностей, стандартный для почти любого современного объектно-ориентированного языка. Применение объектно-ориентированного программирования в Лиспе, в основном, связано с решением задач моделирования и/или управления, которые по своему характеру удачно совмещаются с объектно-ориентированной технологией. Например, одним из первых приложений системы Flavors было взаимодействие с многооконным интерфейсом пользователя, который как раз удобно моделировать в виде набора объектов, обменивающихся сообщениями.

История

Предпосылки

Автором Лиспа является Джон Маккарти, на период создания языка работавший в Массачусетском технологическом институте (MIT) в должности профессора по связи. Вместе с Марвином Мински он занимался работами по искусственному интеллекту, в связи с чем и возникла потребность в создании языка программирования, адекватного задачам, решаемым в этой области. Работа по созданию языка была проделана Маккарти в MIT в период с 1958 по 1963 год, после чего он перешёл в Стенфордский университет в Калифорнии, где получил должность «профессор по искусственному интеллекту».

Основой для Лиспа послужил ранний язык IPL, разработанный Ньюэллом, Шоу и Саймоном. IPL был языком обработки списков и предназначался для реализации проекта «Логик-теоретик» — системы искусственного интеллекта, предназначенной для автоматического вывода теорем математической логики. IPL был довольно низкоуровневым языком, но в нём уже были реализованы такие базовые идеи, как единый механизм хранения программ и данных в виде списков — иерархических структур элементов, связанных ссылками (сама идея списочного представления знаний была позаимствована из исследований по психологии и ассоциативной памяти), а также идея динамического распределения памяти. После ознакомления в 1956 году с IPL у Маккарти появилась идея реализовать обработку IPL-списков в Фортране, который как раз в это время проектировался в IBM (причём под ту же систему IBM 704, с которой Маккарти работал в MIT), но эта идея так и не была реализована. Позже Маккарти принял участие в работе «комитета по языку высокого уровня», разрабатывавшему Алгол, но и там его предложения были встречены холодно. В результате Маккарти пришёл к мысли о необходимости создания нового языка программирования.

Первоначально Маккарти сформулировал списочный формализм для описания данных (S-выражения) и основанный на нём же механизм описания лямбда-выражений, что позволило записывать программы в виде наборов функций, представленных в списочной форме. Как писал позже Маккарти, изначально он планировал применять для записи программ отдельный формализм, отличающийся от S-выражений, но это оказалось излишним. Когда с помощью своей списочной записи Маккарти описал алгоритм функционирования интерпретатора нового языка (формализм, который впоследствии стал известен как «Лисп на Лиспе»), Стив Рассел заметил, что теперь для создания реального работающего интерпретатора достаточно просто перевести эту запись в машинный код. Маккарти отнёсся к этой идее скептически, но Рассел действительно проделал данную работу и получил первый интерпретатор Лиспа для компьютера IBM 704. В дальнейшем идея написания транслятора языка на нём самом многократно использовалась, и не только в функциональных и логических языках, но и в императивных.

Первые реализации

Исторически первой реализацией Лиспа, включающей все современные базовые элементы языка, был интерпретатор, работавший на IBM 704, появившийся в октябре 1958 года. Это, кстати, позволяет говорить о Лиспе как об одном из двух старейших языков высокого уровня, которые находятся в употреблении с момента создания до настоящего времени (первый — Фортран). Помимо этого, Лисп сохранил первенство ещё в одном отношении. Дело в том, что активная работа с динамическими списками сделала невозможным ручное управление памятью, которое в императивных языках отчасти сохраняется по сей день. Создание новых списочных ячеек и списков и выход из использования имеющихся при работе лисп-программы происходят настолько активно, что практически невозможно обойтись без системы автоматического управления памятью, которая контролировала бы использование ранее созданных в памяти объектов и периодически удаляла те из них, использование которых прекратилось, то есть системы сборки мусора. Маккарти пришлось реализовать эту систему, благодаря чему Лисп, помимо прочего, является ещё и самым старым из применяемых сегодня языков программирования с автоматическим управлением памятью и сборкой мусора.

Позднее были созданы реализации для IBM 7090, в дальнейшем — для серий IBM 360 и 370. Компьютеры IBM оказались неудобны для работы в интерактивном режиме, вследствие чего в конце 1950-х годов небольшая группа разработчиков, в том числе работавших ранее в IBM, выделилась в самостоятельную компанию Digital Equipment Corporation (DEC). Первым её изделием стал компьютер PDP-1, изначально ориентированный на интерактивный режим работы. На этой машине в 1960 году была реализована интерактивная система «Lisp 1», включающая в себя интегрированные интерпретатор, редактор исходного кода и отладчик, позволявшая выполнять весь цикл работ над программой непосредственно в системе. По сути, это была первая «среда программирования» в том смысле, который вкладывается в это понятие сейчас. Тогда же в журнале «Communications of ACM» вышла статья Маккарти «Recursive Functions of Symbolic Expressions and their Computation by Machine.», в которой Лисп был описан в виде алгебраического формализма на самом Лиспе. Статья стала классической, а формализм типа «Лисп на Лиспе» с тех пор стал одним из наиболее употребимых в литературе по теории программирования. Ещё одним технологическим новшеством, появившимся в связи с реализацией системы «Lisp 1» был изобретённый Маккарти механизм, позволявший запускать интерпретатор Лиспа одновременно с выполнением обычных вычислительных работ в пакетном режиме (то, что сейчас известно как «система разделения времени»).

К 1962 году была готова следующая версия оригинальной лисп-системы «Lisp 1.5», в которой были устранены обнаруженные за время эксплуатации недостатки первой версии. Её описание было выпущено в издательстве «MIT Press» в виде отдельной книги[4]. Поскольку руководство включало описание реализации системы, оно стало основой для создания лисп-систем для множества других компьютеров как в США, так и за её пределами.

Основные диалекты

Несмотря на использование, подчас весьма активное, Лиспа в европейских и азиатских странах и создание там собственных лисп-систем, большинство распространённых диалектов Лиспа происходят из США.

MacLisp

С начала 1960-х годов в MIT был запущен проект MAC, в рамках которого велись исследования использования вычислительных машин в интерактивном режиме и разработка подходящих для такой работы языков программирования и операционных систем. MacLisp (далее Маклисп) был разработан в рамках этого проекта, основой для него стала система Lisp 1.5. В 1964 году была создана первая реализация Маклиспа для PDP-6, в 1968 — для PDP-10, причём последняя работала как под управлением операционной системы ITS, разработанной в лаборатории искусственного интеллекта MIT, так и под ОС TOPS-10/20 — стандартной ОС для PDP-10/20 фирмы DEC. Также была создана реализация для компьютера GE-600, работавшая под управлением ОС Multics.

Маклисп был чрезвычайно мощной для своего времени системой. На её облике отразилось всё многообразие задач, которые решались в проекте MAC и вообще в исследованиях по искусственному интеллекту в MIT. Помимо традиционных задач символьной обработки, Маклисп использовался для разработок в самых разных областях. Так, работы в области робототехники и обработки речи и изображений потребовали от системы высокой чисто вычислительной эффективности, а также привели к реализации широкого набора математических типов данных, в том числе векторов, матриц и битовых полей. В систему были включены арифметические типы и операции с неограниченной точностью (базирующиеся на алгоритмах, разработанных Д. Кнутом), позволяющие в ряде случаев существенно упростить решение некоторых математических задач, пусть и за счёт значительных вычислительных затрат. Была реализована мощная библиотека математических функций.

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

Маклисп стал первой лисп-системой, для которой был реализован высокоэффективный компилятор (до этого лисп-системы не могли похвастаться высокой вычислительной производительностью и отчасти по этой причине сформировалось отношение к Лиспу как к «языку для учёных, а не для промышленности»). Причём эффективность трансляции была достигнута за счёт применения специфически лисповских методов: исходная программа транслировалась в промежуточную машинно-ориентированную форму, имеющую вид лисповских списков (так называемая LAP — List Assembly Program). Машинный код в этой форме путём формальных преобразований подвергался оптимизации, в результате которой результирующая объектная программа для вычислительных задач оказывалась, как правило, более эффективна, чем аналогичная программа на Фортране, оттранслированная лучшими фортрановскими компиляторами для той же платформы.

Исторически наиболее известные результаты проекта MAC — это система символьных вычислений Macsyma и текстовый редактор Emacs. Macsyma — мощная система символических вычислений, по сути — пионер в этой области компьютерных систем, разработка её велась в MIT с 1968 по 1982 год. Система была целиком написана на Маклиспе и была, по всей видимости, самой большой широко известной программой в мире, целиком написанной на Лиспе. Именно перенос Macsyma на другие аппаратные и программные платформы стал тем мотивом, который вызвал появление нескольких диалектов Лиспа.

Emacs изначально был написанным целиком на Маклиспе полноэкранным текстовым редактором, являющимся как частью среды разработки Маклиспа, так и используемым отдельно от неё, зачастую для целей, не имеющих ничего общего с программированием. Отличительной особенностью его была возможность программирования поведения редактора и добавления в него новой функциональности путём написания соответствующего кода на внутреннем языке, которым стал Emacs Lisp. Фактически ядро редактора представляет собой интерпретатор Emacs Lisp, и некоторый набор системно-зависимых сервисов. Основная часть редактора написана на самом Emacs Lisp. Впоследствии, при переносе Emacs на микрокомпьютеры, ядро было переписано на C (из соображений эффективности — на тот момент не существовало эффективных реализаций Лиспа для ПК), но в остальном редактор остался прежним и продолжил развиваться в том же направлении, приобретя со временем огромное количество написанных на Emacs Lisp дополнений, расширивших его функциональность до огромных размеров, что стало поводом для шутки: «Emacs — отличная операционная система, которой не хватает только приличного текстового редактора».

Система MAC Lisp эксплуатировалась и развивалась вплоть до 1980-х годов, оказав существенное влияние на появлявшиеся в 1960—1980 годах реализации Лиспа, в том числе став одним из источников проектирования стандарта Common Lisp. Эксплуатация системы практически прекратилась в 1980-х годах вместе с прекращением использования компьютеров PDP-10/20, на которых она изначально базировалась. Намного пережили систему разработанные на Маклиспе и уже упоминавшиеся Macsyma и Emacs.

Interlisp

Разработкой лисп-систем в середине 1960-х годов занимались многие компании и исследовательские центры в США. Интерлисп (Interlisp) стал результатом объединения усилий BBN (Bolt, Beranek and Newman Inc.), SDS (Scientific Data Systems) и Xerox. Исследовательский центр BBN в 1966 году приступил к созданию своей реализации Лиспа, ориентированной на компьютеры PDP-10 и SDS-930. Версия BBN-Lisp для PDP использовала аппаратный механизм страничной организации памяти и переключения контекста, созданный специально для обеспечения высокоэффективного разделения времени. BBN-Lisp стал популярен среди исследователей в области искусственного интеллекта и во многом способствовал тому, что именно машины PDP-10/20 вплоть до 1980-х годов оставались основными инструментами в работах по ИИ. В начале 1970-х корпорация Xerox купила обанкротившуюся SDS и начала сотрудничать с BBN. Несмотря на то, что машины SDS не имели большого коммерческого успеха, реализация Лиспа от BBN была достаточно перспективной, чтобы Xerox поддержала её дальнейшую разработку, в результате чего BBN-Lisp превратился в Interlisp (Интерлисп).

А в 1974 году в Xerox началась разработка персональной рабочей станции Alto, исходно ориентированной на Лисп. В этой системе впервые была произведена разработка аппаратуры и системы машинных команд под конкретный язык программирования. На основе Интерлиспа была создана упрощённая версия системы Interlisp-D, предназначенная для лисп-машин серии 1100 («потомков» станции Alto). В этих машинах был впервые реализован многооконный графический интерфейс пользователя, использована графика с высокой разрешающей способностью и применён манипулятор «мышь».

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

Что же касается собственно языка, то можно заметить, что диалект со всеми его характерными особенностями был зафиксирован уже в середине-конце 1970-х годов, после чего кардинальных изменений в язык не вносилось. Это привело к некоторому отставанию системы от более новых разработок в части функциональности и к фиксации некоторых устаревших проектных решений. Вследствие этого уже к началу 1980-х Интерлисп испытывал трудности как с совместимостью с новыми системами, так и с дальнейшим расширением. Наиболее существенные недостатки Интерлиспа — отсутствие иерархии типов данных, объектов и замыканий (впрочем, в 1983 году в Интерлиспе была реализована объектная система LOOPS, дающая возможности объектно-ориентированного программирования). Более существенно то, что Интерлисп базируется на динамическом связывании, тогда как все новые версии Лиспа — статические.

PSL

Лисп попал в Калифорнию вместе с Маккарти, перешедшим в Стенфорд в 1963 году. За следующие несколько лет были разработаны системы Lisp 1.6 (прямой потомок «классического» Lisp 1.5), UCI Lisp (University of California, Irvine) и Stanford Lisp/360. Оттуда вместе с Энтони Хёрном Лисп попал в в Университет штата Юта, где занималась исследованиями в области символьной математики в приложениях теоретической физики. Хёрн предложил решать эти задачи с помощью Лиспа, в результате чего в 1968 году была создана система компьютерной алгебры Reduce.

Хёрн в 1966 году опубликовал спецификацию Standard Lisp, которую предлагал в качестве основы для стандартизации языка. Предложение его не встретило поддержки, так как не было одобрено исследователями искусственного интеллекта, указавшими на ряд нежелательных для них особенностей предлагаемого стандарта, в частности, излишнюю привязку к типам. Тем не менее, на основе данной спецификации в Юте был реализован Portable Standard Lisp — PSL. Эта реализация была использована для развития Reduce и переноса её на различные аппаратные платформы. Специально для улучшения переносимости в PSL был включён сокращённый набор системных функций и структур. Реализация была основана на промежуточном низкоуровневом лисп-подобном языке SYSLisp; ядро PSL было написано на SYSLisp, а вся остальная часть системы — на самом PSL. Для PDP-10 был реализован транслятор SYSLisp и написанный на том же SYSLisp кросс-компилятор, с помощью которого ядро PSL можно было перенести на любую другую аппаратуру. С помощью этой технологии PSL и Reduce были реализованы на целом ряде платформ, в том числе на DEC-10/20, VAX/UNIX, HP9000, Apollo, Wicat, IBM, Cray.

Таким образом, PSL стал одним из первых примеров реализации техники «раскрутки» при переносе программных систем на новую архитектуру, когда для переноса системы ядро изначально пишется на машинно-независимом промежуточном языке, для которого, в свою очередь, создаются реализации на всех целевых платформах. Дальнейшее сопровождение PSL осуществлялось исследовательским центром фирмы Hewlett-Packard в Калифорнии.

Franz Lisp

Мотивом для создания в конце 1970-х годов системы Franz Lisp послужило желание получить лисп-систему для новых компьютеров VAX, чтобы обеспечить выполнение на них системы Macsyma и другого написанного на Лиспе программного обеспечения. Поскольку основной целью был перенос Macsyma, за основу был взят MACLisp, однако из языка были исключены некоторые устаревшие особенности и добавлены новые механизмы, заимствованные из разрабатываемого в то время в том же MIT Zetalisp. Наиболее значительный вклад в создание данного диалекта внесли Университет Беркли, Университет Пенсильвания, Bell Labs, Ливерморская национальная лаборатория и Университет Карнеги-Меллона. Одним из основных вдохновителей проекта был профессор Университета Беркли Ричард Фэйтман, ранее работавший в MIT и участвовавший в разработке оригинальной системы Macsyma. В числе создателей Franz Lisp было несколько его учеников. Название системы было выбрано в честь известного венгерского композитора Ференца Листа (английское написание: Franz Liszt).

Система была реализована в 1981 году на C для VAX 780/11 под управлением ОС UNIX. Входящий в состав системы компилятор носил имя «Liszt» — фамилии композитора, давшего имя диалекту. В 1982 году система была портирована на процессор Motorola 68000, затем ещё на ряд 32-разрядных персональных платформ, в результате она стала наиболее широко используемой версией Лиспа как для 32-разрядных систем с разделением времени, так и для 32-битовых мини-ЭВМ и персональных рабочих станций.

Система Franz Lisp распространялась бесплатно под лицензией BSD, но аспирант Университета Беркли Фридрих Кунце подал идею создания коммерческой компании, которая бы обеспечивала качественную платную поддержку пользователей и выполняла заказы по портированию Franz Lisp на новые аппаратные и программные платформы. Это было время активного роста компьютерного рынка и перспективы выглядели неплохо. Компания была зарегистрирована в 1984 году и получила название «Franz Inc». Начало деятельности фирмы было достаточно удачным, ей удалось получить контракт на портирование Franz Lisp на платформу Sun, а позже — ещё несколько аналогичных предложений. Однако в 1985 году под давлением Министерства обороны США американское лисп-сообщество начало активную переориентацию на новый диалект — Common Lisp, создание которого в это время завершалось. В этих условиях Franz Inc. не могла найти новых контрактов, оказалась на грани закрытия и была вынуждена перейти к разработке собственной реализации Common Lisp — Allegro Common Lisp (название было выбрано, чтобы сохранить преемственность «музыкальной» темы). История Franz Lisp на этом, фактически, завершилась. В настоящее время оригинальная система полностью вышла из употребления.

Scheme

Язык Scheme был разработан в 1976 году в MIT в рамках проекта по созданию лисп-машины — персональной рабочей станции, разработанной полностью, начиная с аппаратуры, в расчёте на максимально эффективное использование языка Лисп. Исходно Scheme был всего лишь «исследовательским языком», в ходе разработки которого опробовались различные идеи и методы. Ставилась цель обеспечить минимальный набор базовых возможностей, который обеспечивал бы построение полноценной лисп-системы путём надстраивания этого набора.

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

Характерное синтаксическое отличие Scheme от большинства диалектов Лиспа — немного другая форма определения функции. Если в большинстве диалектов используется вариант: (DEFUN ИмяФункции (Аргументы) Выражения), то в Scheme сокращённая форма определения выглядит как (DEFINE (ИмяФункции Аргументы) (Выражения)). (Различается ключевое слово и взаимное расположение имени функции и аргументов).

Scheme — единственный диалект Лиспа (не считая встроенных вариантов, таких как Emacs Lisp или AutoLISP), который продолжает использоваться после повсеместного перехода лисп-сообщества на стандартизованный Common Lisp. В настоящее время существует несколько поддерживаемых реализаций Scheme, в том числе свободных, есть примеры использования этого языка и в качестве встроенного (например, используемый в качестве средства создания скриптов GIMP Tiny-Scheme). В нескольких американских университетах Scheme используется как язык для базового обучения программированию.

Zetalisp

Zetalisp или «Lisp Machine Lisp» был создан в MIT во второй половине 1970-х годов в рамках проекта лисп-машины, профинансированного американским оборонным агентством DARPA.

Со стороны собственно языка Зеталисп был основан на Маклиспе и редакторе Emacs, но существенно обновлён и дополнен, в частности, в нём появились новые типы данных, объектно-ориентированная подсистема Flavors, на которой основано взаимодействие программ с многооконным интерфейсом пользователя, новые директивные управляющие конструкции, частично заимствованные из Интерлиспа, многозначные функции (способные штатным образом возвращать более одного значения без предварительной «сборки» их в контейнер), потоковый ввод-вывод, пространства имён, мощная библиотека функций, в том числе математических, обеспечивающих векторные и матричные вычисления и работу с линейными системами.

Гораздо больше новшеств было внесено в саму систему программирования. Система изначально рассчитывалась на работу с графическим пользовательским терминалом и мышью. В ней был реализован графический многооконный интерфейс пользователя. В состав системы входил многооконный интерпретатор Лиспа, частичный транслятор, текстовый редактор Zmacs, инспектор структур данных, отладчик, программа исследования состояния системы, редактор системных файлов, редактор шрифтов и клиент электронной почты Zmail. В состав системы входили трансляторы других языков высокого уровня, преобразователь, обеспечивающий поддержку программ на Интерлиспе, и набор инструментов более высокого уровня. Для Фортрана, Паскаля, Ады и Пролога, поставлявшихся в составе системы, имелись развитые средства взаимодействия с программами на Лиспе, что позволяло в случае необходимости разрабатывать и применять программные системы на нескольких языках.

Изначально проект имел целью создание коммерческого продукта. В 1979 году было создано два предприятия — производителя лисп-машин: Symbolics и Lisp Machine Inc. (LMI). После этого работа по развитию Зеталиспа велась этими фирмами независимо. Тем не менее, при наличии некоторых различий в самих лисп-машинах, в части языка они были почти полностью совместимы.

NIL и T

Реализация MACLisp на машине VAX в самом MIT была начата в 1979 году. Проект получил название NIL (одновременно — аббревиатура «New Implementation of Lisp» — «Новая реализация Лиспа» — и стандартный лисповский атом «NIL», обозначающий, в зависимости от использования, логическую не-истинность или пустой список). NIL имел довольно большое ядро, написанное на ассемблере VAX, на котором всё тем же методом раскрутки строилась лисп-система. В какой-то мере можно считать NIL «ответом на Franz Lisp», поскольку в качестве одной из целей проекта был назван всё тот же перенос на VAX системы Macsyma. NIL много позаимствовал у Зеталиспа, в том числе систему Flavors, превращающую Лисп-систему в объектно-ориентированную. В 1981 году группа, занимавшаяся проектом NIL, распалась из-за непримиримых разногласий в отношении идеологии создаваемой системы. Несмотря на распад, начиная с 1982 года выходили регулярные обновления системы и она получила достаточно заметное распространение. В 1980-е годы NIL нередко использовался в организациях, имевших как VAX, так и лисп-машины, поскольку принципиальных идеологических отличий между NIL и Zetalisp нет, хотя Zetalisp намного богаче возможностями.

Отделившаяся от проекта NIL группа разработчиков приступила к созданию собственной версии лисп-системы, которая получила ироничное имя «T» (одновременно — от «True Lisp» — «Настоящий (истинный) Лисп» и ещё один стандартный лисповский атом «T», обозначающий логическую истинность, то есть — противоположность «NIL»). Разработка этого диалекта велась в Йельском университете в 1982—1984 годы. В отличие от «старых» систем, диалект T использовал по умолчанию статическое связывание переменных, кроме того, его создатели ввели реализацию функций как «полноправных граждан», что означает, что функции могут без специальных синтаксических средств и без ограничений присваиваться переменным и возвращаться в качестве значений других функций. T-Lisp, в отличие от NIL, имел довольно небольшое ядро, написанное на машинном языке. Разработчики использовали технику «раскрутки», перенося ядро вручную на новые платформы и реализуя остальную часть системы непосредственно на Лиспе, рассчитывая, что высокоэффективный транслятор обеспечит лучшую производительность конечной системы, чем ручная реализация крупного ядра на машинном языке.

Спорным моментом в T-Lisp стало решение авторов обновить и систематизировать имена системных функций. Так, например, имена всех без исключения предикатов оканчивались на вопросительный знак, «исторически сложившиеся» стандартные имена элементарных функций были заменены на мнемонические, соответствующие тому, что функция делает. Безусловным плюсом такого решения было облегчение изучения, очевидным минусом стала несовместимость со всеми остальными диалектами языка. В результате создателям всё равно пришлось впоследствии дополнить систему набором макросов, приводящих систему имён в соответствие со стандартом Common Lisp. Безусловно значительное влияние, которое на T оказал диалект Scheme. В целом же T-Lisp получился достаточно простой, элегантной и мобильной системой, которая была реализована для VAX и перенесена на многие 32-битовые рабочие станции.

Стандарт Common Lisp

Процесс разработки стандарта

Из вышесказанного ясно, что к первой половине 1980-х годов в лисп-сообществе сложилась ситуация, которую некоторые авторы сравнивали с Вавилонской башней: параллельно существовали и развивались более десятка только крупных диалектов Лиспа, общее же число несовместимых между собой реализаций было существенно больше. Похожая ситуация наблюдалась в это время в большинстве распространённых языков программирования, в случае же с Лиспом ситуация усугублялась тем, что язык изначально был разработан как произвольно расширяемый, что спровоцировало развитие его возможностей в разных диалектах в существенно разных направлениях. Если на начальном этапе, когда Лисп использовался почти исключительно в лабораториях и институтах, многообразие диалектов не особенно мешало и даже было отчасти полезным, поскольку способствовало быстрому развитию языка, то к 1980-м годам, когда появилась потребность в промышленных разработках на Лиспе, обилие реализаций стало тормозом, поскольку приводило к массовому дублированию разработок и рассредоточению сил на поддержание множества лисп-систем в актуальном состоянии.

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

Первоначальный вариант стандарта начали готовить в Университете Карнеги-Меллона на основе внутреннего проекта Spice Lisp, также первоначально нацеленного на разработку лисп-системы для рабочей станции. Проектируемый стандарт с самого начала получил наименование «Common Lisp» («Общий Лисп»), подчёркивающее цель разработки — получить единый базовый язык, на основании которого можно было бы создавать программно-совместимые системы. В разработке и редактировании стандарта приняли участие около 80 специалистов из университетов, лабораторий и фирм США. Процесс разработки впервые происходил дистанционно, через компьютерную сеть ARPANET, через которую было передано свыше 3000 сообщений. Процесс разработки стандарта завершился в 1984 году. Его результат был зафиксирован в первом издании руководства «Common Lisp: the Language» Гая Стила.

Основные особенности

В основном на идеологические основы стандарта повлияли MACLisp и его диалекты, большое количество возможностей было заимствовано из InterLISP и новых систем, таких как Zetalisp и NIL. Common Lisp — язык со статическим связыванием, традиционным представлением функций (функции не являются «полноправными гражданами»), поддерживает макросы, функционалы, лексические замыкания. То есть с точки зрения функциональной части языка он содержит весь тот набор синтаксических средств, который за предыдущие четверть века сложился в Лиспе и достаточен для любых приложений функционального программирования и расширения языка в любом желаемом направлении. Системные функции в Common Lisp сохранили традиционные имена, но многие из них имеют синонимы с более наглядными именами, например, функции CAR (получение головы списка) и CDR (получение хвоста списка) имеют синонимы, соответственно, FIRST («первый») и REST («остаток»).

Поскольку разработчикам требовался язык, пригодный для широкого спектра применений, а не только для искусственного интеллекта и символьной обработки, в результате получилась достаточно объёмная спецификация, хотя и сохранившая основные особенности Лиспа, но существенно расширенная функциями, синтаксическими средствами и механизмами, направленными на нехарактерные для исходного Лиспа способы разработки. Так, например, в язык были добавлены практически все существующие в традиционных императивных языках синтаксические конструкции, включая несколько видов циклов. Объектная система CLOS (Common Lisp Object System) первоначально не была включена в стандарт, но вошла в него позже. Common Lisp пригоден для написания программ как в функциональном, так и в директивном стиле, на нём возможно обобщённое программирование (посредством стандартных макросов), продукционное программирование, имеются средства для организации логического, объектного программирования и программирования, управляемого данными. Спецификация Common Lisp не включает в себя подробного описания среды программирования, определяя лишь в самых общих чертах её состав и принципы взаимодействия элементов.

Критики нового стандарта указывали на его раздутость и чрезмерное внимание, уделённое практическим требованиям, что привело к нарушению «функциональной чистоты» Лиспа и увеличению объёма поддерживающих его Лисп-систем. Тем не менее, под нажимом Министерства обороны США и частично с его финансовой поддержкой во второй половине 1980-х годов были созданы Common Lisp-реализации практически для всех распространённых платформ. «Старые» Лисп-системы, в большинстве, продолжали существовать, но их поддержка постепенно прекращалась, а пользователи и ПО мигрировали на Common Lisp. В результате к настоящему времени из ранее существовавшего набора реализаций языка в использовании остался разве что диалект Scheme и некоторое количество встроенных в мощное ПО систем, в которых Лисп играет роль скриптового языка для реализации внутренней логики и расширения возможностей.

Дальнейшие модификации

Серьёзный пересмотр вышедшего в 1984 году стандарта, состоялся в 1990 году, когда в него были внесены существенные изменения:

  • Объектная система CLOS, исходно не входившая в спецификацию Common Lisp, а считавшаяся неким «дополнением» к ней, стала частью официального стандарта
  • Был стандартизован макрос loop, реализующий встроенный императивный язык с инфиксным синтаксисом.
  • Внесены изменения в типы данных.
  • Стандартизован механизм pretty-print — форматированного вывода кода и данных.
  • Введены макросы компиляции.
  • Добавлены новые операторы и внесены изменения в существующие.
  • Обновлена система поддержки пакетов.
  • Сделан ряд более мелких изменений.

В 1995 году Common Lisp был стандартизован ANSI. Стандарт практически повторил спецификацию 1990 года, изменения незначительны и состоят, в основном, в добавлении, удалении и переименовании операторов и системных переменных и изменениях в системных вызовах. Можно отметить появление в Common Lisp типа boolean (логического), значениями которого могут быть только NIL и T.

Примеры

Пример программы, выводящей сообщение «Hello, world!»:

(format t "Hello, world!~%")

Пример Куайн (программы, выводящей свой исходный код) на Лиспе:

((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))

Данная программа должна работать на большинстве диалектов Лиспа, в том числе и на Scheme.

Итеративная версия функции определения N-го числа Фибоначчи с использованием макроса Loop:

(defun fibonacci (n)
  (loop repeat n
        for a = 0 then b
        and for b = 1 then (+ a b)
        finally (return b)))

Рекурсивная версия функции N-го числа Фибоначчи:

(defun fibonacci (n)
  (if (> n 1) (+ (fibonacci (1- n)) (fibonacci (- n 2))) n))

Рекурсивная функция вычисления произвольной целой степени:

(defun power (m n)
  (cond ((= n 1) m)
        ((zerop n) 1)
        ((minusp n)(/ 1 (power m (- n))))
        (t (* m (power m (1- n))))))

Здесь использованы системные предикаты ZEROP — проверка на равенство нулю, MINUSP — проверка на отрицательность.

Применение

Первые области применения языка Лисп были связаны с символьной обработкой данных и процессами принятия решений.

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

Одно из направлений использования языка Lisp — его использование в качестве скриптового языка, автоматизирующего работу в ряде прикладных программ:

  • язык Лисп используется как язык сценариев в САПР AutoCAD (диалект AutoLISP);
  • его диалект — SKILL — используется для написания скриптов в САПР Virtuoso Platform компании Cadence Design Systems;
  • язык Лисп является одним из базовых средств текстового редактора Emacs (диалект EmacsLISP)[5];
  • язык Лисп используется как язык сценариев в издательском программном обеспечении Interleaf/Quicksilver (диалект Interleaf Lisp);
  • в оконном менеджере Sawfish применяется специальный диалект Лиспа Rep, который в значительной степени повторяет диалект Лиспа от Emacs;
  • диалект Scheme используется в качестве одного из скриптовых языков в графическом процессоре Gimp;
  • диалект GOAL используется для высокодинамичных трёхмерных игр;
  • язык Лисп может использоваться для написания скриптов в аудиоредакторе Audacity.

Сферы применения языка Лисп многообразны: наука и промышленность, образование и медицина, от декодирования генома человека до системы проектирования авиалайнеров.

Лисп-машины

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

В США исследования по созданию Лисп-компьютера велись в 1970-х годах в двух местах — исследовательском центре Palo Alto, принадлежащем корпорации Xerox, и в MIT (последнее спонсировалось DARPA). Результатом стало появление в начале-середине 1980-х годов трёх основных производителей: Xerox, Lisp Mashine Inc. (LMI) и Symbolics Inc. Xerox производил Лисп-машины, поддерживающие Интерлисп, две последние компании происходят из MIT и ориентируются на Зеталисп. Несколько позже производством Лисп-машин занялась Texas Instruments, а в Японии в 1984 году был показан первый прототип коммерческой Лисп-машины Alpha фирмы Фудзицу.

Лисп-машины имели аппаратную архитектуру, ориентированную на обработку списков и функциональное программирование, с аппаратной поддержкой сборки мусора, динамической типизации. Поддерживаемые этими машинами комплексы средств разработки ПО представляли собой мощные интегрированные среды разработки, включающие в себя все компоненты, которые в настоящее время включают наиболее мощные IDE языков высокого уровня. Поддерживался многооконный графический интерфейс пользователя, работа с мышью и другими дополнительными средствами позиционирования (трэкбол, световое перо), высококачественный ввод-вывод графики и звука. Несмотря на изначальную Лисп-ориентированность, в Лисп-машинах были доступны и другие языки высокого уровня и предоставлялись средства межъязыкового взаимодействия. Сами Лисп-системы Лисп-машин содержали до тысяч функций различного назначения, обеспечивали как работу в интерпретируемом режиме, так и компиляцию программ в объектный код.

Для своего времени Лисп-машины были одними из мощнейших ЭВМ в классе персональных рабочих станций. Им прочили большое будущее, но в 1990-х годах все они вышли из употребления. Производители либо прекратили свою деятельность, либо переориентировались на выпуск компьютеров общего назначения. Причиной стало то, что в условиях длительного экспоненциального роста скорости и объёмов памяти компьютеров разработка оборудования «под язык» оказалась бесперспективной — быстро развивающиеся компьютеры общего назначения, снабжённые трансляторами Лиспа, по своим возможностям догнали и обогнали специализированные Лисп-машины, которые из-за самой специализации уже оказывались дороже и проигрывали в универсальности.

Лисп в СССР и России

В СССР работы, связанные с использованием Лиспа и созданием собственных Лисп-систем активизировались после 1968 года, когда группа американских учёных, среди которых были Дж. Маккарти и Б. Беркли, посетила Советский Союз. В Новосибирске, в ВЦ Сибирского отделения Академии Наук, где Маккарти провёл больше всего времени, он заложил основу реализации Лиспа на БЭСМ-6. В Москве, в ВЦ АН СССР советские математики Лавров и Силагадзе при содействии Беркли начали работу над собственной версией Лисп-интерпретартора для БЭСМ-6. Впоследствии Лавров перешёл на работу в ЛГУ, а Силагадзе — в ВЦ Грузинской академии наук в Тбилиси, где они продолжили работу с Лиспом и участвовали в создании нескольких Лисп-систем для ЕС ЭВМ.

В Ленинграде была создана Лисп-система для польского компьютера Odra 1204, в Москве — реализация для БЭСМ-6, совместимая с английской версией Лиспа для компьютера ICL 4, в МЭИ и в Дальневосточном научном центре во Владивостоке появились реализации для ЕС ЭВМ. В Институте проблем передачи информации (Москва) в конце 1970-х была создана Лисп-система ЭКЛИСП для мини-компьютера ECLIPS. На компьютерах западного производства в СССР использовались Stanford Lisp и UT-Lisp (Дубна, IBM 370 и CDC 6600). Также популярна была шведская система Нордстрема (Лисп на Фортране).

В 1975 году в Тбилиси состоялась четвёртая международная конференция по проблемам искусственного интеллекта IJCAI-75, которая способствовала повышению интереса к Лиспу и распространению его в университетах и НИИ. В 1978 году вышел первый учебник Лиспа на русском языке: С. С. Лавров и Г. С. Силагадзе «Автоматическая обработка данных. Язык ЛИСП и его реализация».

В 1980-е годы интерес к Лиспу в СССР сохранялся, тем не менее, литературы по языку издавалось очень мало (за десятилетие вышло две книги, обе переводные: «Функциональное программирование. Применение и реализация» Хендерсона, переведённая в 1983 году, и двухтомник «Мир Лиспа» Э. Хювёнена и Й. Сеппянена, перевод которой был издан в 1990). После распада СССР российское IT-сообщество достаточно быстро перешло на использование практически исключительно западной вычислительной техники и системного ПО. На сегодняшний день невозможно назвать ни одной Лисп-системы российского происхождения, которая находилась бы в эксплуатации.

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

Интересные факты

  • Существуют альтернативные расшифровки названия LISP: Lots of Irritating Superfluous Parentheses[6] («Много раздражающих лишних скобок») — намёки на особенности синтаксиса.
  • Системные функции CAR и CDR получили такие необычные имена по историческим причинам. Машина IBM 704, на которой Маккарти создавал самую первую реализацию Лиспа, содержала инструкции, позволяющие модифицировать части машинного слова. Машинное слово рассматривалось как структура с полями префикса, декремента, тега и адреса. Функции CAR (сокращение от Contents of the Address part of Register — «содержимое адресной части регистра») и CDR (Contents of the Decrement part of Register — «содержимое декрементной части регистра») получили свои названия в соответствии с этими полями[7]. В этой реализации поля адреса и декремента использовались для хранения, соответственно, указателей на голову и хвост списка.

См. также

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

Примечания

  1. Роберт У. Себеста. 2.4.2· Процесс разработки языка LISP // Основные концепции языков программирования. — 5-е издание. — Вильямс, 2001. — С. 70. — 659 с. — ISBN 5845901928.
  2. Теренс Пратт. 14. ЛИСП 1.5 // Языки программирования: Разработка и реализация = Programming Languages: Design and Implementation. — 1-е изд.. — М.: Мир, 1979. — С. 455. — 573 с.
  3. [lisp.ru/page.php?id=14 Заблуждения относительно Лисп]. — статья, своего рода «вольный перевод» 1 главы из книги Successful Lisp Дэвида Лэмкинса. [www.webcitation.org/617VrFaA3 Архивировано из первоисточника 22 августа 2011].
  4. McCarthy J., Abrahams P., Edwards D., et al. Lisp 1.5 Programmer’s Manual. MIT Press, Cambrige, Massachusetts, 1962.
  5. По сути, большая часть Emacs написана на EmacsLISP, что даёт неограниченные возможности расширения функциональности
  6. [www.catb.org/~esr/jargon/html/L/LISP.html The Jargon File — Lisp] (англ.)
  7. John McCarthy [www-formal.stanford.edu/jmc/recursive.html Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] // Communications of the ACM. — ACM New York, 1960. — Т. 3, вып. 4. — С. 184-195. — DOI:10.1145/367177.367199.

Литература

Ссылки

  • [pcl.catap.ru/doku.php pcl.catap.ru] — русский перевод книги en:Practical Common Lisp (англ.)
  • [lisper.ru/wiki/Cookbook Cookbook] — русский перевод (незаконченный) сборника рецептов [cl-cookbook.sourceforge.net/ Common Lisp Cookbook] (англ.)
  • [lisp.ru/ lisp.ru] — ресурсы по языку Лисп (учебники, статьи).
  • [lisper.ru/ lisper.ru] — сайт, посвящённый Common Lisp, написанный на самом Common Lisp
  • [lisp.ystok.ru lisp.ystok.ru] — Лисп у «Истоков» (литература, ссылки, проекты с исходным кодом)
Ссылки на английском
  • [www-formal.stanford.edu/jmc/recursive.html www-formal.stanford.edu] — статья Джона Маккарти Recursive Functions of Symbolic Expressions and Their Computation by Machine, содержащей первоначальное описание языка Лисп.
  • [www.gigamonkeys.com/book/ gigamonkeys.com] — сайт книги en:Practical Common Lisp, откуда может быть скачана электронная версия (pdf) и архив с исходными кодами для книги
  • [cliki.net Cliki] — вики-ресурс о библиотеках и проектах Common Lisp. Примечательно, что сам ресурс написан полностью на Common Lisp.
  • [common-lisp.net common-lisp.net] — основной хостинг Common Lisp проектов.
  • [lisp.org lisp.org] — ассоциация пользователей Лисп
  • [dir.gmane.org/index.php?prefix=gmane.lisp Архивы списков рассылки] на Gmane.

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

После смерти князя Андрея Наташа и княжна Марья одинаково чувствовали это. Они, нравственно согнувшись и зажмурившись от грозного, нависшего над ними облака смерти, не смели взглянуть в лицо жизни. Они осторожно берегли свои открытые раны от оскорбительных, болезненных прикосновений. Все: быстро проехавший экипаж по улице, напоминание об обеде, вопрос девушки о платье, которое надо приготовить; еще хуже, слово неискреннего, слабого участия болезненно раздражало рану, казалось оскорблением и нарушало ту необходимую тишину, в которой они обе старались прислушиваться к незамолкшему еще в их воображении страшному, строгому хору, и мешало вглядываться в те таинственные бесконечные дали, которые на мгновение открылись перед ними.
Только вдвоем им было не оскорбительно и не больно. Они мало говорили между собой. Ежели они говорили, то о самых незначительных предметах. И та и другая одинаково избегали упоминания о чем нибудь, имеющем отношение к будущему.
Признавать возможность будущего казалось им оскорблением его памяти. Еще осторожнее они обходили в своих разговорах все то, что могло иметь отношение к умершему. Им казалось, что то, что они пережили и перечувствовали, не могло быть выражено словами. Им казалось, что всякое упоминание словами о подробностях его жизни нарушало величие и святыню совершившегося в их глазах таинства.
Беспрестанные воздержания речи, постоянное старательное обхождение всего того, что могло навести на слово о нем: эти остановки с разных сторон на границе того, чего нельзя было говорить, еще чище и яснее выставляли перед их воображением то, что они чувствовали.

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


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


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


После столкновения при Вязьме, где Кутузов не мог удержать свои войска от желания опрокинуть, отрезать и т. д., дальнейшее движение бежавших французов и за ними бежавших русских, до Красного, происходило без сражений. Бегство было так быстро, что бежавшая за французами русская армия не могла поспевать за ними, что лошади в кавалерии и артиллерии становились и что сведения о движении французов были всегда неверны.
Люди русского войска были так измучены этим непрерывным движением по сорок верст в сутки, что не могли двигаться быстрее.
Чтобы понять степень истощения русской армии, надо только ясно понять значение того факта, что, потеряв ранеными и убитыми во все время движения от Тарутина не более пяти тысяч человек, не потеряв сотни людей пленными, армия русская, вышедшая из Тарутина в числе ста тысяч, пришла к Красному в числе пятидесяти тысяч.
Быстрое движение русских за французами действовало на русскую армию точно так же разрушительно, как и бегство французов. Разница была только в том, что русская армия двигалась произвольно, без угрозы погибели, которая висела над французской армией, и в том, что отсталые больные у французов оставались в руках врага, отсталые русские оставались у себя дома. Главная причина уменьшения армии Наполеона была быстрота движения, и несомненным доказательством тому служит соответственное уменьшение русских войск.
Вся деятельность Кутузова, как это было под Тарутиным и под Вязьмой, была направлена только к тому, чтобы, – насколько то было в его власти, – не останавливать этого гибельного для французов движения (как хотели в Петербурге и в армии русские генералы), а содействовать ему и облегчить движение своих войск.
Но, кроме того, со времени выказавшихся в войсках утомления и огромной убыли, происходивших от быстроты движения, еще другая причина представлялась Кутузову для замедления движения войск и для выжидания. Цель русских войск была – следование за французами. Путь французов был неизвестен, и потому, чем ближе следовали наши войска по пятам французов, тем больше они проходили расстояния. Только следуя в некотором расстоянии, можно было по кратчайшему пути перерезывать зигзаги, которые делали французы. Все искусные маневры, которые предлагали генералы, выражались в передвижениях войск, в увеличении переходов, а единственно разумная цель состояла в том, чтобы уменьшить эти переходы. И к этой цели во всю кампанию, от Москвы до Вильны, была направлена деятельность Кутузова – не случайно, не временно, но так последовательно, что он ни разу не изменил ей.
Кутузов знал не умом или наукой, а всем русским существом своим знал и чувствовал то, что чувствовал каждый русский солдат, что французы побеждены, что враги бегут и надо выпроводить их; но вместе с тем он чувствовал, заодно с солдатами, всю тяжесть этого, неслыханного по быстроте и времени года, похода.
Но генералам, в особенности не русским, желавшим отличиться, удивить кого то, забрать в плен для чего то какого нибудь герцога или короля, – генералам этим казалось теперь, когда всякое сражение было и гадко и бессмысленно, им казалось, что теперь то самое время давать сражения и побеждать кого то. Кутузов только пожимал плечами, когда ему один за другим представляли проекты маневров с теми дурно обутыми, без полушубков, полуголодными солдатами, которые в один месяц, без сражений, растаяли до половины и с которыми, при наилучших условиях продолжающегося бегства, надо было пройти до границы пространство больше того, которое было пройдено.
В особенности это стремление отличиться и маневрировать, опрокидывать и отрезывать проявлялось тогда, когда русские войска наталкивались на войска французов.
Так это случилось под Красным, где думали найти одну из трех колонн французов и наткнулись на самого Наполеона с шестнадцатью тысячами. Несмотря на все средства, употребленные Кутузовым, для того чтобы избавиться от этого пагубного столкновения и чтобы сберечь свои войска, три дня у Красного продолжалось добивание разбитых сборищ французов измученными людьми русской армии.
Толь написал диспозицию: die erste Colonne marschiert [первая колонна направится туда то] и т. д. И, как всегда, сделалось все не по диспозиции. Принц Евгений Виртембергский расстреливал с горы мимо бегущие толпы французов и требовал подкрепления, которое не приходило. Французы, по ночам обегая русских, рассыпались, прятались в леса и пробирались, кто как мог, дальше.
Милорадович, который говорил, что он знать ничего не хочет о хозяйственных делах отряда, которого никогда нельзя было найти, когда его было нужно, «chevalier sans peur et sans reproche» [«рыцарь без страха и упрека»], как он сам называл себя, и охотник до разговоров с французами, посылал парламентеров, требуя сдачи, и терял время и делал не то, что ему приказывали.
– Дарю вам, ребята, эту колонну, – говорил он, подъезжая к войскам и указывая кавалеристам на французов. И кавалеристы на худых, ободранных, еле двигающихся лошадях, подгоняя их шпорами и саблями, рысцой, после сильных напряжений, подъезжали к подаренной колонне, то есть к толпе обмороженных, закоченевших и голодных французов; и подаренная колонна кидала оружие и сдавалась, чего ей уже давно хотелось.
Под Красным взяли двадцать шесть тысяч пленных, сотни пушек, какую то палку, которую называли маршальским жезлом, и спорили о том, кто там отличился, и были этим довольны, но очень сожалели о том, что не взяли Наполеона или хоть какого нибудь героя, маршала, и упрекали в этом друг друга и в особенности Кутузова.
Люди эти, увлекаемые своими страстями, были слепыми исполнителями только самого печального закона необходимости; но они считали себя героями и воображали, что то, что они делали, было самое достойное и благородное дело. Они обвиняли Кутузова и говорили, что он с самого начала кампании мешал им победить Наполеона, что он думает только об удовлетворении своих страстей и не хотел выходить из Полотняных Заводов, потому что ему там было покойно; что он под Красным остановил движенье только потому, что, узнав о присутствии Наполеона, он совершенно потерялся; что можно предполагать, что он находится в заговоре с Наполеоном, что он подкуплен им, [Записки Вильсона. (Примеч. Л.Н. Толстого.) ] и т. д., и т. д.
Мало того, что современники, увлекаемые страстями, говорили так, – потомство и история признали Наполеона grand, a Кутузова: иностранцы – хитрым, развратным, слабым придворным стариком; русские – чем то неопределенным – какой то куклой, полезной только по своему русскому имени…


В 12 м и 13 м годах Кутузова прямо обвиняли за ошибки. Государь был недоволен им. И в истории, написанной недавно по высочайшему повелению, сказано, что Кутузов был хитрый придворный лжец, боявшийся имени Наполеона и своими ошибками под Красным и под Березиной лишивший русские войска славы – полной победы над французами. [История 1812 года Богдановича: характеристика Кутузова и рассуждение о неудовлетворительности результатов Красненских сражений. (Примеч. Л.Н. Толстого.) ]
Такова судьба не великих людей, не grand homme, которых не признает русский ум, а судьба тех редких, всегда одиноких людей, которые, постигая волю провидения, подчиняют ей свою личную волю. Ненависть и презрение толпы наказывают этих людей за прозрение высших законов.
Для русских историков – странно и страшно сказать – Наполеон – это ничтожнейшее орудие истории – никогда и нигде, даже в изгнании, не выказавший человеческого достоинства, – Наполеон есть предмет восхищения и восторга; он grand. Кутузов же, тот человек, который от начала и до конца своей деятельности в 1812 году, от Бородина и до Вильны, ни разу ни одним действием, ни словом не изменяя себе, являет необычайный s истории пример самоотвержения и сознания в настоящем будущего значения события, – Кутузов представляется им чем то неопределенным и жалким, и, говоря о Кутузове и 12 м годе, им всегда как будто немножко стыдно.
А между тем трудно себе представить историческое лицо, деятельность которого так неизменно постоянно была бы направлена к одной и той же цели. Трудно вообразить себе цель, более достойную и более совпадающую с волею всего народа. Еще труднее найти другой пример в истории, где бы цель, которую поставило себе историческое лицо, была бы так совершенно достигнута, как та цель, к достижению которой была направлена вся деятельность Кутузова в 1812 году.
Кутузов никогда не говорил о сорока веках, которые смотрят с пирамид, о жертвах, которые он приносит отечеству, о том, что он намерен совершить или совершил: он вообще ничего не говорил о себе, не играл никакой роли, казался всегда самым простым и обыкновенным человеком и говорил самые простые и обыкновенные вещи. Он писал письма своим дочерям и m me Stael, читал романы, любил общество красивых женщин, шутил с генералами, офицерами и солдатами и никогда не противоречил тем людям, которые хотели ему что нибудь доказывать. Когда граф Растопчин на Яузском мосту подскакал к Кутузову с личными упреками о том, кто виноват в погибели Москвы, и сказал: «Как же вы обещали не оставлять Москвы, не дав сраженья?» – Кутузов отвечал: «Я и не оставлю Москвы без сражения», несмотря на то, что Москва была уже оставлена. Когда приехавший к нему от государя Аракчеев сказал, что надо бы Ермолова назначить начальником артиллерии, Кутузов отвечал: «Да, я и сам только что говорил это», – хотя он за минуту говорил совсем другое. Какое дело было ему, одному понимавшему тогда весь громадный смысл события, среди бестолковой толпы, окружавшей его, какое ему дело было до того, к себе или к нему отнесет граф Растопчин бедствие столицы? Еще менее могло занимать его то, кого назначат начальником артиллерии.
Не только в этих случаях, но беспрестанно этот старый человек дошедший опытом жизни до убеждения в том, что мысли и слова, служащие им выражением, не суть двигатели людей, говорил слова совершенно бессмысленные – первые, которые ему приходили в голову.
Но этот самый человек, так пренебрегавший своими словами, ни разу во всю свою деятельность не сказал ни одного слова, которое было бы не согласно с той единственной целью, к достижению которой он шел во время всей войны. Очевидно, невольно, с тяжелой уверенностью, что не поймут его, он неоднократно в самых разнообразных обстоятельствах высказывал свою мысль. Начиная от Бородинского сражения, с которого начался его разлад с окружающими, он один говорил, что Бородинское сражение есть победа, и повторял это и изустно, и в рапортах, и донесениях до самой своей смерти. Он один сказал, что потеря Москвы не есть потеря России. Он в ответ Лористону на предложение о мире отвечал, что мира не может быть, потому что такова воля народа; он один во время отступления французов говорил, что все наши маневры не нужны, что все сделается само собой лучше, чем мы того желаем, что неприятелю надо дать золотой мост, что ни Тарутинское, ни Вяземское, ни Красненское сражения не нужны, что с чем нибудь надо прийти на границу, что за десять французов он не отдаст одного русского.
И он один, этот придворный человек, как нам изображают его, человек, который лжет Аракчееву с целью угодить государю, – он один, этот придворный человек, в Вильне, тем заслуживая немилость государя, говорит, что дальнейшая война за границей вредна и бесполезна.
Но одни слова не доказали бы, что он тогда понимал значение события. Действия его – все без малейшего отступления, все были направлены к одной и той же цели, выражающейся в трех действиях: 1) напрячь все свои силы для столкновения с французами, 2) победить их и 3) изгнать из России, облегчая, насколько возможно, бедствия народа и войска.
Он, тот медлитель Кутузов, которого девиз есть терпение и время, враг решительных действий, он дает Бородинское сражение, облекая приготовления к нему в беспримерную торжественность. Он, тот Кутузов, который в Аустерлицком сражении, прежде начала его, говорит, что оно будет проиграно, в Бородине, несмотря на уверения генералов о том, что сражение проиграно, несмотря на неслыханный в истории пример того, что после выигранного сражения войско должно отступать, он один, в противность всем, до самой смерти утверждает, что Бородинское сражение – победа. Он один во все время отступления настаивает на том, чтобы не давать сражений, которые теперь бесполезны, не начинать новой войны и не переходить границ России.
Теперь понять значение события, если только не прилагать к деятельности масс целей, которые были в голове десятка людей, легко, так как все событие с его последствиями лежит перед нами.
Но каким образом тогда этот старый человек, один, в противность мнения всех, мог угадать, так верно угадал тогда значение народного смысла события, что ни разу во всю свою деятельность не изменил ему?
Источник этой необычайной силы прозрения в смысл совершающихся явлений лежал в том народном чувстве, которое он носил в себе во всей чистоте и силе его.
Только признание в нем этого чувства заставило народ такими странными путями из в немилости находящегося старика выбрать его против воли царя в представители народной войны. И только это чувство поставило его на ту высшую человеческую высоту, с которой он, главнокомандующий, направлял все свои силы не на то, чтоб убивать и истреблять людей, а на то, чтобы спасать и жалеть их.
Простая, скромная и потому истинно величественная фигура эта не могла улечься в ту лживую форму европейского героя, мнимо управляющего людьми, которую придумала история.
Для лакея не может быть великого человека, потому что у лакея свое понятие о величии.


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


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


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


Пятая рота стояла подле самого леса. Огромный костер ярко горел посреди снега, освещая отягченные инеем ветви деревьев.
В середине ночи солдаты пятой роты услыхали в лесу шаги по снегу и хряск сучьев.
– Ребята, ведмедь, – сказал один солдат. Все подняли головы, прислушались, и из леса, в яркий свет костра, выступили две, держащиеся друг за друга, человеческие, странно одетые фигуры.
Это были два прятавшиеся в лесу француза. Хрипло говоря что то на непонятном солдатам языке, они подошли к костру. Один был повыше ростом, в офицерской шляпе, и казался совсем ослабевшим. Подойдя к костру, он хотел сесть, но упал на землю. Другой, маленький, коренастый, обвязанный платком по щекам солдат, был сильнее. Он поднял своего товарища и, указывая на свой рот, говорил что то. Солдаты окружили французов, подстелили больному шинель и обоим принесли каши и водки.
Ослабевший французский офицер был Рамбаль; повязанный платком был его денщик Морель.
Когда Морель выпил водки и доел котелок каши, он вдруг болезненно развеселился и начал не переставая говорить что то не понимавшим его солдатам. Рамбаль отказывался от еды и молча лежал на локте у костра, бессмысленными красными глазами глядя на русских солдат. Изредка он издавал протяжный стон и опять замолкал. Морель, показывая на плечи, внушал солдатам, что это был офицер и что его надо отогреть. Офицер русский, подошедший к костру, послал спросить у полковника, не возьмет ли он к себе отогреть французского офицера; и когда вернулись и сказали, что полковник велел привести офицера, Рамбалю передали, чтобы он шел. Он встал и хотел идти, но пошатнулся и упал бы, если бы подле стоящий солдат не поддержал его.
– Что? Не будешь? – насмешливо подмигнув, сказал один солдат, обращаясь к Рамбалю.
– Э, дурак! Что врешь нескладно! То то мужик, право, мужик, – послышались с разных сторон упреки пошутившему солдату. Рамбаля окружили, подняли двое на руки, перехватившись ими, и понесли в избу. Рамбаль обнял шеи солдат и, когда его понесли, жалобно заговорил:
– Oh, nies braves, oh, mes bons, mes bons amis! Voila des hommes! oh, mes braves, mes bons amis! [О молодцы! О мои добрые, добрые друзья! Вот люди! О мои добрые друзья!] – и, как ребенок, головой склонился на плечо одному солдату.
Между тем Морель сидел на лучшем месте, окруженный солдатами.
Морель, маленький коренастый француз, с воспаленными, слезившимися глазами, обвязанный по бабьи платком сверх фуражки, был одет в женскую шубенку. Он, видимо, захмелев, обнявши рукой солдата, сидевшего подле него, пел хриплым, перерывающимся голосом французскую песню. Солдаты держались за бока, глядя на него.
– Ну ка, ну ка, научи, как? Я живо перейму. Как?.. – говорил шутник песенник, которого обнимал Морель.
Vive Henri Quatre,
Vive ce roi vaillanti –
[Да здравствует Генрих Четвертый!
Да здравствует сей храбрый король!
и т. д. (французская песня) ]
пропел Морель, подмигивая глазом.
Сe diable a quatre…
– Виварика! Виф серувару! сидябляка… – повторил солдат, взмахнув рукой и действительно уловив напев.
– Вишь, ловко! Го го го го го!.. – поднялся с разных сторон грубый, радостный хохот. Морель, сморщившись, смеялся тоже.
– Ну, валяй еще, еще!
Qui eut le triple talent,
De boire, de battre,
Et d'etre un vert galant…
[Имевший тройной талант,
пить, драться
и быть любезником…]
– A ведь тоже складно. Ну, ну, Залетаев!..
– Кю… – с усилием выговорил Залетаев. – Кью ю ю… – вытянул он, старательно оттопырив губы, – летриптала, де бу де ба и детравагала, – пропел он.
– Ай, важно! Вот так хранцуз! ой… го го го го! – Что ж, еще есть хочешь?
– Дай ему каши то; ведь не скоро наестся с голоду то.
Опять ему дали каши; и Морель, посмеиваясь, принялся за третий котелок. Радостные улыбки стояли на всех лицах молодых солдат, смотревших на Мореля. Старые солдаты, считавшие неприличным заниматься такими пустяками, лежали с другой стороны костра, но изредка, приподнимаясь на локте, с улыбкой взглядывали на Мореля.
– Тоже люди, – сказал один из них, уворачиваясь в шинель. – И полынь на своем кореню растет.
– Оо! Господи, господи! Как звездно, страсть! К морозу… – И все затихло.
Звезды, как будто зная, что теперь никто не увидит их, разыгрались в черном небе. То вспыхивая, то потухая, то вздрагивая, они хлопотливо о чем то радостном, но таинственном перешептывались между собой.

Х
Войска французские равномерно таяли в математически правильной прогрессии. И тот переход через Березину, про который так много было писано, была только одна из промежуточных ступеней уничтожения французской армии, а вовсе не решительный эпизод кампании. Ежели про Березину так много писали и пишут, то со стороны французов это произошло только потому, что на Березинском прорванном мосту бедствия, претерпеваемые французской армией прежде равномерно, здесь вдруг сгруппировались в один момент и в одно трагическое зрелище, которое у всех осталось в памяти. Со стороны же русских так много говорили и писали про Березину только потому, что вдали от театра войны, в Петербурге, был составлен план (Пфулем же) поимки в стратегическую западню Наполеона на реке Березине. Все уверились, что все будет на деле точно так, как в плане, и потому настаивали на том, что именно Березинская переправа погубила французов. В сущности же, результаты Березинской переправы были гораздо менее гибельны для французов потерей орудий и пленных, чем Красное, как то показывают цифры.
Единственное значение Березинской переправы заключается в том, что эта переправа очевидно и несомненно доказала ложность всех планов отрезыванья и справедливость единственно возможного, требуемого и Кутузовым и всеми войсками (массой) образа действий, – только следования за неприятелем. Толпа французов бежала с постоянно усиливающейся силой быстроты, со всею энергией, направленной на достижение цели. Она бежала, как раненый зверь, и нельзя ей было стать на дороге. Это доказало не столько устройство переправы, сколько движение на мостах. Когда мосты были прорваны, безоружные солдаты, московские жители, женщины с детьми, бывшие в обозе французов, – все под влиянием силы инерции не сдавалось, а бежало вперед в лодки, в мерзлую воду.
Стремление это было разумно. Положение и бегущих и преследующих было одинаково дурно. Оставаясь со своими, каждый в бедствии надеялся на помощь товарища, на определенное, занимаемое им место между своими. Отдавшись же русским, он был в том же положении бедствия, но становился на низшую ступень в разделе удовлетворения потребностей жизни. Французам не нужно было иметь верных сведений о том, что половина пленных, с которыми не знали, что делать, несмотря на все желание русских спасти их, – гибли от холода и голода; они чувствовали, что это не могло быть иначе. Самые жалостливые русские начальники и охотники до французов, французы в русской службе не могли ничего сделать для пленных. Французов губило бедствие, в котором находилось русское войско. Нельзя было отнять хлеб и платье у голодных, нужных солдат, чтобы отдать не вредным, не ненавидимым, не виноватым, но просто ненужным французам. Некоторые и делали это; но это было только исключение.
Назади была верная погибель; впереди была надежда. Корабли были сожжены; не было другого спасения, кроме совокупного бегства, и на это совокупное бегство были устремлены все силы французов.
Чем дальше бежали французы, чем жальче были их остатки, в особенности после Березины, на которую, вследствие петербургского плана, возлагались особенные надежды, тем сильнее разгорались страсти русских начальников, обвинявших друг друга и в особенности Кутузова. Полагая, что неудача Березинского петербургского плана будет отнесена к нему, недовольство им, презрение к нему и подтрунивание над ним выражались сильнее и сильнее. Подтрунивание и презрение, само собой разумеется, выражалось в почтительной форме, в той форме, в которой Кутузов не мог и спросить, в чем и за что его обвиняют. С ним не говорили серьезно; докладывая ему и спрашивая его разрешения, делали вид исполнения печального обряда, а за спиной его подмигивали и на каждом шагу старались его обманывать.
Всеми этими людьми, именно потому, что они не могли понимать его, было признано, что со стариком говорить нечего; что он никогда не поймет всего глубокомыслия их планов; что он будет отвечать свои фразы (им казалось, что это только фразы) о золотом мосте, о том, что за границу нельзя прийти с толпой бродяг, и т. п. Это всё они уже слышали от него. И все, что он говорил: например, то, что надо подождать провиант, что люди без сапог, все это было так просто, а все, что они предлагали, было так сложно и умно, что очевидно было для них, что он был глуп и стар, а они были не властные, гениальные полководцы.
В особенности после соединения армий блестящего адмирала и героя Петербурга Витгенштейна это настроение и штабная сплетня дошли до высших пределов. Кутузов видел это и, вздыхая, пожимал только плечами. Только один раз, после Березины, он рассердился и написал Бенигсену, доносившему отдельно государю, следующее письмо:
«По причине болезненных ваших припадков, извольте, ваше высокопревосходительство, с получения сего, отправиться в Калугу, где и ожидайте дальнейшего повеления и назначения от его императорского величества».
Но вслед за отсылкой Бенигсена к армии приехал великий князь Константин Павлович, делавший начало кампании и удаленный из армии Кутузовым. Теперь великий князь, приехав к армии, сообщил Кутузову о неудовольствии государя императора за слабые успехи наших войск и за медленность движения. Государь император сам на днях намеревался прибыть к армии.
Старый человек, столь же опытный в придворном деле, как и в военном, тот Кутузов, который в августе того же года был выбран главнокомандующим против воли государя, тот, который удалил наследника и великого князя из армии, тот, который своей властью, в противность воле государя, предписал оставление Москвы, этот Кутузов теперь тотчас же понял, что время его кончено, что роль его сыграна и что этой мнимой власти у него уже нет больше. И не по одним придворным отношениям он понял это. С одной стороны, он видел, что военное дело, то, в котором он играл свою роль, – кончено, и чувствовал, что его призвание исполнено. С другой стороны, он в то же самое время стал чувствовать физическую усталость в своем старом теле и необходимость физического отдыха.
29 ноября Кутузов въехал в Вильно – в свою добрую Вильну, как он говорил. Два раза в свою службу Кутузов был в Вильне губернатором. В богатой уцелевшей Вильне, кроме удобств жизни, которых так давно уже он был лишен, Кутузов нашел старых друзей и воспоминания. И он, вдруг отвернувшись от всех военных и государственных забот, погрузился в ровную, привычную жизнь настолько, насколько ему давали покоя страсти, кипевшие вокруг него, как будто все, что совершалось теперь и имело совершиться в историческом мире, нисколько его не касалось.
Чичагов, один из самых страстных отрезывателей и опрокидывателей, Чичагов, который хотел сначала сделать диверсию в Грецию, а потом в Варшаву, но никак не хотел идти туда, куда ему было велено, Чичагов, известный своею смелостью речи с государем, Чичагов, считавший Кутузова собою облагодетельствованным, потому что, когда он был послан в 11 м году для заключения мира с Турцией помимо Кутузова, он, убедившись, что мир уже заключен, признал перед государем, что заслуга заключения мира принадлежит Кутузову; этот то Чичагов первый встретил Кутузова в Вильне у замка, в котором должен был остановиться Кутузов. Чичагов в флотском вицмундире, с кортиком, держа фуражку под мышкой, подал Кутузову строевой рапорт и ключи от города. То презрительно почтительное отношение молодежи к выжившему из ума старику выражалось в высшей степени во всем обращении Чичагова, знавшего уже обвинения, взводимые на Кутузова.
Разговаривая с Чичаговым, Кутузов, между прочим, сказал ему, что отбитые у него в Борисове экипажи с посудою целы и будут возвращены ему.
– C'est pour me dire que je n'ai pas sur quoi manger… Je puis au contraire vous fournir de tout dans le cas meme ou vous voudriez donner des diners, [Вы хотите мне сказать, что мне не на чем есть. Напротив, могу вам служить всем, даже если бы вы захотели давать обеды.] – вспыхнув, проговорил Чичагов, каждым словом своим желавший доказать свою правоту и потому предполагавший, что и Кутузов был озабочен этим самым. Кутузов улыбнулся своей тонкой, проницательной улыбкой и, пожав плечами, отвечал: – Ce n'est que pour vous dire ce que je vous dis. [Я хочу сказать только то, что говорю.]
В Вильне Кутузов, в противность воле государя, остановил большую часть войск. Кутузов, как говорили его приближенные, необыкновенно опустился и физически ослабел в это свое пребывание в Вильне. Он неохотно занимался делами по армии, предоставляя все своим генералам и, ожидая государя, предавался рассеянной жизни.
Выехав с своей свитой – графом Толстым, князем Волконским, Аракчеевым и другими, 7 го декабря из Петербурга, государь 11 го декабря приехал в Вильну и в дорожных санях прямо подъехал к замку. У замка, несмотря на сильный мороз, стояло человек сто генералов и штабных офицеров в полной парадной форме и почетный караул Семеновского полка.
Курьер, подскакавший к замку на потной тройке, впереди государя, прокричал: «Едет!» Коновницын бросился в сени доложить Кутузову, дожидавшемуся в маленькой швейцарской комнатке.
Через минуту толстая большая фигура старика, в полной парадной форме, со всеми регалиями, покрывавшими грудь, и подтянутым шарфом брюхом, перекачиваясь, вышла на крыльцо. Кутузов надел шляпу по фронту, взял в руки перчатки и бочком, с трудом переступая вниз ступеней, сошел с них и взял в руку приготовленный для подачи государю рапорт.
Беготня, шепот, еще отчаянно пролетевшая тройка, и все глаза устремились на подскакивающие сани, в которых уже видны были фигуры государя и Волконского.
Все это по пятидесятилетней привычке физически тревожно подействовало на старого генерала; он озабоченно торопливо ощупал себя, поправил шляпу и враз, в ту минуту как государь, выйдя из саней, поднял к нему глаза, подбодрившись и вытянувшись, подал рапорт и стал говорить своим мерным, заискивающим голосом.
Государь быстрым взглядом окинул Кутузова с головы до ног, на мгновенье нахмурился, но тотчас же, преодолев себя, подошел и, расставив руки, обнял старого генерала. Опять по старому, привычному впечатлению и по отношению к задушевной мысли его, объятие это, как и обыкновенно, подействовало на Кутузова: он всхлипнул.
Государь поздоровался с офицерами, с Семеновским караулом и, пожав еще раз за руку старика, пошел с ним в замок.
Оставшись наедине с фельдмаршалом, государь высказал ему свое неудовольствие за медленность преследования, за ошибки в Красном и на Березине и сообщил свои соображения о будущем походе за границу. Кутузов не делал ни возражений, ни замечаний. То самое покорное и бессмысленное выражение, с которым он, семь лет тому назад, выслушивал приказания государя на Аустерлицком поле, установилось теперь на его лице.