# Kaula_language_compiler
**Repository Path**: xffish/kaula
## Basic Information
- **Project Name**: Kaula_language_compiler
- **Description**: Kaula语言是一款以C为基础开发的现代编程语言
- **Primary Language**: C
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2026-07-26
- **Last Updated**: 2026-08-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Kaula 编程语言

**更现代、更好用的 C**
[](LICENSE)
[](https://go.dev/)
[](https://en.wikipedia.org/wiki/C_(programming_language))
---
## Kaula 是什么
Kaula 是一门**静态类型的系统级编程语言**,编译到 C,由 Clang 生成原生代码。
核心设计目标:**用更简单的语法,获得接近 Rust 的安全保证**——通过 SOR(子结构所有权)在编译期消除数据竞争和悬垂指针,而不引入运行时开销。
---
## 快速示例
### Hello World
```kaula
import std.io
fn main() {
println("Hello, Kaula!")
}
```
### 变量与类型
```kaula
i32 x = 42 # 显式类型
auto y = 3.14 # 类型推导
string name = "Kaula"
bool flag = true
i32* ptr = &x # 指针
i32? maybe = null # 可空类型
const MAX = 1024 # 编译期常量
```
### 函数与泛型
```kaula
fn add(i32 a, i32 b) i32 {
return a + b
}
# 泛型函数
fn first(T a, T b) T {
return a
}
# 内联汇编
#[asm]
fn read_cr0() u64 {
mov %cr0, %rax
}
```
### 控制流
```kaula
# if/else
if x > 0 {
println("positive")
} else if x == 0 {
println("zero")
} else {
println("negative")
}
# while
while x > 0 {
x = x - 1
}
# for (range 系迭代)
for i in range(10) {
println(i)
}
# range(start, end) / range(start, end, step) 同样支持
for i in range(0, 10, 2) {
println(i)
}
# switch
switch x {
case 1:
println("one")
case 2:
println("two")
default:
println("other")
}
```
### struct 与 class
```kaula
# 结构体 - 值类型
#[packed]
struct PacketHeader {
u8 version
u8 flags
u16 length
}
# 类 - 引用语义,支持方法和构造函数
class Vec2 {
f64 x
f64 y
constructor(f64 x, f64 y) {
self.x = x
self.y = y
}
fn length() f64 {
return math_sqrt(self.x * self.x + self.y * self.y)
}
}
# 接口
interface Printable {
fn to_string() string
}
```
### enum 与 match
```kaula
# 代数数据类型
enum Option {
Some(T)
None
}
enum Result {
Ok(T)
Err(E)
}
# 模式匹配
auto result = fetch_data()
match result {
Ok(data) => {
println(data)
}
Err(e) => {
println("error: " + e)
}
_ => {
println("unknown")
}
}
```
### SOR 子结构所有权
Kaula 的核心安全机制——SOR(Sub-structural Ownership)在编译期追踪资源所有权,无需 GC 或引用计数开销:
```kaula
#[sor]
fn process() {
auto buf = std.memory.kmm_v4_alloc(1024)
# yield: 转移所有权,原变量不可再访问
yield buf -> owner
# extract: 从集合中提取子结构所有权
extract owner[0] -> first_byte
# release: 将所有权分发到多个持有者
release owner -> [holder_a, holder_b]
}
```
三大原语:
- **yield** — 所有权转移(move 语义)
- **extract** — 子结构提取(从复合类型中取出部分所有权)
- **release** — 所有权分发(将一个资源拆分给多个持有者)
启用方式:`--sor` 全局启用,或 `#[sor]` 单函数启用。
### Prefix 前缀系统
Kaula 独有的声明式代码复用机制:
```kaula
# 定义前缀模板
prefix Logger {
$message
$level
auto log = $level + ": " + $message
println(log)
}
# 用 @ 调用前缀
@Logger(message = "server started", level = "INFO")
# 前缀内可用 $ 引用参数
prefix Validate {
$value
$min
if $value < $min {
println("validation failed")
}
}
@Validate(value = age, min = 0)
```
### Spend/Call 消费式遍历
对集合的逐元素结构化处理:
```kaula
auto items = [10, 20, 30]
spend(items) {
call(1) {
println("first")
}
call(2) {
println("second")
}
call(3) {
println("third")
}
}
```
### 属性注解
```kaula
#[packed] # 紧凑内存布局
#[aligned(16)] # 对齐要求
#[section(".isr_vector")] # 链接到指定段
#[volatile] # volatile 语义
#[naked] # 裸函数(无 prologue/epilogue)
#[inline] # 内联提示
#[no_kmm] # 禁用 KMM 内存管理
#[deprecated] # 标记弃用
#[weak] # 弱符号
```
### 类型反射与编译期计算
```kaula
auto sz = sizeof(PacketHeader) # 类型大小
auto al = alignof(PacketHeader) # 类型对齐
auto off = offsetof(Packet, length) # 字段偏移
# 编译期表达式
comptime auto count = #field_count(MyStruct)
comptime auto name = #type_name(i32)
comptime auto kind = #type_kind(MyEnum)
```
### extern 与 FFI
```kaula
# 声明外部符号
extern bss_start: u8
# 声明外部函数
extern fn boot_main() -> void
# 导入标准库
import std.io
import std.math
import std.string
```
### 裸机开发
```kaula
#[naked]
#[section(".init")]
fn _start() {
# 直接操作硬件寄存器
#[volatile] u32* reg = 0x40000000
*reg = 0x01
}
# --freestanding 编译模式
# 自动链接 kaula_freestanding_runtime.c
# 提供 memset/memcpy/memmove 等最小运行时
```
### Freestanding 无依赖标准库
Kaula 提供 **freestanding** 库,作为 std 的无依赖对等体:
```kaula
// 导入 freestanding 模块(与 std 同级别)
import freestanding.base
import freestanding.memory
import freestanding.string
import freestanding.math
import freestanding.io
fn main() {
// 内存管理(BSS 静态池 bump 分配,无 free list、无系统调用)
char* buf = as(fs_alloc(64))
memset(buf, 65, 8)
fs_free(buf)
// 字符串处理
char* s = fs_strdup("hello")
fs_itoa(-9876, buf)
fs_itoa_hex(0xCAFE, buf, true)
// 数学运算
math_abs_i32(-42)
math_gcd(48, 36)
math_is_pow2(256)
// I/O(弱符号钩子,托管模式可覆写 fs_output_putchar 重定向到控制台)
println("Hello freestanding!")
print_int(2026)
print_hex(0xDEADBEEF)
print("printf: %d %s\n", 42, "test")
}
```
**特性**:
- 与 std 相同的调用方式:`import freestanding.memory` 等
- 所有符号均为弱符号(`FS_WEAK`),托管/裸机双环境可跑,不冲突 libc
- 内存管理采用 BSS 静态池 bump 分配器,无 free list、无碎片、无系统调用
- 仅依赖编译器自带 freestanding 头(``/``/``)
- 裸机模式下自动链接 `kaula_freestanding.lib`/`libkaula_freestanding.a`
---
## KMM V4 内存管理
Kaula 默认使用 KMM V4(Kaula Memory Manager V4)作为内存分配器,基于 per-thread heap + bump allocation + scope-based reclamation 设计,相比传统 malloc/free 有显著性能优势。
### 性能对比(vs C malloc/free)
基于 10M 次迭代基准测试(Windows, Clang 16, x86-64):
| 场景 | KMM V4 | malloc/free | 加速比 |
|------|--------|-------------|--------|
| 16B 小对象分配+回收 | 51.8 ms | 634.3 ms | **12.2x** |
| 64B 对象分配+回收 | 65.9 ms | 661.5 ms | **10.0x** |
| 256B 对象分配+回收 | 152.3 ms | 711.8 ms | **4.6x** |
| 零初始化分配(calloc 等价) | 66.1 ms | 704.0 ms | **10.6x** |
| 纯分配吞吐量(64B, 1M 次) | 3.5 ms | 72.7 ms | **20.5x** |
| 字符串处理(32+64+128B) | 72.9 ms | 575.0 ms | **7.8x** |
| 链表节点(8x48B) | 139.1 ms | 594.5 ms | **4.2x** |
| 大对象(4KB) | 486.3 ms | 1597.6 ms | **3.2x** |
| 混合负载(16~1024B 交替) | 287.9 ms | 658.1 ms | **2.2x** |
**核心优势**:纯分配路径快 20x+,小对象分配快 10x+,零初始化分配快 10x。
### 设计特点
- **Per-Thread Heap**:每个线程从全局池批量获取内存块,分配时只推进线程本地 offset,无原子操作、无锁
- **Bump Allocation**:分配即指针推进,O(1) 复杂度,无碎片
- **Scope-based Reclamation**:`kmm_v4_scope_push`/`kmm_v4_scope_pop` 保存/恢复线程本地 offset,作用域退出批量回收,无需逐个 free
- **Inline 优化**:编译器将 `std_malloc` 重写为 `kmm_v4_alloc_auto` inline 调用,消除函数调用开销
- **kmm_v4_free 为 no-op**:无需维护 free list,释放零开销
```kaula
// KMM V4 自动作用域管理示例
fn process_data() {
// 编译器自动插入 kmm_v4_scope_push()
auto buf1 = std.memory.std_malloc(1024) // 内联为 kmm_v4_alloc_auto(1024)
auto buf2 = std.memory.std_malloc(2048) // 内联为 kmm_v4_alloc_auto(2048)
// ... 使用 buf1, buf2 ...
// 编译器自动插入 kmm_v4_scope_pop(),批量回收
}
```
### 线程安全
- **全局 offset**:单调递增,CAS 推进,永不回退
- **Per-thread heap offset**:scope 操作仅影响当前线程,多线程互不干扰
- **Thread Safety Level**:自动根据编译模式选择(0=单线程零开销,1=轻量实时原子,2=完全线程安全)
---
## 标准库
62 个模块,800+ 函数,覆盖从系统编程到 Web 开发:
| 分类 | 模块 |
|------|------|
| **内存** | memory(KMM V4 per-thread heap 作用域分配器,比 malloc 快 2-20x)、bitset |
| **容器** | container(Vector/LinkedList/HashMap/Stack)、deque、heap、trie、graph |
| **字符串** | string、regex、unicode、template |
| **I/O** | io、fs、path |
| **并发** | concurrent(线程/锁/原子/线程池/Channel/Future)、async、parallel |
| **网络** | net、web、ssh、tls |
| **序列化** | json、toml、xml、protobuf、msgpack、serialize |
| **数学** | math、cmath、decimal、random |
| **编码** | encoding、crypto、compress、archive |
| **系统** | system、subprocess、cli、time、datetime、calendar |
| **类型** | option、traits、base、error |
| **运行时** | vo、prefix、task、format、logging、testing、i18n |
| **GUI** | gui(Nuklear 绑定) |
| **Freestanding** | freestanding.base、freestanding.memory、freestanding.string、freestanding.math、freestanding.io(无依赖,弱符号,裸机/托管双环境) |
---
## 编译器
### 安装
```bash
python toolkit_build.py # Debug 构建 (默认)
python toolkit_build.py --release # Release 构建
python toolkit_build.py --target compiler # 只构建编译器
python toolkit_build.py --target freestanding # 只构建 freestanding 无依赖标准库
python toolkit_build.py --cc gcc # 指定使用 gcc 而非默认的 clang
python toolkit_build.py --clean # 清理所有构建产物
python toolkit_build.py --install-dir D:/kaula # 自定义输出目录
```
依赖:Python 3.8+、Go 1.21+、Clang
该脚本一次性构建:标准库 (kaula_std)、freestanding 库 (kaula_freestanding)、运行时 (kaula_runtime)、编译器 (kaulac)、格式化工具 (kaulafmt)。基于 SHA256 增量缓存,未变更的源文件秒级跳过。
### 编译流程
```
源代码 .kl → 词法分析 → 语法分析 → 语义分析 → C 代码生成 → Clang 编译 → 可执行文件
```
支持多阶段并发编译和基于 SHA256 的增量缓存。
### 用法
```bash
kaulac [选项] <源文件.kl>
kaulac program.kl # 编译
kaulac --sor program.kl # 启用 SOR 所有权分析
kaulac --release program.kl # Release 模式 (-O3)
kaulac --freestanding program.kl # 裸机模式
kaulac --sourcemap program.kl # 生成源码映射
kaulac --no-cache program.kl # 禁用缓存
```
常用选项:
| 选项 | 说明 |
|------|------|
| `--sor` | 启用 SOR 编译时所有权分析 |
| `--release` | Release 模式(-O3) |
| `--freestanding` | 裸机模式(无 OS 依赖,链接 freestanding 库) |
| `--opt ` | 优化级别 O0/O1/O2/O3 |
| `--sourcemap` | 生成源码映射 |
| `--no-cache` | 禁用增量编译 |
| `--output-format ` | 输出格式 elf/bin/obj |
完整选项列表和 kaula.json 配置见 [docs/](docs/)。
---
## 项目结构
```
kaula/
├── kaula-compiler/ # 编译器(Go 实现)
│ ├── cmd/kaulac/ # 编译器 CLI
│ ├── internal/
│ │ ├── lexer/ # 词法分析
│ │ ├── parser/ # 语法分析(递归下降)
│ │ ├── sema/ # 语义分析(两遍、泛型、SOR)
│ │ ├── codegen/ # C 代码生成
│ │ ├── sor/ # SOR 所有权分析引擎
│ │ ├── symbol/ # 符号表
│ │ ├── stdlib/ # 标准库配置
│ │ └── ...
│ └── stdlib.json
├── src/ # 运行时系统(C 实现)
│ ├── kaula.h # 跨平台头文件
│ ├── kmm_scoped_allocator_v4.h # KMM V4 内存管理
│ └── ...
├── std/ # 标准库(C 实现,62 个模块)
├── pkglib/ # 第三方库(stb_image, nuklear, zlib)
└── docs/ # 编译器详细文档
```
---
## 许可证
[Apache License 2.0](LICENSE),附带 [Kaula Exceptions](LICENSE#kaula-exceptions-to-the-apache-20-license)