Nemerle

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

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

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

компилируемый

Появился в:

0.9.3 — 16 мая 2006

Автор:

Вроцлавский университет; [nemerle.org/~malekith/ Михал Москаль], [nazgul.omega.pl/index-en.html Камиль Скальски], Павел Ольшта и др. [nemerle.org/Authors_and_Contact]

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

статическая

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

C#, ML, OCaml, Haskell, Лисп

Сайт:

[nemerle.org/About/ .org/About/]

Nemerle — гибридный язык высокого уровня со статической типизацией, сочетающий в себе возможности функционального и объектно-ориентированного программирования, для платформ .NET и Mono (язык компилируется в CIL и является CLS-совместимым). Главная особенность языка — развитая система метапрограммирования.





История

Разработка языка Nemerle началась в 2003 году в университете Вроцлава (Польша). Команда разработчиков составилась всего из трёх человек, все они на момент начала разработки были аспирантами Вроцлавского университета. Михал Москаль — лидер команды и автор системы вывода типов, Камиль Скальски — разработчик системы макросов и расширяемого парсера, и Павел Ольшта — автор кодогенератора и реализации механизма сопоставления с образцом.

Название языка происходит от имени мага Nemmerle из «Волшебника Земноморья» Урсулы Ле Гуин.

Язык изначально проектировался под платформу .NET. 12 марта 2010 года была выпущена первая бета-версия компилятора языка, поддерживающая работу приложений под управлением .NET 3.5. Язык, его реализация и документация выпускаются под свободной BSD-подобной лицензией, допускающей свободное использование их в любых целях.

Первый релиз (версия 1.0) комплекта ПО для программирования на Nemerle выпущен 13 мая 2011 года, на текущий момент самой свежей версией является 1.0.0.9832, работающая на платформе .NET 3.5 — 4.0. В комплект, доступный для свободного скачивания, входит инсталлируемый компилятор языка и набор библиотек для встраивания в Microsoft Visual Studio 2008, отдельный компилятор (для работы без Visual Studio), экспериментальная версия ПО, интегрируемого с Visual Studio 2010, а также исходные коды. Текущая версия компилятора поддерживает включение в проект кода на C# 4.0, при условии неиспользования небезопасного кода.

С июня 2012 года команда разработчиков Nemerle стала частью компании JetBrains, которая займётся дальнейшей разработкой и поддержкой языка.[1]

Характеристика языка

Nemerle позиционируется как язык общего назначения. Он сочетает в себе несколько парадигм программирования: объектно-ориентированное программирование, императивное программирование, функциональное программирование и метапрограммирование. Из-за такого сочетания концепций, написание программ на Nemerle возможно используя разные стили: в императивном подходе код будет аналогичен коду программ C# (за исключением некоторых нюансов напр. указания типа), в функциональном подходе исходный код будет родственен языкам семейства ML (ML, OCaml, F#, Haskell), включая их особенности:

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

Особенности

Характерной особенностью Nemerle, как и всех языков, типизированных по Хиндли — Милнеру является мощная система вывода типов.

Вывод типов

def x = 1; // int
def myList = List(); // generic List[T], T должен выводиться из дальнейшего использования
myList.Add(x);       // благодаря этой строке компилятор определяет тип myList как List[int]

Все является выражением

def x =
  { // эквивалент x = 3
    def y = 1;
    def z = 2;
    y + z  // последнее выражение в блоке является значением блока
  }

def x =
  if (DateTime.Now.DayOfWeek == DayOfWeek.Monday) // if, using, try  - тоже являются выражениями
    "Monday"
  else
    "other day";

def x = try
{
  Int32.Parse(someString)
}
catch
{
  | FormatException() => 0;
}

Кортежи

def k = (1, "one"); // k : (int * string)
def (a, b) = k; // a = 1, b = "one"

Сопоставление с образцом

def result = match (number)
{
  | 0            => "zero"
  | 1            => "one"
  | x when x < 0 => "negative"
  | _            => "more than one"
}

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

def next(x) { x + 1 };

