Haxe

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

Мультипарадигмальный

Появился в:

2005

Выпуск:

3.3.0-RC1 (2016-05-27; 2889 дней тому назад)

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

статическая

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

ECMAScript[1], ActionScript, OCaml, Java

Лицензия:

GPL v2, library: MIT

Сайт:

[haxe.org/ haxe.org]

Платформа:

IA-32, x64

Haxe — это высокоуровневый мультиплатформенный язык программирования с открытым исходным кодом, а также компилятор, с помощью которого можно создавать приложения и генерировать исходный код для разных платформ, сохраняя единую кодовую базу.[2][3][4][5]

Haxe включает в себя функциональность, поддерживаемую на всех платформах, например: числовые типы данных, строки, массивы, а также поддержку некоторых файловых форматов (xml, zip).[3][6] Haxe также включает в себя поддержку платформно-специфических API для Adobe Flash, C++, PHP и других языков.[3][7]

Код, написанный на языке Haxe, может быть транслирован в код ActionScript 3, JavaScript, Java, C#, C++, Python, Lua, PHP, Apache CGI, а также в приложение Node.js.[3][6][8][9]

Haxe — это также ActionScript 3-совместимый Adobe Flash компилятор, который может генерировать SWF приложения из Haxe кода.[3][10] Haxe код также транслируется в код языка Neko — язык и виртуальная машина созданный тем же разработчиком.

Основные пользователи Haxe — это TiVo, Prezi, Nickelodeon, Disney, Mattel, Hasbro, Coca Cola, Toyota и BBC.[11][12] OpenFL и Flambe — популярные Haxe фреймворки для создания мультиплатформенного контента и программ из единой кодовой базы.[12] Кроме этого, в данный момент активно развивается Snõwkit.[13] В связи с всё большим вытеснением технологии Adobe Flash в последние годы в пользу HTML5, Haxe, Unity и другие кроссплатформенные инструменты уделяют последнему всё больше времени, сохраняя обратную поддержку с Adobe Flash Player.[12][14]





Архитектура

Единый язык

Самым значимым аспектом разработки архитектуры Haxe было решение о поддержке Adobe Flash, JavaScript и серверных приложений единой кодовой базой.[15][16] В типичных веб-проектах разработчики должны использовать множество разных языков, чтобы построить полноценное веб-приложение.[15][16]

  • PHP или другой серверный язык для генерации HTML
  • JavaScript для манипуляций над HTML на стороне клиента
  • ActionScript для графической части, при использовании Flash
  • XML или похожий протокол для коммуникации между компонентами

Haxe был создан с идеей объединения всех этих компонентов единой кодовой базой, а также упрощения взаимодействия между компонентами приложения.[15][16][17]

В книге, за авторством Николаса Кеннеси (основателя проекта Haxe), указываются первоначальные цели создания Haxe:[15]

  • Создать язык более мощный, чем ActionScript 2 или ActionScript 3
  • Сделать так, чтобы было легко портировать приложения с ActionScript на Haxe
  • Сделать язык, поддерживающий разработку для Flash 6, 7, 8 и 9
  • Сделать язык, поддерживающий разработку для JavaScript/AJAX
  • Сделать язык, поддерживающий разработку серверно-ориентированных программ, вместо PHP или Java

Компилятор

Компилятор Haxe разделен на один фронтенд и множество бэкэндов. Фронтенд отвечает за парсинг и проверку типов, применение макросов, общую оптимизацию, различные трансформации кода и создания промежуточного представления кода в виде абстрактного синтаксического дерева (АСД). Каждый из бэкендов отвечает за трансляцию этого АСД в исходный код или байткод целевой платформы.

Компилятор написан на OCaml. Он может быть запущен в режиме сервера для поддержки автодополнения кода в IDE, также в этом режиме поддерживается кэш для уменьшения времени компиляции.[18]

Производительность

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

