Skip to content

Манифест проектирования YaoXiang(爻象) ​

Версия: v2.0.0 Статус: Официальный релиз Автор: Чэньсюй + сообщество YaoXiang Дата: 2026-05-31


«Дао рождает единое, единое рождает двое, двое рождает трое, трое рождает десять тысяч вещей.» — «Дао Дэ Цзин»

Типы — это Дао, из которого рождается всё сущее.


I. Зачем создавать YaoXiang? ​

1.1 Заполнение языкового пробела ​

В долгой истории языков программирования мы видели рождение и развитие бесчисленных превосходных языков: язык C принёс революцию эффективности в системном программировании, Python создал опыт программирования, доступный каждому, Rust доказал, что безопасность памяти и производительность могут сосуществовать, TypeScript сделал крупные фронтенд-проекты поддерживаемыми. Однако, рассматривая современную языковую экосистему, мы всё ещё обнаруживаем очевидный разрыв — ни один язык не способен одновременно удовлетворить следующие три ключевые потребности:

ПотребностьПроблемы существующих решений
Типовая безопасностьRust слишком строг, крутая кривая обучения; TypeScript использует опциональные типы и не может обеспечить гарантии на этапе компиляции
Естественный синтаксисСинтаксис Rust сложен и непонятен; функциональный порог Haskell слишком высок; традиционные статические языки многословны и громоздки
AI-дружественностьСуществующие языки имеют много синтаксических неоднозначностей, сложный AST, скрытое поведение, которое трудно предсказать, что ограничивает точность генерации и модификации кода с помощью AI

YaoXiang был создан именно для заполнения этого пробела. Мы верим: язык программирования должен быть одновременно мощным и доступным, безопасным и эффективным, строгим и элегантным.

1.2 Решаемые практические проблемы ​

Проблема первая: фрагментация систем типов

Современные языки программирования демонстрируют серьёзную фрагментацию в системах типов. Статически типизированные языки стремятся к абсолютной корректности на этапе компиляции, но часто жертвуют эффективностью разработки; динамически типизированные языки обеспечивают гибкость, но обнаруживают трудно поддерживаемые дефекты в крупных проектах. YaoXiang предлагает унифицированную абстрактную структуру «всё есть тип» (一切皆类型), делая типы основной линией, пронизывающей дизайн языка, а не запоздалой заплаткой.

Проблема вторая: дилемма между безопасностью памяти и производительностью

Долгое время разработчики были вынуждены делать трудный выбор между безопасностью памяти и производительностью во время выполнения. GC (сборка мусора), хотя и освобождает разработчика, приносит колебания задержки и накладные расходы памяти; ручное управление памятью, хотя и эффективно, опасно, как хождение по канату. YaoXiang использует модель владения в стиле Rust, устраняя гонки данных и утечки памяти на этапе компиляции, сохраняя при этом абстракции с нулевой стоимостью и достигая высокой производительности без GC.

Проблема третья: когнитивная нагрузка асинхронного программирования

Современные приложения немыслимы без сети и параллелизма, а асинхронное программирование всегда было кошмаром программистов. Вложенные функции обратного вызова, цепочки Promise, синтаксис async/await — каждое решение увеличивает сложность кода. YaoXiang переработал модель асинхронности: достаточно добавить метку spawn после сигнатуры функции, и компилятор автоматически обработает все асинхронные детали, делая параллельное программирование таким же естественным, как синхронный код.

Проблема четвёртая: узкое место AI-ассистированного программирования

Когда AI начинает помогать разработчикам писать код, выбор дизайна языка становится критически важным. Расплывчатые синтаксические правила, неявные преобразования типов, сложный синтаксический сахар — эти особенности, к которым уже привыкли люди-программисты, становятся препятствием для понимания и генерации кода AI. YaoXiang с самого начала дизайна сделал «AI-дружественность» ключевой целью: строгие правила отступов, явные границы блоков кода, недвусмысленные синтаксические структуры позволяют AI точно понимать, генерировать и модифицировать код.

1.3 Философские корни языка ​

Название YaoXiang происходит от «爻» (Yao) и «象» (Xiang) из «И Цзин» (Книга Перемен). «爻» — это базовые символы, составляющие гексаграммы, символизирующие изменения инь и ян, взаимное рождение движения и покоя; «象» — это внешнее проявление сущности вещей, представляющее все явления и охватывающее все сущее.