def mult(x, y) { x * y }

def fibbonacci(_)
{
  | 0     => 0
  | 1     => 1
  | i => fibbonacci(i - 1) + fibbonacci(i - 2)
}

Console.WriteLine(next(9));        // 10
Console.WriteLine(mult(2, 2));     // 4
Console.WriteLine(fibbonacci(10)); // 55

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

Nemerle позволяет создавать, анализировать и модифицировать код программы во время компиляции с помощью макросов. Макросы могут быть использованы в виде вызова метода либо в виде новых конструкций языка. Большая часть конструкций в языке реализована с помощью макросов (if, for, foreach, while, using и т. д.).

Пример макроса «if»:

macro @if (cond, e1, e2)
syntax ("if", "(", cond, ")", e1, Optional (";"), "else", e2)
{
  /*
    <[ ]> // <[ ]> определяет области квазицитирования, код внутри них преобразуется в AST Немерле,
          аналогично преобразованию кода в Expression компилятором C#
  */
  <[
    match ($cond : bool)
    {
      | true => $e1
      | _ => $e2
    }
  ]>
}

// Вышеприведённый макрос вводит в язык конструкцию if,
def max = if (a > b) a else b;
// которая при компиляции раскрывается в
def max = match (a > b)
{
  | true => a
  | _    => b
}

Основные концепции

  • Типобезопасные «гигиеничные» макросы и квазицитирование c возможностью расширения синтаксиса.
  • Наличие локальных функций (лексических замыканий). Функция является объектом первого класса.
  • Гарантированная оптимизация хвостовой рекурсии, то есть хвостовая рекурсия всегда заменяется циклом при компиляции.
  • Выведение типов. В частности, возможно выведение типов локальных переменных и выведение сигнатуры локальных функций.
  • Отсутствие четкой границы между инструкцией (statement) и выражением (expression). «Everything is expression». Например, условный оператор может находиться внутри арифметического выражения. Нет необходимости в инструкции return.
  • Блоки кода, упраздняющие необходимость в таких инструкциях, как break или continue.
  • Алгебраические типы данных, кортежи и сопоставление с образцом.
  • Упрощенный синтаксис работы со списками. Списочные литералы.
  • Частичное применение операторов и функций — простая генерация обёртки некоторой функции, в которой часть параметров подставлена заранее, а часть передаётся непосредственно при вызове функции.

Особенности синтаксиса

