Языково-ориентированное программирование

Поделись знанием:
(перенаправлено с «ЯОП»)
Перейти к: навигация, поиск
Парадигмы программирования
 • Императивная
(контрастирует с декларативной)
Процедурная
Структурная
Аспектно-ориентированная
Объектно-ориентированная
Агентно-ориентированная
Компонентно-ориентированная
Прототипно-ориентированная
Обобщённое программирование

 • Декларативная
(контрастирует с императивной)

Чистота языка
Чистота функции
Функциональная
В терминах Рефал-машины
Аппликативная
Комбинаторная
Бесточечная
(чистая конкатенативная)
Логическая
Ограничениями

 • Конкатенативная
 • Векторная[en]
 • Метапрограммирование

Языково-ориентированная
Предметно-ориентированная
Пользователями[en]
Автоматизация процесса программирования
Рефлексивность
Гомоиконность[en]

 • Связанные темы

Программирование в крупном и мелком масштабе[en]
Модульность
Полиморфизм
Продолжения и CPS
Параллелизм и конкурентность

 • Методы и алгоритмы

Автоматное
Динамическое
Потоков данных
Событийно-ориентированное
Реактивное
Сервис-ориентированное

Языково-ориентированное программирование (ЯОП) (англ. Language Oriented Programming), также Расходящаяся разработка (англ. middle out development), также метаязыковая абстракция[en], также Разработка, опирающаяся на предметно-специфичный язык (англ. DSL-Based Development)[1]парадигма программирования, заключающаяся в разбиении процесса разработки программного обеспечения на стадии разработки предметно-ориентированных языков (DSL) и описания собственно решения задачи с их использованием. Стадии могут вестись последовательно или параллельно, однократно или рекурсивно[2][1]; DSL могут быть реализованы зависимо или независимо от базового языка[⇨] и иметь одну или множество реализаций.





Место и роль в информатике

ЯОП предназначено для разделения сложностей: машино-ориентированная часть кода (низкоуровневая функциональность) и человеко-ориентированная (собственно решение прикладной задачи) разрабатываются независимо друг от друга, что исключает экспоненциальный рост результирующей сложности разработки всего проекта и решает проблему сложности как фундаментальную проблему программирования[2], описанную Фредериком Бруксом в знаменитом эссе «Серебряной пули нет», из-за которой оказывается невозможно простым совершенствованием рабочего инструментария повысить производительность труда программистов даже на порядок. Из этого же прямо следует большинство остальных преимуществ[⇨].

О достоинствах сужения специализации языков говорили ещё в середине 1980-х[3], а о достоинствах повышения уровня языков — намного раньше[4], но DSL-ориентированная разработка сформировалась как самостоятельная методология лишь к середине 1990-х[⇨].

Использование DSL вместо языков общего назначения существенно повышает уровень абстрактности кода, что позволяет вести разработку быстро и эффективно и создавать программы, которые легки в понимании и сопровождении; а также делает возможным или существенно упрощает решение многих задач, связанных с манипулированием программами (порождение программ, исследование определённого свойства программ — корректности, эффективности и др.)[3][1][5][6]. С другой стороны, разработка нового языка и эффективная его реализация является нетривиальной проблемой теоретической и прикладной информатики[⇨].

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

и др.

Преимущества ЯОП проявляются даже в тех случаях, когда DSL разрабатывается не для массового использования, а для решения единственной задачи. Например, при разработке системы автоматического эквивалентного преобразования программ FermaT[en] переход от «плоского» программирования на Лиспе к рекурсивному ЯОП (на Лиспе был реализован язык WSL, на нём — язык MetaWSL, а уже на нём — целевая функциональность) не только позволил сократить общий объём кода со 100 до 16 тысяч строк, но одновременно повысил все основные качественные характеристики кода и даже сделал возможным решение задач, которые иначе решить не удавалось[2].

Упрощённо сравнить рост трудозатрат при использовании традиционного и языково-ориентированного подходов позволяет график[1]. Как видно, ЯОП оказывается целесообразно лишь начиная с некоторого порога объёма и сложности функциональности целевой системы.

Большинство исследователей ЯОП опирается на функциональные языки и метаязыки, что обусловливает высокий порог вхождения для разработчиков. Мартин Уорд отмечает возможность реализации DSL на традиционных языках, но лишь после его окончательной разработки.

В мейнстриме часто применяется встраивания интерпретатора в язык общего назначения (см. Подход), хотя это делается не только без апелляции к принципам ЯОП, но и зачастую без осознания факта её применения как таковой. Наиболее часто встраиваются: язык регулярных выражений (интерпретатор PCRE), Lua, SQL, XML. Также был разработан инструментарий визуального программирования для использования в мейнстриме некоторых идей ЯОП.

Многие исследователи видят цель ЯОП в том, чтобы полностью размыть границы между математической моделью и её реализацией на ЭВМ и сделать возможной разработку программного обеспечения специалистами предметных областей, не имеющими специфичных знаний в программировании[1][6]:

-- проверка вхождения точки в регион:
inRegion :: Point -> Region -> Bool
p ‘inRegion‘ r = r p

...
Благодаря точному запечатлению семантики предметной области даже не-программисты оказываются способны понять значительную часть кода. В эксперименте, проведённом по заказу Naval Surface Warfare Center, совершенно незнакомые с Хаскелом люди схватывали основные понятия на лету. Некоторые даже выразили неверие в то, что этот код был действительно исполнимым.
(В самом деле, несмотря на присутствие в тексте этого последнего предложения, один из рецензентов первого черновика данной работы выразил недовольство тем, что «работа заявляется как рассуждения одновременно о синтаксисе и семантике, но её содержание в основном касается синтаксиса (как, например, определение inRegion), и не делается никаких различий между математикой и программированием». Но на самом деле, это определение inRegion целиком и полностью семантическое. Более того, эквациональные рассуждения[7] ... позволяют размыть грань между математикой и программированием: программы могут рассматриваться как спецификации. Это особое свойство, так как расширяет применение формальных методов.)

— Paul Hudak, «Modular Domain Specific Languages and Tools»[1]

Подход

В основе подхода лежит идея о том, что язык, специально разработанный под поставленную задачу, будет обеспечивать заведомо более высокие показатели качества кода, чем любой язык общего назначения[1][6], и что для решения сложных промышленных задач более эффективным будет изобрести более простой в понимании (человеко-ориентированный[8] или точно инкапсулирующий предметные знания[2][1]) язык, нежели преодолевать трудности использования имеющегося, даже укоренившегося в промышленности[4].

Большинство исследователей говорят о ЯОП как о переводе всей индустрии разработки ПО на использование текстовых языков 4-го и 5-го поколения[8], но некоторые ориентируются на использование визуальных языков[9][10].

Основные проблемы подхода состоят в нахождении способов быстро создать реализацию придуманного DSL, чтобы начать разрабатывать собственно решение задачи, и в обеспечении хорошей вычислительной производительности DSL.

Предметно-ориентированный язык, как и вообще любой язык программирования, определяется алфавитом, грамматикой, семантикой и психолингвистикой, однако, в зависимости от способа реализации DSL, роль и взаимосвязь этих уровней может размываться и/или наследоваться от языка его реализации.

Разные авторы делают акцент на разных способах разработки предметно-специфичных языков:

При использовании макросредств, в свою очередь, различают шаблонное метапрограммирование и многостадийную статическую интерпретацию[13][17][18][5].

Третий и четвёртый методы имеют фундаментальное преимущество перед первыми двумя — DSL не заменяет, а расширяет язык общего назначения[14][1][19][20], повторно используя весь инструментарий базового языка, начиная с парсера, благодаря чему:

  • появляется возможность комбинировать в едином коде возможности базового языка, общих библиотек к нему, разработанного предметно-специфичного языка и даже нескольких других разработанных аналогичным образом предметно-специфичных языков, применяя устоявшиеся для базового языка идиомы, трюки, скрещивая методологии;
  • устраняется необходимость реализовывать с нуля тривиальные вещи (такие как арифметика чисел) — достаточно адаптировать синтаксис;
  • устраняется необходимость разработки полного комплекса инструментария разработки (оптимизирующего транслятора с информативными сообщениями об ошибках, REPL, отладчика, профилировщика и пр.). При рекурсивном встраивании DSL повторное использование кода достигает гигантских масштабов[1].

Многие авторы состредотачиваются на эффективном (без интерпретации) встраивании в язык определённых изначально отсутствующих в нём возможностей для адаптации к определённым задачам[15][21], что в дальнейшем может служить основой для чистого встраивания DSL[22]. Значительное внимание уделяется использованию продолжений для разработки DSL с недетерминированной семантикой (Стил[en], Уэнд[en], Феллейзен[en], Рэмси[en], Реппи[en] и другие).

Приложения подхода и самоприменимость

Важным подвидом ЯОП является Пользовательское программирование[en], позволяющее самым разным людям, не имеющим никакого представления об информатике, эффективно решать множество прикладных задач. Роль этого приложения ЯОП столь велика, что едва ли не самым распространённым в мире языком программирования на практике оказываются средства вёрстки крупноформатных таблиц (англ. spreadsheets)[6].