Эта философская идея отражена в каждой детали дизайна языка:

  • Единство (统一性): подобно тому, как простые символы триграмм образуют сложные гексаграммы, YaoXiang использует несколько ключевых концепций (типы, функции, конструкторы) для построения полной модели программирования
  • Иерархичность (层次性): подобно тому, как образы делятся на врождённые и приобретённые, система типов YaoXiang имеет чёткую иерархическую структуру — от примитивных типов к дженерикам, от значений к метатипам
  • Изменчивость (变化性): подобно непрерывному чередованию инь и ян, бесконечному разнообразию изменений, YaoXiang поддерживает зависимые типы, позволяя типам эволюционировать в зависимости от значений
  • Распознаваемость (可识别性): подобно тому, как гексаграммы можно интерпретировать, а все вещи можно представить, YaoXiang предоставляет полные возможности рефлексии типов, информация о типах полностью доступна во время выполнения
  • Доказуемость (可证明性): подобно тому, как гексаграммы раскрывают законы вещей, система типов YaoXiang следует изоморфизму Карри-Ховарда (типы — это утверждения, программы — это доказательства), процесс проверки типов является верификацией логического доказательства

II. Ключевая философия и принципы ​

Следующие проектные заповеди — краеугольный камень YaoXiang, не подлежащий обсуждению и нарушению. Любое предложение новой возможности должно пройти проверку этими принципами.

2.1 Принцип первый: всё есть тип (一切皆类型) ​

В мировоззрении YaoXiang тип является абстракцией высшего уровня, центральной концепцией, пронизывающей язык.

Конкретные проявления:

  • Значение — это экземпляр типа: 42 — экземпляр типа Int, "hello" — экземпляр типа String
  • Сам тип тоже является типом: Type — единственное ключевое слово метатипа в языке, типом Int является Type
  • Функция — это отображение типов: add: (a: Int, b: Int) -> Int описывает отображение типов из Int × Int в Int
  • Модуль — это комбинация типов: модуль представляет собой комбинацию пространств имён, содержащих функции и типы

Причина недопустимости компромисса: унифицированная абстракция типов упрощает семантику языка, устраняет дуализм значения и типа, превращая систему типов из препятствия в хранителя корректности кода.

2.2 Принцип второй: строгая структурированность (严格结构化) ​

Синтаксис YaoXiang стремится к «однозначности, предсказуемости и лёгкости разбора».

Конкретные правила:

  • Обязательный отступ в 4 пробела: символы табуляции запрещены, границы блоков кода очевидны с первого взгляда
  • Скобки не могут быть опущены: параметры функции должны быть в скобках, элементы списка должны быть разделены запятыми
  • Блоки кода должны быть в фигурных скобках: if, while, for и другие управляющие конструкции должны быть обёрнуты в { }
  • Минимальное количество ключевых слов: только 17 ключевых слов, отказ от разрастания синтаксического сахара

Причина недопустимости компромисса: строгая структурированность даёт три ключевых преимущества — (1) более точная подсветка синтаксиса и свёртывание кода в IDE; (2) значительное повышение точности генерации и модификации кода AI; (3) новые учащиеся могут быстро понять структуру кода.

2.3 Принцип третий: абстракции с нулевой стоимостью (零成本抽象) ​

Высокоуровневые абстракции не должны привносить накладные расходы во время выполнения.

Конкретные гарантии:

  • Мономорфизация (单态化): дженерик-функции разворачиваются в конкретные версии на этапе компиляции, без накладных расходов на поиск в виртуальной таблице
  • Встраивание (内联优化): простые функции автоматически встраиваются, устраняя накладные расходы на вызов функций
  • Приоритет стекового размещения: мелкие объекты по умолчанию размещаются в стеке, куча используется только при необходимости
  • Отсутствие GC: модель владения гарантирует безопасность памяти без накладных расходов сборщика мусора во время выполнения

Причина недопустимости компромисса: производительность — это нижняя граница выживания языка программирования. Любой дизайн, жертвующий производительностью ради удобства, — это предательство программиста.

2.4 Принцип четвёртый: неизменяемость по умолчанию (默认不可变) ​

Изменяемость и сложность неразлучны. YaoXiang выбирает неизменяемость по умолчанию, делая код более лёгким для рассуждения и понимания.

Конкретные правила:

  • Переменные по умолчанию неизменяемы, после присваивания их нельзя изменять
  • При необходимости изменяемости требуется явное объявление mut
  • Ссылки по умолчанию неизменяемы, изменяемые ссылки требуют метки mut
  • Передача владения означает, что исходная привязка становится недействительной

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

