==== Формальное описание языка M ====

1. Аннотирование.

Аннотирование - это введение в код дополнительной вспомогательной семантической
информации с помощью аннотирующих слов. Аннотирующие слова могут стоять везде,
где могут стоять квалификаторы const и volatile. Все аннотирующие слова
начинаются с символа '$'.

Доступные аннотирующие слова:
    $nonnull - указатель не равен NULL;
    $nostack - объект выделен не на стеке;          \
    $heap    - объект выделен с помощью аллокатора. / спорно

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

2. M-объекты, S-объекты.

Синтаксис объявления аналогичен объявлению структур:
    async object Mobj {};
    object Sobj {};

"object" - объявление S-объекта. "async object" - объявление M-объекта.

3. Конструкторы и деструкторы.

Синтаксис отличается от принятого в С++:

    object Obj {
	init {
	  // Конструктор
	}

	release {
	  // Деструктор
	}
    };

4. Ссылки и слабые ссылки.

Синтаксис объявления повторяет синтаксис для указателей.
@ - ссылка, @@ - слабая ссылка. Ссылок на ссылки не существует.

5. parent-объекты. Отношение одиночного наследования задаётся добавлением
   слова "parent" перед объявлением первого члена структуры.

   Реализовать "parent" можно будет только после реализации выведения типов
   выражений.

6. Методы синхронные и асинхронные.

Привязка метода к объекту осуществляется при первом объявлении метода как
принадлежащего данному классу - синтаксисом, аналогичным C++. Объявления в теле
класса не требуются и не подерживаются:
    async void MyClass::my_method ();

7. Оператор call. Синтаксис: [call] function-call
   Задаёт точки вызова асинхронных методов других объектов и точки перехода к
   другим асинхронным цепочкам.

8. Асинхронные цепочки. Образуются автоматически, если в теле функции
   встречается оператор [async] [call].

9. События. Синтаксис будет определён позже.

