Перейти к содержанию

Liza

Founded October 18, 2026 · Основан 18 октября 2026 года.

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

Liza — a systems programming language for portable computation with well-defined semantics and explicit control over execution costs.

Контролируемая стоимость — пока проектная цель, а не реализованная гарантия. Она означает возможность управлять аллокациями, копированием и другими затратами, а не одинаковую производительность на всех процессорах.

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

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

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

Начать с примера · Спецификация работающего ядра · План развития

Для чего создаётся Liza

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

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

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

Нативное исполнение. Основной результат — машинный код. Обязательная виртуальная машина и обязательный сборщик мусора в модель не закладываются. Будущие планировщик задач, сетевой reactor и другие компоненты runtime подключаются по потребности.

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

Основные понятия

Эта модель задаёт направление развития. Сейчас реализованы скалярные значения и функции; остальные сущности ещё не являются доступными конструкциями языка.

Понятие Смысл
Value — значение Данные, определяемые содержимым. Физическое место хранения не задаёт их смысл.
Transform — преобразование Вычисление новых значений из входных данных. Зависимости ограничивают допустимые оптимизации.
State — состояние Изменяемая сущность с идентичностью и явным правом на изменение.
View — представление Ограниченный доступ к данным без передачи владения, с определёнными границами и временем жизни.
Handle — право обращения Типизированный доступ к ресурсу; его допустимость не определяется произвольным адресом памяти.
Effect — эффект Наблюдаемое действие или контролируемая стоимость: изменение состояния, аллокация, I/O, блокировка.
Task — задача Логическая единица выполнения с определёнными правилами времени жизни, завершения и отмены.

Подробнее о модели языка.

Значения, владение и память

В основе Liza — значения и операции над ними. Универсальный указатель не вводится как основной способ выражать доступ к данным.

Для будущих составных копируемых значений привязка b = a означает логическое копирование содержимого. Компилятор вправе исключить физическую копию, если сохранит наблюдаемое поведение. Для больших буферов отдельно определяются копирование, временный доступ и передача владения; их стоимость должна быть оговорена до появления массивов.

Изменение локальной привязки и изменение объекта с идентичностью — разные действия. Будущий var позволит заменить локальное значение. Доступ к состоянию через другой объект потребует отдельного правила прав и времени жизни.

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

Определённая арифметика

Для целых фиксированной ширины обычные +, -, * проверяют переполнение и при ошибке завершают программу через trap. Операции +%, -%, *% явно выбирают вычисление по модулю 2ᴺ, где N — ширина типа.

Оптимизация обязана сохранять это поведение: выражение (x + 1) - 1 нельзя просто заменить на x, если первое сложение может переполниться. В невыбранной ветке if вычисление не выполняется и trap не возникает.

Целые шириной 8, 16, 32 и 64 бита, контекстные литералы, битовые операции и сдвиги уже работают. Насыщение и преобразования остаются проектами числовой модели.

Чистые вычисления и внешние действия

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

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

Что уже можно написать

Сегодня доступны i8/i16/i32/i64, u8/u16/u32/u64, bool, неизменяемые привязки, функции, сравнения, if/else, ранние возвраты, логические и побитовые операции, сдвиги, checked- и wrapping-арифметика.

Этот пример компилируется текущим прототипом:

fn in_range(value: u32, minimum: u32, maximum: u32) -> bool {
    if value < minimum {
        return false
    }
    return value <= maximum
}

fn main() -> u32 {
    if in_range(42, 10, 100) {
        return 42
    }
    return 0
}

Результат — нативная программа, возвращающая код завершения 42. Быстрый старт показывает, как собрать и запустить пример.

Пока отсутствуют структуры, массивы, строки, изменяемые привязки, циклы, модули, I/O, ownership и задачи. Поддерживается сборка для хоста; кросс-компиляция и другие выходные артефакты — будущие этапы.

Как проверить идею на практике

Три эталонные задачи постепенно усложняются вместе с языком:

  • Парсер RTP-заголовка: числовые операции, границы буфера и доступ без лишних копий.
  • Таблица соединений: составные значения, обновление данных и время жизни ресурсов.
  • Автомат узла кластера: варианты состояний, переходы и явная обработка ошибок.

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

Ближайшая цель — завершить Liza Core: числовую модель, локальные вычисления, составные значения, алгебраические типы и модули. Владение ресурсами, системные эффекты, конкурентность и распределённые приложения развиваются поэтапно после этой основы. План развития.