В зависимости от трактовки термина «метапрограммирование» (МП) и способа реализации DSL, либо ЯОП является квинтэссенцией МП, либо МП служит одним из способов реализации ЯОП. Последний вариант наиболее применим в случае встраивания DSL в язык общего назначения посредством макро-подмножества последнего[13]. При использовании средств визуальной разработки DSL[9][10] эти определения оказываются синонимичными, т.к. само визуальное программирование представляет собой простейшую форму МП. Рассмотрение МП в качестве самоприменения ЯОП означает:

  • для встраиваемых DSL — рекурсивное применение ЯОП, предлагаемое Уордом и Хьюдаком;
  • для независимых DSL — раскрутку компилятора (англ. bootstrapping).

Инструментарий

Для разработки независимых трансляторов широко распространены генераторы лексеров и парсеров на основе определения грамматики целевого DSL посредством БНФ и регулярных выражений:

и другие.

При компиляции независимого DSL целевой платформой редко выбирается машинный код или даже Ассемблер, более предпочтительным (как для снижения трудоёмкости реализации DSL, так и для повышения портируемости) является использование платформы более высокого уровня:

  • языка общего назначения высокого уровня;
  • языка общего назначения среднего уровня (Си, BitC, Forth)
  • промежуточного языка или фреймфорка компиляторов (C--, MLRISC[24])
  • низкоуровневой виртуальной машины (LLVM)

Для встраивания DSL в язык общего назначения используются следующие технологии:

Чистое встраивание не предполагает каких-либо дополнительных инструментов, но накладывает довольно жёсткие ограничения на выбор базового языка[⇨].

При использовании многостадийной статической интерпретации целевая платформа совпадает с базовым языком[13][17][18][5].

В рамках традиционного программирования (на языках, наследованных от Алгола) использование некоторых идей ЯОП делает возможным инструментарий визуального программирования, разработанный в первой половине 2000-х годов[9][10][28][29]:

  • Intentional Software, Meta Programming System (JetBrains)[30]

История, философия, терминология

В сообществе языка Lisp практически от момента создания практиковалось использование макросредств для адаптации к требованиям предметной области задачи. Этот подход, в частности, был подробно описан в книге Структура и интерпретация компьютерных программ. Аналогичные идеи временами применялись в сообществе языка Forth. В основном эти решения носили спонтанный характер, и зачастую их можно классифицировать как ad hoc-решения[13].

Во второй половине 1970-х годов была изобретена система типов Хиндли — Милнера, которая легла в основу языка ML (аббревиатура от «MetaLanguage» — рус. МетаЯзык). Изначально ML разрабатывался в качестве DSL для системы автоматического доказательства теорем LCF[en], но вскоре стало ясно, что он может быть хорошим прикладным языком общего назначения — более качественным, чем языки, изначально проектируемые быть языками общего назначения, т.к. отлажен на одной конкретной сложной задаче[31][32]. Как следствие, он породил целое семейство Х-М-типизированных языков, завоевавших популярность в качестве языков для разработки языков (метаязыков) и часто определяемых как «DSL для денотационной семантики[en]»[1].

В 1994 году Мартин Уорд (англ. Martin Ward)[33] дал подробную характеристику методологии[2] и предложил термины «языково-ориентированное программирование» и «расходящаяся разработка» (или «разработка от центра к краям», middle out development), отметив, что подход в разнообразных формах неоднократно применялся ранее. Термин «расходящаяся разработка» подчёркивает, что средним слоем (middle layer) в результирующей системе является разработанный DSL,— в противовес ранее известным и широко до сих пор применяющимся методам «восходящей разработки» (bottom up development[en]), «нисходящей разработки» (top down development[en]) и совмещающей их «сходящейся разработки» (ouside in development).

Уорд также предложил использовать ЯОП рекурсивно, поэтапно наращивая сложность разрабатываемой системы снизу вверх; и сочетать ЯОП с быстрым прототипированием, разрабатывая сперва простейший прототип DSL (что может быть выполнено очень быстро) и простейшее решение с его использованием, затем, после тестирования языка, выявления недочётов и уточнения требований, дорабатывать DSL и переписывать решение на новой версии языка, и так далее итеративно.

Пол Хьюдак[en] предложил[1] метод чистого встраивания (англ. pure embedding) с применением типобезопасных языков (предпочтительно ленивых, таких как Haskell, но возможно и строгих, таких как ML, хотя в последнем случае реализация выходит несколько более громоздкой и менее естественной) и эквациональные рассуждения[7], рекурсивно разрабатывая систему сверху вниз и накапливая повторно используемый код в виде «DSL для разработки DSL».

Метод чистого встраивания породил термин «встраиваемый предметно-специфичный язык» (англ. Embedded DSL, EDSL; иногда DSEL)[1][8]. Был разработан целый ряд EDSL над Хаскелем для программирования в чистом функциональном стиле интерактивных приложений реального времени (Fran, Fruit, FRP и RT-FRP, FAL, Frob, Fvision, Yampa)[34][19], сформировавших самостоятельную парадигму — функциональное реактивное программирование (ФРП). Это показывает, что ЯОП не является отдельной замкнутой парадигмой программирования, а напротив, может использоваться в качестве инструмента при разработке новых парадигм.

Вокруг Standard ML — базового диалекта ML — с начала 1990-х годов велись споры в отношении отсутствия макросредств в языке[31]. Критики утверждали, что отсутствие макросредств является недостатком, но сторонники строгой типизации возражали, что их отсутствие является как раз преимуществом. В другом диалекте ML — OCaml — была предложена компромиссная идея — параметризация синтаксиса за счёт выделения парсера в настраиваемый модуль CamlpX[en] компилятора, посредством которой было разработано множество EDSL для OCaml. Позже появилось расширение для генерации кода во время выполнения[en]*MetaOCaml[en]. В конце 1990-х годов была предложена идея типобезопасных макросредств как инструмента эффективной реализации типобезопасных DSL[35]. Эту идею вскоре воплотили в виде расширений MetaML[13][17][18] — для языка Standard ML и Template Haskell[en][36] — для языка Haskell. В первом случае макросредства рассматриваются исключительно как многостадийный статический интерпретатор; во втором они рассматриваются одновременно и как этот же подход, и как известное из языка Lisp квазицитирование, и как подсистема шаблонов, аналогичная имеющейся в языке C++.

Исследование возможности реализации и применения этих подходов в разных языках показали, что С++ является крайне неудобным инструментом разработки встраиваемых языков[37]. Тем не менее, С++ позволяет воплощать решения этого направления, культивированные и отлаженные под эгидой функционального программирования[5][38], что для мейнстримных языков является редким достоинством[5].

Данные предварительных исследований, опубликованные в 2012 году, показали, что независимый DSL оказывается удобнее в использовании, в то время как EDSL проще в реализации[8].

Критика и сравнение с альтернативами

Достоинства

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

— Martin Ward, «Language Oriented Programming»[2]

ЯОП имеет множество достоинств перед традиционной «плоской» разработкой[2]:

  • Разделение сложностей. Реализация и собственно решение оказываются полностью независимы, что исключает экспоненциальный рост результирующей сложности разработки всего проекта.
  • Высокая скорость разработки. Всего несколько строк на DSL могут реализовывать очень сложные функции. Реализация DSL также сохраняется простой, так как содержит лишь необходимые функции.
  • Высокая модифицируемость. Исследования, на которые ссылается Мартин Уорд, показывают, что самым важным фактором, обусловливающим трудности модификации системы, является размер кода. Разделение логики и реализации и сокращение общего объёма кода существенно упрощают его модификацию и исправление ошибок. При традиционном подходе принятые решения по реализации оказываются «размазанными» по проекту, что затрудняет понимание зависимостей (решений, которые привели к написанию данного участка кода). Сторонники «модульного проектирования» приводят те же аргументы, но более фундаментальные проектные решения обычно не могут быть инкапсулированы в одном модуле.
  • Существенное увеличение коэффициента повторного использования кода. DSL, инкапсулирующий специфичные знания предметной области, может быть повторно использован для решения задач одного класса, в т.ч. для самой задачи разработки DSL[2][1].
  • Существенное упрощение портирования системы. Необходимо переделывать только реализацию DSL, тогда как логика системы (код на DSL) переносится без изменений. В случае с FermaT[en], реализация DSL нижнего уровня занимала всего 2-3 тысячи строк кода на Lisp, и в дальнейшем была переписана на Си всего за три человеко-дня. Другим примером служит высокая портируемость системы ΤΕΧ. Кроме того, после создания прототипа реализации DSL дальнейшая разработка приложения может быть распараллелена — одни разработчики занимаются решением прикладной задачи, в то время как другие независимо от них реализуют DSL на разных платформах и совершенствуют эти реализации.
  • Принципиальная возможность решения задач. Многие подзадачи не удавалось решить посредством классического подхода из-за превышения общей сложности решения возможностей человека по восприятию и переработке информации. Решение же на DSL оказывается не просто возможным, а очень простым и интуитивным, к тому же исключающим размножение ошибок, так как доступ к очень сложным функциям системы осуществляется через примитивы DSL.
  • Получение программных систем, расширяемых их пользователями[6]. DSL делает программирование доступным для специалистов предметной области, не имеющих специфичных знаний в программировании, и даёт им возможность самостоятельно расширять функциональность системы, что принципиально невозможно при использовании традиционного подхода.

