logo燕几图
开发平台
编程语言
数据服务
云端协作
开源社区
你的数据逻辑图式

直接面向数据库编程,将 PostgreSQL 变成你的 API 服务器

全新的编程语言(!
concept User {
  name: str;
  boss: User;
}

api GET "/users/${id}" {
  let q_user = db
    .query(User)
    .filter(
      u => u.id == id
    );
  db.fetch_one(q_user)
}
数据库建模、查询语句编写、后端逻辑开发,全部使用统一的语言。
编译至 WASM + SQL编译示意SQL 同 WASM 字节码一样,都是燕几图编译器的目标代码。
运行在 PostgreSQL 中运行时架构你的程序可在进程内访问 PG 共享内存,并直接对外提供网络服务。
图式编程语言
  • 声明式、函数式编程语言,承自 MoonBit 与 EdgeQL
  • 静态强类型、代数效应抽象、ADT 与模式匹配
  • 一体化内生查询语言,向 ORM 说拜拜
  • 零拷贝对接 PostgreSQL 原生类型
  • 服务化编译支持文本、结构化(图形)双模式编程
// 定义一个抽象效应
effect Exn[T] {
  raise(String) -> T
}

// 在函数中触发效应
fn div(x: Int, y: Int) -> <Exn[Int]> Int {
  if y == 0 {  raise("除数为零")  }
  else {  x / y  }
}

// 定义效应处理逻辑,赋予其意义
fn handler() -> ((<Exn[Int]> Int) ~> Int) {
  hn {
    raise(e) => {
      println(e)
      resume(0)  // 恢复成 0
    }
  }
}

// 用 handler 消除效应,获得结果
let result: Int =
  handle { div(5, 0) } with handler
// 找到所有名字为 'old' 的 User,统统改名为 'new'
fn rename(old: String, new: String)
         -> { Mutation } bag[User] {
  mut_table() |> filter_map_inplace(fn {
    { name, .. } as user =>
      if name == old {
        Some({ name: new, ..user })
      } else {
        None
      }
  })
}

let agents: list[User] =
  handle { rename("张牧之", "张麻子") }
    with query_executor
Architecture
Dev开发者
https://yanji.tech/zhang3/e-shop
Browser
Visual Code可视化代码
共享语法树Shared AST
Textual Code文本代码
Compiler
mbt
bytecode
SDL
DDL
EdgeQL
DML
WASM BackendSQL Backend
User终端用户
Client

管理进程

Dispatcher

容器

User App
shmem

服务进程

更新进程

Update SQL
Compiler
Native Code
Query Function
User Data

存储介质

Server
Technologies
OCamlPostgreSQLMoonBitGelPyodideWAMR
Cloud PlatformEarly Preview

后端和数据库的 Figma + Vercel

Web IDEWeb IDE

有浏览器就能开发,支持离线模式、本地实例和多人协作。

CloudCloud

免费提供测试实例,一键部署公网可用免备案,支持私有化。

ToolchainToolchain

开箱即用的图式变更 (migration)、第三方登录和计划任务等。

Collaboration

我们希望把这门语言做成一个真正开放的社区项目。编译器和运行时都是宽松许可的开源软件,可以免费使用和改进;线上群组「网声堂」将倾听开发者的声音,公开讨论和决定语言的发展方向。目前,项目还在早期阶段,我们会逐步开放更多共建机会,也欢迎学术界和业界的合作伙伴加入。无论是写代码、提想法,还是一起探索应用场景,都非常欢迎你通过邮件与我们联系。