Си (язык программирования)

Поделись знанием:
(перенаправлено с «C-подобный синтаксис»)
Перейти к: навигация, поиск
C
Класс языка:

процедурный

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

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

Появился в:

1972

Автор:

Деннис Ритчи, Кен Томпсон

Расширение файлов:

.c - для файлов кода, .h - для заголовочных файлов

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

статическая слабая

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

GCC, TCC, Turbo C, Watcom, Oracle Solaris Studio C

Диалекты:

«K&R» C (1978)
ANSI C (1989)
C90 (1990)
C99 (1999)
C11 (2011)

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

BCPL, B

Повлиял на:

C++, Objective-C, C#, Cyclone, Java, BitC

Стандартная библиотека
языка программирования С

C (рус. Си) — компилируемый статически типизированный язык программирования общего назначения, разработанный в 1969—1973 годах сотрудником Bell Labs Деннисом Ритчи как развитие языка Би. Первоначально был разработан для реализации операционной системы UNIX, но, впоследствии, был перенесён на множество других платформ. Согласно дизайну языка Си, его конструкции близко сопоставляются типичным машинным инструкциям, благодаря чему он нашёл применение в проектах, для которых был свойственен язык ассемблера, в том числе как в операционных системах, так и в различном прикладном ПО для множества устройств — от суперкомпьютеров до встраиваемых систем. Язык программирования Си оказал существенное влияние на развитие индустрии программного обеспечения, а его синтаксис стал основой для таких языков программирования, как C++, C#, Java и Objective-C.





Содержание

История Си

Язык программирования Си был разработан в лабораториях Bell Labs в период с 1969 по 1973 годы. Согласно Ритчи, самый активный период творчества пришёлся на 1972 год. Язык назвали «Си» (C — третья буква латинского алфавита), потому что многие его особенности берут начало от старого языка «Би» (B — вторая буква латинского алфавита). Существует несколько различных версий происхождения названия языка Би. Кен Томпсон указывает на язык программирования BCPL, однако существует ещё и язык Bon, также созданный им, и названный так в честь его жены Бонни.

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

  • Разработка Си стала результатом того, что его будущие авторы любили компьютерную игру, подобную популярной игре Asteroids (Астероиды). Они уже давно играли в неё на главном сервере компании, который был недостаточно мощным и должен был обслуживать около ста пользователей. Томпсон и Ритчи посчитали, что им не хватает контроля над космическим кораблём для того, чтобы избегать столкновений с некоторыми камнями. Поэтому они решили перенести игру на свободный PDP-7, стоящий в офисе. Однако этот компьютер не имел операционной системы, что заставило их её написать. В конце концов, они решили перенести эту операционную систему ещё и на офисный PDP-11, что было очень тяжело, потому что её код был целиком написан на ассемблере. Было вынесено предложение использовать какой-нибудь высокоуровневый портируемый язык, чтобы можно было легко переносить ОС с одного компьютера на другой. Язык Би, который они хотели сначала задействовать для этого, оказался лишён функциональности, способной использовать новые возможности PDP-11. Поэтому они и остановились на разработке языка Си.
  • Самый первый компьютер, для которого была первоначально написана UNIX, предназначался для создания системы автоматического заполнения документов. Первая версия UNIX была написана на ассемблере. Позднее для того, чтобы переписать эту операционную систему, был разработан язык Си.

К 1973 году язык Си стал достаточно силён, и большая часть ядра UNIX, первоначально написанная на ассемблере PDP-11/20, была переписана на Си. Это было одно из самых первых ядер операционных систем, написанное на языке, отличном от ассемблера; более ранними были лишь системы Multics (написана на ПЛ/1) и TRIPOS (написана на BCPL).

K&R C

В 1978 году Брайан Керниган и Деннис Ритчи опубликовали первую редакцию книги «Язык программирования Си». Эта книга, известная среди программистов как «K&R», служила многие годы неформальной спецификацией языка. Версию языка Си, описанную в ней, часто называют «K&R C». Вторая редакция этой книги посвящена более позднему стандарту ANSI C, описанному ниже.

K&R ввёл следующие особенности языка:

  • структуры (тип данных struct);
  • длинное целое (тип данных long int);
  • целое без знака (тип данных unsigned int);
  • оператор += и подобные ему (старые операторы =+ вводили анализатор лексики компилятора Си в заблуждение, например, при сравнении выражений i =+ 10 и i = +10).

K&R C часто считают самой главной частью языка, которую должен поддерживать компилятор Си. Многие годы даже после выхода ANSI C он считался минимальным уровнем, которого следовало придерживаться программистам, желающим добиться от своих программ максимальной переносимости, потому что не все компиляторы тогда поддерживали ANSI C, а хороший код на K&R C был верен и для ANSI C.

После публикации K&R C в язык было добавлено несколько возможностей, поддерживаемых компиляторами AT&T, и некоторых других производителей:

  • функции, не возвращающие значение (с типом void), и указатели, не имеющие типа (с типом void *);
  • функции, возвращающие объединения и структуры;
  • имена полей данных структур в разных пространствах имён для каждой структуры;
  • присваивания структур;
  • спецификатор констант (const);
  • стандартная библиотека, реализующая большую часть функций, введённых различными производителями;
  • перечислимый тип (enum);
  • дробное число одинарной точности (float).

ISO C

В конце 1970-х годов Си начал вытеснять Бейсик с позиции ведущего языка для программирования микрокомпьютеров. В 1980-х годах он был адаптирован для использования в IBM PC, что привело к резкому росту его популярности. В то же время Бьёрн Страуструп и другие в лабораториях Bell Labs начали работу по добавлению в Си возможностей объектно-ориентированного программирования. Язык, который они в итоге сделали, C++, оказал большое влияние на разработку ПО, но так и не смог сравняться по популярности[1] с Си, особенно в UNIX-подобных системах.

В 1983 году Американский национальный институт стандартов (ANSI) сформировал комитет для разработки стандартной спецификации Си. По окончании этого долгого и сложного процесса в 1989 году он был наконец утверждён как «Язык программирования Си» ANSI X3.159-1989. Эту версию языка принято называть ANSI C или C89. В 1990 году стандарт ANSI C был принят с небольшими изменениями Международной организацией по стандартизации (ISO) как ISO/IEC 9899:1990.

Одной из целей этого стандарта была разработка надмножества K&R C, включающего многие особенности языка, созданные позднее. Однако комитет по стандартизации также включил в него и несколько новых возможностей, таких, как прототипы функций (заимствованные из C++) и более сложный препроцессор.

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

  1. они используют нестандартные библиотеки, например, для графических дисплеев;
  2. они используют специфические платформо-зависимые средства;
  3. они рассчитаны на определённое значение размера некоторых типов данных или на определённый способ хранения этих данных в памяти для конкретной платформы.

C99

После стандартизации в ANSI спецификация языка Си оставалась относительно неизменной в течение долгого времени, в то время как C++ продолжал развиваться (в 1995 году в стандарт Си была внесена Первая нормативная поправка, но её почти никто не признавал). Однако в конце 1990-х годов стандарт подвергся пересмотру, что привело к публикации ISO 9899:1999 в 1999 году. Этот стандарт обычно называют «C99». В марте 2000 года он был принят и адаптирован ANSI.

Некоторые новые особенности C99:

  • подставляемые функции (inline);
  • объявление локальных переменных в любом операторе программного текста (как в C++);
  • новые типы данных, такие, как long long int (для облегчения перехода от 32- к 64-битным числам), явный булевый тип данных _Bool и тип complex для представления комплексных чисел;
  • массивы переменной длины;
  • поддержка ограниченных указателей (restrict);
  • именованная инициализация структур: struct { int x, y, z; } point = { .y=10, .z=20, .x=30 };
  • поддержка однострочных комментариев, начинающихся на //, заимствованных из C++ (многие компиляторы Си поддерживали их и ранее в качестве дополнения);
  • несколько новых библиотечных функций, таких, как snprintf;
  • несколько новых заголовочных файлов, таких, как stdint.h.

Интерес к поддержке новых особенностей C99 в настоящее время[когда?] смешан. В то время как GCC[2], компилятор Си от Sun Microsystems и некоторые другие компиляторы в настоящее время поддерживают большую часть новых особенностей C99, компиляторы компаний Borland и Microsoft не делают этого, причём, похоже, что две эти компании и не думают их добавлять.

C11

8 декабря 2011 опубликован новый стандарт для языка Си (ISO/IEC 9899:2011)[3]. Основные изменения:

  • поддержка многопоточности;
  • улучшенная поддержка Юникода;
  • обобщенные макросы (type-generic expressions, позволяют статичную перегрузку);
  • анонимные структуры и объединения (упрощают обращение ко вложенным конструкциям);
  • управление выравниванием объектов;
  • статичные утверждения (static assertions);
  • удаление опасной функции gets (в пользу безопасной gets_s);
  • функция quick_exit;
  • спецификатор функции _Noreturn;
  • новый режим эксклюзивного открытия файла.

Введение в Си

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

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

Си (как и ОС UNIX, с которой он долгое время был связан) создавался программистами и для программистов, круг которых был бы ненамного шире круга разработчиков языка. Несмотря на это, область использования языка значительно шире задач системного программирования.

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

В то же время в Си отсутствуют

а также средства:

Часть отсутствующих возможностей относительно легко имитируется встроенными средствами (например, сопрограммы можно имитировать с помощью функций setjmp и longjmp), часть добавляется с помощью сторонних библиотек (например, для поддержки многозадачности и для сетевых функций можно использовать библиотеки pthreads, sockets и т. п.; существуют библиотеки для поддержки автоматической сборки мусора[5]), часть реализуется в некоторых компиляторах в виде расширений языка (например, вложенные функции в GCC).

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

Одним из последствий высокой эффективности и переносимости Си стало то, что многие компиляторы, интерпретаторы и библиотеки других языков высокого уровня часто написаны на языке Си.

Уязвимости