2.5 Принцип пятый: типы — это данные (类型即数据) ​

Информация о типах не должна существовать только на этапе компиляции, она должна быть полностью доступна во время выполнения.

Конкретные возможности:

  • Запрос типа во время выполнения: для любого значения можно получить информацию о его типе
  • Рефлексия типов: можно конструировать и манипулировать самими типами
  • Деконструкция через сопоставление с образцом: конструкторы типов могут непосредственно использоваться в pattern matching
  • Специализация дженериков: во время выполнения можно получить реализованные типы параметров дженериков

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


III. Ключевые инновации и возможности ​

YaoXiang, впитывая лучшие черты существующих языков, предлагает следующие инновационные дизайнерские решения.

3.1 Инновация первая: унифицированный синтаксис типов ​

Определения типов в традиционных языках часто требуют нескольких ключевых слов:

rust
// Rust
struct Point { x: f64, y: f64 }
enum Result<T, E> { Ok(T), Err(E) }
enum Color { Red, Green, Blue }
trait Drawable { fn draw(&self, s: &Surface); }

Унифицированный синтаксис YaoXiang: всё есть имя: тип = значение, Type — единственное ключевое слово метатипа.

yaoxiang
# === Запись (record type) ===

Point: Type = {
    x: Float,
    y: Float,
}

# Поля со значениями по умолчанию
Point3D: Type = {
    x: Float = 0,
    y: Float = 0,
    z: Float = 0,
}

# === Дженерик-тип ===

Option: (T: Type) -> Type = {
    some: (T) -> Self,
    none: () -> Self,
}

Result: (T: Type, E: Type) -> Type = {
    ok: (T) -> Self,
    err: (E) -> Self,
}

# === Интерфейс (запись, все поля которой — функции) ===

Drawable: Type = {
    draw: (Surface) -> Void,
    bounding_box: () -> Rect,
}

Serializable: Type = {
    serialize: () -> String,
}

# === Реализация интерфейса (имя интерфейса записывается в теле типа) ===

Point: Type = {
    x: Float,
    y: Float,
    Drawable,
    Serializable,
}

# === Метод (синтаксис Type.method) ===

Point.draw: (self: &Point, surface: Surface) -> Void = {
    surface.plot(self.x, self.y)
}

Ценность инновации: нет фрагментации ключевых слов fn, struct, enum, trait, impl — единый синтаксис покрывает все объявления.

3.2 Инновация вторая: конструктор — это тип (构造器即类型) ​

Конструирование значения полностью идентично вызову функции:

yaoxiang
# Определение типа
Point: Type = { x: Float, y: Float }
Option: (T: Type) -> Type = {
    some: (T) -> Self,
    none: () -> Self,
}

# Конструирование значения: то же, что вызов функции
p: Point = Point(3.0, 4.0)
opt: Option(Int) = Option.some(42)
none: Option(Int) = Option.none()

# Pattern matching: непосредственная деконструкция
match opt {
    Option.some(value) -> print(value)
    Option.none -> print("nothing")
}

3.3 Инновация третья: каррированная привязка методов (柯里化方法绑定) ​

YaoXiang использует чисто функциональный дизайн, реализуя синтаксический сахар, подобный вызову методов объекта, посредством каррирования, без введения ключевых слов class и method.

yaoxiang
# === Определение типа ===

Point: Type = {
    x: Float,
    y: Float,
}

# Основная функция: евклидово расстояние
distance: (a: Point, b: Point) -> Float = {
    dx = a.x - b.x
    dy = a.y - b.y
    return (dx * dx + dy * dy).sqrt()
}

# Привязка синтаксического сахара метода ([0] означает привязку к позиции 0-го аргумента)
Point.distance = distance[0]

# === Использование ===

p1 = Point(3.0, 4.0)
p2 = Point(1.0, 2.0)

# Два способа вызова полностью эквивалентны
d1 = distance(p1, p2)     # Прямой вызов основной функции
d2 = p1.distance(p2)      # Синтаксический сахар метода

# Каррированное использование
dist_from_p1 = p1.distance  # Частичное применение, ожидает второй аргумент
d3 = dist_from_p1(p2)       # 2.828

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

3.4 Инновация четвёртая: модель 并作 (параллельного действия) (并作模型) ​

«Десять тысяч вещей действуют совместно, я наблюдаю их возвращение.» — «И Цзин», гексаграмма «Возврат» (复卦)

