SailfinIO/sailfin
GitHub: SailfinIO/sailfin
Sailfin 是一门以编译时 capability/effect 检查为核心特性的自托管系统级编程语言,旨在通过显式副作用标注和 capsule 能力声明在源码层面实现严格的资源访问控制。
Stars: 6 | Forks: 0
Sailfin
一种具有编译时能力检查的自托管系统级语言。
网站 ·
安装 ·
语言规范 ·
路线图 ·
博客 ·
llms.txt
## 什么是 Sailfin?
Sailfin 是一种围绕显式能力构建的系统编程语言。
函数会标明它们所使用的 effect,例如 `![io]`、`![net]` 或
`![clock]`,并且 capsule 会声明它们需要哪些能力。编译器
会检查这两个层面,因此能力的使用在源码中是可见的,并且当其
超出了声明的范围时会被拒绝。
其长期目标是打造一个可用于生产环境的编译器、runtime 和 capsule
生态系统,并带有能力密封的 runtime。该仓库已经实现了
自托管:编译器是用 Sailfin 编写的,从一个发布的 seed 自举编译,并从 `runtime/sfn/` 和
`runtime/prelude.sfn` 链接 Sailfin runtime。
## 仓库布局
- `compiler/src/` - Sailfin 编译器,使用 Sailfin 编写。
- `runtime/` - Sailfin runtime capsule,包括平台适配器、
内存、字符串、进程、时钟和并发支持。
- `capsules/sfn/` - 标准库 capsule,例如 `strings`、`json`、
`fs`、`http`、`net`、`cli`、`test` 以及面向数值/ML的 capsule。
- `compiler/tests/` - 单元测试、集成测试和端到端编译器测试。
- `examples/` - 小型的语言和库示例。
- `docs/` - 工程文档、状态矩阵、提案、性能说明
和 RCA。
- `site/` - 公共网站和面向用户的语言文档。
- `tools/mcp-server/` - 基于编译器诊断的 MCP 集成。
## 当前能力
当前的自托管编译器支持核心语言:函数、
带有 payload 的 struct、enum、interface、type alias、array、具有部分类型推断的泛型、带有捕获的闭包、模式匹配、`Result
` 和
`?`、`unsafe` / `extern fn`、原子内联函数和显式的数值类型转换。
effect 系统对 `io`、`net` 和 `clock` 进行了强制检查,包括
跨模块传播和 capsule 能力检查。所有权强制
机制目前对 owned-buffer 系列以及 affine / linear 绑定生效,而更广泛的借用检查仍在开发中。
工具链包括:
- `sfn build` 和 `sfn run`
- 带有结构化 JSON 诊断的 `sfn check`
- `sfn fmt --check` / `sfn fmt --write`
- 具有过滤、快照、并行执行和每个测试
二进制缓存功能的 `sfn test`
- `sfn init`、`sfn add`、`sfn lock`、`sfn package` 和 `sfn publish`
结构化并发作为一个 v0 接口可用:`routine`、`channel`、
`spawn` / `await` 和 `parallel` 均可端到端运行,而类型化的 channel
构造器、更丰富的结果收集以及 1.0 之后的 async I/O runtime
仍在计划中。
有关详细的状态矩阵,请参阅 [`docs/status.md`](docs/status.md)。
有关语言语义,请参阅
[规范](https://sfn.dev/docs/reference/spec/)。
## 示例
```
struct User {
id: int;
name: string;
}
fn greet(user: User) -> string ![io] {
let msg = "Hello, {{ user.name }}!";
print(msg);
return msg;
}
test "greet produces correct output" {
let u = User { id: 1, name: "Alice" };
let result = greet(u);
assert(result == "Hello, Alice!");
}
```
`greet` 调用了 `print`,因此它声明了 `![io]`。如果移除该注解,
`sfn check` 将报告编译时 effect 错误。如果 capsule 暴露的代码
使用了 `io`,其 `capsule.toml` 必须在 `[capabilities].required` 中包含 `io`。
## 安装
发布版本以按操作系统/架构区分的 tarball 形式发布,其中包含 `bin/sailfin`(或在
Windows 上为 `bin/sailfin.exe`)。安装程序默认安装最新版本,
并在 Linux/macOS 上安装到 `~/.local/bin`,或在
Windows 上安装到 `%LOCALAPPDATA%\sailfin\bin`。
### Linux / macOS
```
curl -fsSL https://raw.githubusercontent.com/SailfinIO/sailfin/main/install.sh | bash
```
要固定特定的发布版本:
```
curl -fsSL https://raw.githubusercontent.com/SailfinIO/sailfin/main/install.sh | VERSION= bash
```
### Windows PowerShell
```
irm https://raw.githubusercontent.com/SailfinIO/sailfin/main/install.ps1 | iex
```
要固定特定的发布版本:
```
$env:VERSION = ""
irm https://raw.githubusercontent.com/SailfinIO/sailfin/main/install.ps1 | iex
```
发布资产遵循 `sailfin___.tar.gz` 的命名模式。
如果发布版本查找
受到限制,请设置 `GITHUB_TOKEN` 以提高 GitHub API 的速率限制。
## 从源码构建
编译器从发布的 seed 二进制文件进行自举。`make compile` 会
在需要时获取 seed 并构建 `build/native/sailfin`。
```
make compile # Build the self-hosted native compiler
make test # Run the test suite with an existing build
make check # Build as needed, build seedcheck, and run the full gate
make install # Install to PREFIX/bin, defaulting to ~/.local/bin
make clean # Remove packaged artifacts under dist/
```
编译完成后:
```
build/native/sailfin --version
build/native/sailfin run examples/basics/hello-world.sfn
build/native/sailfin check compiler/src/
```
如果已安装:
```
sfn --version
sfn run examples/basics/hello-world.sfn
sfn fmt --check compiler/src/ runtime/
```
## 开发说明
- 当前后端会生成 Sailfin 原生 IR (`.sfn-asm`),将其降低为 LLVM IR,
并与平台工具链进行链接。
- 编译器具有确定性的自托管覆盖率:完整的验证
关卡会检查连续的编译器阶段是否产生字节完全相同的 LLVM IR。
- `docs/status.md` 是已发布、部分完成和计划中
行为的唯一事实来源。
- 面向用户的文档位于 `site/src/content/docs/` 并发布在
[sfn.dev/docs](https://sfn.dev/docs/)。
- 公共路线图根据 GitHub 里程碑生成,网址为
[sfn.dev/roadmap](https://sfn.dev/roadmap)。
## 贡献
请参阅 [`CONTRIBUTING.md`](CONTRIBUTING.md) 了解贡献指南。已整理的
工作记录在 [issue 追踪器](https://github.com/SailfinIO/sailfin/issues)中,
而 [sfn.dev/roadmap](https://sfn.dev/roadmap) 上的路线图追踪了
更大的里程碑。标签:权限控制, 系统编程, 编程语言, 编译器, 运行时, 默认DNS解析器