Многие элементы Си потенциально опасны, а последствия неправильного использования этих элементов зачастую непредсказуемы. Керниган говорит: «Си — инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво». В связи со сравнительно низким уровнем языка многие случаи неправильного использования опасных элементов не обнаруживаются и не могут быть обнаружены ни при компиляции, ни во время исполнения. Это часто приводит к непредсказуемому поведению программы. Иногда в результате неграмотного использования элементов языка появляются уязвимости в системе безопасности. Необходимо заметить, что использования многих таких элементов можно избежать.

Примером ошибки является обращение к несуществующему элементу массива. Несмотря на то, что Си непосредственно поддерживает статические массивы, он не имеет средств проверки индексов массивов (проверки границ). Например, возможна запись в шестой элемент массива из пяти элементов, что, естественно, приведёт к непредсказуемым результатам. Частный случай такой ошибки называется ошибкой переполнения буфера. Ошибки такого рода приводят к большинству проблем с безопасностью.

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

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

Ещё одной распространённой проблемой является то, что память не может быть использована снова, пока она не будет освобождена программистом с помощью функции free(). В результате программист может случайно забыть освобождать эту память, но продолжать её выделять, занимая всё большее и большее пространство. Это обозначается термином утечка памяти. Наоборот, возможно освободить память слишком рано, но продолжать её использовать. Из-за того, что система выделения может использовать освобождённую память по-другому, это ведёт к непредсказуемым последствиям. Эти проблемы решаются в языках со сборкой мусора. С другой стороны, если память выделяется в функции и должна освобождаться после выхода из функции, данная проблема решается с помощью автоматического вызова деструкторов в языке C++, или с помощью локальных массивов, используя расширения C99.

Функции с переменным количеством аргументов также являются потенциальным источником проблем. В отличие от обычных функций, имеющих прототип, стандартом не регламентируется проверка функций с переменным числом аргументов. Если передаётся неправильный тип данных, то возникает непредсказуемый, если не фатальный результат. Например, семейство функций printf стандартной библиотеки языка Си, используемое для генерации форматированного текста для вывода, хорошо известно за его потенциально опасный интерфейс с переменным числом аргументов, которые описываются строкой формата. Проверка типов в функциях с переменным числом аргументов является задачей каждой конкретной реализации такой функции, однако многие современные компиляторы, в частности, проверяют типы в каждом вызове printf, генерируя предупреждения в случаях, когда список аргументов не соответствует строке формата. Следует заметить, что невозможно статически проконтролировать даже все вызовы функции printf, поскольку строка формата может создаваться в программе динамически, поэтому, как правило, никаких проверок других функций с переменным числом аргументов компилятором не производится.

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

Синтаксис Си

Лексемы

В языке Си используются (являются допустимыми)

  • все символы латинского алфавита
    A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z
    a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z
  • цифры
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  • и специальные символы
    , (запятая), ;,. (точка), +, -, *, ^, & (амперсанд), =, ~ (тильда), !, /, <, >, (, ), {, }, [, ], |, %, ?, ' (апостроф), " (кавычки), : (двоеточие), _ (знак подчёркивания)

Из допустимых символов формируются лексемы — предопределённые константы, идентификаторы и знаки операций. В свою очередь, лексемы являются частью выражений; а из выражений составляются инструкции и операторы.

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

Также имеется символ #, который не может быть частью никакой лексемы, и используется в препроцессоре (см. ниже).

Идентификаторы

Допустимый идентификатор — это слово (лексема), составленное из допустимых символов алфавита языка программирования, не являющееся знаком некоторой операции или разделителем.

Идентификаторы — это те имена, которые даются программным объектам — (именованным) константам, переменным, типам и функциям.

Некоторые лексемы являются зарезервированными (или, что то же самое, ключевыми) словами (см. ниже), и, поэтому, не могут быть использованы в программе в качестве идентификаторов программных объектов.

Предопределённые константы

Для введения в программе на Си именованных констант используется директива препроцессора #define:

#define имя константы [значение].

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

#undef имя константы.

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

Если для именованной константы указано некоторое значение, то для константы определяется так же и тип, соответствующий виду задаваемого значения. Различают следующие типы констант:

  • числовые (целочисленные или вещественные);
  • символьные (выделяются знаком апострофа);
  • текстовые строки (выделяются знаком двойных кавычек).

Ключевые слова

Ключевые слова — это лексемы, которые зарезервированы компилятором для обозначения типов переменных, класса хранения, элементов операторов.

Стандартом С89 предусмотрены следующие ключевые слова:

  • для указания операции получения размера объекта: sizeof;
  • для описания прототипа объекта: typedef;
  • для объявления переменных:
    для обозначения класса хранения переменных: auto, register;
    для обозначения того, что объект описывается в другом месте extern;
    для обозначения того, что объект статический static;
  • для обозначения типа переменных char, short,int, long, signed, unsigned,float, double, void (для указания на произвольный родовой тип);
  • для обозначения специальных типов данных:
    struct (структура), enum (перечисление), union;
  • для обозначения операторов и их элементов:
    для обозначения операторов цикла: do, for, while;
    для обозначения условного оператора: if, else;
    для обозначения оператора выбора: switch, case, default;
  • для обозначения операторов перехода:
    операторы прерывания исполнения кода: break, continue;
    для обозначения оператора безусловного перехода: goto;
  • для обозначения оператора возврата из функции: return.

В стандарте C99 добавлены следующие ключевые слова:

  • для обозначения того, что функция является встраиваемой: inline;
  • для обозначения типа переменной: _Bool, _Complex, _Imaginary;
  • и для обозначения того, что restrict.

Операции

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

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

  • унарные операции — операции вида
    [знак операции] [операнд]
  • бинарные операции
    [операнд] [знак операции] [операнд]
  • и тернарные операции.

Унарные операции

Унарные операции — это операции, содержащие единственный операнд.

К унарным операциям в Си относятся следующие операции:

+ (унарный плюс), - (унарный минус), ~ (взятие обратного кода), ! (логическое отрицание), & (взятие адреса), * (операция разыменовывания указателя), sizeof (операция определения занимаемого объектом объёма памяти).

Бинарные операции

Бинарные операции — это операции, содержащие два операнда, между которыми расположен знак операции.

К бинарным операциям в Си относятся следующие операции:

+ (сложение), - (вычитание), * (умножение), / (деление), % (взятие остатка от деления), & (поразрядное И), | (поразрядное ИЛИ), ^ (поразрядное исключающее ИЛИ), && (логическое И), || (логическое ИЛИ).

Также к бинарным операциям в Си относятся операции, по сути представляющие собою присваивание:

+= (добавление к левому операнду значения, представленного правым операндом)
-= (вычитание из левого операнда значения, представленного правым операндом)
*= (умножение левого операнда на значение, представленное правым операндом)
/= (деление левого операнда на значение, представленное правым операндом)

Данные операции предполагают, что левый операнд представляет собою лево-допустимое выражение.

Тернарные операции

В Си имеется единственная тернарная операция — условная операция, которая имеет следующий вид:

[условие]? [выражение1] : [выражение2] ;

и которая имеет три операнда:

  • [условие] — логическое условие, которое проверяется на истинность,
  • [выражение1] — выражение, значение которого возвращается в качестве результата выполнения операции, если условие истинно;
  • [выражение2] — выражение, значение которого возвращается в качестве результата выполнения операции, если условие ложно.

Знаком операции здесь служит целое сочетание ? :.

Выражения

Выражение — это упорядоченный набор операций над переменными. Выражения содержат операнды и знаки операций (см. выше). Порядок выполнения операций зависит от формы записи и от приоритета выполнения операций (см. ниже). У каждого выражения имеется значение — результат выполнения всех операций, входящих в выражение. С вычислением значения выражения может быть связан т. н. «побочный эффект», когда в ходе выполнения операций, меняется некоторая переменная. Другим возможным «побочным эффектом» является неявное преобразование типов.

Простейшее выражение содержит только имя переменной (её идентификатор). Значением такого выражения будет то значение (или тот объект), которое хранится в данной переменной.

Среди выражений выделяют класс лево-допустимых выражений — выражений, которые могут присутствовать слева от знака присваивания.

Приоритет выполнения операций

Операции в Си выполняются в соответствии следующей таблице приоритетов операций:

Лексемы Операция Класс Приоритет Ассоциативность
имена, литералы простые лексемы первичный 16 нет
a[k] индексы постфиксный 16 слева направо
f(…) вызов функции постфиксный 16 слева направо
. прямой выбор постфиксный 16 слева направо
-> опосредованный выбор постфиксный 16 слева направо
++ -- положительное и отрицательное приращение постфиксный 16 слева направо
++ -- положительное и отрицательное приращение префиксный 15 справа налево
(имя типа) {init} составной литерал (C99) постфиксный 15 справа налево
sizeof размер унарный 15 справа налево
~ побитовое НЕ унарный 15 справа налево
! логическое НЕ унарный 15 справа налево
- + изменение знака, плюс унарный 15 справа налево
& адрес унарный 15 справа налево
* опосредование (разыменование) унарный 15 справа налево
(имя типа) приведение типа унарный 15 справа налево
* / % мультипликативные операции бинарный 13 слева направо
+ - аддитивные операции бинарный 12 слева направо
<< >> сдвиг влево и вправо бинарный 11 слева направо
< > <= >= отношения бинарный 10 слева направо
== != равенство/неравенство бинарный 9 слева направо
& побитовое И бинарный 8 слева направо
^ побитовое исключающее ИЛИ бинарный 7 слева направо
| побитовое ИЛИ бинарный 6 слева направо
&& логическое И бинарный 5 слева направо
|| логическое ИЛИ бинарный 4 слева направо
? : условие тернарный 3 справа налево
= += -= *= /= %= <<= >>= &= ^= |= присваивание бинарный 2 справа налево
, последовательное вычисление бинарный 1 слева направо

Операторы

Операторы предназначены для осуществления действий и для управления ходом выполнения программы.

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

Пустой оператор

Самая простая языковая конструкция — это пустое выражение, называемое пустым оператором[6][7]:

;

Пустой оператор не совершает никаких действий и может находиться в любом месте программы.

Инструкции

Инструкция — это некое элементарное действие:

(выражение);

Действие этого оператора заключается в выполнении указанного в теле оператора выражения.