Модель 并作 названа так по аналогии: она описывает парадигму программирования, в которой разработчик описывает логику синхронно и последовательно, а исполнитель языка автоматически и эффективно параллельно выполняет вычислительные единицы, как «десять тысяч вещей, действующих совместно», и в итоге унифицированно координирует их.

Три ключевых принципа:

ПринципОписание
Синхронный синтаксисПоследовательный код «что видишь, то и получаешь»
Параллельная сущностьСреда выполнения автоматически извлекает параллелизм
Унифицированная координацияРезультаты автоматически собираются при необходимости, гарантируя логическую корректность

Терминология:

Официальный терминСоответствующий синтаксисПояснение
并作-функция (并作函数)spawn (params) => bodyОпределяет вычислительную единицу, которая может участвовать в 并作-исполнении
并作-блок (并作块)spawn { a(), b() }Явно объявленная область параллелизма, задачи внутри блока выполняются 并作
并作-цикл (并作循环)spawn for x in xs { ... }Параллелизм по данным, тело цикла 并作-исполняется на всех элементах
并作-значение (并作值)Async(T)Будущее значение, находящееся в процессе 并作, автоматически ожидается при использовании
并作-граф (并作图)Граф ленивых вычислений (DAG)Сцена, где происходит 并作, описывающая зависимости и параллелизм
并作-планировщик (并作调度器)Планировщик задач среды выполненияИнтеллектуальный центр, координирующий «десять тысяч вещей» для 并作-исполнения в правильный момент

Подробнее: RFC-001 модель 并作

yaoxiang
# === 并作-функция ===
# Функция, помеченная spawn
fetch_data: (url: String) -> JSON spawn = {
    return HTTP.get(url).json()
}

# === 并作-блок ===
# Выражения внутри spawn { } принудительно выполняются параллельно
compute_all: () -> (Int, Int, Int) spawn = {
    (a, b, c) = spawn {
        heavy_calc(1),    # Задача 1
        heavy_calc(2),    # Задача 2
        another_calc(3)   # Задача 3
    }
    return (a, b, c)
}

# === Автоматическое ожидание ===
main: () -> Void = {
    # Два независимых запроса автоматически выполняются параллельно
    users = fetch_data("https://api.example.com/users")
    posts = fetch_data("https://api.example.com/posts")

    # Точки ожидания вставляются автоматически, когда нужен результат
    print(users.length + posts.length)  # Автоматическое ожидание users и posts
}

Потокобезопасность:

yaoxiang
# Ключевое слово ref автоматически обрабатывает потокобезопасность (компилятор автоматически выбирает Rc/Arc)
main: () -> Void = {
    counter = ref SafeCounter(0)

    # Совместное использование между задачами: компилятор автоматически выбирает Arc
    spawn {
        counter.increment()
    }
    spawn {
        counter.increment()
    }
}

Техническая документация:

Ценность инновации: когнитивная нагрузка асинхронного программирования сводится к нулю, читаемость кода полностью идентична синхронному коду, при этом достигается высокопроизводительное параллельное исполнение.

3.5 Инновация пятая: типы, зависящие от значений (RFC-011) (值依赖类型) ​

Статус: в процессе проектирования, частично реализовано

Типы могут зависеть от значений, реализуя истинную разработку, управляемую типами.

yaoxiang
# Тип матрицы: размерности определяются на этапе компиляции
Matrix: (T: Type, Rows: Int, Cols: Int) -> Type = {
    data: Array(Array(T, Cols), Rows),
}

# Вычисление на этапе компиляции: factorial(3) = 6
arr: Array(Int, factorial(3)) = Array(Int, 6)()

# Проверка размерностей на этапе компиляции
identity_3x3: Matrix(Float, 3, 3) = identity(Float, 3)(3)
# multiply(matrix_2x3, matrix_4x2)  # Ошибка компиляции: несоответствие размерностей

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

3.6 Инновация шестая: минималистичный дизайн ключевых слов (极简关键字设计) ​

YaoXiang определяет всего 17 ключевых слов, что значительно меньше, чем в主流 языках:

pub    use    spawn
ref    mut    if     else
else   match  while  for    return
break  continue as     in     unsafe
Язык для сравненияКоличество ключевых слов
YaoXiang17
Rust51+
Python35
TypeScript64+
Go25

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


IV. Предварительный обзор синтаксиса ​

