# fun **Repository Path**: funlang/fun ## Basic Information - **Project Name**: fun - **Description**: 一门轻量、可嵌入、以数据为中心的脚本语言,能力覆盖从 JSON/FD 数据处理一直到运行时编译 C 与直接编写机器码。 - **Primary Language**: Pascal - **License**: MIT - **Default Branch**: main - **Homepage**: https://www.funlang.org - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2026-08-31 - **Last Updated**: 2026-11-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Fun 语言 > 一门轻量、可嵌入、**以数据为中心**的脚本语言,能力覆盖从 JSON/FD 数据处理一直到运行时编译 C 与直接编写机器码。 **English**: [README.md](README.md) · **简体中文**(本文件) - 版本:**9.5.5** - 官网: - 作者:张卫东 <zwd@funlang.org> - 授权:MIT(另有商业授权条款,见下文「许可证」) - 状态与路线图:[ROADMAP.md](ROADMAP.md) > **版本 9.5.5**:这不是玩具或原型——一门经历了超过 15 年(2010 至今)持续演化与生产级验证的成熟语言,其前身可追溯至 Nuva(2006)与 TemplateScript(2005)。 --- ## 目录 - [为什么是 Fun](#为什么是-fun) - [核心特性](#核心特性) - [快速开始](#快速开始) - [包管理](#包管理) - [测试](#测试) - [体验 Fun 语言](#体验-fun-语言) - [能力阶梯](#能力阶梯) - [FD 数据格式](#fd-数据格式) - [外部函数接口(FFI)](#外部函数接口ffi) - [关键字别名](#关键字别名) - [嵌入运行时 fun.dll](#嵌入运行时-fundll) - [目录结构](#目录结构) - [构建](#构建) - [标准库](#标准库) - [示例](#示例) - [许可证](#许可证) --- ## 为什么是 Fun 一句话定位:**Fun 是一门从 JSON 一路写到机器码的脚本语言。** - 用同一个运行时,覆盖从高层数据处理(JSON/FD)到底层系统编程(FFI、运行时 C、JIT、机器码)的全谱系; - 自带 78 个用 Fun 自身编写的标准库模块,全栈能力打包进单个可嵌入的 `fun.dll`; - 在信创与 AI Agent 场景中,作为连接国产 OS、数据库、芯片与业务逻辑的轻量级胶水。 Fun 的设计出发点很简单:**数据与代码都应该是头等公民,而且一段脚本应该能在不离开语言的情况下一路触达机器底层。** 多数脚本语言要么停留在高层(好用,但在 FFI 处撞墙),要么要求你在性能关键处去写 C。Fun 把这条能力阶梯收敛进同一个运行时: - 用原生的 list / set / tree 集合处理 **JSON 与 FD** 数据; - 通过 **紧凑的 FFI 签名**调用任意原生代码; - 用内置的 Tiny C 编译器 **在运行时编译 C**; - 需要最紧的循环时,直接 **内联汇编 / JIT**; 这一切都可以从纯脚本出发,并打包进单个可嵌入的二进制。 Fun 使用 Pascal(Delphi / Free Pascal)编写。核心是一个小巧的树遍历解释器,带有动态值模型、对象系统、闭包与模块——刻意保持精简,以便既可嵌入为 `fun.dll`,也可作为独立的 `fun.exe` 运行。 --- ## 核心特性 - **动态、以数据为中心的值模型** —— 数字、字符串、时间、正则,以及头等集合:list(数组)、set 与 tree,构建于基于变体(variant)的运行时之上。 - **函数一等公民** —— 匿名函数、函数引用、柯里化、默认参数与可变参数,以及 `->` 管道。 - **对象系统** —— `class`、`this` / `base`、方法,以及属性的 get/set 分发(方法、getter、setter 统一通过 `.` 运算符分发)。 - **模块** —— `use 'file.fun'`(可 `as alias`)引入其它脚本;别名也会暴露转发模块导入的一级名字,运行时跟踪模块状态与依赖。 - **正则作为值类型** —— 内嵌 PCRE 引擎,支持行内正则字面量(`/.../`)与匹配运算符(`=~`、`!~`)。 - **内置数据格式** —— JSON 与 **FD**,一种兼容 JSON、对人类与 AI 都友好的类 Markdown 格式(见[下文](#fd-数据格式))。 - **运行时 C 与机器码** —— 内置 Tiny C 编译器、JIT 与内联汇编(见[能力阶梯](#能力阶梯))。 - **紧凑的 FFI** —— 用简短的签名串调用 DLL/共享库函数(见 [FFI](#外部函数接口ffi))。 - **关键字别名** —— 规范英文关键字 + 可插拔的别名包(中文、法文、自定义),运行时选择(见[下文](#关键字别名))。 - **跨平台** —— Windows(32/64 位)、Linux、ARM 与 Windows CE。 - **双形态分发** —— 命令行 `fun.exe` 与嵌入运行时 `fun.dll`(导出简单的 `Run` 接口)。 - **自托管的标准库** —— 78 个用 Fun 自身编写的模块,覆盖 JSON/YAML/XML 到 ORM、异步、UI 与原生绑定。 --- ## 快速开始 ### 预编译二进制 预编译解释器见 [GitHub Releases](https://github.com/funlang/fun/releases): - Linux x64 / arm64:`.tar.gz`,内含 `libtcc.so` 与标准库 `lib/`; - macOS x64 / arm64:`.zip`。两个包都内含 `libtcc.dylib`。构建 **未签名、未公证**;请使用包内 `install.sh` `--local`(curl 下载不会设置隔离属性),或解压后执行 `xattr -dr com.apple.quarantine <目录>`; - Windows x64:`.7z`。构建未签名,SmartScreen 可能提示;请用 7-Zip 解压, 然后双击包内 `install.cmd`(也可以运行 `powershell -ExecutionPolicy Bypass -File install.ps1`)。包内包含 `fun.exe`、 `fun-safe.exe`、安装脚本,以及 CI 构建的 x86-64 运行期 DLL(`pcre3.dll`、 `ffi.dll`、`libtcc.dll`、`zlib.dll`);个别构建缺失的能力由 `capabilities.json` 记录。 macOS / Linux 一行安装(校验 `SHA256SUMS`,安装到 `~/.fun`): ```bash curl -fsSL https://raw.githubusercontent.com/funlang/fun/main/install.sh | sh ``` 如果最新稳定版还没有二进制资产,安装脚本会明确提示并回退到最新 nightly。 也可以直接用 `--tag` 或 `--nightly` 指定。默认把 `fun` 链接到 `~/.local/bin`;该目录不在 `PATH` 时,可加 `--add-path` 向 `~/.profile` (zsh 为 `~/.zshrc`)追加一段带标记的 PATH 配置,或用 `--bin-dir DIR` 把链接放到已有的 PATH 目录。 Windows 安装(当前用户,无需管理员权限): 1. 用 7-Zip 解压 `.7z`; 2. 双击解压目录里的 `install.cmd`。 `install.cmd` 会把运行时复制到 `%LOCALAPPDATA%\Programs\Fun`,把 `%LOCALAPPDATA%\Programs\Fun\fun` 加入用户 `PATH`,注册 `.fun`、`.foo`、 `.fxx` 的 `Fun Script` 关联(双击脚本即可运行),在 Win+R 中加入 `fun`, 并在**设置 > 应用**中生成卸载项。常用参数:`-AllUsers`(需管理员,安装到 `Program Files`)、`-Dir DIR`、`-NoPath`、`-NoAssoc`、`-Portable`。 从安装目录运行 `uninstall.cmd`,或在**设置 > 应用**中卸载。Windows 可能 保留已有的用户选择;用一次**打开方式 > 选择其他应用**选中 Fun 即可。 每个压缩包内是一个 `fun/` 运行时目录:`fun/fun`(Windows 为 `fun/fun.exe`) 与 `fun/fun-safe`(能力受限构建),以及 `lib/`、`demo/`、`demos/` 和 `test/` 回归套件。运行 `./fun/fun --help`;Linux/macOS 可用 `./fun/test/run-linux-regression.sh` 跑自带测试,Windows 用 `fun\test\run-windows-regression.bat --portable`。 `install.sh` 出现在所有 Unix 压缩包内(不再只限 macOS),同时建立指向 `fun` / `fun-safe` 的 `funcmd` / `funcmd-safe` 兼容软链接。两个安装脚本都 与运行时目录一起打包,是获得全局 `fun` 命令的受支持方式。解压后运行 `./install.sh --local` 会离线安装该目录;不带 `--local` 则下载最新版本。 每个 release 另附 `capabilities.json` 与 `SHA256SUMS`,缺失的可选能力会明确 列出。nightly 是 prerelease,`releases/latest` 仍指向稳定版。`fun.dll` 是 单独授权的产品,不包含在这些产物中。 Linux 产物在 Ubuntu 24.04 上构建,需要 glibc 2.34 或更新版本;启用 getapi/FFI 时还需要运行时的 `libffi.so.8`。 运行脚本: ```text fun.exe # 运行脚本(.fun / .foo / .fxx) fun.exe -v # 显示编译与运行耗时 fun.exe -log[:log.txt] -gui # 输出到日志 / 以 GUI 模式运行 fun.exe -key:key_cn.ini # 加载关键字别名包 ``` Hello world(规范英文关键字): ```fun fun foo() ?. 'Hello, fun!'; end fun; foo(); fun max(a, b) if a > b then result = a; else result = b; end if; end fun; ?. max(1, 9); ?. max(9, 1); ``` 运行: ```text > fun.exe fun/demo/fun.fun Hello, fun! 9 9 ``` --- ## 包管理 下文 `fun` 指命令行程序(Windows 上是 `fun.exe`)。一个项目就是一个带 `package.fun` 清单的目录,`fun package init` 生成清单和最小模板: ```text fun package init myapp # package.fun + src/main.fun fun package init mylib --lib # package.fun + src/lib.fun ``` ```fun fun package() result = [ name: 'myapp', version: '0.1.0', bin: 'src/main.fun', lib: '', 'fun': '9.5.5', dependencies: [ 'hello': [source: 'github.com/acme/hello', version: 'v1.0.0'], 'local': [source: '../libs/local'] ], // >>> generated - do not edit; run 'fun package tidy' to refresh resolved: [] // <<< generated ]; end fun; ``` - `fun package add [--version ]` / `remove ` 只改 `dependencies` 段;版本只接受精确的 tag、分支或 commit。 - `fun package tidy` 把声明的版本装进共享的 `~/.fun` 缓存(`FUN_HOME` 可 覆盖),校验 git tree 哈希,并写回 `resolved` 段;path 依赖就地使用, 只有 git 依赖需要 `git`。 - `fun run [args...]` 以清单目录为根运行 `bin`;在项目里 `fun