Несколько идущих подряд инструкций образуют последовательность инструкций.

Блок вычислений

Инструкции могут быть сгруппированы в специальные вычислительные блоки следующего вида:

main(){

(последовательность инструкций)
},

ограниченные при помощи двух разделителей:

  • левая фигурная скобка ({) обозначает начало вычислительного блока,
  • правая фигурная скобка (}) обозначает конец вычислительного блока.

Вычислительный блок называют ещё составным оператором.

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

Условные операторы

В языке существует два условных оператора, реализующих ветвление программы:

  • оператор if, содержащий проверку одного условия;
  • и оператор switch, содержащий проверку нескольких условий.

Самая простая форма оператора if

if((условие)) (оператор)
(следующий оператор)

Оператор if работает следующим образом:

  • если выполнено условие, указанное в скобках, то выполняется первый оператор, и затем выполняется оператор, указанный после оператора if.
  • если условие, указанное в скобках, не выполнено, то сразу выполняется оператор, указанный после оператора if.

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

if((условие)) ;

поскольку, фактически, выполняется пустой оператор. Более сложная форма оператора if содержит ключевое слово else:

if((условие)) (оператор)
else (альтернативный оператор)
(следующий оператор)

Здесь, если условие, указанное в скобках, не выполнено, то выполняется оператор, указанный после ключевого слова else.

Операторы выполнения цикла

Цикл — это фрагмент программного кода, содержащий

  • условие выполнения цикла — условие, которое постоянно проверяется;
  • и тело цикла — простой или составной оператор, выполнение которого зависит от условия цикла.

В соответствии с этим, различают два вида циклов:

  • цикл с предусловием, где сначала проверяется условие выполнения цикла, и, если условие выполнено, то выполняется тело цикла;
  • цикл с постусловием, где сначала выполняется тело цикла, а уже потом проверяется условие выполнения цикла, и, если условие выполнено, то…;

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

В Си предусмотрен оператор цикла с предусловием:

while(условие) [тело цикла]

и оператор с постусловием do-while:

do [тело цикла] while( условие)

Также имеется оператор

for( блок инициализации;условие;оператор) [тело цикла],

который эквивалентен следующему блоку операторов:

[блок инициализации]
while(условие)
{
[тело цикла]
[оператор]
}

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

Условие цикла — это логическое выражение. Однако неявное приведение типов позволяет использовать в качестве условия цикла арифметическое выражение. Это позволяет организовать т. н. «бесконечный цикл»:

while(1);

или то же самое, но уже с применением оператора for:

for(;;);

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

Операторы безусловного перехода

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

Оператор

goto [метка],

где [метка] — это некоторый (числовой) идентификатор, передаёт управление тому оператору, который помечен в программе указанной меткой:

[метка] : [оператор]

Если указанная метка отсутствует в программе, или, если существует несколько операторов с одной и той же меткой, компилятор сообщает об ошибке.

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

Другие операторы перехода связаны с циклами и позволяют прервать выполнения тела цикла:

  • оператор break немедленно прерывает выполнение тела цикла, и происходит передача управления на оператор, следующий непосредственно сразу за оператором цикла;
  • оператор continue прерывает выполнение тела цикла и передаёт управление в начало цикла, что инициирует проверку условия цикла.

Оператор continue может быть использован только внутри операторов do, while и for; оператор break также может использоваться внутри оператора switch.

Существует два особых случая применения операторов break и continue:

  • если оператор continue встретился в теле оператора for, то сначала происходит выполнение оператора, а уже затем происходит проверка условия цикла, таким образом оператор continue предназначен для немедленного перехода к следующей итерации выполнения цикла;
  • если имеется несколько вложенных циклов, то оператор break , в зависимости от реализации, либо полностью прерывает выполнение всех вложенных циклов, либо прерывает выполнение только того цикла, в котором расположен сам оператор break.

Оператор возврата из функции

В Си определён оператор return, который прерывает выполнение функции, где использован данный оператор. Если функция не должна возвращать значение, то используется вызов

return;

Если функция должна возвращать какое-либо значение, то использует вызов

return[значение];

Если после оператора возврата в теле функции имеются ещё какие-то операторы, то эти операторы никогда не будут выполняться, и в этом случае компилятор может выдать предупреждение.

Функции

Функция — это самостоятельный фрагмент программного кода, который может многократно использоваться в программе. Функции могут иметь аргументы и могут возвращать значения.

Для того, чтобы задать функцию в Си, необходимо её объявить:

  • сообщить имя (идентификатор) функции,
  • перечислить входные параметры (аргументы)
  • и указать тип возвращаемого значения,

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

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

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

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

Объявление функции

Объявление функции имеет следующий формат:

[описатель] [имя] ( [список] );,

где

  • [описатель] — описатель типа возвращаемого функцией значения;
  • [имя] — имя функции (уникальный идентификатор функции);
  • [список] — список (формальных) параметров функции.

Признаком объявления функции является символ «;», таким образом, объявление функции — это инструкция.

В самом простом случае [описатель] содержит указание на конкретный тип возвращаемого значения. Функция, которая не должна возвращать никакого значения, объявляется как имеющая тип

void

При необходимости в описателе могут присутствовать дополнительные элементы:

  • модификатор extern указывает на то, что определение функции находится в другом модуле;
  • модификатор static задаёт статическую функцию;
  • модификаторы pascal или cdecl влияют на обработку формальных параметров и связаны с подключением внешних модулей.

Список параметров функции задаёт сигнатуру функции.

Си не допускает объявление нескольких функций, имеющих одно и то же имя, перегрузка функций не поддерживается.[8]

Определение функции

Определение функции имеет следующий формат:

[описатель] [имя] ( [список] ) [тело]

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

Тело функции имеет следующий вид:

{
[последовательность операторов]
return ([возвращаемое значение]) ;
}

Вызов функции

Вызов функции заключается в выполнении следующих действий:

  • сохранение точки вызова в стеке;
  • выделение памяти под переменные, соответствующие формальным параметрам функции;
  • инициализация переменных значениями переменных (фактических параметров функции), переданных в функцию при её вызове, а также инициализация тех переменных, для которых в объявлении функции указаны значения по умолчанию, но для которых при вызове не были указаны соответствующие им фактические параметры;
  • передача управления в тело функции.

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

Если в функцию передаётся переменная, то при вызове функции создаётся её копия (выделяется память и копируется значение). Если в функцию передаётся ссылка (а не указатель) на объект, то никакая копия не создаётся, и все операции, которые производит функция, будут операциями над самим объектом, а не с его копией. Для указания того, какой подход используется, говорят либо о том, что объект передаётся по значению, либо о том, что объект передаётся по ссылке.

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

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

Возврат из функции

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

Структура программы

Комментарии

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

Первоначально (в стандарте C89) были предусмотрены символы /* для обозначения начала комментария и символ */ для обозначения завершения комментария. При этом невозможно вложить один комментарий в другой, поскольку первый встреченный символ */ завершит комментарий, и текст, следующий непосредственно за символом */, если этот текст не является программным кодом и содержит произвольный текст, вызовет ошибку компиляции.

Следующий стандарт (стандарт C99) ввёл ещё один способ оформления комментариев: комментарием считается текст, начинающийся с символа // и заканчивающийся в конце строки.

Элементы Си

Типы

Система типов в Си подобна типам в других потомках Алгола, таких, как Паскаль. В Си имеются типы целых чисел различных размеров (short int, long int), со знаком (signed) и без (unsigned), чисел с плавающей запятой (float, double), символов, перечисляемых типов (enum) и записей-структур (struct). Кроме того, язык Си предлагает тип объединение (union), с помощью которого можно осуществлять каламбуры типизации — либо хранить в одном месте памяти разнородные данные, не пересекающиеся по времени существования (это позволяет экономить память), либо обращаться к содержимому участка памяти, как к данным разных типов (что позволяет менять тип-интерпретацию данных, не меняя сами данные).

В языке возможно преобразование типов, но оно не всегда происходит автоматически. Только некоторые типы числовых данных полностью совместимы друг с другом. При таком преобразовании компилятор может выдать только предупреждение. Чтобы полностью обезопасить себя от ошибок такого рода, можно использовать программу lint.[9]

Хранение данных

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

В Си есть три разных способа выделения памяти (классы памяти) для объектов:

  • Статическое выделение памяти: пространство для объектов создаётся в сегменте данных программы в момент компиляции; время жизни таких объектов совпадает со временем жизни этого кода. Изменение таких объектов ведёт к так называемому в стандарте «неопределённому поведению» (англ. undefined behaviour). На практике эта операция приводит к ошибке во время выполнения.
  • Автоматическое выделение памяти: объекты можно хранить в стеке; эта память затем автоматически освобождается и может быть использована снова, после того, как программа выходит из блока, использующего его.
  • Динамическое выделение памяти: блоки памяти нужного размера могут запрашиваться во время выполнения программы с помощью библиотечных функций malloc, realloc, calloc из области памяти, называемой кучей. Эти блоки освобождаются и могут быть использованы снова после вызова для них функции free.

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

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

Представление в памяти

На схеме справа показано представление программ на языке C в оперативной памяти. После запуска программы в оперативную память импортируются команды процессора (машинный код) и инициализированные данные. В то же время в старшие адреса импортируются аргументы командной строки (для того чтобы программа их принимала в аргументах функции main надо указать int argc, char ** argv), а также переменные окружения.

В области инициализированных данных хранятся данные, которые уже нельзя менять после определения в теле программы. Это могут быть переменные, объявленные с квалификатором const, строковые литералы (char * a = "sample";).

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

Также память можно выделять динамически, предоставляться она будет из кучи (heap). Для выделения памяти во время работы программы используется функция malloc из stdlib.h . Для освобождения функция free.

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

Стоит учитывать, что порядок расположения кучи, стека и других областей может отличаться в зависимости от конкретной реализации. Схема, представленная на картинке верна для операционных систем GNU/Linux. Также немаловажной деталью является наличие случайного отступа между стеком и верхней областью, а также между областью инициализированных данных и кучей. Делается это в целях безопасности, например, для предотвращения встраивания в стек других функций.

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

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

Примеры на Си

Простейшая программа на Си