Следующие примеры кода демонстрируют языковой стиль YaoXiang и помогают быстро ощутить его дизайнерскую эстетику.

4.1 Hello World ​

yaoxiang
# hello.yx

main: () -> Void = {
    print("Hello, YaoXiang!")
}

4.2 Определение типов и функций ​

yaoxiang
# Унифицированный синтаксис типов: имя: тип = значение

# Запись (record type)
Point: Type = { x: Float, y: Float }

# Дженерик-тип
Option: (T: Type) -> Type = {
    some: (T) -> Self,
    none: () -> Self,
}

# Тип интерфейса (запись, все поля которой — функции)
Serializable: Type = {
    serialize: () -> String,
}

# Определение функции
add: (a: Int, b: Int) -> Int = a + b

# Дженерик-функция
identity: (T: Type) -> ((x: T) -> T) = x

# Многострочная функция
fact: (n: Int) -> Int = {
    if n == 0 { return 1 }
    return n * fact(n - 1)
}

4.3 Сопоставление с образцом (模式匹配) ​

yaoxiang
# Pattern matching
classify: (n: Int) -> String = {
    return match n {
        0 -> "zero",
        1 -> "one",
        _ if n < 0 -> "negative",
        _ -> "positive",
    }
}

# Деконструкция с помощью образца
Point: Type = { x: Float, y: Float }
match point {
    Point(0.0, 0.0) -> "origin",
    Point(x, y) -> "point at (${x}, ${y})",
}

4.4 Модель владения (RFC-009 v9) (所有权模型) ​

yaoxiang
Point: Type = { x: Float, y: Float }

# Move по умолчанию (без копирования)
p1 = Point(1.0, 2.0)
p2 = p1              # Move, p1 больше недоступен для чтения

# Токены &T / &mut T (нулевая стоимость на этапе компиляции)
p2.print()           # Компилятор автоматически создаёт токен &Point
p2.shift(1.0, 1.0)  # Компилятор автоматически создаёт токен &mut Point

# ref: разделяемое владение (компилятор автоматически выбирает Rc/Arc)
shared = ref p2      # Совместное использование между областями видимости

# clone(): явное глубокое копирование
backup = p2.clone()

# unsafe + сырые указатели: системный уровень
unsafe {
    ptr: *Point = &p2
    (*ptr).x = 0.0
}

Градиент владения:

&T / &mut T    Move       ref        clone()    unsafe
    |             |          |           |          |
Токен заимствования  По умолчанию  Разделяемое владение  Глубокое копирование  Сырой указатель
Нулевая стоимость    Без копирования  Авто Rc/Arc  Явное      Системный уровень

4.5 Обработка ошибок ​

yaoxiang
# Тип Result
Result: (T: Type, E: Type) -> Type = {
    ok: (T) -> Self,
    err: (E) -> Self,
}

divide: (a: Float, b: Float) -> Result(Float, String) = {
    if b == 0.0 {
        return Result.err("Division by zero")
    }
    return Result.ok(a / b)
}

# Использование match для обработки
result = divide(10.0, 2.0)
match result {
    Result.ok(value) -> print(value),
    Result.err(msg) -> print("Error: ${msg}"),
}

4.6 Параллельное программирование (модель 并作) ​

yaoxiang
# spawn помечает асинхронную функцию
fetch_api: (url: String) -> JSON spawn = {
    response = HTTP.get(url)
    return JSON.parse(response.body)
}

# Блок параллельного конструирования: явный параллелизм
process_all: () -> (JSON, JSON, JSON) spawn = {
    (a, b, c) = spawn {
        fetch_api("https://api1.com/data"),
        fetch_api("https://api2.com/data"),
        fetch_api("https://api3.com/data")
    }
    return (a, b, c)
}

V. Дорожная карта и открытые вопросы ​

5.1 Принятые проектные решения ​

Следующие решения были всесторонне обсуждены и рассмотрены, изменения больше не принимаются:

МодульРешениеОписание
Система типовВсё есть типЗначения, функции, модули, дженерики — всё это типы
Синтаксис типовУнифицированный имя: тип = значениеОдна форма объявления покрывает все случаи, Type — единственное ключевое слово метатипа
Ключевые слова17 ключевых словБез type/fn/struct/enum/trait/impl
Синтаксис функцийСигнатура + выражениеимя: (параметры) -> Тип_возврата = тело
Привязка методовRFC-004 каррированная привязкаТип.метод = функция[позиция]
Модель асинхронностиМодель 并作Метка spawn, ленивое вычисление, автоматический параллелизм
Управление памятьюМодель владения (RFC-009 v9)Move + токены &T/&mut T + ref + clone + unsafe, без GC
Файл = модульСистема модулейКаждый файл .yx — это модуль
Главная функцияmain: () -> VoidТочка входа программы
Потокобезопасностьref автоматически выбирает Rc/ArcEscape-анализ компилятора, незаметно для пользователя