Производительность программ, написанных на Haxe, зависит от целевой платформы:

  • ActionScript 3: Программы, скомпилированные на Haxe, обычно быстрее, чем программы, скомпилированные с помощью Flex SDK ActionScript Compiler.[19] Однако, используя ActionScript Compiler 2 (ASC2) и грамотно составленный код[20], можно добиться сравнимой производительности.
  • JavaScript: Программы, скомпилированные на Haxe, сравнимы по скорости с программами, написанными просто на JavaScript.[21] OpenFl — самый распространенный фреймворк, который можно запустить на HTML5/JavaScript, но приложения, построенные с помощью этого фреймворка, на текущий момент страдают от потерь производительности на мобильных устройствах.[21]
  • C++: Программы, скомпилированные на Haxe, работают почти также быстро, как и написанные просто на C++, но приложения, построенные с помощью OpenFL, могут страдать от потерь производительности.[22]

Разработка

Разработка Haxe началась в октябре 2005[23], а первая бета-версия была выпущена в феврале 2006. Haxe 1.0 был выпущен в апреле 2006 и поддерживал трансляцию в Adobe Flash, Javascript и Neko

Haxe был разработан Николасом Хеннесси (Nicolas Cannasse) и другими авторами, и первоначально был назван haXe, потому что это короткое, простое имя, а также «у него есть X в названии» — атрибут, необходимый для того, чтобы новая технология стала успешной, с юмором отмечал автор языка.[24]

Haxe — это преемник ActionScript 2 компилятора MTASC с открытым исходным кодом, также сделанный Николасом Хеннесси[15][25] и выпущенный под лицензией GNU General Public License версии 2 или выше.[26]

Haxe имеет много общего с ActionScript 3. Компилятор Haxe разрабатывается на языке OCaml, но для того, чтобы писать на Haxe, знаний OCaml не требуется.

Преимущества использования Haxe включают в себя:

  • Платформо-независимая разработка
  • Разработка на высокоуровневом языке программирования
  • Возможность использовать, как целевую платформу, передовые C#.NET и Adobe AIR
  • Возможность разработки для устройств, поддерживающих только C++[27]

Исходный код

Рекомендуемая IDE для разработки на Haxe — это FlashDevelop[15], которая поддерживает ActionScript 2, 3 и Haxe, как основные языки с подсветкой синтаксиса, автодополнением кода и другими возможностями.[15][28] Эта IDE также поддерживает сворачивание кода, рефакторинг и интерактивную отладку.[29]

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

  • ActionScript 3 в Haxe[30]
  • C# в Haxe[31]

Поддержка платформ

Язык Haxe можно транслировать в байткод различных виртуальных машин, таких как Adobe Flash Player и Neko, а также в исходные коды ActionScript 3, JavaScript, включая экспериментально поддерживаемые C++ и C#. Эта стратегия «компиляции» в различные исходные коды была разработана под вдохновение парадигмы «один раз написать, запускать где угодно». Данная стратегия также позволяет выбирать программисту наилучшую платформу для работы программ.

Генератор кода Результат Платформа Использование Начиная с какой версии Haxe
AVM1[6] Байткод Adobe Flash Player 6+ Desktop, Browser 2005 (alpha)
AVM2[6] Байткод Adobe Flash Player 9+, Adobe AIR, Tamarin VM Desktop, Browser, Server 2005 (alpha)
ActionScript 3[6] Исходный код Adobe Flash Player 9+ Server, Desktop 2007 (1.12)
C++ (hxcpp)[6] Исходный код Windows, Linux, Mac OS X Server, Desktop, CLI 2009 (2.04)
C++ Исходный код Android,[32] Apple iOS,[8] Palm webOS[33] Mobile 2009 (2.04)
C#[6] Исходный код .NET Framework Server, Desktop, Mobile 2012 (2.10)
Java[6] Исходный код Java Server, Desktop 2012 (2.10)
JavaScript[6] Исходный код HTML 5, Node.js, PhoneGap Server, Desktop, Browser, Mobile 2006 (beta)
Neko[6] Байткод NekoVM Server, Desktop, CLI 2005 (alpha)
PHP[6] Исходный код PHP Server 2008 (2.0)
Python[6] Исходный код Python CLI, Web, Desktop 2014 (3.2)
Lua[9] Исходный код Lua Web, Desktop, Mobile 2016 (3.3)