Простейшая программа на Си имеет следующий вид:

main() {  return 0;  }

По умолчанию предполагается, что основная функция программы (функция main()) возвращает целое число, поэтому такая программа должна компилироваться (возможно, с выдачей одного или нескольких предупреждений), если компилятор реализует стандарт ANSI C. Если, однако, компилятор следует стандарту C99, то такой код не будет компилироваться, и потребуется явное описание типа возвращаемого функцией main() значения.

Программа «Hello, World»

Эта простая программа приведена ещё в первом издании книги «Язык программирования Си» Кернигана и Ритчи:

#include <stdio.h>
int main()
{  
    printf("Hello, world!");
    return 0;
}

Эта программа печатает сообщение «Hello, world!» на стандартном устройстве вывода.

Си и другие языки программирования

Си и C++

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

Бьёрн Страуструп, придумавший C++, неоднократно выступал за максимальное сокращение различий между Си и C++ для создания максимальной совместимости между этими языками. Противники же такой точки зрения считают, что так как Си и C++ являются двумя различными языками, то и совместимость между ними не так важна, хоть и полезна. Согласно этому лагерю, усилия по уменьшению несовместимости между ними не должны препятствовать попыткам улучшения каждого языка в отдельности.

Различия между этими языками, существующие на сегодня[когда?]:

  • inline — подставляемые функции существуют в глобальном пространстве C++, а в Си — в пространстве файла (статическом пространстве). Другими словами, это значит, что в C++ любое определение подставляемой функции (независимо от переопределения функций) должно соответствовать правилу одного определения, требующего того, чтобы любая подставляемая функция была определена только один раз. В Си же одна и та же подставляемая функция может быть определена по-разному в разных компилируемых файлах одной программы.
  • В отличие от C++, макрос bool в C99 требует включения соответствующего заголовочного файла stdbool.h. В стандарте C99 определён собственный тип логических данных _Bool. Предыдущий стандарт Си (C89) не определял булевый тип вообще, поэтому для этого часто использовались различные (а значит, несовместимые) методы.
  • Символьные константы (заключённые в одинарные кавычки) по умолчанию имеют: тип int в Си и тип char в C++. Поэтому в Си справедливо равенство sizeof('a') == sizeof(int), а в C++ — равенство sizeof('a') == sizeof(char).[10]
  • Некоторые новые возможности C99, в первую очередь, restrict, не включены в C++.

Реализация Си

Некоторые компиляторы идут в комплекте с компиляторами других языков программирования (включая C++) или являются составной частью среды разработки программного обеспечения.

Компиляторы на динамические языки и платформы

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

  • Emscripten[en][11] — компилятор из LLVM-байтокода (например, полученный из C++) в JavaScript.
  • Flascc[en] (старое название — Alchemy)[12] — компилятор из Си/C++ в ActionScript Virtual Machine (AVM2). Позволяет использовать Си-библиотеки в Flash- и Adobe AIR-приложениях.
  • Clue[13] — компилятор из ANSI Си в Lua, JavaScript, Perl, Java, Common Lisp.
  • AMPC[14] — компилятор из Си в виртуальную машину Java.

Преимущества и недостатки

Язык Си уникален с той точки зрения, что именно он стал первым языком высокого уровня, всерьёз потеснившим ассемблер в разработке системного программного обеспечения. Он остаётся языком, реализованным на максимальном количестве аппаратных платформ, и одним из самых популярных языков программирования, особенно в мире свободного программного обеспечения[15].

Однако не лишён этот язык и недостатков: так у него достаточно высокий порог вхождения, что затрудняет его использование в обучении в качестве первого языка программирования. Рождённый в среде хакеров, он стимулирует соответствующий стиль программирования, часто небезопасный, и поощряющий написание запутанного кода (см. также write-only language[en]). Наконец, за более чем 40 лет существования, язык успел несколько устареть, и в нём достаточно проблематично использовать многие современные приёмы и парадигмы программирования[15].

См. также

Напишите отзыв о статье "Си (язык программирования)"