5.3 Дорожная карта реализации ​

┌─────────────────────────────────────────────────────────────────────────────┐
│                          Дорожная карта реализации YaoXiang (пример)                       │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  v0.1: Интерпретатор на Rust ─────→ v0.5: Компилятор на Rust ─────→ v1.0: AOT- │
│        ✅ Завершено                     │ (текущий этап)            компилятор на Rust│
│                                        │                                      │
│                                        ▼                                      │
│  v0.6: Интерпретатор на YaoXiang ←──── v1.0: JIT-компилятор на YaoXiang ←──── v2.0:│
│        (самостоятельный хостинг)         (самостоятельный хостинг)             AOT на YaoXiang │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

VI. Как участвовать в贡献 ​

YaoXiang — это язык, рождённый сообществом, растущий в сообществе и служащий сообществу. Мы искренне приглашаем каждого разработчика, увлечённого дизайном языков программирования, присоединиться к этому путешествию.

6.1 Дискуссии по дизайну ​

Целевая аудитория: исследователи теории языков программирования, любители систем типов, энтузиасты дизайна языков

Способы участия:

  • GitHub Discussions: участие в обсуждениях в категории «Language Design»
  • Предложения по дизайну (RFC): создание проектных документов для новых возможностей, по шаблону в каталоге rfcs/
  • Рецензирование синтаксиса: предложения по улучшению существующего синтаксиса или выявление потенциальных проблем

| Текущие горячие темы: | | | | - Дизайн и реализация системы макросов | | - Механизм типа интерфейса | | - Оптимизация синтаксиса обработки ошибок | | - Дизайн API стандартной библиотеки |

Подача предложения по дизайну:

  1. Создайте новый файл в каталоге rfcs/
  2. Заполните шаблон RFC (мотивация, детальный дизайн, анализ преимуществ и недостатков, альтернативы)
  3. Создайте Pull Request для общественного рецензирования
  4. После рассмотрения основной командой — слияние или отклонение

6.2 Реализация компилятора ​

Целевая аудитория: разработчики компиляторов, системные программисты, эксперты по оптимизации производительности

Текущие приоритеты реализации (в порядке приоритета):

ПриоритетМодульОписаниеСложность
P0Байткодовая виртуальная машинаУлучшение инструкций VM, оптимизация производительностиСредняя
P0Среда выполнения памятиРеализация GC, аллокатор памятиВысокая
P0Асинхронная среда выполненияПолная реализация модели 并作Высокая
P1Стандартная библиотекаIO, String, List, ConcurrentСредняя
P1JIT-компиляторИнтеграция с CraneliftВысокая
P2AOT-компиляторБэкенд на LLVM/CraneliftВысокая
P3Самостоятельный хостинг компилятораПереписать на YaoXiangОчень высокая

Технологический стек:

  • Язык реализации: Rust (текущий этап)
  • Генерация кода: Cranelift или LLVM
  • Инструмент сборки: Cargo
  • Фреймворк тестирования: Rust #[test] + cargo nextest

Как начать участвовать:

  1. Ознакомьтесь с docs/YaoXiang-implementation-plan.md для понимания архитектуры
  2. Выберите интересующий модуль в каталоге src/
  3. Изучите требования к тестированию в tests/unit/
  4. Перед отправкой кода убедитесь, что cargo fmt и cargo clippy проходят без ошибок

6.3 Разработка инструментария ​

Целевая аудитория: разработчики плагинов для IDE, любители инструментария, искатели эффективных инструментов

Необходимые инструменты:

ИнструментСтатусОписание
LSP-сервер⏳ Ожидает началаПоддержка Language Server Protocol
Интеграция отладчика⏳ Ожидает началаИнтеграция с GDB/LLDB
Форматтер⏳ Ожидает началаyx format
Менеджер пакетов⏳ Ожидает началаУправление зависимостями, разрешение версий
Репозиторий пакетов⏳ Ожидает началаЦентрализованный или децентрализованный
REPL⏳ Ожидает началаИнтерактивный интерпретатор
Инструмент бенчмаркинга⏳ Ожидает началаПрофилирование производительности
Плагин VS Code⏳ Ожидает началаПодсветка синтаксиса, автодополнение, отладка
Плагин Vim/Neovim⏳ Ожидает началаПодсветка синтаксиса, клиент LSP

