Сравнение C Sharp и Java

Поделись знанием:
(перенаправлено с «Сравнение Java и .NET»)
Перейти к: навигация, поиск
Правильный заголовок этой статьи — Сравнение C# и Java. Он показан некорректно из-за технических ограничений.
Сравнения языков программирования
Общее сравнение
Основной синтаксис
Основные инструкции
Массивы
Ассоциативные массивы
Операции со строками
Строковые функции
List comprehension
Объектно-ориентированное программирование
Объектно-ориентированные конструкторы
Доступ к базам данных
СУБД баз данных
Оценка стратегии
Список программ «hello world»

Влияние ALGOL 58 на ALGOL 60
ALGOL 60: Сравнения с другими языками
Сравнение ALGOL 68 и C++
ALGOL 68: Сравнения с другими языками
Совместимость C и C++
Сравнение Pascal и Borland Delphi
Сравнение Object Pascal и C
Сравнение Pascal и C
Сравнение Java и C++
Сравнение C# и Java
Сравнение C# и Visual Basic .NET

C# и Java — два языка программирования, развивающих язык программирования С++, с синтаксисом, во многом наследующим синтаксис С++, и созданных во многом в условиях конкуренции, и, вследствие этого, обладающих определённым сходством, а также имеющих и ряд различий.





Содержание

Общий взгляд

Языки C# и Java появились в разное время. Язык Java был создан задолго до появления C#. Под названием Oak Java был разработан компанией Sun Microsystems в 1990 г., а в 1995 была выпущена первая бета-версия Java. Создание C# было анонсировано в 2000 году, а в 2002 году вышла первая версия платформы .NET, поддерживающей C#. Таким образом, если Java создавался опираясь в большей степени на опыт языков Objective C и C, то для C# такой опорой являлись C++ и сам Java[1]. И, несмотря на своё название, C# оказался ближе к Java, чем к C++[2][3].

С точки зрения разработчика языки Java и C# очень похожи. Оба языка являются строго типизированными, объектно-ориентированными. Оба вобрали в себя многое из синтаксиса C++, но в отличие от C++, проще в освоении для начинающих. Оба позаимствовали из C набор основных ключевых слов и служебных символов, в том числе фигурные скобки для выделения блоков. Оба языка опираются на сборку мусора. Оба языка сопровождаются богатыми коллекциями библиотек. Но есть в языках также свои особенности и различия, сильные и слабые стороны. C# учёл многие недостатки Java, и исправил их в своей реализации[4]. Но и Java не стоит на месте, развиваясь параллельно с C#.

Кик Рэдек из Microsoft считает С# более сложным языком, чем Java[1]. По его мнению, «язык Java был построен таким образом, чтобы уберечь разработчика от стрельбы себе в ногу» (англ. «Java was built to keep a developer from shooting himself in the foot»), а «С# был построен так, чтобы дать разработчику пистолет, но оставить его на предохранителе» (англ. «C# was built to give the developer a gun but leave the safety turned on»).

Язык

Синтаксис

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

  • обозначения начала/конца блока кода фигурными скобками;
  • обозначения, ассоциативность и приоритет большинства встроенных операций (присвоение, арифметические, логические, побитовые операции, операции инкремента/декремента, тернарная условная операция «?:»);
  • синтаксис описания и использования переменных и функций (порядок «тип имя», использование модификаторов, обязательность скобок для функций, описание формальных параметров);
  • синтаксис всех основных конструкций: условного оператора, циклов, оператора множественного выбора;

Синтаксических различий также достаточно.

Синтаксис Java C#
Импорт статических имён
(import static)
позволяет отдельно импортировать некоторые или все статические методы и переменные класса и использовать их имена без квалификации в импортирующем модуле Начиная с C# 6.0 это было введено (например (using static System.Math)).
Оператор switch Аргумент оператора switch должен относиться либо к целочисленному, либо к перечислимому типу. Начиная с версии Java 7 в операторе switch стало возможно использовать строковые литералы и это различие с C# было устранено[2]. Поддерживаются как константные типы, так и строковые. В отличие от Java, прямого перехода к следующему блоку case нет. Для перехода к следующему блоку case, нужно использовать оператор goto[2].
Оператор перехода goto от использования goto сознательно отказались, однако существует механизм, позволяющий выйти на внешний цикл из вложенного, пометив его меткой и используя операторы break, continue вместе с меткой (continue <метка>;) goto сохранился, его обычное использование — передача управления на разные метки case в операторе switch и выход из вложенного цикла
Константы констант как таковых нет, вместо них используются статические переменные класса с модификатором final — эффект от их использования точно такой же отдельное понятие именованной типизированной константы и ключевое слово const
Точность вычислений с плавающей точкой Java содержит конструкцию strictfp, гарантирующую одинаковые результаты операций с плавающей точкой на всех платформах. C# полагается на реализацию, гарантии строго одинаковых результатов вычислений нет.
Отключение проверок В Java все динамические проверки включаются/выключаются только на уровне пакета C# содержит конструкции checked и unchecked, позволяющие локально включать и выключать динамическую проверку арифметического переполнения.


Механизм работы с динамическими данными и сборка мусора

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

И в Java, и в C# есть сильные и слабые ссылки на объекты. Оба языка поддерживают методы-финализаторы. Из-за неопределённости момента удаления объекта финализаторы не могут использоваться для освобождения системных ресурсов, занятых объектом, что вынуждает создавать дополнительные методы для «очистки» объекта и вызывать их явно.

C# содержит в стандартной библиотеке интерфейс IDisposable и специальную конструкцию using, гарантирующую своевременный вызов метода очистки:

// DisposableClass реализует интерфейс IDisposable и описывает его метод Dispose
class DisposableClass : IDisposable
{
  public void Dispose()
  {
    // ... Здесь освобождаются занятые экземпляром ресурсы
  }
}

using (DisposableClass obj = new DisposableClass(...))
{
  // ... Код, использующий объект obj
}
// ... Здесь для объекта obj гарантированно уже вызван метод Dispose

В Java подобной конструкции нет и очистка объектов может быть выполнена только вручную:

class AnyClass {
  void clear() {
    // ... Здесь находится код очистки 
  }
}

AnyClass obj =  new AnyClass(...);
try {
  // ... код, использующий объект obj
}
finally {
  obj.clear(); // - явный вызов метода очистки объекта по завершении его использования
}

В Java 7 добавлена конструкция «try-with-resources», обеспечивающая автоматическую очистку полностью аналогично C#:

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine(); 
}

При выходе из блока try все объекты, которым присвоено значение в его заголовке (круглых скобках перед блоком операторов), будут очищены. Обязательное условие — классы этих объектов должны реализовывать системный интерфейс java.lang.AutoCloseable.

Java позволяет зарегистрировать слушателя (listener), который будет получать сообщения, когда ссылка подвергается сборке мусора, что даёт улучшение производительности [java.sun.com/j2se/1.5.0/docs/api/java/util/WeakHashMap.html WeakHashMap].

C# (точнее, среда CLR) позволяет отменить выполнение финализатора для данного объекта методом GC.SuppressFinalize(obj) (напр., соединение SQL на файловом потоке). Это бывает полезным, поскольку финализация считается относительно дорогой операцией при сборке мусора, и объект с финализатором «живёт» дольше.

Объектные средства

Оба языка — объектно-ориентированные, с синтаксисом, унаследованным от C++, но значительно переработанным. Код и данные могут описываться только внутри классов.

Инкапсуляция

В Java модификатор protected в описании, помимо доступа из классов-потомков, разрешает доступ из всех классов, входящих в тот же пакет, что и класс-владелец.

В C# для объектов, которые должны быть видны в пределах сборки (примерный аналог пакета Java) введён отдельный модификатор internal (аналог default в Java), а protected сохраняет свой изначальный смысл, взятый из C++ — доступ только из классов-потомков. Допускается комбинировать internal и protected — тогда получится область доступа, соответствующая protected в Java.

Внутренние классы

Оба языка позволяют определить класс внутри класса.

В Java внутренние классы используются для эмуляции замыканий. Внутренние классы Java имеют доступ к нестатическим членам родительского класса, то есть «знают о this»; кроме того, внутри методов можно определять локальные классы, имеющие доступ по чтению к локальным переменным, и безымянные (анонимные) локальные классы, которые фактически позволяют создавать экземпляры объектов и интерфейсов, перекрывающие методы своего класса, непосредственно в месте их использования. На этом механизме в Java-программах может строиться обработка событий (событие генерирует вызов метода, в исходном классе-обработчике являющегося абстрактным; там, где нужен конкретный обработчик события, программист создаёт экземпляр локального анонимного класса — наследника базового класса-обработчика и непосредственно использует его). Таким образом, исчезает необходимость в специальном типе и синтаксической поддержке для событий, но сам код, создающий обработчики, несколько более сложен для понимания. В частности, сложнее становятся области видимости переменных.

В C# есть замыкания и лямбды. Подход C# более напоминает C++: внутренние классы в C# имеют доступ только к статическим членам внешнего класса, а для доступа к нестатическим членам нужно явно указывать экземпляр внешнего класса. Локальные внутренние классы в C# и не поддерживаются.

В Java начиная с 8 версии также появились лямбда-выражения.

Методы

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

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

В Java примитивные типы (byte, int, double, float, bool и пр.) передаются по значению, а для остальных (объектные) по значению передается ссылка на объект.