Примечания

  1. [www.tiobe.com/index.php/content/paperinfo/tpci/index.html#TIOBE Programming Community Index for April 2012]
  2. [gcc.gnu.org/c99status.html Status of C99 features in GCC]
  3. [www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57853 ISO/IEC 9899:2011 — Information technology — Programming languages — C]
  4. [www.cs.rit.edu/~ats/books/ooc.pdf Object-Oriented Programming With ANSI-C] (англ.)
  5. [www.hpl.hp.com/personal/Hans_Boehm/gc/ A garbage collector for C and C++] (англ.)
  6. Подбельский, Фомин, 2004, с. 82.
  7. Романов, Си/Си++, 1.5. Алгоритм. Операторы.
  8. [www.geeksforgeeks.org/does-c-support-function-overloading/ Does C support function overloading? | GeeksforGeeks]
  9. [www.intuit.ru/department/pl/cpl/0/3.html Курс: Язык программирования: Лекция № 0: Аннотация и введение] INTUIT.ru
  10. [www.open-std.org/jtc1/sc22/open/n2356/diff.html#diff.iso Annex 0: Compatibility. 1.2. C++ and ISO C]. Working Paper for Draft Proposed International Standard for Information Systems — Programming Language C++ (2 декабря 1996). — см. 1.2.1p3 (параграф 3 в разделе 1.2.1). Проверено 6 июня 2009. [www.webcitation.org/618HTMqKA Архивировано из первоисточника 22 августа 2011].
  11. [github.com/kripken/emscripten/ Emscripten LLVM-to-JavaScript compiler]
  12. [gaming.adobe.com/technologies/flascc/ Flash C++ Compiler]
  13. [cluecc.sourceforge.net Проект Clue] на сайте SourceForge.net
  14. [www.axiomsol.com/ Axiomatic Solutions Sdn Bhd]
  15. 1 2 Столяров, 2010, 1. Предисловие, p. 79.

Литература

  • Керниган Б., Ритчи Д. Язык программирования Си = The C programming language. — 2-е изд. — М.: Вильямс, 2007. — С. 304. — ISBN 0-13-110362-8.
  • Гукин Д. Язык программирования Си для «чайников» = C For Dummies. — М.: Диалектика, 2006. — С. 352. — ISBN 0-7645-7068-4.
  • Подбельский В. В., Фомин С. С. Программирование на языке Си. — 2-е доп. изд. — М.: Финансы и статистика, 2004. — 600 с. — ISBN 5-279-02180-6.
  • Прата С. Язык программирования С: Лекции и упражнения = C Primer Plus. — М.: Вильямс, 2006. — С. 960. — ISBN 5-8459-0986-4.
  • Прата С. Язык программирования C (C11). Лекции и упражнения, 6-е издание = C Primer Plus, 6th Edition. — М.: Вильямс, 2015. — 928 с. — ISBN 978-5-8459-1950-2.
  • Столяров А. В. [www.croco.net/croco/papers/stolyarov_2010.pdf Язык Си и начальное обучение программированию] // Сборник статей молодых учёных факультета ВМК МГУ. — Издательский отдел факультета ВМК МГУ, 2010. — № 7. — С. 78-90.
  • Шилдт Г. C: полное руководство, классическое издание = C: The Complete Reference, 4th Edition. — М.: Вильямс, 2010. — С. 704. — ISBN 978-5-8459-1709-6.
  • Языки программирования Ада, Си, Паскаль = Comparing and Assessong Programming Languages Ada, C, and Pascal / А. Фьюэр, Н. Джехани. — М.: Радио и Саязь, 1989. — 368 с. — 50 000 экз. — ISBN 5-256-00309-7.
  • Axel-Tobias Schreiner. [www.cs.rit.edu/~ats/books/ooc.pdf Object oriented programming with ANSI-C]. — Hanser, 2011. — 223 p. — ISBN 3-446-17426-5.

Ссылки

  • [www.open-std.org/JTC1/SC22/WG14/ ISO/IEC JTC1/SC22/WG14 official home] (англ.). — Официальная страница международной рабочей группы по стандартизации языка программирования Си. Проверено 20 февраля 2009. [www.webcitation.org/618HTpjNt Архивировано из первоисточника 22 августа 2011].
  • [www.open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf WG14 N1124] (англ.). ISO/IEC 9899 — Programming languages — C — Approved standards. ISO/IEC JTC1/SC22/WG14 (6 мая 2005). — Стандарт ISO/IEC 9899:1999 (C99) + ISO/IEC 9899:1999 Cor. 1:2001(E) (TC1 — Technical Corrigendum 1 от 2001 года) + ISO/IEC 9899:1999 Cor. 2:2004(E) (TC2 — Technical Corrigendum 2 от 2004 года). Проверено 20 февраля 2009. [www.webcitation.org/618HUIDTw Архивировано из первоисточника 22 августа 2011].
  • [www.open-std.org/JTC1/SC22/WG14/www/docs/C99RationaleV5.10.pdf C — The ISO Standard — Rationale, Revision 5.10] (англ.) (апрель 2004). — Обоснование и пояснения для стандарта C99. Проверено 20 февраля 2009. [www.webcitation.org/618HUxvqA Архивировано из первоисточника 22 августа 2011].
  • Романов Е. [ermak.cs.nstu.ru/cprog/HTML/index.htm Си/Си++. От дилетанта до профессионала]. ermak.cs.nstu.ru. Проверено 25 мая 2015.


Отрывок, характеризующий Си (язык программирования)


Года два тому назад, в 1808 году, вернувшись в Петербург из своей поездки по имениям, Пьер невольно стал во главе петербургского масонства. Он устроивал столовые и надгробные ложи, вербовал новых членов, заботился о соединении различных лож и о приобретении подлинных актов. Он давал свои деньги на устройство храмин и пополнял, на сколько мог, сборы милостыни, на которые большинство членов были скупы и неаккуратны. Он почти один на свои средства поддерживал дом бедных, устроенный орденом в Петербурге. Жизнь его между тем шла по прежнему, с теми же увлечениями и распущенностью. Он любил хорошо пообедать и выпить, и, хотя и считал это безнравственным и унизительным, не мог воздержаться от увеселений холостых обществ, в которых он участвовал.
В чаду своих занятий и увлечений Пьер однако, по прошествии года, начал чувствовать, как та почва масонства, на которой он стоял, тем более уходила из под его ног, чем тверже он старался стать на ней. Вместе с тем он чувствовал, что чем глубже уходила под его ногами почва, на которой он стоял, тем невольнее он был связан с ней. Когда он приступил к масонству, он испытывал чувство человека, доверчиво становящего ногу на ровную поверхность болота. Поставив ногу, он провалился. Чтобы вполне увериться в твердости почвы, на которой он стоял, он поставил другую ногу и провалился еще больше, завяз и уже невольно ходил по колено в болоте.
Иосифа Алексеевича не было в Петербурге. (Он в последнее время отстранился от дел петербургских лож и безвыездно жил в Москве.) Все братья, члены лож, были Пьеру знакомые в жизни люди и ему трудно было видеть в них только братьев по каменьщичеству, а не князя Б., не Ивана Васильевича Д., которых он знал в жизни большею частию как слабых и ничтожных людей. Из под масонских фартуков и знаков он видел на них мундиры и кресты, которых они добивались в жизни. Часто, собирая милостыню и сочтя 20–30 рублей, записанных на приход, и большею частию в долг с десяти членов, из которых половина были так же богаты, как и он, Пьер вспоминал масонскую клятву о том, что каждый брат обещает отдать всё свое имущество для ближнего; и в душе его поднимались сомнения, на которых он старался не останавливаться.
Всех братьев, которых он знал, он подразделял на четыре разряда. К первому разряду он причислял братьев, не принимающих деятельного участия ни в делах лож, ни в делах человеческих, но занятых исключительно таинствами науки ордена, занятых вопросами о тройственном наименовании Бога, или о трех началах вещей, сере, меркурии и соли, или о значении квадрата и всех фигур храма Соломонова. Пьер уважал этот разряд братьев масонов, к которому принадлежали преимущественно старые братья, и сам Иосиф Алексеевич, по мнению Пьера, но не разделял их интересов. Сердце его не лежало к мистической стороне масонства.
Ко второму разряду Пьер причислял себя и себе подобных братьев, ищущих, колеблющихся, не нашедших еще в масонстве прямого и понятного пути, но надеющихся найти его.
К третьему разряду он причислял братьев (их было самое большое число), не видящих в масонстве ничего, кроме внешней формы и обрядности и дорожащих строгим исполнением этой внешней формы, не заботясь о ее содержании и значении. Таковы были Виларский и даже великий мастер главной ложи.
К четвертому разряду, наконец, причислялось тоже большое количество братьев, в особенности в последнее время вступивших в братство. Это были люди, по наблюдениям Пьера, ни во что не верующие, ничего не желающие, и поступавшие в масонство только для сближения с молодыми богатыми и сильными по связям и знатности братьями, которых весьма много было в ложе.
Пьер начинал чувствовать себя неудовлетворенным своей деятельностью. Масонство, по крайней мере то масонство, которое он знал здесь, казалось ему иногда, основано было на одной внешности. Он и не думал сомневаться в самом масонстве, но подозревал, что русское масонство пошло по ложному пути и отклонилось от своего источника. И потому в конце года Пьер поехал за границу для посвящения себя в высшие тайны ордена.

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


На Пьера опять нашла та тоска, которой он так боялся. Он три дня после произнесения своей речи в ложе лежал дома на диване, никого не принимая и никуда не выезжая.
В это время он получил письмо от жены, которая умоляла его о свидании, писала о своей грусти по нем и о желании посвятить ему всю свою жизнь.
В конце письма она извещала его, что на днях приедет в Петербург из за границы.
Вслед за письмом в уединение Пьера ворвался один из менее других уважаемых им братьев масонов и, наведя разговор на супружеские отношения Пьера, в виде братского совета, высказал ему мысль о том, что строгость его к жене несправедлива, и что Пьер отступает от первых правил масона, не прощая кающуюся.
В это же самое время теща его, жена князя Василья, присылала за ним, умоляя его хоть на несколько минут посетить ее для переговоров о весьма важном деле. Пьер видел, что был заговор против него, что его хотели соединить с женою, и это было даже не неприятно ему в том состоянии, в котором он находился. Ему было всё равно: Пьер ничто в жизни не считал делом большой важности, и под влиянием тоски, которая теперь овладела им, он не дорожил ни своею свободою, ни своим упорством в наказании жены.
«Никто не прав, никто не виноват, стало быть и она не виновата», думал он. – Ежели Пьер не изъявил тотчас же согласия на соединение с женою, то только потому, что в состоянии тоски, в котором он находился, он не был в силах ничего предпринять. Ежели бы жена приехала к нему, он бы теперь не прогнал ее. Разве не всё равно было в сравнении с тем, что занимало Пьера, жить или не жить с женою?
Не отвечая ничего ни жене, ни теще, Пьер раз поздним вечером собрался в дорогу и уехал в Москву, чтобы повидаться с Иосифом Алексеевичем. Вот что писал Пьер в дневнике своем.
«Москва, 17 го ноября.
Сейчас только приехал от благодетеля, и спешу записать всё, что я испытал при этом. Иосиф Алексеевич живет бедно и страдает третий год мучительною болезнью пузыря. Никто никогда не слыхал от него стона, или слова ропота. С утра и до поздней ночи, за исключением часов, в которые он кушает самую простую пищу, он работает над наукой. Он принял меня милостиво и посадил на кровати, на которой он лежал; я сделал ему знак рыцарей Востока и Иерусалима, он ответил мне тем же, и с кроткой улыбкой спросил меня о том, что я узнал и приобрел в прусских и шотландских ложах. Я рассказал ему всё, как умел, передав те основания, которые я предлагал в нашей петербургской ложе и сообщил о дурном приеме, сделанном мне, и о разрыве, происшедшем между мною и братьями. Иосиф Алексеевич, изрядно помолчав и подумав, на всё это изложил мне свой взгляд, который мгновенно осветил мне всё прошедшее и весь будущий путь, предлежащий мне. Он удивил меня, спросив о том, помню ли я, в чем состоит троякая цель ордена: 1) в хранении и познании таинства; 2) в очищении и исправлении себя для воспринятия оного и 3) в исправлении рода человеческого чрез стремление к таковому очищению. Какая есть главнейшая и первая цель из этих трех? Конечно собственное исправление и очищение. Только к этой цели мы можем всегда стремиться независимо от всех обстоятельств. Но вместе с тем эта то цель и требует от нас наиболее трудов, и потому, заблуждаясь гордостью, мы, упуская эту цель, беремся либо за таинство, которое недостойны воспринять по нечистоте своей, либо беремся за исправление рода человеческого, когда сами из себя являем пример мерзости и разврата. Иллюминатство не есть чистое учение именно потому, что оно увлеклось общественной деятельностью и преисполнено гордости. На этом основании Иосиф Алексеевич осудил мою речь и всю мою деятельность. Я согласился с ним в глубине души своей. По случаю разговора нашего о моих семейных делах, он сказал мне: – Главная обязанность истинного масона, как я сказал вам, состоит в совершенствовании самого себя. Но часто мы думаем, что, удалив от себя все трудности нашей жизни, мы скорее достигнем этой цели; напротив, государь мой, сказал он мне, только в среде светских волнений можем мы достигнуть трех главных целей: 1) самопознания, ибо человек может познавать себя только через сравнение, 2) совершенствования, только борьбой достигается оно, и 3) достигнуть главной добродетели – любви к смерти. Только превратности жизни могут показать нам тщету ее и могут содействовать – нашей врожденной любви к смерти или возрождению к новой жизни. Слова эти тем более замечательны, что Иосиф Алексеевич, несмотря на свои тяжкие физические страдания, никогда не тяготится жизнию, а любит смерть, к которой он, несмотря на всю чистоту и высоту своего внутреннего человека, не чувствует еще себя достаточно готовым. Потом благодетель объяснил мне вполне значение великого квадрата мироздания и указал на то, что тройственное и седьмое число суть основание всего. Он советовал мне не отстраняться от общения с петербургскими братьями и, занимая в ложе только должности 2 го градуса, стараться, отвлекая братьев от увлечений гордости, обращать их на истинный путь самопознания и совершенствования. Кроме того для себя лично советовал мне первее всего следить за самим собою, и с этою целью дал мне тетрадь, ту самую, в которой я пишу и буду вписывать впредь все свои поступки».
«Петербург, 23 го ноября.
«Я опять живу с женой. Теща моя в слезах приехала ко мне и сказала, что Элен здесь и что она умоляет меня выслушать ее, что она невинна, что она несчастна моим оставлением, и многое другое. Я знал, что ежели я только допущу себя увидать ее, то не в силах буду более отказать ей в ее желании. В сомнении своем я не знал, к чьей помощи и совету прибегнуть. Ежели бы благодетель был здесь, он бы сказал мне. Я удалился к себе, перечел письма Иосифа Алексеевича, вспомнил свои беседы с ним, и из всего вывел то, что я не должен отказывать просящему и должен подать руку помощи всякому, тем более человеку столь связанному со мною, и должен нести крест свой. Но ежели я для добродетели простил ее, то пускай и будет мое соединение с нею иметь одну духовную цель. Так я решил и так написал Иосифу Алексеевичу. Я сказал жене, что прошу ее забыть всё старое, прошу простить мне то, в чем я мог быть виноват перед нею, а что мне прощать ей нечего. Мне радостно было сказать ей это. Пусть она не знает, как тяжело мне было вновь увидать ее. Устроился в большом доме в верхних покоях и испытываю счастливое чувство обновления».