Справочник по структуре проекта:

yaoxiang/
├── src/
│   ├── tools/                    # Инструментарий
│   │   ├── lsp/                  # LSP-сервер
│   │   ├── fmt/                  # Форматтер
│   │   ├── repl/                 # REPL
│   │   └── benchmark/            # Бенчмаркинг
│   └── ...
├── extensions/                   # Расширения редакторов
│   ├── vscode/                   # VS Code
│   └── vim/                      # Vim/Neovim

6.4 Создание стандартной библиотеки ​

Целевая аудитория: разработчики библиотек, проектировщики API, отраслевые эксперты

Планирование модулей стандартной библиотеки:

МодульПриоритетОписание
std.ioP0Файловый IO, консольный ввод/вывод
std.stringP0Операции со строками, форматирование
std.listP0Операции со списками/массивами
std.dictP0Словари/хэш-таблицы
std.mathP0Математические функции, константы
std.timeP1Операции с датой и временем
std.netP1Сетевое программирование, HTTP
std.concurrentP1Примитивы параллелизма, каналы
std.cryptoP2Криптографические хэши, подписи
std.jsonP1Парсинг/генерация JSON
std.regexP2Регулярные выражения
std.databaseP3Подключение к базам данных
std.guiP3Графический интерфейс (долгосрочно)

Принципы проектирования:

  • Согласованность: имена и поведение функций с одинаковой функциональностью должны быть единообразными
  • Простота: API должно быть интуитивно понятным и простым в использовании, избегая избыточного проектирования
  • Производительность: функции стандартной библиотеки должны быть эффективными, избегая ненужного копирования
  • Тестируемость: каждая функция должна иметь соответствующие модульные тесты

6.5 Документация и учебные пособия ​

Целевая аудитория: технические писатели, преподаватели, менеджеры сообщества

Необходимая документация:

ДокументСтатусОписание
Быстрый старт✅ ЗавершеноРуководство для начала за 5 минут
Руководство по языку✅ ЗавершеноСистематическое изучение основных концепций
Спецификация языка✅ ЗавершеноПолное определение синтаксиса и семантики
План реализации✅ ЗавершеноТехнические детали реализации компилятора
API-документация⏳ Ожидает началаСправочник по API стандартной библиотеки
Учебные пособия⏳ Ожидает началаПродвинутые руководства и лучшие практики
Блог⏳ Ожидает началаТехнические статьи и истории дизайна
Переводы⏳ Ожидает началаПоддержка нескольких языков

6.6 Построение сообщества ​

Целевая аудитория: менеджеры сообществ, организаторы мероприятий, евангелисты

Мероприятия сообщества:

  • Регулярные онлайн-встречи (ежемесячно)
  • Совещания по дизайну и реализации (еженедельно)
  • Кодовые спринты (ежеквартально)
  • Оффлайн-встречи и выступления на конференциях

Каналы коммуникации:

  • GitHub Discussions: технические обсуждения
  • GitHub Issues: отчёты об ошибках и запросы на функции
  • Discord/Slack: общение в реальном времени
  • Twitter/X: новости проекта
  • Блог: глубокие статьи

6.7 Руководство по участию ​

Как начать участвовать:

  1. Изучите проект: прочитайте README и проектную документацию
  2. Выберите направление: выберите область участия в соответствии с интересами
  3. Настройте окружение: Rust 1.75+, cargo, git
  4. Найдите задачу: просмотрите Issues на GitHub с меткой good first issue
  5. Отправьте PR: следуйте правилам коммитов, пишите тесты
  6. Участвуйте в рецензировании: проверяйте чужой код, участвуйте в обсуждениях

Соглашение о коммитах:

bash
# Формат сообщения коммита
<тип>(<область>): <тема>

# Типы
feat: новая функциональность
fix: исправление ошибки
docs: обновление документации
style: форматирование кода (не влияет на функциональность)
refactor: рефакторинг
perf: оптимизация производительности
test: тесты
chore: инструменты сборки или вспомогательные инструменты

# Примеры
feat(typecheck): add generic type inference
fix(parser): fix infinite loop on invalid input
docs(readme): update installation instructions