Реализация языков путём разработки независимых трансляторов является рутинной задачей, так как накоплена обширная формальная база и основанного на ней инструментария (Lex/Yacc, ANTLR, Parsec[23]). Например, на Parsec разработка парсеров для языков с несложной грамматикой (сопоставимой с грамматикой Паскаля Вирта) выполняется за считанные человеко-часы[39][40].

Недостатки

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

Ограничения

Для разработки новых языков требуется хорошая теоретическая подготовка и свободное владение семантически разными языками и их расширениями. Мартин Уорд отмечает, что проектирование хорошего языка, потенциально способного удовлетворять его пользователей и иметь длительный жизненный цикл — это сложная задача, требующая высокой степени грамотности в информатике, и рекомендует программистам постоянно практиковаться в разработке языков для накопления достаточного практического опыта. Кроме того, он указывает, что назначение ЯОП не в том, чтобы снизить порог вхождения для разработчиков, а наоборот, в том, чтобы расширить возможности и упростить работу квалифицированных разработчиков,— а уже в дальнейшем это приводит к снижению порога вхождения пользователей системы, необходимого для её использования и развития.

Методы встраивания DSL в язык общего назначения применимы далеко не в любом языке, т.к. требуют определённых свойств семантики базового языка в разных сочетаниях: аппликативной модели вызова, истинно полиморфной системы типов либо динамической типизации (см. полиморфизм), функций высшего порядка, продолжений, развитой подсистемы макрорасширения, рефлексивности, ленивости. Эти свойства доступны изначально (или могут быть полноценно реализованы) далеко не в любом языке. Чаще всего оба метода и их комбинации используются в диалектах языков, основанных на нетипизированном и типизированном лямбда-исчислении (математической модели описания семантик), порой с нестандартизированными специфичными расширениями: Common Lisp, Scheme, Standard ML, MetaML[13], Alice, OCaml, MetaOCaml[en], Haskell, Template Haskell[en], Nemerle. Также эти методы применимы в языке Forth, хотя реально применяются разработчиками на Forth относительно редко. Все эти языки имеют высокий порог вхождения. Некоторые авторы отмечают возможность применения третьего метода в мейнстримном языке С++, но пригодность С++ для ЯОП подвергается критике[37].

Визуальная разработка DSL[9][10] имеет низкий порог вхождения, но жертвует рядом свойств ЯОП, описываемых Уордом, Хьюдаком и другими:

  • Понятие DSL определяется как «урезанный язык программирования (в большинстве случаев не полный по Тьюрингу)»;
  • Рассматриваются DSL только с детерминированной семантикой, в частности, Фаулер относит к DSL адаптивные объектные модели (так что размытие границ между математикой и семантикой, на котором делает акцент Хьюдак, не выполняется);
  • Не рассматриваются возможности ни рекурсивного применения ЯОП, ни увеличения числа реализаций разработанного DSL, так что эффективность реализации DSL целиком зависит от разработчиков визуальной среды.

Эффективность

Вычислительная производительность «небрежной» реализации DSL может оказаться невысокой, а хорошая оптимизация — неоправданно дорогой. Разумеется, в силу предназначения некоторых DSL, скорость для них не имеет принципиального значения (ΤΕΧ, AutoLisp). В остальных же случаях она зависит как от способа реализации, так и от целевой платформы компиляции, и во многих случаях удаётся добиться очень хороших показателей. Например, Валид Таха описывает[41] реализацию транслятора функционально чистого языка FRP методом порождения императивного кода на Си, с помощью которого были разработаны приложения реального времени для 16-битного микроконтроллера PIC16C66[42]. Хьюдак указывает[1], что многостадийные модульные реализации DSL методом чистого встраивания (см. Подход) в Haskell получаются крайне медлительными, так как каждый слой абстракции даёт 15-70-кратное замедление, — но за счёт применения техники суперкомпиляции скорость может быть обратно повышена на три порядка (от 400 до 2800 раз).

Возможна разработка DSL, предназначенного для оптимизации конструкций, применяемых в логике более высокого уровня. Например, был разработан язык OL (Operator Language)[43] для описания математических алгоритмов платформенно-независимым образом и упрощения портирования на новые архитектуры математических библиотек с высокими требованиями эффективности (см. числодробилка). Компилятор параметризуется данными об архитектуре процессора (поддержке векторных операций, количестве ядер и др.), а также порой выполняет автоматическое сравнительное тестирование вариантов реализации с выбором наиболее быстрой. В результате программа на декларативном языке сверхвысокого уровня порождает на выходе очень эффективный (сравнимый с написанным вручную) код на Си, реализующий алгоритм максимально эффективным для данной архитектуры образом. В данном случае компонентом эффективности также становится ужесточение размера входных данных — например, может быть построена быстрая функция для перемножения матриц размера 8x8.

Использование встраиваемых DSL в языках, для которых существуют глобально-оптимизирующие компиляторы (такие как Stalin Scheme[en], MLton), позволяет осуществлять языково-ориентированную декомпозицию задач без потерь эффективности в сравнении с другими подходами к проектированию, но может накладывать ограничения на разрабатываемый DSL. Это направление является предметом многих исследований.

Все эти решения являются частными, и применимость каждого из них зависит от природы разрабатываемого DSL на всех уровнях, либо наоборот, предъявляет к ней особые требования. Таким образом, соотнесение архитектуры проекта с эффективностью его реализации является неотъемлемой частью проблематики ЯОП. Это верно и для других подходов к проектированию, но в гораздо меньшей степени.

Напишите отзыв о статье "Языково-ориентированное программирование"