Как и всегда, и тогда высшее общество, соединяясь вместе при дворе и на больших балах, подразделялось на несколько кружков, имеющих каждый свой оттенок. В числе их самый обширный был кружок французский, Наполеоновского союза – графа Румянцева и Caulaincourt'a. В этом кружке одно из самых видных мест заняла Элен, как только она с мужем поселилась в Петербурге. У нее бывали господа французского посольства и большое количество людей, известных своим умом и любезностью, принадлежавших к этому направлению.
Элен была в Эрфурте во время знаменитого свидания императоров, и оттуда привезла эти связи со всеми Наполеоновскими достопримечательностями Европы. В Эрфурте она имела блестящий успех. Сам Наполеон, заметив ее в театре, сказал про нее: «C'est un superbe animal». [Это прекрасное животное.] Успех ее в качестве красивой и элегантной женщины не удивлял Пьера, потому что с годами она сделалась еще красивее, чем прежде. Но удивляло его то, что за эти два года жена его успела приобрести себе репутацию
«d'une femme charmante, aussi spirituelle, que belle». [прелестной женщины, столь же умной, сколько красивой.] Известный рrince de Ligne [князь де Линь] писал ей письма на восьми страницах. Билибин приберегал свои mots [словечки], чтобы в первый раз сказать их при графине Безуховой. Быть принятым в салоне графини Безуховой считалось дипломом ума; молодые люди прочитывали книги перед вечером Элен, чтобы было о чем говорить в ее салоне, и секретари посольства, и даже посланники, поверяли ей дипломатические тайны, так что Элен была сила в некотором роде. Пьер, который знал, что она была очень глупа, с странным чувством недоуменья и страха иногда присутствовал на ее вечерах и обедах, где говорилось о политике, поэзии и философии. На этих вечерах он испытывал чувство подобное тому, которое должен испытывать фокусник, ожидая всякий раз, что вот вот обман его откроется. Но оттого ли, что для ведения такого салона именно нужна была глупость, или потому что сами обманываемые находили удовольствие в этом обмане, обман не открывался, и репутация d'une femme charmante et spirituelle так непоколебимо утвердилась за Еленой Васильевной Безуховой, что она могла говорить самые большие пошлости и глупости, и всё таки все восхищались каждым ее словом и отыскивали в нем глубокий смысл, которого она сама и не подозревала.
Пьер был именно тем самым мужем, который нужен был для этой блестящей, светской женщины. Он был тот рассеянный чудак, муж grand seigneur [большой барин], никому не мешающий и не только не портящий общего впечатления высокого тона гостиной, но, своей противоположностью изяществу и такту жены, служащий выгодным для нее фоном. Пьер, за эти два года, вследствие своего постоянного сосредоточенного занятия невещественными интересами и искреннего презрения ко всему остальному, усвоил себе в неинтересовавшем его обществе жены тот тон равнодушия, небрежности и благосклонности ко всем, который не приобретается искусственно и который потому то и внушает невольное уважение. Он входил в гостиную своей жены как в театр, со всеми был знаком, всем был одинаково рад и ко всем был одинаково равнодушен. Иногда он вступал в разговор, интересовавший его, и тогда, без соображений о том, были ли тут или нет les messieurs de l'ambassade [служащие при посольстве], шамкая говорил свои мнения, которые иногда были совершенно не в тоне настоящей минуты. Но мнение о чудаке муже de la femme la plus distinguee de Petersbourg [самой замечательной женщины в Петербурге] уже так установилось, что никто не принимал au serux [всерьез] его выходок.
В числе многих молодых людей, ежедневно бывавших в доме Элен, Борис Друбецкой, уже весьма успевший в службе, был после возвращения Элен из Эрфурта, самым близким человеком в доме Безуховых. Элен называла его mon page [мой паж] и обращалась с ним как с ребенком. Улыбка ее в отношении его была та же, как и ко всем, но иногда Пьеру неприятно было видеть эту улыбку. Борис обращался с Пьером с особенной, достойной и грустной почтительностию. Этот оттенок почтительности тоже беспокоил Пьера. Пьер так больно страдал три года тому назад от оскорбления, нанесенного ему женой, что теперь он спасал себя от возможности подобного оскорбления во первых тем, что он не был мужем своей жены, во вторых тем, что он не позволял себе подозревать.
– Нет, теперь сделавшись bas bleu [синим чулком], она навсегда отказалась от прежних увлечений, – говорил он сам себе. – Не было примера, чтобы bas bleu имели сердечные увлечения, – повторял он сам себе неизвестно откуда извлеченное правило, которому несомненно верил. Но, странное дело, присутствие Бориса в гостиной жены (а он был почти постоянно), физически действовало на Пьера: оно связывало все его члены, уничтожало бессознательность и свободу его движений.
– Такая странная антипатия, – думал Пьер, – а прежде он мне даже очень нравился.
В глазах света Пьер был большой барин, несколько слепой и смешной муж знаменитой жены, умный чудак, ничего не делающий, но и никому не вредящий, славный и добрый малый. В душе же Пьера происходила за всё это время сложная и трудная работа внутреннего развития, открывшая ему многое и приведшая его ко многим духовным сомнениям и радостям.


Он продолжал свой дневник, и вот что он писал в нем за это время:
«24 ro ноября.
«Встал в восемь часов, читал Св. Писание, потом пошел к должности (Пьер по совету благодетеля поступил на службу в один из комитетов), возвратился к обеду, обедал один (у графини много гостей, мне неприятных), ел и пил умеренно и после обеда списывал пиесы для братьев. Ввечеру сошел к графине и рассказал смешную историю о Б., и только тогда вспомнил, что этого не должно было делать, когда все уже громко смеялись.
«Ложусь спать с счастливым и спокойным духом. Господи Великий, помоги мне ходить по стезям Твоим, 1) побеждать часть гневну – тихостью, медлением, 2) похоть – воздержанием и отвращением, 3) удаляться от суеты, но не отлучать себя от а) государственных дел службы, b) от забот семейных, с) от дружеских сношений и d) экономических занятий».
«27 го ноября.
«Встал поздно и проснувшись долго лежал на постели, предаваясь лени. Боже мой! помоги мне и укрепи меня, дабы я мог ходить по путям Твоим. Читал Св. Писание, но без надлежащего чувства. Пришел брат Урусов, беседовали о суетах мира. Рассказывал о новых предначертаниях государя. Я начал было осуждать, но вспомнил о своих правилах и слова благодетеля нашего о том, что истинный масон должен быть усердным деятелем в государстве, когда требуется его участие, и спокойным созерцателем того, к чему он не призван. Язык мой – враг мой. Посетили меня братья Г. В. и О., была приуготовительная беседа для принятия нового брата. Они возлагают на меня обязанность ритора. Чувствую себя слабым и недостойным. Потом зашла речь об объяснении семи столбов и ступеней храма. 7 наук, 7 добродетелей, 7 пороков, 7 даров Святого Духа. Брат О. был очень красноречив. Вечером совершилось принятие. Новое устройство помещения много содействовало великолепию зрелища. Принят был Борис Друбецкой. Я предлагал его, я и был ритором. Странное чувство волновало меня во всё время моего пребывания с ним в темной храмине. Я застал в себе к нему чувство ненависти, которое я тщетно стремлюсь преодолеть. И потому то я желал бы истинно спасти его от злого и ввести его на путь истины, но дурные мысли о нем не оставляли меня. Мне думалось, что его цель вступления в братство состояла только в желании сблизиться с людьми, быть в фаворе у находящихся в нашей ложе. Кроме тех оснований, что он несколько раз спрашивал, не находится ли в нашей ложе N. и S. (на что я не мог ему отвечать), кроме того, что он по моим наблюдениям не способен чувствовать уважения к нашему святому Ордену и слишком занят и доволен внешним человеком, чтобы желать улучшения духовного, я не имел оснований сомневаться в нем; но он мне казался неискренним, и всё время, когда я стоял с ним с глазу на глаз в темной храмине, мне казалось, что он презрительно улыбается на мои слова, и хотелось действительно уколоть его обнаженную грудь шпагой, которую я держал, приставленною к ней. Я не мог быть красноречив и не мог искренно сообщить своего сомнения братьям и великому мастеру. Великий Архитектон природы, помоги мне находить истинные пути, выводящие из лабиринта лжи».
После этого в дневнике было пропущено три листа, и потом было написано следующее:
«Имел поучительный и длинный разговор наедине с братом В., который советовал мне держаться брата А. Многое, хотя и недостойному, мне было открыто. Адонаи есть имя сотворившего мир. Элоим есть имя правящего всем. Третье имя, имя поизрекаемое, имеющее значение Всего . Беседы с братом В. подкрепляют, освежают и утверждают меня на пути добродетели. При нем нет места сомнению. Мне ясно различие бедного учения наук общественных с нашим святым, всё обнимающим учением. Науки человеческие всё подразделяют – чтобы понять, всё убивают – чтобы рассмотреть. В святой науке Ордена всё едино, всё познается в своей совокупности и жизни. Троица – три начала вещей – сера, меркурий и соль. Сера елейного и огненного свойства; она в соединении с солью, огненностью своей возбуждает в ней алкание, посредством которого притягивает меркурий, схватывает его, удерживает и совокупно производит отдельные тела. Меркурий есть жидкая и летучая духовная сущность – Христос, Дух Святой, Он».
«3 го декабря.
«Проснулся поздно, читал Св. Писание, но был бесчувствен. После вышел и ходил по зале. Хотел размышлять, но вместо того воображение представило одно происшествие, бывшее четыре года тому назад. Господин Долохов, после моей дуэли встретясь со мной в Москве, сказал мне, что он надеется, что я пользуюсь теперь полным душевным спокойствием, несмотря на отсутствие моей супруги. Я тогда ничего не отвечал. Теперь я припомнил все подробности этого свидания и в душе своей говорил ему самые злобные слова и колкие ответы. Опомнился и бросил эту мысль только тогда, когда увидал себя в распалении гнева; но недостаточно раскаялся в этом. После пришел Борис Друбецкой и стал рассказывать разные приключения; я же с самого его прихода сделался недоволен его посещением и сказал ему что то противное. Он возразил. Я вспыхнул и наговорил ему множество неприятного и даже грубого. Он замолчал и я спохватился только тогда, когда было уже поздно. Боже мой, я совсем не умею с ним обходиться. Этому причиной мое самолюбие. Я ставлю себя выше его и потому делаюсь гораздо его хуже, ибо он снисходителен к моим грубостям, а я напротив того питаю к нему презрение. Боже мой, даруй мне в присутствии его видеть больше мою мерзость и поступать так, чтобы и ему это было полезно. После обеда заснул и в то время как засыпал, услыхал явственно голос, сказавший мне в левое ухо: – „Твой день“.
«Я видел во сне, что иду я в темноте, и вдруг окружен собаками, но иду без страха; вдруг одна небольшая схватила меня за левое стегно зубами и не выпускает. Я стал давить ее руками. И только что я оторвал ее, как другая, еще большая, стала грызть меня. Я стал поднимать ее и чем больше поднимал, тем она становилась больше и тяжеле. И вдруг идет брат А. и взяв меня под руку, повел с собою и привел к зданию, для входа в которое надо было пройти по узкой доске. Я ступил на нее и доска отогнулась и упала, и я стал лезть на забор, до которого едва достигал руками. После больших усилий я перетащил свое тело так, что ноги висели на одной, а туловище на другой стороне. Я оглянулся и увидал, что брат А. стоит на заборе и указывает мне на большую аллею и сад, и в саду большое и прекрасное здание. Я проснулся. Господи, Великий Архитектон природы! помоги мне оторвать от себя собак – страстей моих и последнюю из них, совокупляющую в себе силы всех прежних, и помоги мне вступить в тот храм добродетели, коего лицезрения я во сне достигнул».
«7 го декабря.
«Видел сон, будто Иосиф Алексеевич в моем доме сидит, я рад очень, и желаю угостить его. Будто я с посторонними неумолчно болтаю и вдруг вспомнил, что это ему не может нравиться, и желаю к нему приблизиться и его обнять. Но только что приблизился, вижу, что лицо его преобразилось, стало молодое, и он мне тихо что то говорит из ученья Ордена, так тихо, что я не могу расслышать. Потом, будто, вышли мы все из комнаты, и что то тут случилось мудреное. Мы сидели или лежали на полу. Он мне что то говорил. А мне будто захотелось показать ему свою чувствительность и я, не вслушиваясь в его речи, стал себе воображать состояние своего внутреннего человека и осенившую меня милость Божию. И появились у меня слезы на глазах, и я был доволен, что он это приметил. Но он взглянул на меня с досадой и вскочил, пресекши свой разговор. Я обробел и спросил, не ко мне ли сказанное относилось; но он ничего не отвечал, показал мне ласковый вид, и после вдруг очутились мы в спальне моей, где стоит двойная кровать. Он лег на нее на край, и я будто пылал к нему желанием ласкаться и прилечь тут же. И он будто у меня спрашивает: „Скажите по правде, какое вы имеете главное пристрастие? Узнали ли вы его? Я думаю, что вы уже его узнали“. Я, смутившись сим вопросом, отвечал, что лень мое главное пристрастие. Он недоверчиво покачал головой. И я ему, еще более смутившись, отвечал, что я, хотя и живу с женою, по его совету, но не как муж жены своей. На это он возразил, что не должно жену лишать своей ласки, дал чувствовать, что в этом была моя обязанность. Но я отвечал, что я стыжусь этого, и вдруг всё скрылось. И я проснулся, и нашел в мыслях своих текст Св. Писания: Живот бе свет человеком, и свет во тме светит и тма его не объят . Лицо у Иосифа Алексеевича было моложавое и светлое. В этот день получил письмо от благодетеля, в котором он пишет об обязанностях супружества».
«9 го декабря.
«Видел сон, от которого проснулся с трепещущимся сердцем. Видел, будто я в Москве, в своем доме, в большой диванной, и из гостиной выходит Иосиф Алексеевич. Будто я тотчас узнал, что с ним уже совершился процесс возрождения, и бросился ему на встречу. Я будто его целую, и руки его, а он говорит: „Приметил ли ты, что у меня лицо другое?“ Я посмотрел на него, продолжая держать его в своих объятиях, и будто вижу, что лицо его молодое, но волос на голове нет, и черты совершенно другие. И будто я ему говорю: „Я бы вас узнал, ежели бы случайно с вами встретился“, и думаю между тем: „Правду ли я сказал?“ И вдруг вижу, что он лежит как труп мертвый; потом понемногу пришел в себя и вошел со мной в большой кабинет, держа большую книгу, писанную, в александрийский лист. И будто я говорю: „это я написал“. И он ответил мне наклонением головы. Я открыл книгу, и в книге этой на всех страницах прекрасно нарисовано. И я будто знаю, что эти картины представляют любовные похождения души с ее возлюбленным. И на страницах будто я вижу прекрасное изображение девицы в прозрачной одежде и с прозрачным телом, возлетающей к облакам. И будто я знаю, что эта девица есть ничто иное, как изображение Песни песней. И будто я, глядя на эти рисунки, чувствую, что я делаю дурно, и не могу оторваться от них. Господи, помоги мне! Боже мой, если это оставление Тобою меня есть действие Твое, то да будет воля Твоя; но ежели же я сам причинил сие, то научи меня, что мне делать. Я погибну от своей развратности, буде Ты меня вовсе оставишь».


