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

Milestones Liza

Текущий рубеж — 0.0.20: нативные программы для Linux x86-64, macOS ARM64 и Windows x86-64, обновление составных значений, консольный вывод, файловые ресурсы с владением и проверяемые эффекты.

Milestone означает работающую возможность с определённой семантикой и проверками. Это не обещание стабильного API или готовности к production. Даты будущих этапов не назначены: переход определяется критериями готовности. Подробный порядок работ — в roadmap.

18 октября 2026 — основание Liza

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

Достигнутые рубежи

Версия / этап Что стало возможным Проверяемый результат
Первый прототип Исходник → AST → Semantic IR → LLVM IR → машинный код; функции, затем bool и ветвления Нативная программа вычисляет результат; неисполняемая ветвь не вызывает trap
0.0.5 · Числовая модель Целые фиксированных ширин, checked/wrapping/saturating, деление, сдвиги и явные преобразования Граничные значения и обязательные traps сохраняются при O0/O2
0.0.6 · Изменяемые привязки var, присваивание и области видимости Новые значения и слияния ветвей выражены через SSA/phi
0.0.7 · Структурированные циклы while, break, continue, вложенные циклы Корректная передача значений между итерациями, ранние возвраты и сохранение незавершения
0.0.8 · Copy и move Независимые значения, явное перемещение, восстановление var Use-after-move отклоняется на ветвлениях и обратных рёбрах циклов
0.0.9 · Структуры-значения Поля, вложенные структуры, аргументы и результаты функций Составные значения проходят через SSA/phi без адресуемых полей в семантике языка
0.0.10 · Массивы и views Фиксированные массивы, проверка границ, readonly View<T> Ограниченный доступ к пакету без копирования массива в проверенном RTP-тракте
0.0.11 · Ожидаемые ошибки enum, исчерпывающий match, Option, Result RTP-парсер возвращает Result<RtpHeader,ParseError> для корректных и некорректных входов
0.0.12 · Hello, Liza! Text, консоль, проверяемые pure/io Вывод, порядок эффектов и ошибки проверяются при O0/O2
0.0.12 · Три платформы Linux, macOS и Windows runtime, сборка нативных исполняемых файлов ELF на Linux x86-64, Mach-O на macOS ARM64, PE .exe на Windows x86-64
0.0.13 · Файл → RTP Ограниченное чтение, FileBuffer, FileFailure Настоящий бинарный файл → readonly view → парсер → консоль
0.0.14 · Ресурсы Move-only File, открытие, чтение чанками и закрытие Владение проверяется на нормальных выходах и переходах CFG
0.0.15 · Обновления Поля и элементы у var, вложенные пути Независимость копий, лексические заимствования, порядок вычислений и bounds traps
0.0.16 · Таблица соединений ID с поколениями, get/add/edit/del на самой Liza Обновление уникального владельца без полной копии таблицы в проверенном цикле; независимые снимки сохраняются
0.0.17 · Модули import, pub, приватные поля и номинальные типы Ромбовидный импорт сохраняет идентичность; модульная таблица сохраняет выбранный тракт без полной копии
0.0.18 · Generics Параметры типов и вместимости, вывод аргументов и мономорфизация Одна generic-таблица сохраняет владение и проверенный тракт обновлений без полной копии
0.0.19 · Регионы Bounded storage, move-only буферы, отдельный анализ зависимостей и alloc Запрет преждевременного закрытия, атомарный отказ выделения, чтение и обновление без аллокаций
0.0.20 · Bounded Vec Линейные результаты и изменяемый инициализированный префикс Возврат владения при ошибке, readonly views, без аллокаций и полной копии хранилища в проверенном цикле

Текущий результат: нативная программа

fn main() -> u32 : io {
    match console.println("Hello, Liza!") {
        Ok(written) => { return 0 }
        Err(error) => { return 1 }
    }
}

Один исходник собирается на каждой из трёх поддержанных host-платформ. Компилятор написан на Python, но готовой программе Python не нужен. Язык понижается в LLVM IR напрямую; C используется для платформенной runtime консоли. Кросс-компиляция пока не реализована.

Этот рубеж включает обработку частичного вывода, закрытого stdout и pipe, UTF-8 текст, вывод чисел и сохранение обязательных traps. Windows дополнительно проверяется на Unicode-вывод в консоль и полный 32-битный код завершения. Объём платформенных проверок различается: POSIX signal-тесты и Windows handle-тесты проверяют соответствующие реализации одного API.

Собрать Hello World · Контракт I/O.

0.0.13 — первый файловый инструмент

Реализовано: file.read, буфер 2 КиБ, ошибки через Result, пример rtp_file.liza. Контракт, ограничения и запуск.

Бинарный файл → буфер ограниченной вместимости → View<u8> → чистый RTP-парсер → консольный результат.

Контракт этапа:

  • Чтение не увеличивает буфер скрыто; превышение вместимости обнаруживается.
  • Доступен только диапазон инициализированных байтов; владение при заполнении определено.
  • Ошибки файлового ввода, формата RTP и вывода остаются разными значениями.
  • Закрытие вызывается на успешном и ошибочном пути; приоритет ошибок определён.
  • Передача заполненного буфера парсеру не копирует весь пакет в выбранном тракте.

0.0.14 — файловые ресурсы с владением

Реализовано: File, file.open, чтение чанками и file.close(move file). Компилятор запрещает копирование, повторное использование и пропущенное закрытие на нормальном выходе. Пример file_stream.liza обрабатывает файлы больше 2 КиБ, сохраняя фиксированную вместимость одного чанка. Контракт ресурсов.

0.0.15 — обновление составных значений

Реализовано: var позволяет обновлять поля структур и элементы массивов, включая вложенные пути и динамические индексы. Копии независимы, readonly views блокируют запись, проверки границ сохраняют trap. Индексы и их проверки предшествуют правой части; ветвления и циклы объединяют целые значения. Частичных перемещений и mutable views нет.

Пример: value_updates.liza. Полный контракт.

0.0.16 — таблица соединений и стоимость обновления

Функциональный срез: 64/4096 слотов, ID с поколением, get/add/edit/del, вывод слота из обращения при исчерпании поколений, независимые копии. Новых конструкций языка нет. Чтение не материализует всю таблицу. В проверенном тракте единственного владельца edit не копирует таблицу, включая обратное ребро цикла. Проверка стоимости охватывает 64/4096/16384 слота; живые снимки сохраняют независимость. Контракт и результаты.

0.0.17 — пользовательские модули

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

0.0.18 — generics

Generic-функции, структуры и параметры N: u32 позволяют переиспользовать алгоритмы для разных типов и вместимостей. Проверки специализаций сохраняют владение, приватность и traps. Контракт и примеры.

0.0.19 — регионы и буферы

Логическое владение буфером отделено от владения хранилищем. Result и функции сохраняют зависимость от региона; release завершает её, close освобождает память. Контракт.

0.0.20 — линейные результаты и bounded Vec

(next, item) = vec.pop(move current) потребляет результат целиком и переносит обязанности каждому компоненту. Вектор хранит только инициализированный префикс; Full и OutOfBounds возвращают прежнего владельца. Фиксированная вместимость, лексические views и явный release сохраняют модель регионов. Контракт и пример.

Дальнейшие рубежи

Явный рост коллекций и полноценные строки UTF-8; затем расширенная модель эффектов, FFI, задачи и сеть. Таблица соединений и автомат узла кластера будут проверять модель на эталонных задачах.

Контролируемая стоимость, переносимость семантики и возможность self-hosting остаются направлениями развития. Они требуют отдельных подтверждений по мере роста языка.