Примечания

  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Hudak - Modular Domain Specific Languages and Tools, 1998.
  2. 1 2 3 4 5 6 7 8 Ward - Language Oriented Programming, 1994.
  3. 1 2 Bentley - Little languages, 1986.
  4. 1 2 Backus - Can Programming Be Liberated from the vonNeumann Style?, 1978, Introduction.
  5. 1 2 3 4 5 Czarnecki, O’Donnell, Striegnitz, Taha - DSL implementation in metaocaml, template haskell, and C++, 2004.
  6. 1 2 3 4 5 Taha - Domain-Specific Languages, 2008.
  7. 1 2 3 [www.haskell.org/haskellwiki/Equational_reasoning_examples Equational reasoning]
  8. 1 2 3 4 Mernik - Formal and Practical Aspects of Domain-Specific Languages, 2012.
  9. 1 2 3 4 Мартин Фаулер [www.maxkir.com/sd/languageWorkbenches.html Языковой инструментарий: новая жизнь языков предметной области]. — 2005.
  10. 1 2 3 4 Сергей Дмитриев (JetBrains) [www.rsdn.ru/article/philosophy/LOP.xml Языково-ориентированное программирование: следующая парадигма] // = RSDN Magazine. — 2005.
  11. Ахо, Сети, Ульман - Компиляторы, 1985.
  12. [bookre.org/reader?file=1251401 Developing Applications With Objective Caml]
  13. 1 2 3 4 5 6 7 Ganz, Sabry, Taha - Macros as Multi-Stage Computations, 2001.
  14. 1 2 Shivers - The ultimate little language, 1996.
  15. 1 2 Berthomieu - OO Programming Styles in ML, 2000.
  16. Ramsey - Embedding an Interpreter, 1990.
  17. 1 2 3 Taha - A Gentle Introduction to Multi-stage Programming, 2004.
  18. 1 2 3 Taha - A Gentle Introduction to Multi-stage Programming, Part II, 2007.
  19. 1 2 Cheong - Functional Programming and 3D Games, 2005.
  20. Benton - Embedded Interpreters, 2005.
  21. Ramsey - Concurrent Programming in ML, 1990.
  22. Schelog, 2003.
  23. 1 2 [www.haskell.org/haskellwiki/Parsec Parsec for Haskell].
  24. [www.cs.nyu.edu/leunga/www/MLRISC/Doc/html/index.html MLRISC Library - a framework for retargetable and optimizing compiler back ends]
  25. [www.smlnj.org/doc/quote.html Object Language Embedding in SML with Quote/Antiquote].
  26. Daniel de Rauglaudre. [caml.inria.fr/pub/docs/tutorial-camlp4/ Camlp4 - Tutorial] ((c) 2002 Institut National de Recherche en Informatique et Automatique).
  27. Martin Jambon. [mjambon.com/extend-ocaml-syntax.html How to customize the syntax of OCaml, using Camlp5] ((c) 2005, 2010).
  28. Дмитрий Кириллов. [old.computerra.ru/2006/630/258015/ Ориентация на язык]. Компьютерра (14 марта 2006). Проверено 5 мая 2006.
  29. Игорь Тамащук. [igor.quatrocode.com/2008/10/domain-specific-language.html Domain Specific Language в своём приложении — это просто] (22 октября 2008). Проверено 24 октября 2008. [www.webcitation.org/65Npx6rMP Архивировано из первоисточника 12 февраля 2012].
  30. [www.jetbrains.com/mps/ JetBrains - DSL Development Environment]
  31. 1 2 Appel - A Critique of Standard ML, 1992.
  32. Paulson - ML for the Working Programmer, 1996, Standard ML, с. 11.
  33. [www.cse.dmu.ac.uk/~mward/ Martin Ward's Homepage]
  34. Elliott, Hudak - Functional reactive animation, 1997.
  35. Bawden - First-class macros have types, 2000.
  36. Sheard, S.P.Jones - Template Meta-programming for Haskell, 2002.
  37. 1 2 Czarnecki, O’Donnell, Striegnitz, Taha - DSL implementation in metaocaml, template haskell, and C++, 2004, 6. Discussion and Concluding Remarks, с. 18: «C++ Template Metaprogramming suffers from a number of limitations, including portability problems due to compiler limitations (although this has significantly improved in the last few years), lack of debugging support or IO during template instantiation, long compilation times, long and incomprehensible errors, poor readability of the code, and poor error reporting.».
  38. Daniel Lincke, Patrik Jansson, Marcin Zalewski, and Cezar Ionescu [www.informatik.uni-trier.de/~ley/db/conf/dsl/dsl2009.html Generic Libraries in C++ with Concepts from High-Level Domain Descriptions in Haskell] // DSLs, IFIP TC 2 Working Conference. — Oxford, UK: Springer Berlin Heidelberg New York, Germany, 2009. — Вып. July 15-17, Volume Editor W.M. Taha. — С. 236-261. — ISBN 3-642-03033-5, 978-3-642-03033-8. — ISSN [www.sigla.ru/table.jsp?f=8&t=3&v0=0302-9743&f=1003&t=1&v1=&f=4&t=2&v2=&f=21&t=3&v3=&f=1016&t=3&v4=&f=1016&t=3&v5=&bf=4&b=&d=0&ys=&ye=&lng=&ft=&mt=&dt=&vol=&pt=&iss=&ps=&pe=&tr=&tro=&cc=UNION&i=1&v=tagged&s=0&ss=0&st=0&i18n=ru&rlf=&psz=20&bs=20&ce=hJfuypee8JzzufeGmImYYIpZKRJeeOeeWGJIZRrRRrdmtdeee88NJJJJpeeefTJ3peKJJ3UWWPtzzzzzzzzzzzzzzzzzbzzvzzpy5zzjzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzztzzzzzzzbzzzzzzzzzzzzzzzzzzzzzzzzzzzvzzzzzzyeyTjkDnyHzTuueKZePz9decyzzLzzzL*.c8.NzrGJJvufeeeeeJheeyzjeeeeJh*peeeeKJJJJJJJJJJmjHvOJJJJJJJJJfeeeieeeeSJJJJJSJJJ3TeIJJJJ3..E.UEAcyhxD.eeeeeuzzzLJJJJ5.e8JJJheeeeeeeeeeeeyeeK3JJJJJJJJ*s7defeeeeeeeeeeeeeeeeeeeeeeeeeSJJJJJJJJZIJJzzz1..6LJJJJJJtJJZ4....EK*&debug=false 0302-9743].
  39. Jonathan Tang. [en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours/Parsing Write Yourself a Scheme in 48 Hours].
  40. [von-neumann-architecture.blogspot.ru/2011/08/blog-post_02.html О том, как на Хаскеле компилировать Паскаль в.].
  41. Zhanyong Wan, Walid Taha, Paul Hudak [doc.effective-modeling.org/p/publications/conference/padl02.pdf Event-Driven FRP]. — Department of Computer Science, Yale University.
  42. [www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010152 PIC16C66 - PIC® Microcontrollers]
  43. Franz Franchetti, Frédéric de Mesmay, Daniel McFarlin, and Markus Püschel, Carnegie Mellon University [www.informatik.uni-trier.de/~ley/db/conf/dsl/dsl2009.html Operator Language: A Program Generation Framework for Fast Kernels] // Domain-Specific Languages, IFIP TC 2 Working Conference, International Federation for Information Processing. — Oxford, UK: Springer Berlin Heidelberg New York, Germany, 2009. — Вып. July 15-17, Volume Editor W.M. Taha. — С. 385–409. — ISBN 3-642-03033-5, 978-3-642-03033-8. — ISSN [www.sigla.ru/table.jsp?f=8&t=3&v0=0302-9743&f=1003&t=1&v1=&f=4&t=2&v2=&f=21&t=3&v3=&f=1016&t=3&v4=&f=1016&t=3&v5=&bf=4&b=&d=0&ys=&ye=&lng=&ft=&mt=&dt=&vol=&pt=&iss=&ps=&pe=&tr=&tro=&cc=UNION&i=1&v=tagged&s=0&ss=0&st=0&i18n=ru&rlf=&psz=20&bs=20&ce=hJfuypee8JzzufeGmImYYIpZKRJeeOeeWGJIZRrRRrdmtdeee88NJJJJpeeefTJ3peKJJ3UWWPtzzzzzzzzzzzzzzzzzbzzvzzpy5zzjzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzztzzzzzzzbzzzzzzzzzzzzzzzzzzzzzzzzzzzvzzzzzzyeyTjkDnyHzTuueKZePz9decyzzLzzzL*.c8.NzrGJJvufeeeeeJheeyzjeeeeJh*peeeeKJJJJJJJJJJmjHvOJJJJJJJJJfeeeieeeeSJJJJJSJJJ3TeIJJJJ3..E.UEAcyhxD.eeeeeuzzzLJJJJ5.e8JJJheeeeeeeeeeeeyeeK3JJJJJJJJ*s7defeeeeeeeeeeeeeeeeeeeeeeeeeSJJJJJJJJZIJJzzz1..6LJJJJJJtJJZ4....EK*&debug=false 0302-9743].

Литература

Учебники, руководства, справочники, использование

  • Харольд Абельсон, Джеральд Джей Сассман, Джули Сассман. Структура и интерпретация компьютерных программ (SICP).
  • Альфред Ахо, Рави Сети, Джеффри Ульман. Компиляторы: принципы, технологии и инструменты. — Addison-Wesley Publishing Company, Издательский дом «Вильямс», 1985, 2001, 2003. — 768 с. — ISBN 5-8459-0189-8 (рус.), 0-201-10088-6 (ориг.).
  • Джон Хопкрофт, Раджив Мотвани, Джеффри Ульман. Введение в теорию автоматов, языков и вычислений. — 2-е. — Cornell University, Stanford University: Addison-Wesley Publishing Company, Издательский дом «Вильямс», 2001. — 528 с. — ISBN 5-8459-0261-4 (рус.), 0-201-44124-1 (англ.).
  • Jon Bentley [academic.research.microsoft.com/Publication/774283/little-languages Little languages]. — CACM, 1986. — Вып. 29(8). — С. 711–721.
  • Norman Ramsey [www.cs.princeton.edu/research/techreps/TR-262-90 Concurrent Programming in ML]. — Department of Computer Science, Princeton University, 1990.
  • Lawrence C. Paulson. ML for the Working Programmer. — 2nd edition. — Cambridge: University Press, 1991, 1996. — 478 с. — ISBN 0-521-57050-6 (hardback), 0-521-56543-X (paperback).
  • Bernard Berthomieu [homepages.laas.fr/bernard/oo/ooml.html OO Programming Styles in ML]. — LAAS Report #2000111, Centre National De La Recherche Scientifique Laboratoire d'Analyse et d'Architecture des Systèmes, 2000.
  • [www.hh.se/english/research/professors/walidmohamedtaha.10235.html Walid Taha] [www.cs.rice.edu/~taha/publications/journal/dspg04a.pdf A Gentle Introduction to Multi-stage Programming]. — Department of Computer Science, Rice University, 2004.
  • [www.hh.se/english/research/professors/walidmohamedtaha.10235.html Walid Taha] [www.cs.rice.edu/~taha/publications/journal/gttse07.pdf A Gentle Introduction to Multi-stage Programming, Part II]. — Department of Computer Science, Rice University, 2007.
  • K. Czarnecki, J. O’Donnell, J. Striegnitz, W. Taha [camlunity.ru/swap/Library/Computer%20Science/Metaprogramming/Domain-Specific%20Languages/DSL%20Implementation%20in%20MetaOCaml,%20Template%20Haskell%20and%20C++.pdf DSL implementation in metaocaml, template haskell, and C++]. — University of Waterloo, University of Glasgow, Research Centre Julich, Rice University, 2004.
  • Mun Hon Cheong [www.cse.unsw.edu.au/~pls/thesis/munc-thesis.pdf Functional Programming and 3D Games]. — The University of New South Wales, 2005.
  • Nick Benton [research.microsoft.com/en-us/um/people/nick/benton03.pdf Embedded Interpreters]. — Journal of Functional Programming, Microsoft Research, Cambridge, 2005.
  • [www.hh.se/english/research/professors/walidmohamedtaha.10235.html Walid Taha] [www.cs.rice.edu/~taha/publications/conference/icces08.pdf Domain-Specific Languages]. — Department of Computer Science, Rice University, 2008.
  • Norman Ramsey [www.cs.tufts.edu/~nr/pubs/embedj-abstract.html Embedding an Interpreted Language Using Higher-Order Functions and Types]. — Cambridge University Press, 2008.

История, анализ, критика

  • John Backus Can Programming Be Liberated from the vonNeumann Style? A Functional Style and Its Algebra of Programs // ACM 0001-0782/78/0800-0613, August 1978, vol.2, #8. — IBM Research Laboratory, ACM Turing Award Lecture, 1978.
  • Andrew W. Appel [www.cs.princeton.edu/research/techreps/TR-364-92 A Critique of Standard ML]. — Princeton University, revised version of CS-TR-364-92, 1992.
  • [www.cse.dmu.ac.uk/~mward/ Martin Ward] [www.cse.dmu.ac.uk/~mward/martin/papers/middle-out-t.pdf Language Oriented Programming]. — Computer Science Department, Science Labs, 1994.
  • Olin Shivers [citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.7.2089&rep=rep1&type=pdf A universal scripting framework, or lambda: The ultimate "little language"]. — MIT AI Lab, Cambridge, 1996.
  • Conal Elliott, Paul Hudak [conal.net/papers/icfp97/ Functional reactive animation]. — International Conference on Functional Programming, 1997.
  • Paul Hudak [haskell.cs.yale.edu/?post_type=publication&p=125 Modular Domain Specific Languages and Tools]. — IEEE Computer Society Press, Department of Computer Science, Yale University, 1998.
  • A. Bawden First-class macros have types. — 27th ACM Symposium on Principles of Programming Languages (POPL’00), 2000. — С. 133–141.
  • Steven E. Ganz, Amr Sabry, [www.hh.se/english/research/professors/walidmohamedtaha.10235.html Walid Taha] [www.cs.rice.edu/~taha/publications/preprints/icfp01-pre.pdf Macros as Multi-Stage Computations: Type-Safe, Generative, Binding Macros in MacroML]. — International Conference on Functional Programming, ACM Press, 2001.
  • Tim Sheard, Simon Peyton Jones [research.microsoft.com/en-us/um/people/simonpj/papers/meta-haskell/meta-haskell.pdf Template Meta-programming for Haskell]. — ACM 1-58113-415-0/01/0009, 2002.
  • Marjan Mernik [sharebookfree.com/formal-and-practical-aspects-of-domain-specific-languages-recent-developments/ Formal and Practical Aspects of Domain-Specific Languages]. — IGI Global, 2012. — ISBN 978-1-4666-2092-6.

Ссылки

  • Dorai Sitaram. [www.ccs.neu.edu/home/dorai/schelog/schelog.html Programming in Schelog] (2003).
  • [www.haskell.org/haskellwiki/Applications_and_libraries/Compilers_and_interpreters Compilers and interpreters implemented in Haskell].

Отрывок, характеризующий Языково-ориентированное программирование

Наташа, как подстреленный, загнанный зверь смотрит на приближающихся собак и охотников, смотрела то на того, то на другого.
– Наталья Ильинична, – начал Пьер, опустив глаза и испытывая чувство жалости к ней и отвращения к той операции, которую он должен был делать, – правда это или не правда, это для вас должно быть всё равно, потому что…
– Так это не правда, что он женат!
– Нет, это правда.
– Он женат был и давно? – спросила она, – честное слово?
Пьер дал ей честное слово.
– Он здесь еще? – спросила она быстро.
– Да, я его сейчас видел.
Она очевидно была не в силах говорить и делала руками знаки, чтобы оставили ее.


Пьер не остался обедать, а тотчас же вышел из комнаты и уехал. Он поехал отыскивать по городу Анатоля Курагина, при мысли о котором теперь вся кровь у него приливала к сердцу и он испытывал затруднение переводить дыхание. На горах, у цыган, у Comoneno – его не было. Пьер поехал в клуб.
В клубе всё шло своим обыкновенным порядком: гости, съехавшиеся обедать, сидели группами и здоровались с Пьером и говорили о городских новостях. Лакей, поздоровавшись с ним, доложил ему, зная его знакомство и привычки, что место ему оставлено в маленькой столовой, что князь Михаил Захарыч в библиотеке, а Павел Тимофеич не приезжали еще. Один из знакомых Пьера между разговором о погоде спросил у него, слышал ли он о похищении Курагиным Ростовой, про которое говорят в городе, правда ли это? Пьер, засмеявшись, сказал, что это вздор, потому что он сейчас только от Ростовых. Он спрашивал у всех про Анатоля; ему сказал один, что не приезжал еще, другой, что он будет обедать нынче. Пьеру странно было смотреть на эту спокойную, равнодушную толпу людей, не знавшую того, что делалось у него в душе. Он прошелся по зале, дождался пока все съехались, и не дождавшись Анатоля, не стал обедать и поехал домой.
Анатоль, которого он искал, в этот день обедал у Долохова и совещался с ним о том, как поправить испорченное дело. Ему казалось необходимо увидаться с Ростовой. Вечером он поехал к сестре, чтобы переговорить с ней о средствах устроить это свидание. Когда Пьер, тщетно объездив всю Москву, вернулся домой, камердинер доложил ему, что князь Анатоль Васильич у графини. Гостиная графини была полна гостей.
Пьер не здороваясь с женою, которую он не видал после приезда (она больше чем когда нибудь ненавистна была ему в эту минуту), вошел в гостиную и увидав Анатоля подошел к нему.
– Ah, Pierre, – сказала графиня, подходя к мужу. – Ты не знаешь в каком положении наш Анатоль… – Она остановилась, увидав в опущенной низко голове мужа, в его блестящих глазах, в его решительной походке то страшное выражение бешенства и силы, которое она знала и испытала на себе после дуэли с Долоховым.
– Где вы – там разврат, зло, – сказал Пьер жене. – Анатоль, пойдемте, мне надо поговорить с вами, – сказал он по французски.
Анатоль оглянулся на сестру и покорно встал, готовый следовать за Пьером.
Пьер, взяв его за руку, дернул к себе и пошел из комнаты.
– Si vous vous permettez dans mon salon, [Если вы позволите себе в моей гостиной,] – шопотом проговорила Элен; но Пьер, не отвечая ей вышел из комнаты.
Анатоль шел за ним обычной, молодцоватой походкой. Но на лице его было заметно беспокойство.
Войдя в свой кабинет, Пьер затворил дверь и обратился к Анатолю, не глядя на него.
– Вы обещали графине Ростовой жениться на ней и хотели увезти ее?
– Мой милый, – отвечал Анатоль по французски (как и шел весь разговор), я не считаю себя обязанным отвечать на допросы, делаемые в таком тоне.
Лицо Пьера, и прежде бледное, исказилось бешенством. Он схватил своей большой рукой Анатоля за воротник мундира и стал трясти из стороны в сторону до тех пор, пока лицо Анатоля не приняло достаточное выражение испуга.
– Когда я говорю, что мне надо говорить с вами… – повторял Пьер.
– Ну что, это глупо. А? – сказал Анатоль, ощупывая оторванную с сукном пуговицу воротника.
– Вы негодяй и мерзавец, и не знаю, что меня воздерживает от удовольствия разможжить вам голову вот этим, – говорил Пьер, – выражаясь так искусственно потому, что он говорил по французски. Он взял в руку тяжелое пресспапье и угрожающе поднял и тотчас же торопливо положил его на место.
– Обещали вы ей жениться?
– Я, я, я не думал; впрочем я никогда не обещался, потому что…
Пьер перебил его. – Есть у вас письма ее? Есть у вас письма? – повторял Пьер, подвигаясь к Анатолю.
Анатоль взглянул на него и тотчас же, засунув руку в карман, достал бумажник.
Пьер взял подаваемое ему письмо и оттолкнув стоявший на дороге стол повалился на диван.
– Je ne serai pas violent, ne craignez rien, [Не бойтесь, я насилия не употреблю,] – сказал Пьер, отвечая на испуганный жест Анатоля. – Письма – раз, – сказал Пьер, как будто повторяя урок для самого себя. – Второе, – после минутного молчания продолжал он, опять вставая и начиная ходить, – вы завтра должны уехать из Москвы.
– Но как же я могу…
– Третье, – не слушая его, продолжал Пьер, – вы никогда ни слова не должны говорить о том, что было между вами и графиней. Этого, я знаю, я не могу запретить вам, но ежели в вас есть искра совести… – Пьер несколько раз молча прошел по комнате. Анатоль сидел у стола и нахмурившись кусал себе губы.
– Вы не можете не понять наконец, что кроме вашего удовольствия есть счастье, спокойствие других людей, что вы губите целую жизнь из того, что вам хочется веселиться. Забавляйтесь с женщинами подобными моей супруге – с этими вы в своем праве, они знают, чего вы хотите от них. Они вооружены против вас тем же опытом разврата; но обещать девушке жениться на ней… обмануть, украсть… Как вы не понимаете, что это так же подло, как прибить старика или ребенка!…
Пьер замолчал и взглянул на Анатоля уже не гневным, но вопросительным взглядом.
– Этого я не знаю. А? – сказал Анатоль, ободряясь по мере того, как Пьер преодолевал свой гнев. – Этого я не знаю и знать не хочу, – сказал он, не глядя на Пьера и с легким дрожанием нижней челюсти, – но вы сказали мне такие слова: подло и тому подобное, которые я comme un homme d'honneur [как честный человек] никому не позволю.
Пьер с удивлением посмотрел на него, не в силах понять, чего ему было нужно.
– Хотя это и было с глазу на глаз, – продолжал Анатоль, – но я не могу…
– Что ж, вам нужно удовлетворение? – насмешливо сказал Пьер.
– По крайней мере вы можете взять назад свои слова. А? Ежели вы хотите, чтоб я исполнил ваши желанья. А?
– Беру, беру назад, – проговорил Пьер и прошу вас извинить меня. Пьер взглянул невольно на оторванную пуговицу. – И денег, ежели вам нужно на дорогу. – Анатоль улыбнулся.
Это выражение робкой и подлой улыбки, знакомой ему по жене, взорвало Пьера.
– О, подлая, бессердечная порода! – проговорил он и вышел из комнаты.
На другой день Анатоль уехал в Петербург.


Пьер поехал к Марье Дмитриевне, чтобы сообщить об исполнении ее желанья – об изгнании Курагина из Москвы. Весь дом был в страхе и волнении. Наташа была очень больна, и, как Марья Дмитриевна под секретом сказала ему, она в ту же ночь, как ей было объявлено, что Анатоль женат, отравилась мышьяком, который она тихонько достала. Проглотив его немного, она так испугалась, что разбудила Соню и объявила ей то, что она сделала. Во время были приняты нужные меры против яда, и теперь она была вне опасности; но всё таки слаба так, что нельзя было думать везти ее в деревню и послано было за графиней. Пьер видел растерянного графа и заплаканную Соню, но не мог видеть Наташи.
Пьер в этот день обедал в клубе и со всех сторон слышал разговоры о попытке похищения Ростовой и с упорством опровергал эти разговоры, уверяя всех, что больше ничего не было, как только то, что его шурин сделал предложение Ростовой и получил отказ. Пьеру казалось, что на его обязанности лежит скрыть всё дело и восстановить репутацию Ростовой.
Он со страхом ожидал возвращения князя Андрея и каждый день заезжал наведываться о нем к старому князю.
Князь Николай Андреич знал через m lle Bourienne все слухи, ходившие по городу, и прочел ту записку к княжне Марье, в которой Наташа отказывала своему жениху. Он казался веселее обыкновенного и с большим нетерпением ожидал сына.
Чрез несколько дней после отъезда Анатоля, Пьер получил записку от князя Андрея, извещавшего его о своем приезде и просившего Пьера заехать к нему.
Князь Андрей, приехав в Москву, в первую же минуту своего приезда получил от отца записку Наташи к княжне Марье, в которой она отказывала жениху (записку эту похитила у княжны Марьи и передала князю m lle Вourienne) и услышал от отца с прибавлениями рассказы о похищении Наташи.
Князь Андрей приехал вечером накануне. Пьер приехал к нему на другое утро. Пьер ожидал найти князя Андрея почти в том же положении, в котором была и Наташа, и потому он был удивлен, когда, войдя в гостиную, услыхал из кабинета громкий голос князя Андрея, оживленно говорившего что то о какой то петербургской интриге. Старый князь и другой чей то голос изредка перебивали его. Княжна Марья вышла навстречу к Пьеру. Она вздохнула, указывая глазами на дверь, где был князь Андрей, видимо желая выразить свое сочувствие к его горю; но Пьер видел по лицу княжны Марьи, что она была рада и тому, что случилось, и тому, как ее брат принял известие об измене невесты.
– Он сказал, что ожидал этого, – сказала она. – Я знаю, что гордость его не позволит ему выразить своего чувства, но всё таки лучше, гораздо лучше он перенес это, чем я ожидала. Видно, так должно было быть…
– Но неужели совершенно всё кончено? – сказал Пьер.
Княжна Марья с удивлением посмотрела на него. Она не понимала даже, как можно было об этом спрашивать. Пьер вошел в кабинет. Князь Андрей, весьма изменившийся, очевидно поздоровевший, но с новой, поперечной морщиной между бровей, в штатском платье, стоял против отца и князя Мещерского и горячо спорил, делая энергические жесты. Речь шла о Сперанском, известие о внезапной ссылке и мнимой измене которого только что дошло до Москвы.
– Теперь судят и обвиняют его (Сперанского) все те, которые месяц тому назад восхищались им, – говорил князь Андрей, – и те, которые не в состоянии были понимать его целей. Судить человека в немилости очень легко и взваливать на него все ошибки другого; а я скажу, что ежели что нибудь сделано хорошего в нынешнее царствованье, то всё хорошее сделано им – им одним. – Он остановился, увидав Пьера. Лицо его дрогнуло и тотчас же приняло злое выражение. – И потомство отдаст ему справедливость, – договорил он, и тотчас же обратился к Пьеру.
– Ну ты как? Все толстеешь, – говорил он оживленно, но вновь появившаяся морщина еще глубже вырезалась на его лбу. – Да, я здоров, – отвечал он на вопрос Пьера и усмехнулся. Пьеру ясно было, что усмешка его говорила: «здоров, но здоровье мое никому не нужно». Сказав несколько слов с Пьером об ужасной дороге от границ Польши, о том, как он встретил в Швейцарии людей, знавших Пьера, и о господине Десале, которого он воспитателем для сына привез из за границы, князь Андрей опять с горячностью вмешался в разговор о Сперанском, продолжавшийся между двумя стариками.
– Ежели бы была измена и были бы доказательства его тайных сношений с Наполеоном, то их всенародно объявили бы – с горячностью и поспешностью говорил он. – Я лично не люблю и не любил Сперанского, но я люблю справедливость. – Пьер узнавал теперь в своем друге слишком знакомую ему потребность волноваться и спорить о деле для себя чуждом только для того, чтобы заглушить слишком тяжелые задушевные мысли.
Когда князь Мещерский уехал, князь Андрей взял под руку Пьера и пригласил его в комнату, которая была отведена для него. В комнате была разбита кровать, лежали раскрытые чемоданы и сундуки. Князь Андрей подошел к одному из них и достал шкатулку. Из шкатулки он достал связку в бумаге. Он всё делал молча и очень быстро. Он приподнялся, прокашлялся. Лицо его было нахмурено и губы поджаты.
– Прости меня, ежели я тебя утруждаю… – Пьер понял, что князь Андрей хотел говорить о Наташе, и широкое лицо его выразило сожаление и сочувствие. Это выражение лица Пьера рассердило князя Андрея; он решительно, звонко и неприятно продолжал: – Я получил отказ от графини Ростовой, и до меня дошли слухи об искании ее руки твоим шурином, или тому подобное. Правда ли это?
– И правда и не правда, – начал Пьер; но князь Андрей перебил его.
– Вот ее письма и портрет, – сказал он. Он взял связку со стола и передал Пьеру.
– Отдай это графине… ежели ты увидишь ее.
– Она очень больна, – сказал Пьер.
– Так она здесь еще? – сказал князь Андрей. – А князь Курагин? – спросил он быстро.
– Он давно уехал. Она была при смерти…
– Очень сожалею об ее болезни, – сказал князь Андрей. – Он холодно, зло, неприятно, как его отец, усмехнулся.
– Но господин Курагин, стало быть, не удостоил своей руки графиню Ростову? – сказал князь Андрей. Он фыркнул носом несколько раз.
– Он не мог жениться, потому что он был женат, – сказал Пьер.
Князь Андрей неприятно засмеялся, опять напоминая своего отца.
– А где же он теперь находится, ваш шурин, могу ли я узнать? – сказал он.
– Он уехал в Петер…. впрочем я не знаю, – сказал Пьер.
– Ну да это всё равно, – сказал князь Андрей. – Передай графине Ростовой, что она была и есть совершенно свободна, и что я желаю ей всего лучшего.
Пьер взял в руки связку бумаг. Князь Андрей, как будто вспоминая, не нужно ли ему сказать еще что нибудь или ожидая, не скажет ли чего нибудь Пьер, остановившимся взглядом смотрел на него.
– Послушайте, помните вы наш спор в Петербурге, – сказал Пьер, помните о…
– Помню, – поспешно отвечал князь Андрей, – я говорил, что падшую женщину надо простить, но я не говорил, что я могу простить. Я не могу.
– Разве можно это сравнивать?… – сказал Пьер. Князь Андрей перебил его. Он резко закричал:
– Да, опять просить ее руки, быть великодушным, и тому подобное?… Да, это очень благородно, но я не способен итти sur les brisees de monsieur [итти по стопам этого господина]. – Ежели ты хочешь быть моим другом, не говори со мною никогда про эту… про всё это. Ну, прощай. Так ты передашь…
Пьер вышел и пошел к старому князю и княжне Марье.
Старик казался оживленнее обыкновенного. Княжна Марья была такая же, как и всегда, но из за сочувствия к брату, Пьер видел в ней радость к тому, что свадьба ее брата расстроилась. Глядя на них, Пьер понял, какое презрение и злобу они имели все против Ростовых, понял, что нельзя было при них даже и упоминать имя той, которая могла на кого бы то ни было променять князя Андрея.
За обедом речь зашла о войне, приближение которой уже становилось очевидно. Князь Андрей не умолкая говорил и спорил то с отцом, то с Десалем, швейцарцем воспитателем, и казался оживленнее обыкновенного, тем оживлением, которого нравственную причину так хорошо знал Пьер.


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


С конца 1811 го года началось усиленное вооружение и сосредоточение сил Западной Европы, и в 1812 году силы эти – миллионы людей (считая тех, которые перевозили и кормили армию) двинулись с Запада на Восток, к границам России, к которым точно так же с 1811 го года стягивались силы России. 12 июня силы Западной Европы перешли границы России, и началась война, то есть совершилось противное человеческому разуму и всей человеческой природе событие. Миллионы людей совершали друг, против друга такое бесчисленное количество злодеяний, обманов, измен, воровства, подделок и выпуска фальшивых ассигнаций, грабежей, поджогов и убийств, которого в целые века не соберет летопись всех судов мира и на которые, в этот период времени, люди, совершавшие их, не смотрели как на преступления.
Что произвело это необычайное событие? Какие были причины его? Историки с наивной уверенностью говорят, что причинами этого события были обида, нанесенная герцогу Ольденбургскому, несоблюдение континентальной системы, властолюбие Наполеона, твердость Александра, ошибки дипломатов и т. п.
Следовательно, стоило только Меттерниху, Румянцеву или Талейрану, между выходом и раутом, хорошенько постараться и написать поискуснее бумажку или Наполеону написать к Александру: Monsieur mon frere, je consens a rendre le duche au duc d'Oldenbourg, [Государь брат мой, я соглашаюсь возвратить герцогство Ольденбургскому герцогу.] – и войны бы не было.
Понятно, что таким представлялось дело современникам. Понятно, что Наполеону казалось, что причиной войны были интриги Англии (как он и говорил это на острове Св. Елены); понятно, что членам английской палаты казалось, что причиной войны было властолюбие Наполеона; что принцу Ольденбургскому казалось, что причиной войны было совершенное против него насилие; что купцам казалось, что причиной войны была континентальная система, разорявшая Европу, что старым солдатам и генералам казалось, что главной причиной была необходимость употребить их в дело; легитимистам того времени то, что необходимо было восстановить les bons principes [хорошие принципы], а дипломатам того времени то, что все произошло оттого, что союз России с Австрией в 1809 году не был достаточно искусно скрыт от Наполеона и что неловко был написан memorandum за № 178. Понятно, что эти и еще бесчисленное, бесконечное количество причин, количество которых зависит от бесчисленного различия точек зрения, представлялось современникам; но для нас – потомков, созерцающих во всем его объеме громадность совершившегося события и вникающих в его простой и страшный смысл, причины эти представляются недостаточными. Для нас непонятно, чтобы миллионы людей христиан убивали и мучили друг друга, потому что Наполеон был властолюбив, Александр тверд, политика Англии хитра и герцог Ольденбургский обижен. Нельзя понять, какую связь имеют эти обстоятельства с самым фактом убийства и насилия; почему вследствие того, что герцог обижен, тысячи людей с другого края Европы убивали и разоряли людей Смоленской и Московской губерний и были убиваемы ими.
Для нас, потомков, – не историков, не увлеченных процессом изыскания и потому с незатемненным здравым смыслом созерцающих событие, причины его представляются в неисчислимом количестве. Чем больше мы углубляемся в изыскание причин, тем больше нам их открывается, и всякая отдельно взятая причина или целый ряд причин представляются нам одинаково справедливыми сами по себе, и одинаково ложными по своей ничтожности в сравнении с громадностью события, и одинаково ложными по недействительности своей (без участия всех других совпавших причин) произвести совершившееся событие. Такой же причиной, как отказ Наполеона отвести свои войска за Вислу и отдать назад герцогство Ольденбургское, представляется нам и желание или нежелание первого французского капрала поступить на вторичную службу: ибо, ежели бы он не захотел идти на службу и не захотел бы другой, и третий, и тысячный капрал и солдат, настолько менее людей было бы в войске Наполеона, и войны не могло бы быть.
Ежели бы Наполеон не оскорбился требованием отступить за Вислу и не велел наступать войскам, не было бы войны; но ежели бы все сержанты не пожелали поступить на вторичную службу, тоже войны не могло бы быть. Тоже не могло бы быть войны, ежели бы не было интриг Англии, и не было бы принца Ольденбургского и чувства оскорбления в Александре, и не было бы самодержавной власти в России, и не было бы французской революции и последовавших диктаторства и империи, и всего того, что произвело французскую революцию, и так далее. Без одной из этих причин ничего не могло бы быть. Стало быть, причины эти все – миллиарды причин – совпали для того, чтобы произвести то, что было. И, следовательно, ничто не было исключительной причиной события, а событие должно было совершиться только потому, что оно должно было совершиться. Должны были миллионы людей, отрекшись от своих человеческих чувств и своего разума, идти на Восток с Запада и убивать себе подобных, точно так же, как несколько веков тому назад с Востока на Запад шли толпы людей, убивая себе подобных.
Действия Наполеона и Александра, от слова которых зависело, казалось, чтобы событие совершилось или не совершилось, – были так же мало произвольны, как и действие каждого солдата, шедшего в поход по жребию или по набору. Это не могло быть иначе потому, что для того, чтобы воля Наполеона и Александра (тех людей, от которых, казалось, зависело событие) была исполнена, необходимо было совпадение бесчисленных обстоятельств, без одного из которых событие не могло бы совершиться. Необходимо было, чтобы миллионы людей, в руках которых была действительная сила, солдаты, которые стреляли, везли провиант и пушки, надо было, чтобы они согласились исполнить эту волю единичных и слабых людей и были приведены к этому бесчисленным количеством сложных, разнообразных причин.
Фатализм в истории неизбежен для объяснения неразумных явлений (то есть тех, разумность которых мы не понимаем). Чем более мы стараемся разумно объяснить эти явления в истории, тем они становятся для нас неразумнее и непонятнее.
Каждый человек живет для себя, пользуется свободой для достижения своих личных целей и чувствует всем существом своим, что он может сейчас сделать или не сделать такое то действие; но как скоро он сделает его, так действие это, совершенное в известный момент времени, становится невозвратимым и делается достоянием истории, в которой оно имеет не свободное, а предопределенное значение.
Есть две стороны жизни в каждом человеке: жизнь личная, которая тем более свободна, чем отвлеченнее ее интересы, и жизнь стихийная, роевая, где человек неизбежно исполняет предписанные ему законы.
Человек сознательно живет для себя, но служит бессознательным орудием для достижения исторических, общечеловеческих целей. Совершенный поступок невозвратим, и действие его, совпадая во времени с миллионами действий других людей, получает историческое значение. Чем выше стоит человек на общественной лестнице, чем с большими людьми он связан, тем больше власти он имеет на других людей, тем очевиднее предопределенность и неизбежность каждого его поступка.
«Сердце царево в руце божьей».
Царь – есть раб истории.
История, то есть бессознательная, общая, роевая жизнь человечества, всякой минутой жизни царей пользуется для себя как орудием для своих целей.
Наполеон, несмотря на то, что ему более чем когда нибудь, теперь, в 1812 году, казалось, что от него зависело verser или не verser le sang de ses peuples [проливать или не проливать кровь своих народов] (как в последнем письме писал ему Александр), никогда более как теперь не подлежал тем неизбежным законам, которые заставляли его (действуя в отношении себя, как ему казалось, по своему произволу) делать для общего дела, для истории то, что должно было совершиться.
Люди Запада двигались на Восток для того, чтобы убивать друг друга. И по закону совпадения причин подделались сами собою и совпали с этим событием тысячи мелких причин для этого движения и для войны: укоры за несоблюдение континентальной системы, и герцог Ольденбургский, и движение войск в Пруссию, предпринятое (как казалось Наполеону) для того только, чтобы достигнуть вооруженного мира, и любовь и привычка французского императора к войне, совпавшая с расположением его народа, увлечение грандиозностью приготовлений, и расходы по приготовлению, и потребность приобретения таких выгод, которые бы окупили эти расходы, и одурманившие почести в Дрездене, и дипломатические переговоры, которые, по взгляду современников, были ведены с искренним желанием достижения мира и которые только уязвляли самолюбие той и другой стороны, и миллионы миллионов других причин, подделавшихся под имеющее совершиться событие, совпавших с ним.
Когда созрело яблоко и падает, – отчего оно падает? Оттого ли, что тяготеет к земле, оттого ли, что засыхает стержень, оттого ли, что сушится солнцем, что тяжелеет, что ветер трясет его, оттого ли, что стоящему внизу мальчику хочется съесть его?
Ничто не причина. Все это только совпадение тех условий, при которых совершается всякое жизненное, органическое, стихийное событие. И тот ботаник, который найдет, что яблоко падает оттого, что клетчатка разлагается и тому подобное, будет так же прав, и так же не прав, как и тот ребенок, стоящий внизу, который скажет, что яблоко упало оттого, что ему хотелось съесть его и что он молился об этом. Так же прав и не прав будет тот, кто скажет, что Наполеон пошел в Москву потому, что он захотел этого, и оттого погиб, что Александр захотел его погибели: как прав и не прав будет тот, кто скажет, что завалившаяся в миллион пудов подкопанная гора упала оттого, что последний работник ударил под нее последний раз киркою. В исторических событиях так называемые великие люди суть ярлыки, дающие наименований событию, которые, так же как ярлыки, менее всего имеют связи с самым событием.
Каждое действие их, кажущееся им произвольным для самих себя, в историческом смысле непроизвольно, а находится в связи со всем ходом истории и определено предвечно.


29 го мая Наполеон выехал из Дрездена, где он пробыл три недели, окруженный двором, составленным из принцев, герцогов, королей и даже одного императора. Наполеон перед отъездом обласкал принцев, королей и императора, которые того заслуживали, побранил королей и принцев, которыми он был не вполне доволен, одарил своими собственными, то есть взятыми у других королей, жемчугами и бриллиантами императрицу австрийскую и, нежно обняв императрицу Марию Луизу, как говорит его историк, оставил ее огорченною разлукой, которую она – эта Мария Луиза, считавшаяся его супругой, несмотря на то, что в Париже оставалась другая супруга, – казалось, не в силах была перенести. Несмотря на то, что дипломаты еще твердо верили в возможность мира и усердно работали с этой целью, несмотря на то, что император Наполеон сам писал письмо императору Александру, называя его Monsieur mon frere [Государь брат мой] и искренно уверяя, что он не желает войны и что всегда будет любить и уважать его, – он ехал к армии и отдавал на каждой станции новые приказания, имевшие целью торопить движение армии от запада к востоку. Он ехал в дорожной карете, запряженной шестериком, окруженный пажами, адъютантами и конвоем, по тракту на Позен, Торн, Данциг и Кенигсберг. В каждом из этих городов тысячи людей с трепетом и восторгом встречали его.
Армия подвигалась с запада на восток, и переменные шестерни несли его туда же. 10 го июня он догнал армию и ночевал в Вильковисском лесу, в приготовленной для него квартире, в имении польского графа.
На другой день Наполеон, обогнав армию, в коляске подъехал к Неману и, с тем чтобы осмотреть местность переправы, переоделся в польский мундир и выехал на берег.
Увидав на той стороне казаков (les Cosaques) и расстилавшиеся степи (les Steppes), в середине которых была Moscou la ville sainte, [Москва, священный город,] столица того, подобного Скифскому, государства, куда ходил Александр Македонский, – Наполеон, неожиданно для всех и противно как стратегическим, так и дипломатическим соображениям, приказал наступление, и на другой день войска его стали переходить Неман.
12 го числа рано утром он вышел из палатки, раскинутой в этот день на крутом левом берегу Немана, и смотрел в зрительную трубу на выплывающие из Вильковисского леса потоки своих войск, разливающихся по трем мостам, наведенным на Немане. Войска знали о присутствии императора, искали его глазами, и, когда находили на горе перед палаткой отделившуюся от свиты фигуру в сюртуке и шляпе, они кидали вверх шапки, кричали: «Vive l'Empereur! [Да здравствует император!] – и одни за другими, не истощаясь, вытекали, всё вытекали из огромного, скрывавшего их доселе леса и, расстрояясь, по трем мостам переходили на ту сторону.
– On fera du chemin cette fois ci. Oh! quand il s'en mele lui meme ca chauffe… Nom de Dieu… Le voila!.. Vive l'Empereur! Les voila donc les Steppes de l'Asie! Vilain pays tout de meme. Au revoir, Beauche; je te reserve le plus beau palais de Moscou. Au revoir! Bonne chance… L'as tu vu, l'Empereur? Vive l'Empereur!.. preur! Si on me fait gouverneur aux Indes, Gerard, je te fais ministre du Cachemire, c'est arrete. Vive l'Empereur! Vive! vive! vive! Les gredins de Cosaques, comme ils filent. Vive l'Empereur! Le voila! Le vois tu? Je l'ai vu deux fois comme jete vois. Le petit caporal… Je l'ai vu donner la croix a l'un des vieux… Vive l'Empereur!.. [Теперь походим! О! как он сам возьмется, дело закипит. Ей богу… Вот он… Ура, император! Так вот они, азиатские степи… Однако скверная страна. До свиданья, Боше. Я тебе оставлю лучший дворец в Москве. До свиданья, желаю успеха. Видел императора? Ура! Ежели меня сделают губернатором в Индии, я тебя сделаю министром Кашмира… Ура! Император вот он! Видишь его? Я его два раза как тебя видел. Маленький капрал… Я видел, как он навесил крест одному из стариков… Ура, император!] – говорили голоса старых и молодых людей, самых разнообразных характеров и положений в обществе. На всех лицах этих людей было одно общее выражение радости о начале давно ожидаемого похода и восторга и преданности к человеку в сером сюртуке, стоявшему на горе.
13 го июня Наполеону подали небольшую чистокровную арабскую лошадь, и он сел и поехал галопом к одному из мостов через Неман, непрестанно оглушаемый восторженными криками, которые он, очевидно, переносил только потому, что нельзя было запретить им криками этими выражать свою любовь к нему; но крики эти, сопутствующие ему везде, тяготили его и отвлекали его от военной заботы, охватившей его с того времени, как он присоединился к войску. Он проехал по одному из качавшихся на лодках мостов на ту сторону, круто повернул влево и галопом поехал по направлению к Ковно, предшествуемый замиравшими от счастия, восторженными гвардейскими конными егерями, расчищая дорогу по войскам, скакавшим впереди его. Подъехав к широкой реке Вилии, он остановился подле польского уланского полка, стоявшего на берегу.
– Виват! – также восторженно кричали поляки, расстроивая фронт и давя друг друга, для того чтобы увидать его. Наполеон осмотрел реку, слез с лошади и сел на бревно, лежавшее на берегу. По бессловесному знаку ему подали трубу, он положил ее на спину подбежавшего счастливого пажа и стал смотреть на ту сторону. Потом он углубился в рассматриванье листа карты, разложенного между бревнами. Не поднимая головы, он сказал что то, и двое его адъютантов поскакали к польским уланам.
– Что? Что он сказал? – слышалось в рядах польских улан, когда один адъютант подскакал к ним.
Было приказано, отыскав брод, перейти на ту сторону. Польский уланский полковник, красивый старый человек, раскрасневшись и путаясь в словах от волнения, спросил у адъютанта, позволено ли ему будет переплыть с своими уланами реку, не отыскивая брода. Он с очевидным страхом за отказ, как мальчик, который просит позволения сесть на лошадь, просил, чтобы ему позволили переплыть реку в глазах императора. Адъютант сказал, что, вероятно, император не будет недоволен этим излишним усердием.
Как только адъютант сказал это, старый усатый офицер с счастливым лицом и блестящими глазами, подняв кверху саблю, прокричал: «Виват! – и, скомандовав уланам следовать за собой, дал шпоры лошади и подскакал к реке. Он злобно толкнул замявшуюся под собой лошадь и бухнулся в воду, направляясь вглубь к быстрине течения. Сотни уланов поскакали за ним. Было холодно и жутко на середине и на быстрине теченья. Уланы цеплялись друг за друга, сваливались с лошадей, лошади некоторые тонули, тонули и люди, остальные старались плыть кто на седле, кто держась за гриву. Они старались плыть вперед на ту сторону и, несмотря на то, что за полверсты была переправа, гордились тем, что они плывут и тонут в этой реке под взглядами человека, сидевшего на бревне и даже не смотревшего на то, что они делали. Когда вернувшийся адъютант, выбрав удобную минуту, позволил себе обратить внимание императора на преданность поляков к его особе, маленький человек в сером сюртуке встал и, подозвав к себе Бертье, стал ходить с ним взад и вперед по берегу, отдавая ему приказания и изредка недовольно взглядывая на тонувших улан, развлекавших его внимание.
Для него было не ново убеждение в том, что присутствие его на всех концах мира, от Африки до степей Московии, одинаково поражает и повергает людей в безумие самозабвения. Он велел подать себе лошадь и поехал в свою стоянку.
Человек сорок улан потонуло в реке, несмотря на высланные на помощь лодки. Большинство прибилось назад к этому берегу. Полковник и несколько человек переплыли реку и с трудом вылезли на тот берег. Но как только они вылезли в обшлепнувшемся на них, стекающем ручьями мокром платье, они закричали: «Виват!», восторженно глядя на то место, где стоял Наполеон, но где его уже не было, и в ту минуту считали себя счастливыми.
Ввечеру Наполеон между двумя распоряжениями – одно о том, чтобы как можно скорее доставить заготовленные фальшивые русские ассигнации для ввоза в Россию, и другое о том, чтобы расстрелять саксонца, в перехваченном письме которого найдены сведения о распоряжениях по французской армии, – сделал третье распоряжение – о причислении бросившегося без нужды в реку польского полковника к когорте чести (Legion d'honneur), которой Наполеон был главою.
Qnos vult perdere – dementat. [Кого хочет погубить – лишит разума (лат.) ]


Русский император между тем более месяца уже жил в Вильне, делая смотры и маневры. Ничто не было готово для войны, которой все ожидали и для приготовления к которой император приехал из Петербурга. Общего плана действий не было. Колебания о том, какой план из всех тех, которые предлагались, должен быть принят, только еще более усилились после месячного пребывания императора в главной квартире. В трех армиях был в каждой отдельный главнокомандующий, но общего начальника над всеми армиями не было, и император не принимал на себя этого звания.
Чем дольше жил император в Вильне, тем менее и менее готовились к войне, уставши ожидать ее. Все стремления людей, окружавших государя, казалось, были направлены только на то, чтобы заставлять государя, приятно проводя время, забыть о предстоящей войне.
После многих балов и праздников у польских магнатов, у придворных и у самого государя, в июне месяце одному из польских генерал адъютантов государя пришла мысль дать обед и бал государю от лица его генерал адъютантов. Мысль эта радостно была принята всеми. Государь изъявил согласие. Генерал адъютанты собрали по подписке деньги. Особа, которая наиболее могла быть приятна государю, была приглашена быть хозяйкой бала. Граф Бенигсен, помещик Виленской губернии, предложил свой загородный дом для этого праздника, и 13 июня был назначен обед, бал, катанье на лодках и фейерверк в Закрете, загородном доме графа Бенигсена.