Язык

Haxe — это объектно-ориентированный язык общего назначения, с поддержкой механизма обработки исключений и вывода типов для параметров классов. Также языком и библиотеками поддерживаются обобщённое программирование, рефлексия, итераторы и функциональное программирование.[34] Haxe также, в отличие от многих других языков, одновременно поддерживает и статическую и динамическую типизацию. Компилятор может проверять вывод типов и выдавать ошибки времени компиляции, но также разработчики могут выключить эту проверку, и положиться на динамическую проверку типов целевой платформы.

Язык Haxe похож на ECMAScript, хотя практически любой код на ECMAScript не сможет быть скомпилирован на Haxe без модификации. В отличие от ECMAScript, Haxe компилируемый язык. Haxe был создан под влиянием ActionScript, Java, и OCaml.[16]

Так как Haxe был основан на ActionScript 3, он поддерживает все функции Flash API, хотя и требует лучше оформленный код и более высокие стандарты разработки, нежели компиляторы Adobe.

Hello world

Эта программа напишет «Hello World» после компиляции и запуска:

class Main {
  static public function main():Void {
    trace("Hello World");
  }
}

Проверить этот код можно, сохранив его в файл с именем Main.hx и запустив компилятор Haxe со следующими параметрами: haxe -main Main --interp. Эта команда запустит Haxe Compiler в режиме интерпретации кода и выведет на экран терминала Main.hx:3: Hello world.

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

Haxe — статически типизированный язык. Он имеет богатую систему типов, включая классы, интерфейсы, функциональные типы, анонимные типы, алгебраические типы данных (ADT, называемые «перечислениями» в Haxe), а также абстрактные типы данных. Классы, алгебраические типы данных и функциональные типы поддерживают параметрический полиморфизм, основанный на стирании типов, в других объективно-ориентированных языках часто называемый «Дженериками».

Haxe включает с себя поддержку ограниченного полиморфизма и полиморфизм подтипов.

К тому же, Haxe поддерживает структурную типизацию и номинальную типизацию. Для облегчения работы программистов и без ущерба безопасности типов, Haxe поддерживает вывод типов, который во многих случаях позволяет не писать типы вручную.

Классы

Классы (ключевое слово «class») в Haxe похожи на таковые в Java или AS3. Их полями могут быть методы, статические переменные класса или свойства экземпляра класса. Haxe поддерживает атрибуты доступа «public» и «private», а также более продвинутые методы контроля доступа (ACL, ссылки), которые описываются аннотациями. Методы и статические переменные с постоянным значением могут быть встроены с помощью ключевого слова «inline».

Интерфейсы в Haxe похожи на интерфейсы Java.

interface ICreature {
    public var birth:Date;
    public var name:String;

    public function age():Int;
}

class Fly implements ICreature {
    public var birth:Date;
    public var name:String;
    
    public function age():Int return Date.now().getFullYear() - birth.getFullYear();
}

Перечисления

Перечисляемые типы — это ключевая особенность языка. Перечисления могут иметь собственные параметры, а также быть рекурсивными.[35] Они похожи на алгебраические типы данных, как таковые в языках вроде ML или Haskell. Строго говоря, это правильные типы-суммы, при условии, что типы-произведения, включенные в них, обязаны быть определены внутри этих типов-сумм. Это значит, что перечисления не просто именованные «магические числа», как в большинстве языков, ими можно элегантно решать сложные архитектурные проблемы:

enum Color {
    red;
    green;
    blue;
    rgb( r : Int, g : Int, b : Int );
}

class Colors {
    static function toInt ( c : Color ) : Int {
        return switch ( c ) {
            case red: 0xFF0000;
            case green: 0x00FF00;
            case blue: 0x0000FF;
            case rgb(r, g, b): (r << 16) | (g << 8) | b;
        }
    }
    static function validCalls() {
        var redint = toInt(Color.red);
        var rgbint = toInt(Color.rgb(100, 100, 100));
    }
}