В C# в дополнение к примитивным типам передаются по значению структуры (struct) (т. н. значимые типы), остальные типы передаются по ссылке (т. н. ссылочные типы). C# также поддерживает явное описание передачи параметров по ссылке (ключевые слова ref и out). При использовании out компилятор контролирует наличие в методе присваивания значения. Использовать их стоит только при работе с неуправляемым кодом, который это требует (например, Winapi), так как это нарушает концепцию ООП.

В C# запрещается давать методам наименование, совпадающее с названием класса, что предотвращает ошибки (в Java программист может определить конструктор, который будет на самом деле являться методом)[4].

Виртуальность методов

C# копирует концепцию виртуальных методов C++: виртуальный метод должен быть явно объявлен с ключевым словом virtual, прочие методы виртуальными не являются. Такое выборочное объявление виртуальных методов введено в C#, так как объявление всех методов виртуальными может сильно замедлить исполнение[5]. Кроме того, C# требует явного объявления о перекрытии виртуального метода в производном классе ключевым словом override. Если требуется скрыть (hide) виртуальный метод, то есть просто ввести новый метод с тем же именем и сигнатурой, требуется указать ключевое слово new (в случае отсутствия которого компилятор выдаёт предупреждение). Запрещается заслонять абстрактные методы. Объявление override-метода с ключевым словом sealed запрещает переопределять (override) этот метод в классах-потомках, однако по-прежнему позволяет скрыть его.

В Java, наоборот, все открытые методы, кроме статических, являются виртуальными, а переопределить метод так, чтобы механизм виртуальности не включился, невозможно. Метод всегда виртуально перекрывает метод базового класса с теми же именем и сигнатурой, если он есть. Ключевое слово final позволяет запретить создание метода с такой же сигнатурой в производных классах.

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

Виртуальность всех методов потенциально небезопасна: если программист по ошибке объявит метод, который уже есть в базовом классе, не имея намерения его перекрывать, а просто не обратив внимания на то, что такой метод уже есть, то новый метод перекроет одноимённый метод в базовом классе, хотя это и не входит в намерения разработчика. В C# подобная ошибка тоже возможна, но компилятор выдаст предупреждение, что перекрывающий метод объявлен без new и override. В Java 5 появился аналогичный механизм — если метод перекрывает виртуальный метод класса-предка, компилятор выдаёт предупреждение; чтобы предупреждение не выдавалось, необходимо отметить перекрывающий метод аннотацией «@Override».

Типы данных

Примитивные типы

