From a8d42f86c451062807053b9b01f17300f89fbf6a Mon Sep 17 00:00:00 2001 From: samsonium Date: Mon, 19 Oct 2026 16:49:07 +0300 Subject: [PATCH] doc: add `operators` and `types_system` docs --- docs/ru/reference/compiler_cli.md | 2 -- docs/ru/reference/operators.md | 38 ++++++++++++++++++++++ docs/ru/reference/types_system.md | 52 +++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-) delete mode 100644 docs/ru/reference/compiler_cli.md diff --git a/docs/ru/reference/compiler_cli.md b/docs/ru/reference/compiler_cli.md deleted file mode 100644 index dff6902..0000000 --- a/docs/ru/reference/compiler_cli.md +++ /dev/null @@ -1,2 +0,0 @@ -# Интерфейс компилятора - diff --git a/docs/ru/reference/operators.md b/docs/ru/reference/operators.md index e6f177e..dcf09c1 100644 --- a/docs/ru/reference/operators.md +++ b/docs/ru/reference/operators.md @@ -1,2 +1,40 @@ # Операторы +FZLang поддерживает арифметические, логические и унарные операции. +Во время работы бинарные операции достают со стека два значения, и обратно кладут результат на стек. +Унарные операции достают одно значение со стека, а затем кладут результат обратно на стек. + +## Арифметические операции + +| Операция | Допустимые типы | Описание | +| -------- | --------------- | -------- | +| `N + N` | *все числовые* | Сложение двух операндов | +| `N - N` | *все числовые* | Вычитание правого операнда из левого | +| `N * N` | *все числовые* | Переменожение двух операндов | +| `N / N` | *все числовые* | Деление левого операнда на правый | +| `N % N` | *все числовые* | Получение остатка от деления левого операнда на правый | +| `N ^ N` | *все числовые* | Возведение левого операнда в степень правого | +| `-N` | *все числовые* | Инверсия операнда | + +## Операции сравнения + +| Операция | Допустимые типы | Описание | +| -------- | --------------- | -------- | +| `N == N` | *все числовые*, булевы, объекты, строки | Сравнить равенство операндов | +| `N != N` | *все числовые*, булевы, объекты, строки | Сравнить неравенство операндов | +| `N > N` | *все числовые* | Проверить, что левый операнд больше правого | +| `N >= N` | *все числовые* | Проверить, что левый операнд больше или равен правому | +| `N < N` | *все числовые* | Проверить, что левый операнд меньше правого | +| `N <= N` | *все числовые* | Проверить, что левый операнд меньше или равен правому | +| `!N` | булевы | Инвертировать операнд | + +> Важно: +> В случае сравнения объектов (`==`, `!=`), сравниваются адреса, а не значения! + +## Логические операции + +| Операция | Допустимые типы | Описание | +| -------- | --------------- | -------- | +| `N && N` | булевы | Логическое **И** двух операндов | +| `N || N` | булевы | Логическое **ИЛИ** двух операндов | + diff --git a/docs/ru/reference/types_system.md b/docs/ru/reference/types_system.md index 540fb6e..53b8ef0 100644 --- a/docs/ru/reference/types_system.md +++ b/docs/ru/reference/types_system.md @@ -1,2 +1,54 @@ # Система типов +FZLang имеет две основы для типов: примитивы и объекты. + +Примитивами являются строки, числовые типы, булевы и скрытый тип - "объект". +Объектами на данный момент являются экземпляры классов, а также литерал `null`. + +## Таблица типов + +| Внутреннее имя | Синтаксическое имя | Описание | +| --------------- | ------------------ | -------- | +| FZL_TYPE_NULL | *отстутсвует* | *на данный момент не используется* | +| FZL_TYPE_OBJECT | *отстутсвует* | экземпляр класса или литерал `null` | +| FZL_TYPE_STRING | `str` | строка | +| FZL_TYPE_CHAR | `char` | *на данный момент не используется* | +| FZL_TYPE_BOOL | `bool` | булева | +| FZL_TYPE_INT8 | `i8` | 8-битное знаковое число | +| FZL_TYPE_UINT8 | `u8` | 8-битное беззнаковое число | +| FZL_TYPE_INT16 | `i16` | 16-битное знаковое число | +| FZL_TYPE_UINT16 | `u16` | 16-битное беззнаковое число | +| FZL_TYPE_INT32 | `i32` | 32-битное знаковое число | +| FZL_TYPE_UINT32 | `u32` | 32-битное беззнаковое число | +| FZL_TYPE_INT64 | `i64` | 64-битное знаковое число | +| FZL_TYPE_UINT64 | `u64` | 64-битное беззнаковое число | +| FZL_TYPE_INT | `int` | знаковое число размером с машинное слово | +| FZL_TYPE_UINT | `uint` | беззнаковое число размером с машинное слово | + + +## Совместимость + +При проверке совместимости типов работают следующие правила: + +1. Если оба типа - объекты (`FZL_TYPE_OBJECT`), то: + 1. Если один из типов имеет имя класса ``, проверка **пройдена**; + 2. Если оба типа имеют одинаковое имя класса, проверка **пройдена**; + 3. В ином случае проверка **не пройдена**. +2. Если типы равны, проверка **пройдена**; +3. Если оба типа - числовые (`u8`..`uint`, `i8`..`int`), проверка **пройдена**; +4. Если ни одно правило из вышеперечисленных не сработало, то проверка **не пройдена**. + +**пройдена** = типы совместимы, **не пройдена** - не совместимы. + +## Работа в рантайме + +Для примитивов (т.е., не `FZL_TYPE_OBJECT`), значения используются прямо. +Это значит, что они все операции, работающие со значениями используют для работы то значение, что лежит в контейнере на стеке. + +Объектные типы хранятся на стеке как **ссылки на объект**. +Для них валидные такие операции, как: + +- `FZL_OPCODE_ESCAPE_OBJECT` (эвакуация объекта в родительское окружение) +- `FZL_OPCODE_GET_FIELD N` (чтение поля с индексом `N` из объекта) +- `FZL_OPCODE_SET_FIELD N` (запись значения в поле объекта с индексом `N`) +