Haxe также поддерживает параметрические перечисляемые типы. Примером могут послужить реализация типов Option, Either и ConsList, причем ConsList ещё и рекурсивный:

enum Option<T> {
    Some(v:T);
    None;
}

enum Either<T,U> {
    Left(v:T);
    Right(v:U);
}

enum ConsList<T> {
    Nil;
    Cons(head:T,tail:ConsList<T>);
}

Документация на сайте указывает[36], что Haxe также поддерживает обобщённые алгебраические типы (GADT), но не приводит пример создания такового.

Анонимные типы

Анонимные типы определяются с помощью явного описания их структуры, им также можно назначить псевдоним, используя определение типа (ключевое слово «typedef»):

typedef Anon = { a:Int, b:String, c:Float->Void };

Функциональные типы

Функциональные типы являются объектами первого класса в Haxe. Они описываются, используя стрелки между типами аргументов, и между типами и возвращаемым значением, как и в многих других функциональных языках. Однако, в отличие от Haskell или семейства ML, не все функции в Haxe унарные (функции с одним аргументом), по умолчанию они не могут быть частично применены. Таким образом сигнатуры типов в следующих примерах имеют отличное от вышеупомянутых языков значение.

Тип F — это функция, которая принимает Int и String как аргументы и возвращает Float как результат.

В языках, где существуют только унарные функции, этот тип означал бы функцию, которая принимает Int как аргумент и возвращает функцию типа String->Float.

Типы F2 и F3 описывают один и тот же тип. Они оба описывают бинарные функции, которые возвращают бинарную функцию типа F. Для F3 описывается случай использования функционального типа внутри другого определения.

typedef F = Int->String->Float;

typedef F2 = Int->String->F;
typedef F3 = Int->String->(Int->String->Float);

Абстрактные типы

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

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

abstract Kilometer(Float) {
    public function new(v:Float) this = v;
}
 
abstract Mile(Float) {
    public function new(v:Float) this = v;
    @:to public inline function toKilometer():Kilometer return (new Kilometer(this / 0.62137));
}
 
class Test {
  static var km:Kilometer;
  static function main(){
    var one100Miles = new Mile(100);
    km = one100Miles;
 
    trace(km); // 160.935
  }
}

Пример показывает, что не обязательно делать явное преобразование km = one100Miles; для использования корректных единиц.

Структурная типизация

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

class FooBar {

   public var foo:Int;
   public var bar:String;

   public function new(){ foo=1; bar="2";}

   function anyFooBar(v:{foo:Int,bar:String}) trace(v.foo);

   static function test(){
        var fb = new FooBar();
        fb.anyFooBar(fb);
        fb.anyFooBar({foo:123,bar:"456"});
   }
}

См. также

Также, на платформе Haxe:

Другие языки, компилирующиеся в JavaScript:

Другие мультиплатформенные языки:

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