Денежные дела Ростовых не поправились в продолжение двух лет, которые они пробыли в деревне.
Несмотря на то, что Николай Ростов, твердо держась своего намерения, продолжал темно служить в глухом полку, расходуя сравнительно мало денег, ход жизни в Отрадном был таков, и в особенности Митенька так вел дела, что долги неудержимо росли с каждым годом. Единственная помощь, которая очевидно представлялась старому графу, это была служба, и он приехал в Петербург искать места; искать места и вместе с тем, как он говорил, в последний раз потешить девчат.
Вскоре после приезда Ростовых в Петербург, Берг сделал предложение Вере, и предложение его было принято.
Несмотря на то, что в Москве Ростовы принадлежали к высшему обществу, сами того не зная и не думая о том, к какому они принадлежали обществу, в Петербурге общество их было смешанное и неопределенное. В Петербурге они были провинциалы, до которых не спускались те самые люди, которых, не спрашивая их к какому они принадлежат обществу, в Москве кормили Ростовы.
Ростовы в Петербурге жили так же гостеприимно, как и в Москве, и на их ужинах сходились самые разнообразные лица: соседи по Отрадному, старые небогатые помещики с дочерьми и фрейлина Перонская, Пьер Безухов и сын уездного почтмейстера, служивший в Петербурге. Из мужчин домашними людьми в доме Ростовых в Петербурге очень скоро сделались Борис, Пьер, которого, встретив на улице, затащил к себе старый граф, и Берг, который целые дни проводил у Ростовых и оказывал старшей графине Вере такое внимание, которое может оказывать молодой человек, намеревающийся сделать предложение.
Берг недаром показывал всем свою раненую в Аустерлицком сражении правую руку и держал совершенно не нужную шпагу в левой. Он так упорно и с такою значительностью рассказывал всем это событие, что все поверили в целесообразность и достоинство этого поступка, и Берг получил за Аустерлиц две награды.
В Финляндской войне ему удалось также отличиться. Он поднял осколок гранаты, которым был убит адъютант подле главнокомандующего и поднес начальнику этот осколок. Так же как и после Аустерлица, он так долго и упорно рассказывал всем про это событие, что все поверили тоже, что надо было это сделать, и за Финляндскую войну Берг получил две награды. В 19 м году он был капитан гвардии с орденами и занимал в Петербурге какие то особенные выгодные места.
Хотя некоторые вольнодумцы и улыбались, когда им говорили про достоинства Берга, нельзя было не согласиться, что Берг был исправный, храбрый офицер, на отличном счету у начальства, и нравственный молодой человек с блестящей карьерой впереди и даже прочным положением в обществе.
Четыре года тому назад, встретившись в партере московского театра с товарищем немцем, Берг указал ему на Веру Ростову и по немецки сказал: «Das soll mein Weib werden», [Она должна быть моей женой,] и с той минуты решил жениться на ней. Теперь, в Петербурге, сообразив положение Ростовых и свое, он решил, что пришло время, и сделал предложение.
Предложение Берга было принято сначала с нелестным для него недоумением. Сначала представилось странно, что сын темного, лифляндского дворянина делает предложение графине Ростовой; но главное свойство характера Берга состояло в таком наивном и добродушном эгоизме, что невольно Ростовы подумали, что это будет хорошо, ежели он сам так твердо убежден, что это хорошо и даже очень хорошо. Притом же дела Ростовых были очень расстроены, чего не мог не знать жених, а главное, Вере было 24 года, она выезжала везде, и, несмотря на то, что она несомненно была хороша и рассудительна, до сих пор никто никогда ей не сделал предложения. Согласие было дано.
– Вот видите ли, – говорил Берг своему товарищу, которого он называл другом только потому, что он знал, что у всех людей бывают друзья. – Вот видите ли, я всё это сообразил, и я бы не женился, ежели бы не обдумал всего, и это почему нибудь было бы неудобно. А теперь напротив, папенька и маменька мои теперь обеспечены, я им устроил эту аренду в Остзейском крае, а мне прожить можно в Петербурге при моем жалованьи, при ее состоянии и при моей аккуратности. Прожить можно хорошо. Я не из за денег женюсь, я считаю это неблагородно, но надо, чтоб жена принесла свое, а муж свое. У меня служба – у нее связи и маленькие средства. Это в наше время что нибудь такое значит, не так ли? А главное она прекрасная, почтенная девушка и любит меня…
Берг покраснел и улыбнулся.
– И я люблю ее, потому что у нее характер рассудительный – очень хороший. Вот другая ее сестра – одной фамилии, а совсем другое, и неприятный характер, и ума нет того, и эдакое, знаете?… Неприятно… А моя невеста… Вот будете приходить к нам… – продолжал Берг, он хотел сказать обедать, но раздумал и сказал: «чай пить», и, проткнув его быстро языком, выпустил круглое, маленькое колечко табачного дыма, олицетворявшее вполне его мечты о счастьи.
Подле первого чувства недоуменья, возбужденного в родителях предложением Берга, в семействе водворилась обычная в таких случаях праздничность и радость, но радость была не искренняя, а внешняя. В чувствах родных относительно этой свадьбы были заметны замешательство и стыдливость. Как будто им совестно было теперь за то, что они мало любили Веру, и теперь так охотно сбывали ее с рук. Больше всех смущен был старый граф. Он вероятно не умел бы назвать того, что было причиной его смущенья, а причина эта была его денежные дела. Он решительно не знал, что у него есть, сколько у него долгов и что он в состоянии будет дать в приданое Вере. Когда родились дочери, каждой было назначено по 300 душ в приданое; но одна из этих деревень была уж продана, другая заложена и так просрочена, что должна была продаваться, поэтому отдать имение было невозможно. Денег тоже не было.
Берг уже более месяца был женихом и только неделя оставалась до свадьбы, а граф еще не решил с собой вопроса о приданом и не говорил об этом с женою. Граф то хотел отделить Вере рязанское именье, то хотел продать лес, то занять денег под вексель. За несколько дней до свадьбы Берг вошел рано утром в кабинет к графу и с приятной улыбкой почтительно попросил будущего тестя объявить ему, что будет дано за графиней Верой. Граф так смутился при этом давно предчувствуемом вопросе, что сказал необдуманно первое, что пришло ему в голову.
– Люблю, что позаботился, люблю, останешься доволен…
И он, похлопав Берга по плечу, встал, желая прекратить разговор. Но Берг, приятно улыбаясь, объяснил, что, ежели он не будет знать верно, что будет дано за Верой, и не получит вперед хотя части того, что назначено ей, то он принужден будет отказаться.
– Потому что рассудите, граф, ежели бы я теперь позволил себе жениться, не имея определенных средств для поддержания своей жены, я поступил бы подло…
Разговор кончился тем, что граф, желая быть великодушным и не подвергаться новым просьбам, сказал, что он выдает вексель в 80 тысяч. Берг кротко улыбнулся, поцеловал графа в плечо и сказал, что он очень благодарен, но никак не может теперь устроиться в новой жизни, не получив чистыми деньгами 30 тысяч. – Хотя бы 20 тысяч, граф, – прибавил он; – а вексель тогда только в 60 тысяч.
– Да, да, хорошо, – скороговоркой заговорил граф, – только уж извини, дружок, 20 тысяч я дам, а вексель кроме того на 80 тысяч дам. Так то, поцелуй меня.


