Lua

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

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

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

интерпретируемый, JIT-компилируемый

Появился в:

1993

Автор:

Роберту Иерузалимски,
Валдемар Селиш,
Луиш Энрике ди Фигейреду

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

динамическая, строгая, «утиная»

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

Lua, [luajit.org/ LuaJIT], [code.google.com/p/llvm-lua/ LLVM-Lua], [www.lua.inf.puc-rio.br/luaclr LuaCLR], [www.codeplex.com/Nua Nua], [code.google.com/p/lua-alchemy/ Lua Alchemy] и др.[1]

Диалекты:

[metalua.luaforge.net/ MetaLua]

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

Scheme, Снобол, Модула, Клу, C++

Повлиял на:

JavaScript, Ruby, Io, GameMonkey, Squirrel, Dao, MiniD

Лицензия:

лицензия MIT

Сайт:

[www.lua.org .org]

Lua (лу́а, с порт. — «луна»[2]) — скриптовый язык программирования, разработанный в подразделении Tecgraf (Computer Graphics Technology Group) Католического университета Рио-де-Жанейро (Бразилия). Интерпретатор языка является свободно распространяемым, с открытыми исходными текстами на языке Си.

По возможностям, идеологии и реализации язык ближе всего к JavaScript, однако Lua отличается более мощными и гораздо более гибкими конструкциями. Хотя Lua не содержит понятия класса и объекта в явном виде, механизмы объектно-ориентированного программирования, включая множественное наследование, легко реализуются с использованием метатаблиц, которые также отвечают за перегрузку операций и т. п. Реализуемая модель объектно-ориентированного программирования — прототипная (как и в JavaScript).