Примечания

  1. [haxe.org/documentation/introduction/language-introduction.html Introduction to the Haxe Language].
  2. [groups.google.com/d/topic/haxelang/O7PB-ZrX4i4/discussion Nicolas' announcement of spelling change on Haxe official mail list].
  3. 1 2 3 4 5 Ponticelli Franco. [books.google.com/books?id=nkReDryjU3UC&dq=haxe&hl=en&sa=X&ved=0CCoQ6AEwAmoVChMIobHLuPaUxwIVy9SOCh2PWAFf Professional haXe and Neko]. — Wiley. — ISBN 0470122137.
  4. Ivanov Michael. [books.google.com/books?id=4yAcDM-qQDsC&pg=PT631&dq=haxe+flash&hl=en&sa=X#v=onepage&q=haxe%20flash&f=false Away3D 3.6 Cookbook]. — Packt Publishing Ltd. — ISBN 1849512817.
  5. Doucet, Lars [gamasutra.com/blogs/LarsDoucet/20150603/245099/HaxeOpenFL_for_home_game_consoles.php Haxe/OpenFL for home game consoles]. Gamasutra (3 июня 2015).
  6. 1 2 3 4 5 6 7 8 9 10 11 12 [haxe.org/documentation/introduction/stdlib-introduction.html#general-purpose-api Introduction to the Haxe Standard Library], Haxe Docs
  7. [haxe.org/documentation/introduction/stdlib-introduction.html#target-apis Target Specific APIs, Introduction to the Haxe Standard Library], Haxe Docs
  8. 1 2 [gamehaxe.com/2009/07/28/haxe-iphone-cpp-at-last/ Haxe, iPhone & C++ At Last], GameHaxe website
  9. 1 2 [haxe.org/blog/hello-lua Hello Lua! - Haxe - The Cross-platform Toolkit]. Проверено 9 августа 2016.
  10. Dasnois Benjamin. [books.google.com/books?id=sX-lOUrMJZ4C&printsec=frontcover&dq=haxe&hl=en&sa=X#v=onepage&q=haxe&f=false HaXe 2 Beginner's Guide]. — Packt Publishing Ltd. — ISBN 1849512574.
  11. [haxe.org/use-cases/who-uses-haxe.html Companies using Haxe], Haxe Docs
  12. 1 2 3 Doucet, Lars [www.gamasutra.com/blogs/LarsDoucet/20140624/219674/Dear_Adobe_Support_Haxe_save_your_Tools.php Dear Adobe: Support Haxe, save your Tools]. Gamasutra (24 июня 2014).
  13. [snowkit.org/2014/09/20/about-snowkit/ about snõwkit]. snõwkit (20 сентября 2014). Проверено 9 августа 2016.
  14. Doucet, Lars [gamasutra.com/blogs/LarsDoucet/20140318/213407/Flash_is_dead_long_live_OpenFL.php Flash is dead, long live OpenFL!]. Gamasutra (18 марта 2014).
  15. 1 2 3 4 5 6 7 [books.google.com/books?id=MNo27PxpM_AC&pg=PA231&dq=haxe+flash&hl=en&sa=X#v=onepage&q=haxe%20flash&f=false The Essential Guide to Open Source Flash Development]. — Apress. — P. Chapter 9 (Using Haxe). — ISBN 1430209941.
  16. 1 2 3 4 (2009-04-01) «[ncannasse.fr/blog/haxe_interview Haxe Interview]» (Io Programmo): 1–6.
  17. Fisher Matt. [books.google.com/books?id=O2DWzWRnQPwC&pg=PT377&dq=haxe+flash&hl=en&sa=X#v=onepage&q=haxe%20flash&f=false HTML5 for Flash Developers]. — Packt Publishing Ltd. — ISBN 1849693331.
  18. Server mode command-line : haxe --wait [host:]port
  19. [www.splashdust.net/2009/10/as3-vs-haxe-performance/ AS3 vs haXe performance], SplashDust website
  20. [wiki.starling-framework.org/manual/performance_optimization AS3 Performance Optimization], Starling Wiki
  21. 1 2 Vadim Dyachenko. [yal.cc/answering-you-cant-make-good-html5-games-in-haxe/ On “You can’t make good HTML5 games in Haxe”]. Yellow After Life (5 декабря 2013).
  22. Kaya, Talha [www.gamasutra.com/blogs/TalhaKaya/20140407/214965/OpenFL__Haxe_A_Bumpy_Start.php OpenFL & Haxe, A Bumpy Start]. Gamasutra (4 июля 2014).
  23. [github.com/HaxeFoundation/haxe/blob/3.2.0/extra/CHANGES.txt Haxe 3.2 Release]. Github.
  24. [lists.motion-twin.com/pipermail/haxe/2007-March/007897.html Haxe mailing list post on naming].
  25. [www.mtasc.org MTASC Compiler], MTASC website
  26. [haxe.org/doc/license Haxe license page].
  27. [haxe.org/doc/intro Haxe introduction page].
  28. [www.flashdevelop.org/wikidocs/index.php?title=Main_Page Main Page, FlashDevelop Wiki], «first class support for Flash ActionScript (AS2 and AS3) and Haxe development»
  29. [www.flashdevelop.org/wikidocs/index.php?title=Haxe Haxe Support], FlashDevelop Wiki
  30. [github.com/HaxeFoundation/as3hx as3hx], AS3 to Haxe converter, Haxe source code repository
  31. [cs2hx.codeplex.com/ CS2HX — C# to haXe converter], CodePlex project hosting
  32. [gamehaxe.com/2010/06/28/android-port-first-light/ Blog post mentioning Android port progress].
  33. [web.archive.org/web/20141022194729/developer.palm.com/distribution/viewtopic.php?f=70&t=8499 How to get started with Haxe 2.06 and the webOS PDK [archived on WayBackMachine]].
  34. [Haxe.org/ref Haxe language reference].
  35. [haxe.org/ref/enums Haxe reference detailing the use of enum].
  36. [haxe.org/documentation/introduction/language-features.html Language Features]. Haxe Foundation. Проверено 30 апреля 2015.
  37. [www.scala-js.org/ A Scala to JavaScript compiler].

Ссылки

  • [Haxe.org/ Официальный сайт Haxe]
  • [www.amazon.co.uk/dp/0470122137 Официальная книга по Haxe]

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

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


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


Наступил последний день Москвы. Была ясная веселая осенняя погода. Было воскресенье. Как и в обыкновенные воскресенья, благовестили к обедне во всех церквах. Никто, казалось, еще не мог понять того, что ожидает Москву.
Только два указателя состояния общества выражали то положение, в котором была Москва: чернь, то есть сословие бедных людей, и цены на предметы. Фабричные, дворовые и мужики огромной толпой, в которую замешались чиновники, семинаристы, дворяне, в этот день рано утром вышли на Три Горы. Постояв там и не дождавшись Растопчина и убедившись в том, что Москва будет сдана, эта толпа рассыпалась по Москве, по питейным домам и трактирам. Цены в этот день тоже указывали на положение дел. Цены на оружие, на золото, на телеги и лошадей всё шли возвышаясь, а цены на бумажки и на городские вещи всё шли уменьшаясь, так что в середине дня были случаи, что дорогие товары, как сукна, извозчики вывозили исполу, а за мужицкую лошадь платили пятьсот рублей; мебель же, зеркала, бронзы отдавали даром.
В степенном и старом доме Ростовых распадение прежних условий жизни выразилось очень слабо. В отношении людей было только то, что в ночь пропало три человека из огромной дворни; но ничего не было украдено; и в отношении цен вещей оказалось то, что тридцать подвод, пришедшие из деревень, были огромное богатство, которому многие завидовали и за которые Ростовым предлагали огромные деньги. Мало того, что за эти подводы предлагали огромные деньги, с вечера и рано утром 1 го сентября на двор к Ростовым приходили посланные денщики и слуги от раненых офицеров и притаскивались сами раненые, помещенные у Ростовых и в соседних домах, и умоляли людей Ростовых похлопотать о том, чтоб им дали подводы для выезда из Москвы. Дворецкий, к которому обращались с такими просьбами, хотя и жалел раненых, решительно отказывал, говоря, что он даже и не посмеет доложить о том графу. Как ни жалки были остающиеся раненые, было очевидно, что, отдай одну подводу, не было причины не отдать другую, все – отдать и свои экипажи. Тридцать подвод не могли спасти всех раненых, а в общем бедствии нельзя было не думать о себе и своей семье. Так думал дворецкий за своего барина.
Проснувшись утром 1 го числа, граф Илья Андреич потихоньку вышел из спальни, чтобы не разбудить к утру только заснувшую графиню, и в своем лиловом шелковом халате вышел на крыльцо. Подводы, увязанные, стояли на дворе. У крыльца стояли экипажи. Дворецкий стоял у подъезда, разговаривая с стариком денщиком и молодым, бледным офицером с подвязанной рукой. Дворецкий, увидав графа, сделал офицеру и денщику значительный и строгий знак, чтобы они удалились.
– Ну, что, все готово, Васильич? – сказал граф, потирая свою лысину и добродушно глядя на офицера и денщика и кивая им головой. (Граф любил новые лица.)
– Хоть сейчас запрягать, ваше сиятельство.
– Ну и славно, вот графиня проснется, и с богом! Вы что, господа? – обратился он к офицеру. – У меня в доме? – Офицер придвинулся ближе. Бледное лицо его вспыхнуло вдруг яркой краской.
– Граф, сделайте одолжение, позвольте мне… ради бога… где нибудь приютиться на ваших подводах. Здесь у меня ничего с собой нет… Мне на возу… все равно… – Еще не успел договорить офицер, как денщик с той же просьбой для своего господина обратился к графу.
– А! да, да, да, – поспешно заговорил граф. – Я очень, очень рад. Васильич, ты распорядись, ну там очистить одну или две телеги, ну там… что же… что нужно… – какими то неопределенными выражениями, что то приказывая, сказал граф. Но в то же мгновение горячее выражение благодарности офицера уже закрепило то, что он приказывал. Граф оглянулся вокруг себя: на дворе, в воротах, в окне флигеля виднелись раненые и денщики. Все они смотрели на графа и подвигались к крыльцу.
– Пожалуйте, ваше сиятельство, в галерею: там как прикажете насчет картин? – сказал дворецкий. И граф вместе с ним вошел в дом, повторяя свое приказание о том, чтобы не отказывать раненым, которые просятся ехать.
– Ну, что же, можно сложить что нибудь, – прибавил он тихим, таинственным голосом, как будто боясь, чтобы кто нибудь его не услышал.
В девять часов проснулась графиня, и Матрена Тимофеевна, бывшая ее горничная, исполнявшая в отношении графини должность шефа жандармов, пришла доложить своей бывшей барышне, что Марья Карловна очень обижены и что барышниным летним платьям нельзя остаться здесь. На расспросы графини, почему m me Schoss обижена, открылось, что ее сундук сняли с подводы и все подводы развязывают – добро снимают и набирают с собой раненых, которых граф, по своей простоте, приказал забирать с собой. Графиня велела попросить к себе мужа.
– Что это, мой друг, я слышу, вещи опять снимают?
– Знаешь, ma chere, я вот что хотел тебе сказать… ma chere графинюшка… ко мне приходил офицер, просят, чтобы дать несколько подвод под раненых. Ведь это все дело наживное; а каково им оставаться, подумай!.. Право, у нас на дворе, сами мы их зазвали, офицеры тут есть. Знаешь, думаю, право, ma chere, вот, ma chere… пускай их свезут… куда же торопиться?.. – Граф робко сказал это, как он всегда говорил, когда дело шло о деньгах. Графиня же привыкла уж к этому тону, всегда предшествовавшему делу, разорявшему детей, как какая нибудь постройка галереи, оранжереи, устройство домашнего театра или музыки, – и привыкла, и долгом считала всегда противоборствовать тому, что выражалось этим робким тоном.
Она приняла свой покорно плачевный вид и сказала мужу:
– Послушай, граф, ты довел до того, что за дом ничего не дают, а теперь и все наше – детское состояние погубить хочешь. Ведь ты сам говоришь, что в доме на сто тысяч добра. Я, мой друг, не согласна и не согласна. Воля твоя! На раненых есть правительство. Они знают. Посмотри: вон напротив, у Лопухиных, еще третьего дня все дочиста вывезли. Вот как люди делают. Одни мы дураки. Пожалей хоть не меня, так детей.
Граф замахал руками и, ничего не сказав, вышел из комнаты.
– Папа! об чем вы это? – сказала ему Наташа, вслед за ним вошедшая в комнату матери.
– Ни о чем! Тебе что за дело! – сердито проговорил граф.
– Нет, я слышала, – сказала Наташа. – Отчего ж маменька не хочет?
– Тебе что за дело? – крикнул граф. Наташа отошла к окну и задумалась.
– Папенька, Берг к нам приехал, – сказала она, глядя в окно.


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