Наташе было 16 лет, и был 1809 год, тот самый, до которого она четыре года тому назад по пальцам считала с Борисом после того, как она с ним поцеловалась. С тех пор она ни разу не видала Бориса. Перед Соней и с матерью, когда разговор заходил о Борисе, она совершенно свободно говорила, как о деле решенном, что всё, что было прежде, – было ребячество, про которое не стоило и говорить, и которое давно было забыто. Но в самой тайной глубине ее души, вопрос о том, было ли обязательство к Борису шуткой или важным, связывающим обещанием, мучил ее.
С самых тех пор, как Борис в 1805 году из Москвы уехал в армию, он не видался с Ростовыми. Несколько раз он бывал в Москве, проезжал недалеко от Отрадного, но ни разу не был у Ростовых.
Наташе приходило иногда к голову, что он не хотел видеть ее, и эти догадки ее подтверждались тем грустным тоном, которым говаривали о нем старшие:
– В нынешнем веке не помнят старых друзей, – говорила графиня вслед за упоминанием о Борисе.
Анна Михайловна, в последнее время реже бывавшая у Ростовых, тоже держала себя как то особенно достойно, и всякий раз восторженно и благодарно говорила о достоинствах своего сына и о блестящей карьере, на которой он находился. Когда Ростовы приехали в Петербург, Борис приехал к ним с визитом.
Он ехал к ним не без волнения. Воспоминание о Наташе было самым поэтическим воспоминанием Бориса. Но вместе с тем он ехал с твердым намерением ясно дать почувствовать и ей, и родным ее, что детские отношения между ним и Наташей не могут быть обязательством ни для нее, ни для него. У него было блестящее положение в обществе, благодаря интимности с графиней Безуховой, блестящее положение на службе, благодаря покровительству важного лица, доверием которого он вполне пользовался, и у него были зарождающиеся планы женитьбы на одной из самых богатых невест Петербурга, которые очень легко могли осуществиться. Когда Борис вошел в гостиную Ростовых, Наташа была в своей комнате. Узнав о его приезде, она раскрасневшись почти вбежала в гостиную, сияя более чем ласковой улыбкой.
Борис помнил ту Наташу в коротеньком платье, с черными, блестящими из под локон глазами и с отчаянным, детским смехом, которую он знал 4 года тому назад, и потому, когда вошла совсем другая Наташа, он смутился, и лицо его выразило восторженное удивление. Это выражение его лица обрадовало Наташу.
– Что, узнаешь свою маленькую приятельницу шалунью? – сказала графиня. Борис поцеловал руку Наташи и сказал, что он удивлен происшедшей в ней переменой.
– Как вы похорошели!
«Еще бы!», отвечали смеющиеся глаза Наташи.
– А папа постарел? – спросила она. Наташа села и, не вступая в разговор Бориса с графиней, молча рассматривала своего детского жениха до малейших подробностей. Он чувствовал на себе тяжесть этого упорного, ласкового взгляда и изредка взглядывал на нее.
Мундир, шпоры, галстук, прическа Бориса, всё это было самое модное и сomme il faut [вполне порядочно]. Это сейчас заметила Наташа. Он сидел немножко боком на кресле подле графини, поправляя правой рукой чистейшую, облитую перчатку на левой, говорил с особенным, утонченным поджатием губ об увеселениях высшего петербургского света и с кроткой насмешливостью вспоминал о прежних московских временах и московских знакомых. Не нечаянно, как это чувствовала Наташа, он упомянул, называя высшую аристократию, о бале посланника, на котором он был, о приглашениях к NN и к SS.
Наташа сидела всё время молча, исподлобья глядя на него. Взгляд этот всё больше и больше, и беспокоил, и смущал Бориса. Он чаще оглядывался на Наташу и прерывался в рассказах. Он просидел не больше 10 минут и встал, раскланиваясь. Всё те же любопытные, вызывающие и несколько насмешливые глаза смотрели на него. После первого своего посещения, Борис сказал себе, что Наташа для него точно так же привлекательна, как и прежде, но что он не должен отдаваться этому чувству, потому что женитьба на ней – девушке почти без состояния, – была бы гибелью его карьеры, а возобновление прежних отношений без цели женитьбы было бы неблагородным поступком. Борис решил сам с собою избегать встреч с Наташей, нo, несмотря на это решение, приехал через несколько дней и стал ездить часто и целые дни проводить у Ростовых. Ему представлялось, что ему необходимо было объясниться с Наташей, сказать ей, что всё старое должно быть забыто, что, несмотря на всё… она не может быть его женой, что у него нет состояния, и ее никогда не отдадут за него. Но ему всё не удавалось и неловко было приступить к этому объяснению. С каждым днем он более и более запутывался. Наташа, по замечанию матери и Сони, казалась по старому влюбленной в Бориса. Она пела ему его любимые песни, показывала ему свой альбом, заставляла его писать в него, не позволяла поминать ему о старом, давая понимать, как прекрасно было новое; и каждый день он уезжал в тумане, не сказав того, что намерен был сказать, сам не зная, что он делал и для чего он приезжал, и чем это кончится. Борис перестал бывать у Элен, ежедневно получал укоризненные записки от нее и всё таки целые дни проводил у Ростовых.


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

На другой день графиня, пригласив к себе Бориса, переговорила с ним, и с того дня он перестал бывать у Ростовых.


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


Наташа с утра этого дня не имела ни минуты свободы, и ни разу не успела подумать о том, что предстоит ей.
В сыром, холодном воздухе, в тесноте и неполной темноте колыхающейся кареты, она в первый раз живо представила себе то, что ожидает ее там, на бале, в освещенных залах – музыка, цветы, танцы, государь, вся блестящая молодежь Петербурга. То, что ее ожидало, было так прекрасно, что она не верила даже тому, что это будет: так это было несообразно с впечатлением холода, тесноты и темноты кареты. Она поняла всё то, что ее ожидает, только тогда, когда, пройдя по красному сукну подъезда, она вошла в сени, сняла шубу и пошла рядом с Соней впереди матери между цветами по освещенной лестнице. Только тогда она вспомнила, как ей надо было себя держать на бале и постаралась принять ту величественную манеру, которую она считала необходимой для девушки на бале. Но к счастью ее она почувствовала, что глаза ее разбегались: она ничего не видела ясно, пульс ее забил сто раз в минуту, и кровь стала стучать у ее сердца. Она не могла принять той манеры, которая бы сделала ее смешною, и шла, замирая от волнения и стараясь всеми силами только скрыть его. И эта то была та самая манера, которая более всего шла к ней. Впереди и сзади их, так же тихо переговариваясь и так же в бальных платьях, входили гости. Зеркала по лестнице отражали дам в белых, голубых, розовых платьях, с бриллиантами и жемчугами на открытых руках и шеях.
Наташа смотрела в зеркала и в отражении не могла отличить себя от других. Всё смешивалось в одну блестящую процессию. При входе в первую залу, равномерный гул голосов, шагов, приветствий – оглушил Наташу; свет и блеск еще более ослепил ее. Хозяин и хозяйка, уже полчаса стоявшие у входной двери и говорившие одни и те же слова входившим: «charme de vous voir», [в восхищении, что вижу вас,] так же встретили и Ростовых с Перонской.
Две девочки в белых платьях, с одинаковыми розами в черных волосах, одинаково присели, но невольно хозяйка остановила дольше свой взгляд на тоненькой Наташе. Она посмотрела на нее, и ей одной особенно улыбнулась в придачу к своей хозяйской улыбке. Глядя на нее, хозяйка вспомнила, может быть, и свое золотое, невозвратное девичье время, и свой первый бал. Хозяин тоже проводил глазами Наташу и спросил у графа, которая его дочь?
– Charmante! [Очаровательна!] – сказал он, поцеловав кончики своих пальцев.
В зале стояли гости, теснясь у входной двери, ожидая государя. Графиня поместилась в первых рядах этой толпы. Наташа слышала и чувствовала, что несколько голосов спросили про нее и смотрели на нее. Она поняла, что она понравилась тем, которые обратили на нее внимание, и это наблюдение несколько успокоило ее.