Оба языка поддерживают идею примитивных типов (которые в C# являются подмножеством типов-значений — value types), и оба для трансляции примитивных типов в объектные обеспечивают их автоматическую «упаковку» в объекты (boxing) и «распаковку» (unboxing) (в Java — начиная с версии 5). В C# к примитивным типам можно обращаться как к объектам, и это является одной из причин, с которой связывают популярность C#. В Java разделяют примитивные типы и объектные, для обращения к примитивным типам как к объектам применяются классы-обёртки (например для типа int — обёртка Integer), это вызывает недовольство многих разработчиков на Java[6][7].

Примитивных типов в C# больше, чем в Java, за счёт беззнаковых целых типов (unsigned), имеющихся парно ко всем знаковым, и специального типа decimal для высокоточных вычислений с фиксированной запятой (в Java для этого служат классы java.math.BigInteger и java.math.BigDecimal).

В Java отказались от большинства беззнаковых типов ради упрощения языка. Одна из известных проблем с такими типами — сложность определения типа результата арифметических операций над двумя аргументами, один из которых является знаковым, другой — беззнаковым. Независимо от того, какие правила в отношении подобных операций примет язык, в некоторых ситуациях это приведёт к ошибкам (например, в C++ операция над знаковым и беззнаковым значением даёт беззнаковый результат; в итоге на 16-разрядных архитектурах выражение «40000 / (-4)» даст в результате не −10000, а 55536). Однако этот отказ порождает свои проблемы; поскольку значительная часть технических данных, используемых на низком уровне (например, различные служебные данные, передаваемые оборудованием и возвращаемые функциями API операционной системы) имеет именно беззнаковый целый тип, и отсутствие таких типов приводит к необходимости выполнять небезопасные операции конвертации данных, а в ряде случаев — заменять использование простой беззнаковой арифметики неочевидными комбинациями побитовых операций.

Структуры (записи)

C# позволяет создавать пользовательские типы-значения, используя ключевое слово struct. Это прямое наследие языка С++ от которого создатели Java сознательно отказались. В отличие от экземпляров классов, экземпляры типов-значений создаются не в куче, а на стеке вызовов или в составе экземпляра объекта, в котором они объявлены, что в некоторых случаях повышает производительность кода. С точки зрения программиста они подобны классам, но с несколькими ограничениями: у них не может быть явного конструктора без параметров (но может быть конструктор с параметрами), от них нельзя наследовать[8] и они не могут явно наследоваться от других типов (всегда неявно наследуются от класса System.ValueType), но могут реализовывать интерфейсы. Кроме того, значения struct-типов поддерживают логику присваивания значения (то есть присваивание одной переменной значения другой приводит не к копированию ссылки на один и тот же объект, а к копированию значений полей одной структуры в другую). Начиная с версии 1.6, в Java тоже имеется возможность создавать объекты на стеке, но происходит это автоматически без участия пользователя.

В Java для того, чтобы от класса нельзя было наследоваться, его можно объявить финальным final, тем самым получив частичный аналог конструкции struct (копирование по значению при этом поддерживаться не будет всё равно). В C# для тех же целей используется модификатор sealed[9].

Перечислимые типы

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

В Java перечислимые типы являются классами, их значения, соответственно — объектами. Тип-перечисление может иметь методы, реализовывать интерфейсы. Единственные допустимые значения типа — те, что перечислены в объявлении. Для комбинации их вместе как флагов требуется специальный объект набора перечислений. Возможно задавать разные реализации методов для каждого значения.

Массивы и коллекции

Массивы и коллекции тоже получили выражение в синтаксисе обоих языков, благодаря особой разновидности цикла for (цикл по коллекции, известный также как цикл foreach). В обоих языках массив является объектом класса Array, но в Java он не реализует какие-либо интерфейсы коллекций, хотя по массивам возможна итерация циклом for(:). Оба языка имеют в стандартной библиотеке классы типичных коллекций.

В Java могут быть объявлены, строго говоря, только одномерные массивы. Многомерный массив в Java — массив массивов. В C# есть как настоящие многомерные массивы, так и массивы массивов, которые в C# обычно называются «неровными», или «ступенчатыми» (jagged). Многомерные массивы всегда «прямоугольные» (говоря в двумерной терминологии), в то время как массивы массивов могут хранить строки разной длины (опять-таки в двумерном случае, в многомерном аналогично). Многомерные массивы ускоряют доступ к памяти (для них указатель разыменовывается только один раз), а неровные массивы работают медленнее, но экономят память, когда не все строки заполнены. Многомерные массивы требуют для своего создания лишь один вызов оператора new, а ступенчатые требуют явно выделять память в цикле для каждой строки.

Параметризованные (обобщённые) типы

В обоих языках типы могут быть параметризованными, что поддерживает парадигму обобщённого программирования. Синтаксически определение типов достаточно близко — в обоих языках оно унаследовано от шаблонов (templates) C++, хотя и с некоторыми модификациями.

Обобщения типов в Java являются чисто языковой конструкцией и реализованы лишь в компиляторе. Компилятор заменяет все обобщённые типы на их верхние границы и вставляет соответствующее приведение типов в те места, где используется параметризируемый тип. В результате получается байт-код, который не содержит ссылок на обобщённые типы и их параметры. Такая техника реализации обобщённых типов называется затиранием типов (type erasure). Это означает, что информация об исходных обобщённых типах во время выполнения недоступна, и обусловливает некоторые ограничения, такие как невозможность создавать новые экземпляры массивов из аргументов обобщённого типа. Среда выполнения Java не знакома с системой обобщённых типов, вследствие чего новым реализациям JVM понадобились лишь минимальные обновления для работы с новым форматом классов.

C# пошёл другим путём. Поддержка обобщённости была интегрирована в саму виртуальную среду выполнения, впервые появившись в .NET 2.0. Язык здесь стал лишь внешним интерфейсом для доступа к этим возможностям среды. Как и в Java, компилятор производит статическую проверку типов, но в дополнение к этому JIT производит проверку корректности во время загрузки. Информация об обобщённых типах полностью присутствует во время выполнения и позволяет полную поддержку рефлексии обобщённых типов и создание их новых реализаций.

Подход Java требует дополнительных проверок во время выполнения, не гарантирует, что клиент кода будет следовать соответствию типов, и не обеспечивает рефлексии для обобщённых типов. Java не позволяет специализировать обобщённые типы примитивными (это можно сделать только заворачивая примитивные типы в классы), в то время как C# обеспечивает обобщение как для ссылочных типов, так и для типов-значений, включая примитивные. Вместо этого Java предлагает использование завёрнутых примитивных типов в качестве параметров (напр., List<Integer> вместо List<int>), но это даётся ценой дополнительного выделения динамической памяти. Как в Java, так и в C# специализации обобщённого типа на разных ссылочных типах дают одинаковый код[10], но для C# среда выполнения динамически генерирует оптимизированный код при специализации на типах-значениях (например, List<int>), что позволяет их хранить и извлекать из контейнеров без операций за- и разворачивания.

Обработка событий

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

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

Замыкания включены в Java SE 8 [en.wikipedia.org/wiki/Java_version_history#Java_SE_8]. Эти замыкания, как делегаты в C#, имеют полный доступ ко всем локальным переменным в данной области видимости, а не только доступ для чтения к переменным, помеченным словом final (как с анонимными вложенными классами).

Перегрузка операторов

C# включает перегрузку операторов и задаваемое пользователем приведение типов, знакомые программирующим на C++. C# её поддерживает с некоторыми ограничениями, обеспечивающими логическую целостность, что при осторожном использовании помогает сделать код более лаконичным и читаемым. Java не включает перегрузку операций во избежание злоупотреблений ею и для поддержания простоты языка[11][12][13].

Свойства

C# поддерживает концепцию «свойств» — псевдополей класса, к которым обеспечивается полностью контролируемый доступ путём создания методов для извлечения и записи значения поля. Описания свойств производятся с помощью конструкций get и set. В Java отсутствует такая концепция[14] (хотя никаких ограничений, чтобы реализовать её с помощью традиционных методов, нет).

C# также включает так называемые индексаторы, которые можно считать особым случаем перегрузки операций (аналогичным перегрузке operator[] в C++), или параметризованными свойствами. Индексатор — это свойство с именем this[], которое может иметь один или более параметров (индексов), причём индексы могут быть любого типа. Это позволяет создавать классы, экземпляры которых ведут себя подобно массивам / Map:

myList[4] = 5;
string name = xmlNode.Attributes["name"];
orders = customerMap[theCustomer];

Использование свойств не одобряется некоторыми авторитетными программистами. В частности, Джеффри Рихтер пишет:

«Лично мне свойства не нравятся, и я был бы рад, если бы их поддержку убрали из Microsoft .NET Framework и сопутствующих языков программирования. Причина в том, что свойства выглядят как поля, на самом деле являясь методами.»[15]

Согласно общепринятому в C# стилю именования, имена свойств визуально отличаются от полей тем, что начинаются с прописной буквы.

Условная компиляция

C#, в отличие от Java, поддерживает условную компиляцию с использованием директив препроцессора. В нём также есть атрибут Conditional, означающий, что указанный метод вызывается только тогда, когда определена данная константа компиляции. Таким путём можно вставлять в код, например, проверки допущений (assertion checks), которые будут работать только в отладочной версии, когда определена константа DEBUG. В стандартной библиотеке .NET таков метод Debug.Assert().

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

Пространства имён, сборки, пакеты

Внешние модули в Java и в C# подключаются сходным образом. В Java используется ключевое слово import, в С# — using. Пример[16]:

// Пример на Java
import java.lang.System;
public class GlobalGreeting2 {
   public static void main(String args[]) {
      System.out.println("Zdravo, zemjata!");
   }
}
// Пример на C#
using System;
class GlobalGreeting2 {
   static void Main(string[] args) {
      Console.WriteLine("Salut, monde!");
   }
}

Существенным отличием между import в Java и using в C# является то, что C# использует концепцию пространств имён (namespace), напоминающую одноимённый механизм C++[16]. В Java используется концепция пакетов. Пространства имён никак не связаны с компилированными модулями (сборками, или assembly в терминологии Microsoft). Несколько сборок могут содержать одно и то же пространство имён, в одной сборке может объявляться несколько пространств имён, не обязательно вложенных. Модификаторы области видимости C# никак не связаны с пространствами имён. В Java же объявленные в одном пакете классы по умолчанию образуют единый компилированный модуль. Модификатор области видимости по умолчанию (отсутствие явного указания) ограничивает область видимости полей и методов класса пределами пакета.

В Java структура файлов и каталогов исходных текстов пакета по умолчанию связана со структурой пакета — пакету соответствует каталог, входящим в него подпакетам — подкаталоги этого каталога, файлы исходных текстов располагаются в каталогах, соответствующих пакету или подпакету, в который они входят. Таким образом, дерево исходных текстов повторяет структуру пакета. В C# местонахождение файла с исходным текстом никак не связано с его пространством имён.

Ни один из вариантов не обладает значительным превосходством в мощности, просто используются разные механизмы для разрешения неоднозначностей[16].

Расположение исходного текста в файлах

В C# классы могут располагаться в файлах произвольным образом. Имя файла исходного кода никак не связано с именами определяемых в нём классов. Допускается расположить в одном файле несколько общедоступных (public) классов. Начиная с версии 2.0, C# позволяет также разбить класс на два и более файла (ключевое слово partial). Последняя особенность сделана для разделения кода, который пишется человеком, и генерируемого кода. Она используется, например, визуальными средствами построения интерфейса: часть класса, в которой находятся поля и методы, управляемые конструктором интерфейса, выделяются в отдельный файл.

В Java каждый файл может содержать только один общедоступный (public) класс, причём Java требует, чтобы имя файла совпадало с именем этого класса, что исключает путаницу в именах файлов и классов. Более того, согласно рекомендуемому Sun соглашению об оформлении кода, размер файла исходного кода не должен превышать 2000 строк кода, поскольку в файле большего размера труднее разбираться. Большой размер файла также считается признаком плохого проектирования.

Исключения

Оба языка поддерживают механизм обработки исключений, синтаксически оформленный совершенно одинаково: в языке имеется оператор генерации исключения throw и блок обработки исключений try{}catch(){}finally{}, обеспечивающий перехват возникших внутри блока исключений, их обработку, а также гарантированное выполнение завершающих действий.

Java поддерживает проверяемые (checked) исключения: программист должен явно указать для каждого метода типы исключений, которые метод может выбросить, эти типы перечисляют в объявлении метода после ключевого слова throws. Если метод использует методы, выбрасывающие проверяемые исключения, он должен либо явно перехватывать все эти исключения, либо содержать их в собственном описании. Таким образом, код явно содержит перечень исключений, которые могут быть выброшены каждым методом. Иерархия типов исключений содержит также два типа (RuntimeException и Error), наследники которых не являются проверяемыми и не должны описываться. Они выделены для исключений времени выполнения, которые могут возникнуть в любом месте, либо обычно не могут быть обработаны программистом (например, ошибки среды исполнения), и не должны указываться в объявлении throws.

C# проверяемые исключения не поддерживает. Их отсутствие является сознательным выбором разработчиков. Андерс Хейлсберг, главный архитектор C#, считает, что в Java они были в какой-то степени экспериментом и себя не оправдали [www.artima.com/intv/handcuffs.html].

Вопрос о пользе проверяемых исключений дискуссионный. Подробнее см. статью Обработка исключений.

Параллельное программирование

В целом механизмы параллельного программирования в C# аналогичны тем, что предоставляет Java, различие состоит в деталях реализации. В обоих случаях имеется библиотечный класс Thread, реализующий понятие «потока». Java предоставляет два способа создания собственных потоков: либо путём расширения класса Thread, либо путём реализации интерфейса Runnable. В обоих случаях программист должен определить наследуемый (входящий в интерфейс) метод run(), содержащий тело потока — код, который будет в нём выполняться. C# вместо этого использует механизм делегатов: для создания потока создаётся экземпляр стандартного класса Thread, которому передаётся в виде параметра конструктора делегат, содержащий метод — тело потока.

В обоих языках есть возможность создать синхронно исполняемый блок кода; в Java это делается с помощью оператора synchronized(), в C# — оператором lock(). В Java имеется также возможность объявлять синхронные методы, используя модификатор synchronized в заголовке описания метода. Такие методы при исполнении блокируют свой объект-хозяин (таким образом, из синхронизированных методов класса, для одного и того же экземпляра, одновременно может выполняться только один и только в одном треде, остальные будут ждать). Аналогичная возможность в .NET реализуется с помощью атрибута реализации метода MethodImplAttribute MethodImplOptions.Synhronized, но, в отличие от Java, эта возможность формально не является частью языка C#.

В С# есть оператор lock(){} [msdn.microsoft.com/en-us/library/vstudio/c5kehkcz.aspx], захватывающий блокировку перед входом в блок и освобождающий её как при выходе, так и при выбросе исключения. Аналог в Java - synchronized () {}.

В C# 5.0 появились операторы async и await а также новый класс Task, призванный заменить Thread.

В обоих языках доступны также идентичные средства синхронизации, основанные на отправке и ожидании сигнала от одного потока к другому (другим). В Java это методы notify(), notifyAll() и wait(), в C# — методы Pulse(), PulseAll(), Wait() (тройки методов функционально попарно аналогичны). Различие состоит лишь в том, что в Java эти методы (и, соответственно, функциональность монитора) реализуется в классе Object, поэтому для синхронизации не требуется никаких дополнительных библиотек, а в C# эти методы реализованы как статические в отдельном библиотечном классе Monitor. В C# стандартная библиотека содержит также несколько дополнительных примитивов синхронизации параллельного исполнения потоков: мьютексы, семафоры, синхронизирующие таймеры. С версии 1.5 в JDK SE включены пакеты java.util.concurrent, java.util.concurrent.atomic и java.util.concurrent.locks содержащие исчерпывающий набор средств для реализации параллельных вычислений.

Низкоуровневый код

Java Native Interface (JNI) позволяет программам вызывать из Java низкоуровневые, системно-зависимые функции (например, библиотек winAPI). Как правило, JNI используется при написании драйверов. При написании JNI-библиотек разработчик должен использовать специальный API, предоставляемый бесплатно. Выпускаются также специализированные библиотеки для взаимодействия Java с COM.

Технология Platform Invoke (P/Invoke), реализованная в .NET, позволяет вызывать из C# внешний код, который Microsoft называет неуправляемым. Через атрибуты в метаданных программист может точно управлять передачей (маршалингом) параметров и результатов, избегая таким образом необходимости дополнительного кода адаптации. P/Invoke предоставляет почти полный доступ к процедурным API (таким, как Win32 или POSIX), но не даёт прямого доступа к библиотекам классов C++.

.NET Framework предоставляет также мост между .NET и COM, позволяя обращаться к COM-компонентам так, как если бы они были родными объектами .NET, что требует дополнительных усилий программиста при использовании COM-компонент со сложными нетривиальными интерфейсами (например, в случае передачи структуры через массив байтов). В этих случаях приходится прибегать к unsafe коду (см. ниже) или другим обходным путям.

C# разрешает ограниченное использование указателей, которые проектировщики языков зачастую считают опасными. Подход C# в этом деле — требование ключевого слова unsafe при блоках кода или методах, использующих эту возможность. Это ключевое слово предупреждает пользователей такого кода о его потенциальной опасности. Оно также требует явного задания компилятору опции /unsafe, которая по умолчанию выключена. Такой «небезопасный» код используется для улучшения взаимодействия с неуправляемым API и иногда для повышения эффективности определённых участков кода.

C# также позволяет программисту отключить нормальную проверку типов и другие возможности безопасности CLR, разрешая использование переменных-указателей при условии применения ключевого слова unsafe. JNI, P/Invoke и unsafe-код одинаковоК:Википедия:Статьи без источников (тип: не указан)[источник не указан 5450 дней] рискованны, чреваты дырами в безопасности системы и нестабильностью приложения. Преимуществом управляемого unsafe-кода над P/Invoke или JNI является то, что он позволяет программисту продолжать работать в знакомой среде C# для выполнения задач, которые при других методах потребовали бы вызова неуправляемого кода, написанного на другом языке.

Реализации

JVM и CLR

Существуют многочисленные реализации JVM практически для всех присутствующих на рынке платформ. Разработкой JVM занимаются такие корпорации, как IBM, Sun Microsystems (с 2010 года Oracle), Bea и ряд других. Следует отметить, что Sun(Oracle) выпускает свою JVM как под своей собственной лицензией [www.java.com/en/download/license.jsp], так и под модифицированной (посредством т. н. «Classpath exception») лицензией GPLv2 [www.sun.com/software/opensource/java/faq.jsp#b3].

Java Web Start и апплеты обеспечивают удобное, лёгкое и безопасное средство распространения настольных приложений, причём эффективность её байткодового представления совместно с агрессивными технологиями сжатия, такими как pack200, делают Java средством распространения сетевых приложений, неприхотливым к полосе пропускания.

C# тоже является кроссплатформенным стандартом. Его первичная платформа — Windows, но существуют и реализации для других платформ, самая значительная из которых — проект Mono. Однако платформы, отличные от Windows, не поддерживаются официальным производителем.

Технология ClickOnce предлагает функциональность, подобную Java Web Start, но она имеется только для клиентов Windows. Internet Explorer на Windows умеет показывать элементы интерфейса .NET Windows Forms, что даёт апплетоподобную функциональность, но ограничено конкретным браузером.

Стандартизация

Развитие этих двух языков, и также их API, двоичных форматов и сред выполнения управляется по-разному.

C# определён стандартами ECMA и ISO, которые задают синтаксис языка, формат выполнимых модулей (известный как CLI) и библиотеку базовых классов (Base Class Library, или BCL). Стандарты не включают многие новые библиотеки, реализованные Microsoft поверх стандартного каркаса, такие как библиотеки для баз данных, GUI и веб-приложений (Windows Forms, ASP.NET и ADO.NET). Однако Microsoft формально согласилась не преследовать в судебном порядке проекты сообщества за реализацию этих библиотек [www.linux-watch.com/news/NS2912974320.html].

На сегодняшний день никакая составная часть среды Java не стандартизуется Ecma, ISO, ANSI или какой-либо другой сторонней организацией стандартов. В то время как Sun Microsystems сохраняет неограниченные исключительные юридические права на модификацию и лицензирование своих торговых марок Java, Sun добровольно участвует в процессе, называемом Java Community Process (JCP), который позволяет заинтересованным сторонам предлагать изменения в любые Java-технологии Sun (язык, инструментарий, API) через консультации и экспертные группы. По правилам JCP, любое предложение по изменению в JDK, среде выполнения Java или спецификации языка Java может быть односторонне отвергнуто Sun, потому что для его одобрения требуется голос «за» со стороны Sun. От коммерческих участников JCP требует членских взносов, в то время как некоммерческие организации и частные лица могут участвовать в нём бесплатно.

Лицензия

В то время как «Java» — торговая марка Sun, и только Sun может лицензировать имя «Java», существуют многочисленные свободные проекты, частично совместимые с Sun Java. Например, GNU Classpath и GNU Compiler for Java (GCJ) поставляют свободную библиотеку классов и компилятор, частично совместимые с текущей версией Sun Java[17]. В конце 2006 года Sun объявила, что весь исходный код Java, за исключением закрытого кода, на который они не сохраняют права, будет выпущен к марту 2007 года в качестве свободного программного обеспечения под видоизменённой лицензией GPL[18]. Sun в настоящее время распространяет свою HotSpot Virtual Machine и компилятор Java под лицензией GPL, но на стандартную среду выполнения Java сейчас нет свободной лицензии[19][20]. Поскольку Sun сохранит право собственности на свой исходный код Java, выпуск под лицензией GPL не запретит Sun распространять несвободные или неоткрытые версии Java, или давать на это лицензии другим[21].

C#, среда CLR и большая часть соответствующей библиотеки классов стандартизированы и могут свободно реализовываться без лицензии. Уже реализовано несколько свободных систем C#, в том числе Mono и DotGNU. В проекте Mono также реализованы многие нестандартные библиотеки Microsoft путём изучения материалов Microsoft, аналогично GNU Classpath и Java. Целью проекта Mono является избежать посягательств на какие-либо патенты или копирайты, и проект может свободно распространяться и использоваться под лицензией GPL[22]. Microsoft в настоящее время распространяет Shared source-версию своей среды выполнения .NET для некоммерческого использования[23].

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

Запуск программ

Интерпретаторы Java могут устанавливаться копированием файлов и работают без ограничений на Windows как минимум с Windows 2000. Официальный C# фреймворк должен быть установлен в систему от администратора, определенные версии языка могут требовать определённую версию Windows.

Java построена на более открытой культуре с высокой конкурентностью фирм в различных областях функциональности. Большинство дополнительных библиотек доступно под свободными лицензиями с открытым исходным кодом. Также Sun приветствует практику описания какой-либо функциональности в виде спецификации (см. процесс JCP), оставляя реализацию сторонним разработчикам (возможно, предоставляя эталонную реализацию). Таким образом, решается вопрос независимости от производителя ПО.

Несмотря на существование Mono, C# тесно привязывает разработчиков к платформе Microsoft (включая ОС, офисные решения). Таким образом, пользователь программного обеспечения, написанного на .NET, часто не имеет выбора в использовании различных компонент системы. Это приводит к так называемому vendor-locking, при котором производитель стороннего ПО может диктовать покупателю практически любые условия на поддержку внедрённого проекта. В то время, как пользователь приложения Java, как правило, может сам выбрать поставщика дополнительного ПО (такого, как БД, ОС, сервера приложений и т. д.).

Популярность и развитие

Java старше, чем C# и построена на большой и активной пользовательской базе, став lingua franca во многих современных областях информатики, особенно таких, где задействованы сети. Java доминирует в курсах программирования американских университетов и колледжей, и литературы по Java сегодня намного больше, чем по C#. Зрелость и популярность Java привели к большему числу библиотек и API на Java (многие из которых открытые), чем на C#.

В отличие от Java, C# — язык относительно новый. Microsoft изучила существующие языки, такие как Java, Delphi и Visual Basic, и изменила некоторые аспекты языка для лучшего соответствия нуждам некоторых типов приложений.

В отношении Java можно услышать критику, что этот язык медленно развивается, в нём не хватает некоторых возможностей, которые облегчают модные шаблоны программирования и методологии. Язык C# критикуют в том, что его разработчики, возможно, слишком спешат угодить сиюминутным течениям в программировании ценой фокусировки и простоты языка. Очевидно, проектировщики Java заняли более консервативную позицию по добавлению крупных новых возможностей в синтаксис языка, чем в других современных языках — возможно, не желая привязать язык к течениям, которые в долгосрочной перспективе могут завести в тупик. С выпуском Java 5.0 эта тенденция во многом была нарушена, так как в ней ввели несколько крупных новых возможностей языка: цикл типа foreach, автоматическое заворачивание, методы с переменным числом параметров, перечислимые типы, обобщённые типы и аннотации (все они присутствуют и в C#).

C#, в свою очередь, развивается быстрее, гораздо слабее ограничивая себя в добавлении новых проблемно-ориентированных возможностей. Особенно эта тенденция проявилась в версии C# 3.0, в которой, например, появились SQL-подобные запросы. (Новые возможности при этом строятся так, чтобы язык оставался языком общего назначения. Подробнее о C# 3.0 см в статье о C#). Проблемно-ориентированные дополнения к Java рассматривались, но, по крайней мере на сегодняшний день, были отвергнуты.

Рынок

С момента появления C# он постоянно сравнивается с Java. Невозможно отрицать, что C# и его управляемая среда CLR многим обязаны Java и её JRE (Java Runtime Environment).

Можно спорить, является ли разработка C# в какой-то степени результатом признания Майкрософтом того, что среда управляемого кода, где лидирует Java, имеет множество достоинств в растущем сетевом мире, особенно при появлении интернета на устройствах, отличных от персональных компьютеров, и при растущей важности сетевой безопасности. До создания C# Microsoft модифицировала Java (создав J++), с тем чтобы добавить возможности, работающие только на ОС Windows, нарушив таким образом лицензионное соглашение Sun Microsystems. Пока Microsoft находилась на второй фазе своей бизнес-стратегии, известной как «Embrace, Extend, and Extinguish», развитие J++ было остановлено иском, поданным Sun’ом. Будучи лишённой возможности разрабатывать клон Java с нужными ей свойствами, Microsoft создала альтернативу, которая больше соответствовала их потребностям и видению будущего.

Несмотря на такое беспокойное начало, становится всё более очевидным, что два языка редко конкурируют друг с другом на рынке. Java доминирует в мобильном секторе и имеет много приверженцев на рынке веб-приложений. C# получил хорошее признание на рынке настольных приложений Windows и благодаря ASP.NET, C# также является игроком и на рынке веб-приложений.

Настольные приложения

Для обоих языков имеется набор библиотек, предоставляющих возможности построения интерфейса пользователя для настольных приложений. В случае Java это мультиплатформенные библиотеки Swing и SWT, а также платформа JavaFX, позволяющая создавать RIA-приложения. В принципе, любая из них позволяет создавать кроссплатформенные настольные приложения на Java.

Для C# на платформе Windows основными платформами для разработки настольных графических приложений являются платформы Windows Forms и WPF. Для разработки под Windows 8 существует специальная платформа WinRT. Для прочих платформ используется библиотека gtk#, выполненная в рамках проекта Mono. Попытки свободной реализации Windows.Forms предпринимались и предпринимаются (например, в проекте DotGNU), однако они, в силу закрытости оригинала, неизбежно страдают вторичностью и неполнотой, вряд ли могут конкурировать с реализацией от Microsoft и потому могут применяться разве что для запаздывающего портирования Windows-приложений на другие платформы. Разработки, изначально базирующиеся на Windows, строятся обычно на Windows.Forms, и их перенос на другую платформу становится затруднительным. Разработки на C# в среде Mono, использующие gtk#, переносимы, но их существенно меньше. Реализация платформы WPF в рамках проекта Mono отсутствует, поэтому WPF приложения не обладают переносимостью на операционные системы на основе Linux.

C#, наравне с Java, постепенно становится популярным на нескольких операционных системах на основе Linux и BSD[24][25][26]. Реализация проекта Mono была юридически безболезненным процессом, поскольку CLR и язык C# стандартизированы Ecma и ISO, и любой может их реализовывать, не беспокоясь о правовой стороне дела[27]. В то же время, следует отметить, что приложение, написанное под средой Windows, может иметь значительные проблемы запуска под другой ОС.

Серверные приложения

На этой арене, возможно, два языка наиболее близки к тому, чтобы считаться конкурентами. Java с её платформой J2EE (Java(2) Enterprise Edition) и C# с его ASP.NET соперничают в области создания динамического веб-контента и приложений.

На этом рынке широко используются и поддерживаются оба языка, вместе с комплектом инструментов и сопровождающих продуктов, имеющихся для JavaEE и .NET.

Мобильные приложения

J2ME (JavaME, Java(2) Micro Edition) имеет очень широкую базу на рынках мобильных телефонов и КПК, где только самые дешёвые устройства лишены KVM (урезанная Java Virtual Machine для устройств с ограниченными ресурсами). Программы на Java, включая множество игр, встречаются повсеместно.

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

Java используется для разработки приложений для Android, использующей нестандартную виртуальную машину Dalvik (или ART).

С# является основным языком для написания приложений для мобильной операционной системы Windows Phone, разрабатываемой Microsoft.

Передовые технологии

К:Википедия:Статьи без источников (тип: не указан)

Java принята в качестве официального программного средства для использования в следующем поколении стандарта DVD, Blu-ray, через интерактивную платформу BD-J (англ.). Это значит, что такое интерактивное содержимое, как меню, игры, скачивания и т. д., на всех дисках DVD Blu-ray будет создаваться на платформе Java[28].

См. также

Напишите отзыв о статье "Сравнение C Sharp и Java"

Примечания

  1. 1 2 Radeck, Kirk [msdn.microsoft.com/en-us/library/ms836794.aspx C# and Java: Comparing Programming Languages] (англ.). MSDN (October 2003). Проверено 19 ноября 2013.
  2. 1 2 3 Kurniawan, Budi [www.windowsdevcenter.com/lpt/a/889 Comparing C# and Java] (англ.). O’Reilly Media (06/07/2001). Проверено 18 ноября 2013.
  3. Chandra, Shyamal Suhana; Chandra, Kailash [dl.acm.org/citation.cfm?id=1040228 A comparison of Java and C#] // Journal of Computing Sciences in Colleges. — Consortium for Computing Sciences in Colleges, 2005. — Вып. 20. — № 3. — С. 238-254. — ISSN [www.sigla.ru/table.jsp?f=8&t=3&v0=1937-4771&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 1937-4771].
  4. 1 2 Gruntz, Dominik [www.jot.fm/issues/issue_2002_11/article4/ C# and Java: The Smart Distinctions] (англ.) // Journal of Object Technology. — 2002. — Fasc. November-December. — No. vol. 1, no. 5. — P. 163-176.
  5. Rowe, 2004, pp. 204-206.
  6. Johnson, Mark [www.javaworld.com/cgi-bin/mailto/x_java.cgi?pagetosend=/export/home/httpd/javaworld/javaworld/jw-12-2000/jw-1221-csharp2.html&pagename=/javaworld/jw-12-2000/jw-1221-csharp2.html&pageurl=www.javaworld.com/javaworld/jw-12-2000/jw-1221-csharp2.html&site=jw_core C#: A language alternative or just J--?, Part 2] (англ.). JavaWorld (21.12.2000). Проверено 18 ноября 2013.
  7. Krikorian, Raffi [www.windowsdevcenter.com/lpt/a/929 Contrasting C# and Java Syntax] (англ.). O’Reilly Media (06/14/2001). Проверено 19 ноября 2013.
  8. Хотя сама среда исполнения позволяет порождать и инстанцировать типы, производные от наследников System.ValueType.
  9. [msdn.microsoft.com/ru-ru/library/88c54tsw.aspx sealed (Справочник по C#)]
  10.  (англ.)[www.artima.com/intv/genericsP.html Generics in C#, Java, and C++]
  11. [www.cafeaulait.org/1998august.html August 1998 Java News]
  12. Cabrera, 2002, pp. 30-32.
  13. Puvvala, 2003, pp. 62-63.
  14. Balagurusamy, 2008, p. 8.
  15. Джеффри Рихтер CLR via C#//М., Издательство «Русская редакция», 2007 — С.656. ISBN 978-5-91180-303-2
  16. 1 2 3 Johnson, Mark [www.javaworld.com/cgi-bin/mailto/x_java.cgi?pagetosend=/export/home/httpd/javaworld/jw-11-2000/jw-1122-csharp1.html&pagename=/jw-11-2000/jw-1122-csharp1.html&pageurl=www.javaworld.com/jw-11-2000/jw-1122-csharp1.html&site=jw_core C#: A language alternative or just J--?, Part 1] (англ.). JavaWorld (22.11.2000). Проверено 18 ноября 2013.
  17.  (англ.)[www.kaffe.org/~stuart/japi/htmlout/h-jdk15-classpath Результаты сравнения jdk15 и classpath]
  18. [www.sun.com/software/opensource/java/project_overview.jsp Related Technologies | Oracle]
  19. [openjdk.dev.java.net/ Sun openjdk: Home]
  20. [java.sun.com/j2se/1.4.2/j2re-1_4_2_13-license.txt Sun Java 2 Runtime License Agreement]
  21. [www.gnu.org/copyleft/gpl.html GNU General Public License — GNU Project — Free Software Foundation (FSF)]
  22. [www.mono-project.com/FAQ:_Licensing#Patents Mono FAQ: Licensing (Patents)]
  23. [msdn.microsoft.com/msdnmag/issues/02/07/SharedSourceCLI/ Rotor: Shared Source CLI Provides Source Code for a FreeBSD Implementation of .NET]
  24. [news.zdnet.co.uk/software/0,1000000121,39246774,00.htm Fedora embraces Mono — ZDNet UK]
  25. [packages.debian.org/unstable/interpreters/mono Debian — mono]
  26. [www.osnews.com/story.php?news_id=10714 Wikipedia Uses Mono; Mono Integrated into Ubuntu/Debian — OSNews.com]
  27. [isotc.iso.org/livelink/livelink/fetch/2000/2122/3770791/customview.html?func=ll&objId=3770791&objAction=browse ISO Standards Development:ISOTC home:00. ISO standards and patents]
  28. [java.sun.com/developer/technicalArticles/javame/bluray/ Blu-ray Disc Application Development with Java ME]

Литература

Ссылки

  • [cse.spsu.edu/jchastin/ Jeff Chastine, Ph.D.] [cse.spsu.edu/jchastin/Transitioning/ Transitioning between Java and C#] (англ.). Southern Polytechnic State University. Проверено 18 ноября 2013.
  • Jeff Cogswell. [slashdot.org/topic/cloud/java-vs-c-which-performs-better-in-the-real-world/ Java vs. C#: Which Performs Better in the ‘Real World’?] (англ.). Slashdot (17 January 2013). Проверено 18 ноября 2013.
  • Christopher W. Cowell-Shah [www.osnews.com/story/5602 Nine Language Performance Round-up: Benchmarking Math & File I/O] (англ.). OSnews (8 January 2004). Проверено 18 ноября 2013.

Отрывок, характеризующий Сравнение C Sharp и Java

Ростов жил, попрежнему, с Денисовым, и дружеская связь их, со времени их отпуска, стала еще теснее. Денисов никогда не говорил про домашних Ростова, но по нежной дружбе, которую командир оказывал своему офицеру, Ростов чувствовал, что несчастная любовь старого гусара к Наташе участвовала в этом усилении дружбы. Денисов видимо старался как можно реже подвергать Ростова опасностям, берег его и после дела особенно радостно встречал его целым и невредимым. На одной из своих командировок Ростов нашел в заброшенной разоренной деревне, куда он приехал за провиантом, семейство старика поляка и его дочери, с грудным ребенком. Они были раздеты, голодны, и не могли уйти, и не имели средств выехать. Ростов привез их в свою стоянку, поместил в своей квартире, и несколько недель, пока старик оправлялся, содержал их. Товарищ Ростова, разговорившись о женщинах, стал смеяться Ростову, говоря, что он всех хитрее, и что ему бы не грех познакомить товарищей с спасенной им хорошенькой полькой. Ростов принял шутку за оскорбление и, вспыхнув, наговорил офицеру таких неприятных вещей, что Денисов с трудом мог удержать обоих от дуэли. Когда офицер ушел и Денисов, сам не знавший отношений Ростова к польке, стал упрекать его за вспыльчивость, Ростов сказал ему:
– Как же ты хочешь… Она мне, как сестра, и я не могу тебе описать, как это обидно мне было… потому что… ну, оттого…
Денисов ударил его по плечу, и быстро стал ходить по комнате, не глядя на Ростова, что он делывал в минуты душевного волнения.
– Экая дуг'ацкая ваша пог'ода Г'остовская, – проговорил он, и Ростов заметил слезы на глазах Денисова.


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


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


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


Вернувшись в полк и передав командиру, в каком положении находилось дело Денисова, Ростов с письмом к государю поехал в Тильзит.
13 го июня, французский и русский императоры съехались в Тильзите. Борис Друбецкой просил важное лицо, при котором он состоял, о том, чтобы быть причислену к свите, назначенной состоять в Тильзите.
– Je voudrais voir le grand homme, [Я желал бы видеть великого человека,] – сказал он, говоря про Наполеона, которого он до сих пор всегда, как и все, называл Буонапарте.
– Vous parlez de Buonaparte? [Вы говорите про Буонапарта?] – сказал ему улыбаясь генерал.
Борис вопросительно посмотрел на своего генерала и тотчас же понял, что это было шуточное испытание.
– Mon prince, je parle de l'empereur Napoleon, [Князь, я говорю об императоре Наполеоне,] – отвечал он. Генерал с улыбкой потрепал его по плечу.
– Ты далеко пойдешь, – сказал он ему и взял с собою.
Борис в числе немногих был на Немане в день свидания императоров; он видел плоты с вензелями, проезд Наполеона по тому берегу мимо французской гвардии, видел задумчивое лицо императора Александра, в то время как он молча сидел в корчме на берегу Немана, ожидая прибытия Наполеона; видел, как оба императора сели в лодки и как Наполеон, приставши прежде к плоту, быстрыми шагами пошел вперед и, встречая Александра, подал ему руку, и как оба скрылись в павильоне. Со времени своего вступления в высшие миры, Борис сделал себе привычку внимательно наблюдать то, что происходило вокруг него и записывать. Во время свидания в Тильзите он расспрашивал об именах тех лиц, которые приехали с Наполеоном, о мундирах, которые были на них надеты, и внимательно прислушивался к словам, которые были сказаны важными лицами. В то самое время, как императоры вошли в павильон, он посмотрел на часы и не забыл посмотреть опять в то время, когда Александр вышел из павильона. Свидание продолжалось час и пятьдесят три минуты: он так и записал это в тот вечер в числе других фактов, которые, он полагал, имели историческое значение. Так как свита императора была очень небольшая, то для человека, дорожащего успехом по службе, находиться в Тильзите во время свидания императоров было делом очень важным, и Борис, попав в Тильзит, чувствовал, что с этого времени положение его совершенно утвердилось. Его не только знали, но к нему пригляделись и привыкли. Два раза он исполнял поручения к самому государю, так что государь знал его в лицо, и все приближенные не только не дичились его, как прежде, считая за новое лицо, но удивились бы, ежели бы его не было.
Борис жил с другим адъютантом, польским графом Жилинским. Жилинский, воспитанный в Париже поляк, был богат, страстно любил французов, и почти каждый день во время пребывания в Тильзите, к Жилинскому и Борису собирались на обеды и завтраки французские офицеры из гвардии и главного французского штаба.
24 го июня вечером, граф Жилинский, сожитель Бориса, устроил для своих знакомых французов ужин. На ужине этом был почетный гость, один адъютант Наполеона, несколько офицеров французской гвардии и молодой мальчик старой аристократической французской фамилии, паж Наполеона. В этот самый день Ростов, пользуясь темнотой, чтобы не быть узнанным, в статском платье, приехал в Тильзит и вошел в квартиру Жилинского и Бориса.
В Ростове, также как и во всей армии, из которой он приехал, еще далеко не совершился в отношении Наполеона и французов, из врагов сделавшихся друзьями, тот переворот, который произошел в главной квартире и в Борисе. Все еще продолжали в армии испытывать прежнее смешанное чувство злобы, презрения и страха к Бонапарте и французам. Еще недавно Ростов, разговаривая с Платовским казачьим офицером, спорил о том, что ежели бы Наполеон был взят в плен, с ним обратились бы не как с государем, а как с преступником. Еще недавно на дороге, встретившись с французским раненым полковником, Ростов разгорячился, доказывая ему, что не может быть мира между законным государем и преступником Бонапарте. Поэтому Ростова странно поразил в квартире Бориса вид французских офицеров в тех самых мундирах, на которые он привык совсем иначе смотреть из фланкерской цепи. Как только он увидал высунувшегося из двери французского офицера, это чувство войны, враждебности, которое он всегда испытывал при виде неприятеля, вдруг обхватило его. Он остановился на пороге и по русски спросил, тут ли живет Друбецкой. Борис, заслышав чужой голос в передней, вышел к нему навстречу. Лицо его в первую минуту, когда он узнал Ростова, выразило досаду.
– Ах это ты, очень рад, очень рад тебя видеть, – сказал он однако, улыбаясь и подвигаясь к нему. Но Ростов заметил первое его движение.
– Я не во время кажется, – сказал он, – я бы не приехал, но мне дело есть, – сказал он холодно…
– Нет, я только удивляюсь, как ты из полка приехал. – «Dans un moment je suis a vous», [Сию минуту я к твоим услугам,] – обратился он на голос звавшего его.
– Я вижу, что я не во время, – повторил Ростов.
Выражение досады уже исчезло на лице Бориса; видимо обдумав и решив, что ему делать, он с особенным спокойствием взял его за обе руки и повел в соседнюю комнату. Глаза Бориса, спокойно и твердо глядевшие на Ростова, были как будто застланы чем то, как будто какая то заслонка – синие очки общежития – были надеты на них. Так казалось Ростову.
– Ах полно, пожалуйста, можешь ли ты быть не во время, – сказал Борис. – Борис ввел его в комнату, где был накрыт ужин, познакомил с гостями, назвав его и объяснив, что он был не статский, но гусарский офицер, его старый приятель. – Граф Жилинский, le comte N.N., le capitaine S.S., [граф Н.Н., капитан С.С.] – называл он гостей. Ростов нахмуренно глядел на французов, неохотно раскланивался и молчал.
Жилинский, видимо, не радостно принял это новое русское лицо в свой кружок и ничего не сказал Ростову. Борис, казалось, не замечал происшедшего стеснения от нового лица и с тем же приятным спокойствием и застланностью в глазах, с которыми он встретил Ростова, старался оживить разговор. Один из французов обратился с обыкновенной французской учтивостью к упорно молчавшему Ростову и сказал ему, что вероятно для того, чтобы увидать императора, он приехал в Тильзит.
– Нет, у меня есть дело, – коротко ответил Ростов.
Ростов сделался не в духе тотчас же после того, как он заметил неудовольствие на лице Бориса, и, как всегда бывает с людьми, которые не в духе, ему казалось, что все неприязненно смотрят на него и что всем он мешает. И действительно он мешал всем и один оставался вне вновь завязавшегося общего разговора. «И зачем он сидит тут?» говорили взгляды, которые бросали на него гости. Он встал и подошел к Борису.
– Однако я тебя стесняю, – сказал он ему тихо, – пойдем, поговорим о деле, и я уйду.
– Да нет, нисколько, сказал Борис. А ежели ты устал, пойдем в мою комнатку и ложись отдохни.
– И в самом деле…
Они вошли в маленькую комнатку, где спал Борис. Ростов, не садясь, тотчас же с раздраженьем – как будто Борис был в чем нибудь виноват перед ним – начал ему рассказывать дело Денисова, спрашивая, хочет ли и может ли он просить о Денисове через своего генерала у государя и через него передать письмо. Когда они остались вдвоем, Ростов в первый раз убедился, что ему неловко было смотреть в глаза Борису. Борис заложив ногу на ногу и поглаживая левой рукой тонкие пальцы правой руки, слушал Ростова, как слушает генерал доклад подчиненного, то глядя в сторону, то с тою же застланностию во взгляде прямо глядя в глаза Ростову. Ростову всякий раз при этом становилось неловко и он опускал глаза.
– Я слыхал про такого рода дела и знаю, что Государь очень строг в этих случаях. Я думаю, надо бы не доводить до Его Величества. По моему, лучше бы прямо просить корпусного командира… Но вообще я думаю…
– Так ты ничего не хочешь сделать, так и скажи! – закричал почти Ростов, не глядя в глаза Борису.
Борис улыбнулся: – Напротив, я сделаю, что могу, только я думал…
В это время в двери послышался голос Жилинского, звавший Бориса.
– Ну иди, иди, иди… – сказал Ростов и отказавшись от ужина, и оставшись один в маленькой комнатке, он долго ходил в ней взад и вперед, и слушал веселый французский говор из соседней комнаты.


Ростов приехал в Тильзит в день, менее всего удобный для ходатайства за Денисова. Самому ему нельзя было итти к дежурному генералу, так как он был во фраке и без разрешения начальства приехал в Тильзит, а Борис, ежели даже и хотел, не мог сделать этого на другой день после приезда Ростова. В этот день, 27 го июня, были подписаны первые условия мира. Императоры поменялись орденами: Александр получил Почетного легиона, а Наполеон Андрея 1 й степени, и в этот день был назначен обед Преображенскому батальону, который давал ему батальон французской гвардии. Государи должны были присутствовать на этом банкете.
Ростову было так неловко и неприятно с Борисом, что, когда после ужина Борис заглянул к нему, он притворился спящим и на другой день рано утром, стараясь не видеть его, ушел из дома. Во фраке и круглой шляпе Николай бродил по городу, разглядывая французов и их мундиры, разглядывая улицы и дома, где жили русский и французский императоры. На площади он видел расставляемые столы и приготовления к обеду, на улицах видел перекинутые драпировки с знаменами русских и французских цветов и огромные вензеля А. и N. В окнах домов были тоже знамена и вензеля.
«Борис не хочет помочь мне, да и я не хочу обращаться к нему. Это дело решенное – думал Николай – между нами всё кончено, но я не уеду отсюда, не сделав всё, что могу для Денисова и главное не передав письма государю. Государю?!… Он тут!» думал Ростов, подходя невольно опять к дому, занимаемому Александром.
У дома этого стояли верховые лошади и съезжалась свита, видимо приготовляясь к выезду государя.
«Всякую минуту я могу увидать его, – думал Ростов. Если бы только я мог прямо передать ему письмо и сказать всё, неужели меня бы арестовали за фрак? Не может быть! Он бы понял, на чьей стороне справедливость. Он всё понимает, всё знает. Кто же может быть справедливее и великодушнее его? Ну, да ежели бы меня и арестовали бы за то, что я здесь, что ж за беда?» думал он, глядя на офицера, всходившего в дом, занимаемый государем. «Ведь вот всходят же. – Э! всё вздор. Пойду и подам сам письмо государю: тем хуже будет для Друбецкого, который довел меня до этого». И вдруг, с решительностью, которой он сам не ждал от себя, Ростов, ощупав письмо в кармане, пошел прямо к дому, занимаемому государем.
«Нет, теперь уже не упущу случая, как после Аустерлица, думал он, ожидая всякую секунду встретить государя и чувствуя прилив крови к сердцу при этой мысли. Упаду в ноги и буду просить его. Он поднимет, выслушает и еще поблагодарит меня». «Я счастлив, когда могу сделать добро, но исправить несправедливость есть величайшее счастье», воображал Ростов слова, которые скажет ему государь. И он пошел мимо любопытно смотревших на него, на крыльцо занимаемого государем дома.
С крыльца широкая лестница вела прямо наверх; направо видна была затворенная дверь. Внизу под лестницей была дверь в нижний этаж.
– Кого вам? – спросил кто то.
– Подать письмо, просьбу его величеству, – сказал Николай с дрожанием голоса.
– Просьба – к дежурному, пожалуйте сюда (ему указали на дверь внизу). Только не примут.
Услыхав этот равнодушный голос, Ростов испугался того, что он делал; мысль встретить всякую минуту государя так соблазнительна и оттого так страшна была для него, что он готов был бежать, но камер фурьер, встретивший его, отворил ему дверь в дежурную и Ростов вошел.
Невысокий полный человек лет 30, в белых панталонах, ботфортах и в одной, видно только что надетой, батистовой рубашке, стоял в этой комнате; камердинер застегивал ему сзади шитые шелком прекрасные новые помочи, которые почему то заметил Ростов. Человек этот разговаривал с кем то бывшим в другой комнате.
– Bien faite et la beaute du diable, [Хорошо сложена и красота молодости,] – говорил этот человек и увидав Ростова перестал говорить и нахмурился.
– Что вам угодно? Просьба?…
– Qu'est ce que c'est? [Что это?] – спросил кто то из другой комнаты.
– Encore un petitionnaire, [Еще один проситель,] – отвечал человек в помочах.
– Скажите ему, что после. Сейчас выйдет, надо ехать.
– После, после, завтра. Поздно…
Ростов повернулся и хотел выйти, но человек в помочах остановил его.
– От кого? Вы кто?
– От майора Денисова, – отвечал Ростов.
– Вы кто? офицер?
– Поручик, граф Ростов.
– Какая смелость! По команде подайте. А сами идите, идите… – И он стал надевать подаваемый камердинером мундир.
Ростов вышел опять в сени и заметил, что на крыльце было уже много офицеров и генералов в полной парадной форме, мимо которых ему надо было пройти.
Проклиная свою смелость, замирая от мысли, что всякую минуту он может встретить государя и при нем быть осрамлен и выслан под арест, понимая вполне всю неприличность своего поступка и раскаиваясь в нем, Ростов, опустив глаза, пробирался вон из дома, окруженного толпой блестящей свиты, когда чей то знакомый голос окликнул его и чья то рука остановила его.
– Вы, батюшка, что тут делаете во фраке? – спросил его басистый голос.
Это был кавалерийский генерал, в эту кампанию заслуживший особенную милость государя, бывший начальник дивизии, в которой служил Ростов.
Ростов испуганно начал оправдываться, но увидав добродушно шутливое лицо генерала, отойдя к стороне, взволнованным голосом передал ему всё дело, прося заступиться за известного генералу Денисова. Генерал выслушав Ростова серьезно покачал головой.
– Жалко, жалко молодца; давай письмо.
Едва Ростов успел передать письмо и рассказать всё дело Денисова, как с лестницы застучали быстрые шаги со шпорами и генерал, отойдя от него, подвинулся к крыльцу. Господа свиты государя сбежали с лестницы и пошли к лошадям. Берейтор Эне, тот самый, который был в Аустерлице, подвел лошадь государя, и на лестнице послышался легкий скрип шагов, которые сейчас узнал Ростов. Забыв опасность быть узнанным, Ростов подвинулся с несколькими любопытными из жителей к самому крыльцу и опять, после двух лет, он увидал те же обожаемые им черты, то же лицо, тот же взгляд, ту же походку, то же соединение величия и кротости… И чувство восторга и любви к государю с прежнею силою воскресло в душе Ростова. Государь в Преображенском мундире, в белых лосинах и высоких ботфортах, с звездой, которую не знал Ростов (это была legion d'honneur) [звезда почетного легиона] вышел на крыльцо, держа шляпу под рукой и надевая перчатку. Он остановился, оглядываясь и всё освещая вокруг себя своим взглядом. Кое кому из генералов он сказал несколько слов. Он узнал тоже бывшего начальника дивизии Ростова, улыбнулся ему и подозвал его к себе.
Вся свита отступила, и Ростов видел, как генерал этот что то довольно долго говорил государю.
Государь сказал ему несколько слов и сделал шаг, чтобы подойти к лошади. Опять толпа свиты и толпа улицы, в которой был Ростов, придвинулись к государю. Остановившись у лошади и взявшись рукою за седло, государь обратился к кавалерийскому генералу и сказал громко, очевидно с желанием, чтобы все слышали его.
– Не могу, генерал, и потому не могу, что закон сильнее меня, – сказал государь и занес ногу в стремя. Генерал почтительно наклонил голову, государь сел и поехал галопом по улице. Ростов, не помня себя от восторга, с толпою побежал за ним.


На площади куда поехал государь, стояли лицом к лицу справа батальон преображенцев, слева батальон французской гвардии в медвежьих шапках.
В то время как государь подъезжал к одному флангу баталионов, сделавших на караул, к противоположному флангу подскакивала другая толпа всадников и впереди их Ростов узнал Наполеона. Это не мог быть никто другой. Он ехал галопом в маленькой шляпе, с Андреевской лентой через плечо, в раскрытом над белым камзолом синем мундире, на необыкновенно породистой арабской серой лошади, на малиновом, золотом шитом, чепраке. Подъехав к Александру, он приподнял шляпу и при этом движении кавалерийский глаз Ростова не мог не заметить, что Наполеон дурно и не твердо сидел на лошади. Батальоны закричали: Ура и Vive l'Empereur! [Да здравствует Император!] Наполеон что то сказал Александру. Оба императора слезли с лошадей и взяли друг друга за руки. На лице Наполеона была неприятно притворная улыбка. Александр с ласковым выражением что то говорил ему.
Ростов не спуская глаз, несмотря на топтание лошадьми французских жандармов, осаживавших толпу, следил за каждым движением императора Александра и Бонапарте. Его, как неожиданность, поразило то, что Александр держал себя как равный с Бонапарте, и что Бонапарте совершенно свободно, как будто эта близость с государем естественна и привычна ему, как равный, обращался с русским царем.
Александр и Наполеон с длинным хвостом свиты подошли к правому флангу Преображенского батальона, прямо на толпу, которая стояла тут. Толпа очутилась неожиданно так близко к императорам, что Ростову, стоявшему в передних рядах ее, стало страшно, как бы его не узнали.
– Sire, je vous demande la permission de donner la legion d'honneur au plus brave de vos soldats, [Государь, я прошу у вас позволенья дать орден Почетного легиона храбрейшему из ваших солдат,] – сказал резкий, точный голос, договаривающий каждую букву. Это говорил малый ростом Бонапарте, снизу прямо глядя в глаза Александру. Александр внимательно слушал то, что ему говорили, и наклонив голову, приятно улыбнулся.
– A celui qui s'est le plus vaillament conduit dans cette derieniere guerre, [Тому, кто храбрее всех показал себя во время войны,] – прибавил Наполеон, отчеканивая каждый слог, с возмутительным для Ростова спокойствием и уверенностью оглядывая ряды русских, вытянувшихся перед ним солдат, всё держащих на караул и неподвижно глядящих в лицо своего императора.
– Votre majeste me permettra t elle de demander l'avis du colonel? [Ваше Величество позволит ли мне спросить мнение полковника?] – сказал Александр и сделал несколько поспешных шагов к князю Козловскому, командиру батальона. Бонапарте стал между тем снимать перчатку с белой, маленькой руки и разорвав ее, бросил. Адъютант, сзади торопливо бросившись вперед, поднял ее.
– Кому дать? – не громко, по русски спросил император Александр у Козловского.
– Кому прикажете, ваше величество? – Государь недовольно поморщился и, оглянувшись, сказал:
– Да ведь надобно же отвечать ему.
Козловский с решительным видом оглянулся на ряды и в этом взгляде захватил и Ростова.
«Уж не меня ли?» подумал Ростов.
– Лазарев! – нахмурившись прокомандовал полковник; и первый по ранжиру солдат, Лазарев, бойко вышел вперед.
– Куда же ты? Тут стой! – зашептали голоса на Лазарева, не знавшего куда ему итти. Лазарев остановился, испуганно покосившись на полковника, и лицо его дрогнуло, как это бывает с солдатами, вызываемыми перед фронт.
Наполеон чуть поворотил голову назад и отвел назад свою маленькую пухлую ручку, как будто желая взять что то. Лица его свиты, догадавшись в ту же секунду в чем дело, засуетились, зашептались, передавая что то один другому, и паж, тот самый, которого вчера видел Ростов у Бориса, выбежал вперед и почтительно наклонившись над протянутой рукой и не заставив ее дожидаться ни одной секунды, вложил в нее орден на красной ленте. Наполеон, не глядя, сжал два пальца. Орден очутился между ними. Наполеон подошел к Лазареву, который, выкатывая глаза, упорно продолжал смотреть только на своего государя, и оглянулся на императора Александра, показывая этим, что то, что он делал теперь, он делал для своего союзника. Маленькая белая рука с орденом дотронулась до пуговицы солдата Лазарева. Как будто Наполеон знал, что для того, чтобы навсегда этот солдат был счастлив, награжден и отличен от всех в мире, нужно было только, чтобы его, Наполеонова рука, удостоила дотронуться до груди солдата. Наполеон только прило жил крест к груди Лазарева и, пустив руку, обратился к Александру, как будто он знал, что крест должен прилипнуть к груди Лазарева. Крест действительно прилип.
Русские и французские услужливые руки, мгновенно подхватив крест, прицепили его к мундиру. Лазарев мрачно взглянул на маленького человечка, с белыми руками, который что то сделал над ним, и продолжая неподвижно держать на караул, опять прямо стал глядеть в глаза Александру, как будто он спрашивал Александра: всё ли еще ему стоять, или не прикажут ли ему пройтись теперь, или может быть еще что нибудь сделать? Но ему ничего не приказывали, и он довольно долго оставался в этом неподвижном состоянии.
Государи сели верхами и уехали. Преображенцы, расстроивая ряды, перемешались с французскими гвардейцами и сели за столы, приготовленные для них.
Лазарев сидел на почетном месте; его обнимали, поздравляли и жали ему руки русские и французские офицеры. Толпы офицеров и народа подходили, чтобы только посмотреть на Лазарева. Гул говора русского французского и хохота стоял на площади вокруг столов. Два офицера с раскрасневшимися лицами, веселые и счастливые прошли мимо Ростова.
– Каково, брат, угощенье? Всё на серебре, – сказал один. – Лазарева видел?
– Видел.
– Завтра, говорят, преображенцы их угащивать будут.
– Нет, Лазареву то какое счастье! 10 франков пожизненного пенсиона.
– Вот так шапка, ребята! – кричал преображенец, надевая мохнатую шапку француза.
– Чудо как хорошо, прелесть!
– Ты слышал отзыв? – сказал гвардейский офицер другому. Третьего дня было Napoleon, France, bravoure; [Наполеон, Франция, храбрость;] вчера Alexandre, Russie, grandeur; [Александр, Россия, величие;] один день наш государь дает отзыв, а другой день Наполеон. Завтра государь пошлет Георгия самому храброму из французских гвардейцев. Нельзя же! Должен ответить тем же.
Борис с своим товарищем Жилинским тоже пришел посмотреть на банкет преображенцев. Возвращаясь назад, Борис заметил Ростова, который стоял у угла дома.
– Ростов! здравствуй; мы и не видались, – сказал он ему, и не мог удержаться, чтобы не спросить у него, что с ним сделалось: так странно мрачно и расстроено было лицо Ростова.
– Ничего, ничего, – отвечал Ростов.
– Ты зайдешь?
– Да, зайду.
Ростов долго стоял у угла, издалека глядя на пирующих. В уме его происходила мучительная работа, которую он никак не мог довести до конца. В душе поднимались страшные сомнения. То ему вспоминался Денисов с своим изменившимся выражением, с своей покорностью и весь госпиталь с этими оторванными руками и ногами, с этой грязью и болезнями. Ему так живо казалось, что он теперь чувствует этот больничный запах мертвого тела, что он оглядывался, чтобы понять, откуда мог происходить этот запах. То ему вспоминался этот самодовольный Бонапарте с своей белой ручкой, который был теперь император, которого любит и уважает император Александр. Для чего же оторванные руки, ноги, убитые люди? То вспоминался ему награжденный Лазарев и Денисов, наказанный и непрощенный. Он заставал себя на таких странных мыслях, что пугался их.
Запах еды преображенцев и голод вызвали его из этого состояния: надо было поесть что нибудь, прежде чем уехать. Он пошел к гостинице, которую видел утром. В гостинице он застал так много народу, офицеров, так же как и он приехавших в статских платьях, что он насилу добился обеда. Два офицера одной с ним дивизии присоединились к нему. Разговор естественно зашел о мире. Офицеры, товарищи Ростова, как и большая часть армии, были недовольны миром, заключенным после Фридланда. Говорили, что еще бы подержаться, Наполеон бы пропал, что у него в войсках ни сухарей, ни зарядов уж не было. Николай молча ел и преимущественно пил. Он выпил один две бутылки вина. Внутренняя поднявшаяся в нем работа, не разрешаясь, всё также томила его. Он боялся предаваться своим мыслям и не мог отстать от них. Вдруг на слова одного из офицеров, что обидно смотреть на французов, Ростов начал кричать с горячностью, ничем не оправданною, и потому очень удивившею офицеров.
– И как вы можете судить, что было бы лучше! – закричал он с лицом, вдруг налившимся кровью. – Как вы можете судить о поступках государя, какое мы имеем право рассуждать?! Мы не можем понять ни цели, ни поступков государя!
– Да я ни слова не говорил о государе, – оправдывался офицер, не могший иначе как тем, что Ростов пьян, объяснить себе его вспыльчивости.
Но Ростов не слушал.
– Мы не чиновники дипломатические, а мы солдаты и больше ничего, – продолжал он. – Умирать велят нам – так умирать. А коли наказывают, так значит – виноват; не нам судить. Угодно государю императору признать Бонапарте императором и заключить с ним союз – значит так надо. А то, коли бы мы стали обо всем судить да рассуждать, так этак ничего святого не останется. Этак мы скажем, что ни Бога нет, ничего нет, – ударяя по столу кричал Николай, весьма некстати, по понятиям своих собеседников, но весьма последовательно по ходу своих мыслей.