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: числовую модель, локальные вычисления, составные значения, алгебраические типы и модули. Владение ресурсами, системные эффекты, конкурентность и распределённые приложения развиваются поэтапно после этой основы. План развития.