Стиль кода:

  • Следуйте спецификации rustfmt.toml
  • Убедитесь, что cargo clippy не выдаёт предупреждений
  • Пишите необходимые модульные тесты
  • Обновляйте соответствующую документацию

Приложение A: Краткий справочник по языку ​

A.1 Ключевые слова ​

Ключевое словоНазначение
pubПубличный экспорт
useИмпорт модуля
spawnМетка 并作
refРазделяемое владение (компилятор автоматически выбирает Rc/Arc)
mutИзменяемая переменная
if/else if/elseУсловные ветвления
matchСопоставление с образцом
while/forЦиклы
return/break/continueУправление потоком
asПреобразование типа
inПроверка принадлежности/list comprehension
unsafeБлок unsafe-кода (сырые указатели)

Примечание: Type, true, false, void и т.д. являются зарезервированными словами, а не ключевыми. Ключевое слово type было удалено в RFC-010, для единообразия используется синтаксис имя: Type = значение.

A.3 Примитивные типы (原类型) ​

ТипОписаниеРазмер по умолчанию
VoidПустое значение0 байт
BoolЛогическое значение1 байт
IntЗнаковое целое8 байт
UintБеззнаковое целое8 байт
FloatЧисло с плавающей точкой8 байт
StringUTF-8 строкаПеременный
CharСимвол Unicode4 байта
BytesСырые байтыПеременный

A.4 Приоритет операторов ​

ПриоритетОператорыАссоциативность
1() [] . ?Слева направо
2asСлева направо
3Унарный префикс ! - +Справа налево
4* / %Слева направо
5+ -Слева направо
6..Слева направо
7<< >>Слева направо
8& | ^Слева направо
9== != < > <= >=Слева направо
10and orСлева направо
11if...elseСправа налево
12= += -= *= /=Справа налево

Унарные префиксные операторы (! - +) связываются сильнее всех бинарных операторов (стиль Zig, см. SPEC §2.2).


Приложение B: Вдохновение в дизайне ​

Дизайн YaoXiang заимствовал превосходные идеи из следующих языков и проектов:

ИсточникЧто заимствовано
RustМодель владения, абстракции с нулевой стоимостью, система типов
PythonСтиль синтаксиса, читаемость, list comprehension
Idris/AgdaЗависимые типы, разработка, управляемая типами
Изоморфизм Карри-ХовардаТипы — это утверждения, программы — это доказательства, единая теория системы типов и логики
TypeScriptАннотации типов, типы во время выполнения
MoonBitAI-дружественный дизайн, лаконичный синтаксис
HaskellЧистый функциональный подход, pattern matching
OCamlВывод типов, вариантные типы

Приложение C: Часто задаваемые вопросы ​

В: Какие преимущества YaoXiang имеет по сравнению с Rust?

О: YaoXiang сохраняет безопасность памяти и абстракции с нулевой стоимостью Rust, но использует более простой синтаксис и меньшую когнитивную нагрузку. Модель 并作 проще, чем async/await в Rust — достаточно одной метки spawn, без ручного управления Future и Pin. «Десять тысяч вещей действуют совместно, я наблюдаю их возвращение» — параллельное программирование становится таким же интуитивным, как описание законов природы. Модель владения (RFC-009 v9) заменяет аннотации времён жизни на Move + токены &T/&mut T, а проверку заимствований — на атрибуты типов (Dup/Linear). Унифицированный синтаксис типов устраняет концептуальную фрагментацию enum/struct/trait/impl.

В: Для каких типов разработки подходит YaoXiang?

О: Системное программирование, разработка приложений, веб-сервисы, скриптовые инструменты, AI-ассистированное программирование. Цель — стать универсальным языком программирования.

В: Почему выбран отступ в 4 пробела?

О: 4 пробела обеспечивают чёткое визуальное разделение блоков кода, уменьшая путаницу от глубины вложенности. Это тщательно продуманное решение «AI-дружественного» дизайна.

В: Когда выйдет версия 1.0?

О: Цель v1.0: готовность к продакшену. Сроки выпуска зависят от хода реализации, подробности см. в RFC о планировании версий.

В: Как связаться с основной командой?

О: Через GitHub Discussions или канал сообщества Discord. Члены основной команды регулярно отвечают.


Последнее обновление: 2026-05-31

Версия документа: v2.0.0

Лицензия: MIT


«Изменения爻 и象 рождают все вещи. Эволюция типов создаёт программы.»

Пусть путешествие дизайна YaoXiang будет вместе с вами.