Синтаксис Nemerle очень близок к C#, но имеет ряд характерных отличий, в том числе позаимствованных из функциональных и скриптовых языков. Вот некоторые из них:

  • Язык поддерживает локальные функции (функции внутри методов и других функций). Эти функции поддерживают замыкания (в результате становится важно, где и в каком порядке они объявлены).
  • Наряду с обычным порядком заключения элементов программы (классов, составных операторов, тел методов) в фигурные скобки, поддерживается альтернативный вариант описания структуры программы, базирующийся на отступах, как в Python.
  • В описании переменных и методов тип указывается в стиле OCaml (похоже на Pascal, но без возможности задать несколько имен переменных) в виде «переменная : тип».
  • Имена могут, помимо букв, цифр и знака подчёркивания, содержать знак апострофа «'».
  • Объявления локальных функций и констант начинаются с def.
  • Наряду с унаследованным от C# объявлением главной функции программы в виде статического метода Main головного класса программы поддерживается прямое размещение кода в файле без помещения его в какой-либо класс или метод.
  • Переменные объявляются с помощью модификатора mutable (а не def). Таким образом, синтаксис поощряет использование неизменяемых объектов, что соответствует идеологии функционального программирования.
  • Создание экземпляра класса выполняется вызовом его конструктора — «ИмяКласса(параметры конструктора)» без необходимости указывать ключевое слово new (как это принято в C#).
  • Команда подключения пространства имён using подключает все вложенные пространства имён, а также позволяет прямо подключить конкретный тип, что даёт возможность использования его статических членов (например, методов классов или констант перечислений) без квалификации имени.
  • Статические классы (классы, имеющие только статические методы и поля) описываются с ключевым словом module вместо class и не требуют указания модификатора static перед каждым членом класса.
  • Введены две отдельные конструкции для статического уточнения и динамического приведения типов (: и :> соответственно).
  • В стандартной библиотеке имеется тип «список» (list), являющийся однонаправленным связанным списком. Списки являются неизменяемыми и ведут себя во многом аналогично строкам C#. Для этого типа в языке предусмотрен специализированный синтаксис, значительно упрощающий работу с ним (литералы, возможность использования списка в сопоставлении с образцом).
  • Введён тип «вариант» (variant) — аналог алгебраических типов в функциональных языках.
  • Введён тип «кортеж» (tuple) — безымянная, незменяемая структура данных, содержащая несколько (возможно разнотипных) элементов. Для кортежей поддерживается структурное соответствие. Кортежи удобны, когда требуется вернуть несколько значений из функции, свойства или просто организовать любое выражение.
  • Конструкцию переключения switch заменила конструкция сопоставления с образцом match, обладающая большими возможностями (позаимствовано из ML-подобных языков).
  • Гарантировано преобразование компилятором хвостовой рекурсии в цикл. Это позволяет описывать повторяющиеся вычисления рекурсивно, не опасаясь, что применение рекурсии приведёт к исчерпанию памяти. Поддерживается только для одной функции. Поддержка взаимно-рекурсивных функций пока что не реализована.
  • Отсутствует специальный синтаксис (используемый в C#) для финализатора (конструкция «~ИмяКласса()»), как провоцирующий ошибочное понимание у программистов, знакомых с C++. Финализатор описывается как обычный виртуальный метод Finalize(), причём компилятор не обеспечивает автоматический вызов финализатора класса-родителя.
  • Имеется возможность объявления значений используемых по умолчанию в параметрах и синтаксис вызова с явным указанием имён параметров в произвольном порядке.
  • В стандартной библиотеке языка есть три макроса, реализующих условные операторы: if, отличающийся тем, что в нём обязательна ветвь else, when, представляющий собой «if без else», и unless, представляющий собой отрицание when, то есть «when (! условие) выражение». Все условные операторы переписываются соответствующими макросами в оператор match.
  • В параметрах, аргументах и именах переменных допускается использование специального подстановочного символа-заместителя «_». Будучи указанным в начале имени переменной или вместо него (то есть если указан только знак подчеркивания), этот символ подавляет предупреждение компилятора о неиспользованной переменной. Использование подчеркивания вместо имени локальной переменной (например, «_ = f(a, b)») позволяет игнорировать значение вычисления (в тех же целях можно использовать стандартный макрос ignore следующим образом: «ignore(f(a, b))»). C# игнорирует их автоматически, что иногда приводит к ошибкам. Nemerle выдает предупреждение, если результат вычисления не используется в дальнейшем. Приведенный прием позволяет указать компилятору, что игнорирование результата сделано не случайно.
  • Почти все языковые конструкции (кроме using, class и т. д.) определены как имеющие значение и могут быть использованы в качестве элементов выражений. Однако, выражение может иметь тип void, что соответствует statement в C#.
  • В языке поддерживается функциональный тип (обычный для функциональных языков). С его помощью можно по месту описать ссылку на функцию. В C# для передачи ссылок на функции используются делегаты. Nemerle также поддерживает их, но функциональный тип является более удобным, гибким и быстрым решением. Он не требует объявления отдельного типа (как делегат) и не может быть множественным (multicast).
  • В языке поддерживается частичное применение функций и операторов, что позволяет создавать функции «на лету». Например, если в некоторую функцию требуется передать другую функцию (например, функцию сложения), то можно частично применить оператор сложения. Выражение «_ + 2» возвращает функцию с одним целочисленным аргументом, прибавляющую к нему значение 2.

Средства метапрограммирования

Ряд языковых средств кардинальным образом отличает Nemerle от C#, Java, C++. Это макросы и замыкания, причём в виде, более характерном для Lisp или других функциональных языков, нежели для С++. Система макросов позволяет описывать на Nemerle новые синтаксические конструкции и использовать их наравне со встроенными. В действительности, большинство директивных управляющих конструкций, в том числе операторы if, when, циклы всех видов, реализованы в виде макросов стандартной библиотеки Nemerle.

Среда разработки

Кроме большого количества поддерживаемых редакторов типа emacs, vi, итд. Nemerle имеет бесплатную полноценную [rsdn.ru/?article/nemerle/Nemerle.VsIntegration-ru.xml IDE], основанную на Visual Studio 2008 Shell, а также [rsdn.ru/?article/nemerle/Nemerle.VsIntegration-ru.xml может интегрироваться] с полноценной Visual Studio 2008, Visual Studio 2010, Visual Studio 2015. Основные механизмы интеграции с VS вынесены в отдельную сборку, не зависящую от VS, так что желающие могут добавить поддержку Nemerle в другие IDE.

См. также

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

Примечания

  1. [twitter.com/orangy/status/216127804482404352 Твиттер / orangy: We’ve decided to bring Nem]

Ссылки

  • [nemerle.org/ Main Page] (англ.). — домашняя страница проекта. Проверено 10 октября 2006. [www.webcitation.org/65NGeTvOT Архивировано из первоисточника 11 февраля 2012].
  • [code.google.com/p/nemerle/ Project Hosting on Google Code] (англ.). — исходные коды проекта. Проверено 5 февраля 2010. [www.webcitation.org/65NGf8e8W Архивировано из первоисточника 11 февраля 2012].
  • [rsdn.ru/summary/3766.xml Nemerle]. — статьи по Nemerle на rsdn.ru. Проверено 10 октября 2006. [www.webcitation.org/65NGfgKMF Архивировано из первоисточника 11 февраля 2012].
  • [rsdn.ru/forum/?group=nemerle Nemerle]. — форум по Nemerle на русском языке. Проверено 10 октября 2006. [www.webcitation.org/65NGgKuWQ Архивировано из первоисточника 11 февраля 2012].
  • [blog.gmane.org/gmane.comp.lang.nemerle.devel Nemerle]. — конференция по Nemerle на английском языке. Проверено 10 октября 2006. [www.webcitation.org/65NGhAHdJ Архивировано из первоисточника 11 февраля 2012].
  • [groups.google.com/group/nemerle-dev?hl=en Nemerle]. — конференция по Nemerle на английском языке. [www.webcitation.org/65NGiEW8s Архивировано из первоисточника 11 февраля 2012].
  • [nikovs-blog.blogspot.com/2007/02/nemerle.html Nemerle]. — Краткий обзор языка и ссылки. Проверено 10 октября 2006. [www.webcitation.org/65NGiiJMM Архивировано из первоисточника 11 февраля 2012].
  • [www.agpage.ru/articles/nemerle_quick_guide_rus.html Quick Guide по-русски] (рус.). — Перевод "Nemerle. Quick Guide". Проверено 1 мая 2009. [www.webcitation.org/65NGjKrQY Архивировано из первоисточника 11 февраля 2012].
  • [forum.vingrad.ru/topic-112938.html Цикл статей о Nemerle для начинающих]

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


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

На другой день Ростов проводил Денисова, который не хотел более ни одного дня оставаться в Москве. Денисова провожали у цыган все его московские приятели, и он не помнил, как его уложили в сани и как везли первые три станции.
После отъезда Денисова, Ростов, дожидаясь денег, которые не вдруг мог собрать старый граф, провел еще две недели в Москве, не выезжая из дому, и преимущественно в комнате барышень.
Соня была к нему нежнее и преданнее чем прежде. Она, казалось, хотела показать ему, что его проигрыш был подвиг, за который она теперь еще больше любит его; но Николай теперь считал себя недостойным ее.
Он исписал альбомы девочек стихами и нотами, и не простившись ни с кем из своих знакомых, отослав наконец все 43 тысячи и получив росписку Долохова, уехал в конце ноября догонять полк, который уже был в Польше.



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


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