Язык широко используется для создания тиражируемого программного обеспечения (например, на нём написан графический интерфейс пакета Adobe Lightroom). Также получил известность как язык программирования уровней и расширений во многих играх (в том числе World of Warcraft и Garry's Mod) из-за удобства встраивания, скорости исполнения кода и лёгкости обучения[3].





История

Lua разработана подразделением Tecgraf (группа технологий компьютерной графики) Католического университета Рио-де-Жанейро в Бразилии, история языка ведёт отсчёт с 1993 года. Авторы языка — Роберто Иерусалимский, Луиш Энрике ди Фигейреду (Luiz Henrique de Figueiredo) и Валдемар Селиш (Waldemar Celes). Lua распространяется свободно, с открытыми исходными текстами на языке Си.

Историческими родителями Lua были языки конфигурирования и описания данных SOL (Simple Object Language) и DEL (Data-Entry Language).[4] Они были независимо разработаны в Tecgraf в 1992—1993 годах для добавления некоторой гибкости в два отдельных проекта (оба были интерактивными графическими приложениями для конструкторских нужд в компании Petrobras). В SOL и DEL отсутствовали какое-либо управляющие конструкции, и Petrobras чувствовал растущую необходимость в добавлении к ним полноценного программирования.

Как пишет автор языка в The Evolution of Lua:[5]

В 1993 году единственным реальным претендентом был Tcl, который был специально создан для встраивания в приложения. Однако у Tcl был непривычный синтаксис, не было хорошей поддержки описания данных, и запускался он только на платформах Unix. Мы не рассматривали LISP или Scheme из-за их недружелюбного синтаксиса. Python был ещё во младенческом возрасте. В атмосфере «сделай сам», которая тогда царила в Tecgraf, было вполне естественно, что мы решили разработать наш собственный скриптовый язык. Из-за того, что большинство пользователей не были профессиональными программистами, языку следовало избегать замысловатого синтаксиса и семантики. Реализация нового языка должна быть легко портируема, так как клиенты Tecgraf имели очень разнообразные платформы. Наконец, поскольку мы ожидали, что другим продуктам Tecgraf также понадобится встроенный скриптовый язык, новый язык должен следовать примеру SOL и предоставляться в виде библиотеки с API на C.

Lua 1.0 была спроектирована таким образом, что её конструкторы объектов, тогда чуть отличающиеся от текущего лёгкого и гибкого стиля, включали в себя синтаксис языка SOL (отсюда название Lua: по-португальски sol — «солнце», lua — «луна»). Управляющие конструкции Lua в основном заимствованы из Modula (if, while, repeat/until), хотя на них также повлияли CLU (параллельное присваивание, множественное возвращаемое значение функции как более простая альтернатива вместо передачи параметров по ссылке или явных указателей), C++ («отличная идея объявлять локальные переменные лишь тогда, когда они нужны»), SNOBOL и AWK (ассоциативные массивы). Создатели Lua также признают, что единый вездесущий механизм структурирования данных в LISP и Scheme (связный список) оказал большое влияние на их решение о выборе таблиц в качестве основной структуры данных для Lua.[6]

Версии Lua вплоть до 5.0 выпускались под лицензией, подобной лицензии BSD. Начиная с версии 5.0 и выше Lua распространяется под лицензией MIT. Обе лицензии являются пермиссивными и практически идентичны.

Некоторые возможности

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

Так, в Lua отсутствует явная поддержка наследования, однако оно легко реализуется с помощью метатаблиц.

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

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

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

Параллельное присваивание

Подобно таким скриптовым языкам, как Perl, Python, Ruby и Icon, допускает параллельное присваивание. В простейшем случае это позволяет писать выражения вида:

x, y = y, x

Типы

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

В Lua восемь основных типов:

  1. nil (неопределенный)
  2. boolean (логический)
  3. number (числовой, с версии 5.3 добавлена возможность явного определения целого или вещественного формата числа)
  4. string (строковый)
  5. function (функция)
  6. userdata (пользовательские данные)
  7. thread (поток)
  8. table (таблица)

nil — это тип значения nil [пустое значение], главное свойство которого — отличаться от всех остальных значений и обозначать отсутствие пригодного значения. К типу boolean относятся значения false (ложь) и true (истина). Значения nil и false считаются ложными, любое другое значение считается истинным. К типу number относятся обычно вещественные числа (double), но внутреннее представление чисел можно изменить при сборке интерпретатора. Тип string обозначает массивы символов. Строки Lua могут содержать любые 8-битные символы, включая ноль ('\0'). Строки неизменяемы.

Таблицы

Таблицы являются самым важным типом данных в Lua и являются фундаментом для пользовательских типов данных, таких как структуры, массивы, списки, множества. Таблица в Lua представляет собой набор пар — (Ключ, Значение). Ключом может выступать значение любого типа, кроме nil.

Замыкания

Lua поддерживает концепцию замыканий, например:

function makeaddfunc(x)
  -- Возвращает новую анонимную функцию, которая добавляет x к аргументу
  return function(y)
    -- Когда мы ссылаемся на переменную x, которая вне текущей области,
    -- и время жизни которой меньше, чем этой анонимной функции, 
    -- Lua создаёт замыкание.
    return x + y
  end
end
plustwo = makeaddfunc(2)
print(plustwo(5)) -- Выводит 7

Каждый раз, когда вызывается makeaddfunc, создаётся новое замыкание для переменной x, так что каждая возвращаемая анонимная функция будет ссылаться на свой параметр x. Как и у любого другого объекта Lua, временем жизни замыкания управляет сборщик мусора.

Примеры кода

Классическая программа «Hello, world!» на Lua выглядит вот так:

print("Hello World!")

Для комментариев используется следующий синтаксис, близкий к языкам Ada, SQL и VHDL:

-- Комментарии в Lua начинаются с двойного дефиса и продолжаются до конца строки.
--[[Многострочные текстовые литералы и комментарии
 берут в двойные квадратные скобки.]]

Факториал — пример рекурсивной функции:

function factorial(n)
  if n == 0 then
    return 1
  else
    return n * factorial(n - 1)
  end
end

Цикл со счётчиком:

for i = 1,5 do
     -- Statements
end

Работа с функциями как с объектами первого класса демонстрируется в следующем примере, в котором модифицируется поведение функции print:

do
  local oldprint = print   -- Сохраняем текущую функцию print как oldprint
  function print(s)        -- Переопределяем функцию print
    if s == "foo" then
      oldprint("bar")
    else
      oldprint(s)
    end
  end
end

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

Ключевой особенностью Lua является расширяемая семантика, механизм метатаблиц даёт большие возможности по настройке уникального поведения для таблиц Lua. В следующем примере демонстрируется «бесконечная» таблица. Для любого <math>n</math>, fibs[n] даст <math>n</math>-е число Фибоначчи с использованием мемоизации.

fibs = { 1, 1 } -- Первоначальные значения для fibs[1] и fibs[2].
setmetatable(fibs, { 
  __index = function(name, n)            -- Вызов функции, если fibs[n] не существует.
    name[n] = name[n - 1] + name[n - 2]  -- Расчёт и мемоизация fibs[n].
    return name[n]                       
  end
})

Реализация

Как и многие интерпретируемые языки программирования, реализация Lua имеет отдельно компилятор с исходного языка в исполняемый байт-код и виртуальную машину для исполнения сгенерированного байт-кода. Причём байт-код — это не команды стековой машины, а команды некоего виртуального процессора с несколькими регистрами, что повышает эффективность исполнения. В стандартной виртуальной машине Lua используется распределение памяти со сборкой мусора (аналогично Java или .NET).

Lua использует единый строковый пул, что позволяет снизить расходы памяти на хранение строк.

Для задач, критичных по времени, имеется JIT-компилятор Lua — LuaJIT[7]. Также разработан компилятор llvm-lua[8], генерирующий код для виртуальной машины LLVM, предоставляющей возможность последующей компиляции в очень эффективный машинный код для процессоров различной архитектуры.

Использование

В настоящее время используется в различных проектах, где требуется встроить достаточно быстрый и нетрудный в освоении скриптовый язык программирования — например, в разработке игр, где Lua часто используется в качестве прослойки между игровым движком и данными для написания сценариев поведения/взаимодействия объектов.

Игры

Первыми в разработку компьютерных игр язык Lua внедрила компания LucasArts, начиная с игры Grim Fandango[9]. Авторы языка в своём докладе на конференции HOPL (англ.) вспоминают, что в январе 1997 они получили сообщение от Брета Могилефски, главного разработчика Grim Fandango, где он писал, что, прочитав о языке в статье 1996 года в Dr. Dobb’s Journal, он планирует заменить используемый ими самодельный скриптовый язык SCUMM на Lua[10]. В результате им был создан игровой движок GrimE, используемый также более поздним квестом от LucasArts — Escape from Monkey Island.

В 2003 году в результате опроса на сайте GameDev.net Lua был признан самым популярным скриптовым языком для разработки игр[11].

Примером игры, программируемой с помощью Lua, является World of Warcraft.[12][13] На языке Lua описываются уровни игры-головоломки Enigma[14].

Доступен ряд свободных игровых движков, программируемых на Lua, таких, как аркадный движок LÖVE[15][16], игровой конструктор Novashell[17] и ориентированный на квесты (преимущественно — текстовые) INSTEAD[18].

Также используется в авиасимуляторе X-Plane, в движке X-Ray для S.T.A.L.K.E.R[19].

Для популярной игры Minecraft созданы модификации ComputerCraft и его более совершенный аналог OpenComputers, которые добавляют компьютеры, программируемые на языке Lua[20].

Зарубежная команда Croteam (разработчики Serious Sam и The Talos Principle) используют Lua в скриптах начиная с версии Serious Engine 3.5[21].

IDE

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

Примечания

  1. [lua-users.org/wiki/LuaImplementations Lua Implementations] (англ.). Lua-users wiki. Проверено 18 мая 2009. [www.webcitation.org/61AbdtjZ2 Архивировано из первоисточника 24 августа 2011].
  2. [www.lua.org/about.html#name About Lua]. Lua.org. Проверено 19 июня 2013.
  3. [stackoverflow.com/questions/38338/why-is-lua-considered-a-game-language Why is Lua considered a game language?]. Stack Overflow. Проверено 23 апреля 2010.
  4. [www.lua.org/history.html The evolution of an extension language: a history of Lua] (2001). Проверено 24 августа 2016.
  5. HOPL, 2007, p. 2–1–2–26.
  6. [www.lua.org/ddj.html Lua: an Extensible Embedded Language. A few metamechanisms replace a host of features] (December 1996), стр. 26–33.
  7. [luajit.org The LuaJIT Project]
  8. [code.google.com/p/llvm-lua/ llvm-lua. JIT/Static compiler for Lua using LLVM on the backend.]
  9. Bret Mogilefsky. [www.grimfandango.net/?page=articles&pagenumber=2 Lua in Grim Fandango]. Проверено 9 декабря 2011. [www.webcitation.org/65BoxDdvU Архивировано из первоисточника 4 февраля 2012].
  10. HOPL, 2007, с. 11.
  11. [web.archive.org/web/20031207171619/gamedev.net/gdpolls/viewpoll.asp?ID=163 Which language do you use for scripting in your game engine?. GameDev.net — Poll Results]
  12. Paul Emmerich. Beginning Lua with World of Warcraft Add-ons. — Apress, July 2009. — ISBN 1430223715.
  13. James Whitehead II, Bryan McLemore, and Matthew Orlando. World of Warcraft Programming. — Wiley, May 2008. — ISBN 0470229810.
  14. Tom Gutschmidt. Ch. 8. The Lua Game Community → Game Engines // Game Programming with Python, Lua, and Ruby. — Premier Press, 2003. — 472 p. — ISBN 1-59200-079-7.
  15. Dj Walker-Morgan. [www.h-online.com/open/features/The-H-Speed-Guide-to-Lua-1517427.html%3Fpage=2 The H Speed Guide to Lua → Developing with Lua]. The H (17 April 2012). Проверено 26 февраля 2015.
  16. Darmie Akinlaja. LÖVE for Lua Game Programming. — Packt, 2013. — 106 p. — ISBN 978-1-78216-160-8.
  17. Alan Thorn. Chapter 8. Novashell and 2D Games // Cross Platform Game Development. — Jones & Bartlett Learning, 2008. — P. 225-264. — 421 p. — ISBN 978-1-59822-056-8.
  18. Пётр Косых [ifprint.org/articles/insteadstory/ INSTEAD: Как все начиналось] // IFPrint.org. — Март 18, 2013. — Вып. 1. — ISSN [www.sigla.ru/table.jsp?f=8&t=3&v0=2307-535X&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 2307-535X].
  19. Ronnie Tucker. [books.google.com/books?id=7q0iBQAAQBAJ Full Circle Magazine #90: THE INDEPENDENT MAGAZINE FOR THE UBUNTU LINUX COMMUNITY]. — Full Circle Magazine, 2014-10-31. — 50 с.
  20. Matthew Monk, Simon Monk. [books.google.com/books?id=f06vlwEACAAJ ComputerCraft: Lua Programming in Minecraft]. — CreateSpace Independent Publishing Platform, 2013-01-28. — 58 с. — ISBN 9781481927659.
  21. Zero_Cool. [gamegpu.com/history/istoriya-tehnologii-serious-engine.html История технологий - Serious Engine | History | Тест GPU]. gamegpu.com. Проверено 10 апреля 2016.
  22. [studio.zerobrane.com/ ZeroBrane Studio — Lua IDE/editor/debugger for Windows, Mac OSX, and Linux]
  23. [www.eclipse.org/koneki/ldt/ Lua Development Tools]

Литература

  • Роберто Иерузалимски. Программирование на языке Lua. — 3-е изд.. — ДМК, 2014. — ISBN 9785940747673. (оригинал: Roberto Ierusalimschy. Programming in Lua. — 3-nd ed.. — 2012. — ISBN 9788590379850.)
  • Ian Dees. Lua // Seven More Languages in Seven Weeks. Languages That Are Shaping the Future / Bruce Tate, Fred Daoud, Jack Moffitt, Ian Dees. — The Pragmatic Bookshelf, 2015. — С. 1-48. — 320 с. — ISBN 978-1941222157.
  • Mário Kašuba. Lua Game Development Cookbook. — Packt Publishing, 2015. — 402 с. — ISBN 978-1849515504.
  • David Young. Learning Game AI Programming with Lua. — Packt Publishing, 2014. — 352 с. — ISBN 978-1783281336.
  • Jayant Varma. [books.google.com/books?id=dLI7IloCzR8C Learn Lua for iOS Game Development]. — Apress, 2012. — 410 с. — ISBN 9781430246626.
  • Kurt Jung, Aaron Brown. [books.google.com/books?id=Br8l4Z_XUgoC Beginning Lua Programming]. — John Wiley & Sons, 2011. — 675 с. — (Programmer to Programmer). — ISBN 9781118079119.
История языка
  • R. Ierusalimschy, L. H. de Figueiredo, W. Celes [www.lua.org/doc/hopl.pdf The evolution of Lua] // Proceedings of ACM HOPL III. 2-1–2-26. — 2007.
  • Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes. [www.lua.org/history.html The evolution of an extension language: a history of Lua]. Reprint from Proceedings of V Brazilian Symposium on Programming Languages (2001) B-14–B-28.. Проверено 9 декабря 2011. [www.webcitation.org/65Boxgnss Архивировано из первоисточника 4 февраля 2012]. (перевод [habrahabr.ru/post/229269 Эволюция языка расширений: история Lua] (рус.))
  • Федерико Бьянкуцци, Шейн Уорден. Глава 7. Lua // Пионеры программирования. Диалоги с создателями наиболее популярных языков программирования = Masterminds of Programming: Conversations with the Creators of Major Programming Languages. — Символ, 2011. — С. 211-230. — 608 с. — 1500 экз. — ISBN 9785932861707.
  • [www.computerworld.com.au/index.php/id;1028768484;fp;4194304;fpid;1 Интервью Роберто Иерусалимского] для Computerworld о языке Lua

Ссылки

  • [www.Lua.org Официальный сайт разработчиков Lua] (англ.)
  • [Luaforge.net Сайт проектов Lua] (англ.)
  • [Lua-users.org Сайт пользователей Lua] (англ.)
  • [www.lua.org/manual/5.3/ Справочное руководство по языку Lua 5.3] (англ.)
Lua-проекты
  • [www.keplerproject.org Kepler Project team] — Платформа веб-разработки под Lua (англ.)
  • [luagl.luaforge.net LuaGL] — интерфейс к OpenGL для Lua 5.1
  • [raidar.github.io/Programs/FarScripts.htm#LuaFAR LuaFAR] — движок Lua-плагинов и скриптов для файлового менеджера

Lua на русском

Переводы руководств
Статьи и обзоры
  • Мартин Страйчер. [www.ibm.com/developerworks/ru/library/l-lua/ Создание встраиваемых сценариев на языке Lua]
  • Андрей Зубинский. [itc.ua/articles/eshhe_odin_letnij_yazyk_programmirovaniya_20951 Еще один «летний» язык программирования] ([itc.ua/articles/eshhe_odin_letnij_yazyk_programmirovaniya_chast_2_21025 часть 2]; [itc.ua/articles/eshhe_odin_letnij_yazyk_programmirovaniya_chast_3_21293 часть 3]; [itc.ua/articles/eshhe_odin_letnij_yazyk_programmirovaniya_chast_4_21409 часть 4])
  • Ash Matheson. [club.shelek.ru/viewart.php?id=77 Введение в Lua] — перевод статьи [www.gamedev.net/reference/articles/article1932.asp An Introduction to Lua] (англ.)
  • Keith Fieldhouse. [netsago.org/ru/docs/1/4/ Введение в Lua] — перевод статьи [www.onlamp.com/pub/a/onlamp/2006/02/16/introducing-lua.html Introducing Lua] (англ.)
  • [wiki.linuxformat.ru/wiki/LXF122:LUA Серия статей о Lua] // Linux Format
  • [ilovelua.narod.ru/ Я люблю Lua] — уроки по языку Lua и его встраиванию в C++ приложения ([ilovelua.wordpress.com/ Новый Сайт])
  • [robot-develop.org/archives/3717 Использование Lua в робототехнике]

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

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


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

В гостиной продолжался разговор.
– Ah! chere, – говорила графиня, – и в моей жизни tout n'est pas rose. Разве я не вижу, что du train, que nous allons, [не всё розы. – при нашем образе жизни,] нашего состояния нам не надолго! И всё это клуб, и его доброта. В деревне мы живем, разве мы отдыхаем? Театры, охоты и Бог знает что. Да что обо мне говорить! Ну, как же ты это всё устроила? Я часто на тебя удивляюсь, Annette, как это ты, в свои годы, скачешь в повозке одна, в Москву, в Петербург, ко всем министрам, ко всей знати, со всеми умеешь обойтись, удивляюсь! Ну, как же это устроилось? Вот я ничего этого не умею.
– Ах, душа моя! – отвечала княгиня Анна Михайловна. – Не дай Бог тебе узнать, как тяжело остаться вдовой без подпоры и с сыном, которого любишь до обожания. Всему научишься, – продолжала она с некоторою гордостью. – Процесс мой меня научил. Ежели мне нужно видеть кого нибудь из этих тузов, я пишу записку: «princesse une telle [княгиня такая то] желает видеть такого то» и еду сама на извозчике хоть два, хоть три раза, хоть четыре, до тех пор, пока не добьюсь того, что мне надо. Мне всё равно, что бы обо мне ни думали.
– Ну, как же, кого ты просила о Бореньке? – спросила графиня. – Ведь вот твой уже офицер гвардии, а Николушка идет юнкером. Некому похлопотать. Ты кого просила?
– Князя Василия. Он был очень мил. Сейчас на всё согласился, доложил государю, – говорила княгиня Анна Михайловна с восторгом, совершенно забыв всё унижение, через которое она прошла для достижения своей цели.
– Что он постарел, князь Василий? – спросила графиня. – Я его не видала с наших театров у Румянцевых. И думаю, забыл про меня. Il me faisait la cour, [Он за мной волочился,] – вспомнила графиня с улыбкой.
– Всё такой же, – отвечала Анна Михайловна, – любезен, рассыпается. Les grandeurs ne lui ont pas touriene la tete du tout. [Высокое положение не вскружило ему головы нисколько.] «Я жалею, что слишком мало могу вам сделать, милая княгиня, – он мне говорит, – приказывайте». Нет, он славный человек и родной прекрасный. Но ты знаешь, Nathalieie, мою любовь к сыну. Я не знаю, чего я не сделала бы для его счастья. А обстоятельства мои до того дурны, – продолжала Анна Михайловна с грустью и понижая голос, – до того дурны, что я теперь в самом ужасном положении. Мой несчастный процесс съедает всё, что я имею, и не подвигается. У меня нет, можешь себе представить, a la lettre [буквально] нет гривенника денег, и я не знаю, на что обмундировать Бориса. – Она вынула платок и заплакала. – Мне нужно пятьсот рублей, а у меня одна двадцатипятирублевая бумажка. Я в таком положении… Одна моя надежда теперь на графа Кирилла Владимировича Безухова. Ежели он не захочет поддержать своего крестника, – ведь он крестил Борю, – и назначить ему что нибудь на содержание, то все мои хлопоты пропадут: мне не на что будет обмундировать его.
Графиня прослезилась и молча соображала что то.
– Часто думаю, может, это и грех, – сказала княгиня, – а часто думаю: вот граф Кирилл Владимирович Безухой живет один… это огромное состояние… и для чего живет? Ему жизнь в тягость, а Боре только начинать жить.
– Он, верно, оставит что нибудь Борису, – сказала графиня.
– Бог знает, chere amie! [милый друг!] Эти богачи и вельможи такие эгоисты. Но я всё таки поеду сейчас к нему с Борисом и прямо скажу, в чем дело. Пускай обо мне думают, что хотят, мне, право, всё равно, когда судьба сына зависит от этого. – Княгиня поднялась. – Теперь два часа, а в четыре часа вы обедаете. Я успею съездить.
И с приемами петербургской деловой барыни, умеющей пользоваться временем, Анна Михайловна послала за сыном и вместе с ним вышла в переднюю.
– Прощай, душа моя, – сказала она графине, которая провожала ее до двери, – пожелай мне успеха, – прибавила она шопотом от сына.
– Вы к графу Кириллу Владимировичу, ma chere? – сказал граф из столовой, выходя тоже в переднюю. – Коли ему лучше, зовите Пьера ко мне обедать. Ведь он у меня бывал, с детьми танцовал. Зовите непременно, ma chere. Ну, посмотрим, как то отличится нынче Тарас. Говорит, что у графа Орлова такого обеда не бывало, какой у нас будет.


– Mon cher Boris, [Дорогой Борис,] – сказала княгиня Анна Михайловна сыну, когда карета графини Ростовой, в которой они сидели, проехала по устланной соломой улице и въехала на широкий двор графа Кирилла Владимировича Безухого. – Mon cher Boris, – сказала мать, выпрастывая руку из под старого салопа и робким и ласковым движением кладя ее на руку сына, – будь ласков, будь внимателен. Граф Кирилл Владимирович всё таки тебе крестный отец, и от него зависит твоя будущая судьба. Помни это, mon cher, будь мил, как ты умеешь быть…
– Ежели бы я знал, что из этого выйдет что нибудь, кроме унижения… – отвечал сын холодно. – Но я обещал вам и делаю это для вас.
Несмотря на то, что чья то карета стояла у подъезда, швейцар, оглядев мать с сыном (которые, не приказывая докладывать о себе, прямо вошли в стеклянные сени между двумя рядами статуй в нишах), значительно посмотрев на старенький салоп, спросил, кого им угодно, княжен или графа, и, узнав, что графа, сказал, что их сиятельству нынче хуже и их сиятельство никого не принимают.
– Мы можем уехать, – сказал сын по французски.
– Mon ami! [Друг мой!] – сказала мать умоляющим голосом, опять дотрогиваясь до руки сына, как будто это прикосновение могло успокоивать или возбуждать его.
Борис замолчал и, не снимая шинели, вопросительно смотрел на мать.
– Голубчик, – нежным голоском сказала Анна Михайловна, обращаясь к швейцару, – я знаю, что граф Кирилл Владимирович очень болен… я затем и приехала… я родственница… Я не буду беспокоить, голубчик… А мне бы только надо увидать князя Василия Сергеевича: ведь он здесь стоит. Доложи, пожалуйста.
Швейцар угрюмо дернул снурок наверх и отвернулся.
– Княгиня Друбецкая к князю Василию Сергеевичу, – крикнул он сбежавшему сверху и из под выступа лестницы выглядывавшему официанту в чулках, башмаках и фраке.
Мать расправила складки своего крашеного шелкового платья, посмотрелась в цельное венецианское зеркало в стене и бодро в своих стоптанных башмаках пошла вверх по ковру лестницы.
– Mon cher, voue m'avez promis, [Мой друг, ты мне обещал,] – обратилась она опять к Сыну, прикосновением руки возбуждая его.
Сын, опустив глаза, спокойно шел за нею.
Они вошли в залу, из которой одна дверь вела в покои, отведенные князю Василью.
В то время как мать с сыном, выйдя на середину комнаты, намеревались спросить дорогу у вскочившего при их входе старого официанта, у одной из дверей повернулась бронзовая ручка и князь Василий в бархатной шубке, с одною звездой, по домашнему, вышел, провожая красивого черноволосого мужчину. Мужчина этот был знаменитый петербургский доктор Lorrain.
– C'est donc positif? [Итак, это верно?] – говорил князь.
– Mon prince, «errare humanum est», mais… [Князь, человеку ошибаться свойственно.] – отвечал доктор, грассируя и произнося латинские слова французским выговором.
– C'est bien, c'est bien… [Хорошо, хорошо…]
Заметив Анну Михайловну с сыном, князь Василий поклоном отпустил доктора и молча, но с вопросительным видом, подошел к ним. Сын заметил, как вдруг глубокая горесть выразилась в глазах его матери, и слегка улыбнулся.
– Да, в каких грустных обстоятельствах пришлось нам видеться, князь… Ну, что наш дорогой больной? – сказала она, как будто не замечая холодного, оскорбительного, устремленного на нее взгляда.
Князь Василий вопросительно, до недоумения, посмотрел на нее, потом на Бориса. Борис учтиво поклонился. Князь Василий, не отвечая на поклон, отвернулся к Анне Михайловне и на ее вопрос отвечал движением головы и губ, которое означало самую плохую надежду для больного.
– Неужели? – воскликнула Анна Михайловна. – Ах, это ужасно! Страшно подумать… Это мой сын, – прибавила она, указывая на Бориса. – Он сам хотел благодарить вас.
Борис еще раз учтиво поклонился.
– Верьте, князь, что сердце матери никогда не забудет того, что вы сделали для нас.
– Я рад, что мог сделать вам приятное, любезная моя Анна Михайловна, – сказал князь Василий, оправляя жабо и в жесте и голосе проявляя здесь, в Москве, перед покровительствуемою Анною Михайловной еще гораздо большую важность, чем в Петербурге, на вечере у Annette Шерер.
– Старайтесь служить хорошо и быть достойным, – прибавил он, строго обращаясь к Борису. – Я рад… Вы здесь в отпуску? – продиктовал он своим бесстрастным тоном.
– Жду приказа, ваше сиятельство, чтоб отправиться по новому назначению, – отвечал Борис, не выказывая ни досады за резкий тон князя, ни желания вступить в разговор, но так спокойно и почтительно, что князь пристально поглядел на него.
– Вы живете с матушкой?
– Я живу у графини Ростовой, – сказал Борис, опять прибавив: – ваше сиятельство.
– Это тот Илья Ростов, который женился на Nathalie Шиншиной, – сказала Анна Михайловна.
– Знаю, знаю, – сказал князь Василий своим монотонным голосом. – Je n'ai jamais pu concevoir, comment Nathalieie s'est decidee a epouser cet ours mal – leche l Un personnage completement stupide et ridicule.Et joueur a ce qu'on dit. [Я никогда не мог понять, как Натали решилась выйти замуж за этого грязного медведя. Совершенно глупая и смешная особа. К тому же игрок, говорят.]
– Mais tres brave homme, mon prince, [Но добрый человек, князь,] – заметила Анна Михайловна, трогательно улыбаясь, как будто и она знала, что граф Ростов заслуживал такого мнения, но просила пожалеть бедного старика. – Что говорят доктора? – спросила княгиня, помолчав немного и опять выражая большую печаль на своем исплаканном лице.
– Мало надежды, – сказал князь.
– А мне так хотелось еще раз поблагодарить дядю за все его благодеяния и мне и Боре. C'est son filleuil, [Это его крестник,] – прибавила она таким тоном, как будто это известие должно было крайне обрадовать князя Василия.
Князь Василий задумался и поморщился. Анна Михайловна поняла, что он боялся найти в ней соперницу по завещанию графа Безухого. Она поспешила успокоить его.
– Ежели бы не моя истинная любовь и преданность дяде, – сказала она, с особенною уверенностию и небрежностию выговаривая это слово: – я знаю его характер, благородный, прямой, но ведь одни княжны при нем…Они еще молоды… – Она наклонила голову и прибавила шопотом: – исполнил ли он последний долг, князь? Как драгоценны эти последние минуты! Ведь хуже быть не может; его необходимо приготовить ежели он так плох. Мы, женщины, князь, – она нежно улыбнулась, – всегда знаем, как говорить эти вещи. Необходимо видеть его. Как бы тяжело это ни было для меня, но я привыкла уже страдать.
Князь, видимо, понял, и понял, как и на вечере у Annette Шерер, что от Анны Михайловны трудно отделаться.
– Не было бы тяжело ему это свидание, chere Анна Михайловна, – сказал он. – Подождем до вечера, доктора обещали кризис.
– Но нельзя ждать, князь, в эти минуты. Pensez, il у va du salut de son ame… Ah! c'est terrible, les devoirs d'un chretien… [Подумайте, дело идет о спасения его души! Ах! это ужасно, долг христианина…]
Из внутренних комнат отворилась дверь, и вошла одна из княжен племянниц графа, с угрюмым и холодным лицом и поразительно несоразмерною по ногам длинною талией.
Князь Василий обернулся к ней.
– Ну, что он?
– Всё то же. И как вы хотите, этот шум… – сказала княжна, оглядывая Анну Михайловну, как незнакомую.
– Ah, chere, je ne vous reconnaissais pas, [Ах, милая, я не узнала вас,] – с счастливою улыбкой сказала Анна Михайловна, легкою иноходью подходя к племяннице графа. – Je viens d'arriver et je suis a vous pour vous aider a soigner mon oncle . J`imagine, combien vous avez souffert, [Я приехала помогать вам ходить за дядюшкой. Воображаю, как вы настрадались,] – прибавила она, с участием закатывая глаза.
Княжна ничего не ответила, даже не улыбнулась и тотчас же вышла. Анна Михайловна сняла перчатки и в завоеванной позиции расположилась на кресле, пригласив князя Василья сесть подле себя.
– Борис! – сказала она сыну и улыбнулась, – я пройду к графу, к дяде, а ты поди к Пьеру, mon ami, покаместь, да не забудь передать ему приглашение от Ростовых. Они зовут его обедать. Я думаю, он не поедет? – обратилась она к князю.
– Напротив, – сказал князь, видимо сделавшийся не в духе. – Je serais tres content si vous me debarrassez de ce jeune homme… [Я был бы очень рад, если бы вы меня избавили от этого молодого человека…] Сидит тут. Граф ни разу не спросил про него.
Он пожал плечами. Официант повел молодого человека вниз и вверх по другой лестнице к Петру Кирилловичу.


Пьер так и не успел выбрать себе карьеры в Петербурге и, действительно, был выслан в Москву за буйство. История, которую рассказывали у графа Ростова, была справедлива. Пьер участвовал в связываньи квартального с медведем. Он приехал несколько дней тому назад и остановился, как всегда, в доме своего отца. Хотя он и предполагал, что история его уже известна в Москве, и что дамы, окружающие его отца, всегда недоброжелательные к нему, воспользуются этим случаем, чтобы раздражить графа, он всё таки в день приезда пошел на половину отца. Войдя в гостиную, обычное местопребывание княжен, он поздоровался с дамами, сидевшими за пяльцами и за книгой, которую вслух читала одна из них. Их было три. Старшая, чистоплотная, с длинною талией, строгая девица, та самая, которая выходила к Анне Михайловне, читала; младшие, обе румяные и хорошенькие, отличавшиеся друг от друга только тем, что у одной была родинка над губой, очень красившая ее, шили в пяльцах. Пьер был встречен как мертвец или зачумленный. Старшая княжна прервала чтение и молча посмотрела на него испуганными глазами; младшая, без родинки, приняла точно такое же выражение; самая меньшая, с родинкой, веселого и смешливого характера, нагнулась к пяльцам, чтобы скрыть улыбку, вызванную, вероятно, предстоящею сценой, забавность которой она предвидела. Она притянула вниз шерстинку и нагнулась, будто разбирая узоры и едва удерживаясь от смеха.
– Bonjour, ma cousine, – сказал Пьер. – Vous ne me гесоnnaissez pas? [Здравствуйте, кузина. Вы меня не узнаете?]
– Я слишком хорошо вас узнаю, слишком хорошо.