YScript v1.0 正式开源发布。 这是历经 1 年 8 个月持续开发的首个正式版本; 从语言运行时、标准库到跨平台工具链的演进历程,详见开发日志。
YScript 是一门面向网络安全领域的专项编程语言,不是围绕少数固定操作设计的传统 DSL(领域专用描述语言)。它拥有完整的编程语言结构,包括函数、结构体与方法、闭包、 异常处理和项目依赖管理,并以网络通信、协议解析、密码学、二进制处理及系统工具等安全 工作场景为核心设计方向。动态类型和简洁语法让它适合快速编写、组合与分发安全工具。
本项目目录包含两部分:
yscript/:Go 实现的 YScript 解释器和工具ysc。ysc-Compiler/:将 YScript 程序编译为原生可执行文件的编译器yscc。
package main
func main() {
let message = "Hello, YScript!"
println(message)
}
使用解释器运行脚本:
ysc hello.ys使用原生编译器生成可执行文件:
yscc hello.ys -o hello
./helloysc 负责运行脚本、交互式执行、语法检查和项目管理;yscc 则使用共享的 Go 前端解析
YScript,再通过 LLVM 生成并链接原生程序。编译器支持优化等级、调试信息、死代码清理、
多种输出格式和 C ABI/FFI(通过 --cys 启用)。语言语法、标准库和使用示例详见
yscript/README.md;编译器选项和实现说明详见
ysc-Compiler/README.md。
yscc 生成原生程序。下表概括各目标的支持等级;交叉编译仍需相应目标 runtime、SDK/sysroot
和 linker,详细配置见 ysc-Compiler/README.md。
当前 yscc 主要面向 Linux 平台。 Windows、macOS 和 Android 等其他平台的支持仍在完善中,
会在后续版本逐步补齐。
| 目标 | 支持等级 | 说明 |
|---|---|---|
| Linux amd64 | 完美支持 | 本机编译和运行已验证 |
| Linux arm64 | 完美支持 | 交叉编译及目标运行已验证 |
| Windows amd64(MinGW-w64 GNU) | 部分支持 | Linux 交叉构建、Windows yscc 在 Wine 下启动、IR/汇编/COFF 生成及静态 PE 运行均已验证;26 项 Wine runtime smoke 检查通过。net 仅支持部分 API;不支持监听/接受连接、其他 DNS 查询、TLS;POSIX regex 字符类限单字节编码;尚未在原生 Windows 环境验证,不支持 MSVC ABI |
| macOS amd64/arm64 | 部分支持 | 目标受支持,需 macOS SDK/sysroot;arm64 yscc 可在 Linux 上交叉构建,生成的 macOS 程序仍需在 macOS 上验证 |
| Android arm64 / Termux | 部分支持 | 目标受支持,需 Android NDK/sysroot;尚未完成端到端验证 |
| Windows MSVC、ARMv7,以及表中未列出的系统或架构 | 不支持 | 当前 yscc 不提供这些目标 |
下表描述的是 yscc 生成的 Windows 原生程序所使用的内置 runtime,不代表解释器 ysc
或 Go 标准库的 Windows 支持情况。标为“支持”的是常用功能子集,并不保证与 Go API 完全兼容。
| 状态 | 标准库 / 命名空间 | Windows 支持范围与限制 |
|---|---|---|
| 支持常用功能 | stdio、color、strings(string/str)、from、math、array、errors、iter |
常用输入输出、格式化、字符串、数学和集合操作 |
| 支持常用功能 | io、os、json、csv、ini、encoding(hex)、rand、url |
常用文件读写、环境/进程操作、数据解析与编码 |
| 部分支持 | net |
支持 IsIP/IPVersion、LookupHost、TCP/UDP 拨号及 ConnRead/ConnWrite/ConnClose;不支持监听/接受连接、其他 DNS 查询、CIDR、接口枚举及 TLS |
| 部分支持 | regex |
支持 POSIX ERE 的常用匹配、查找、替换和分割;字符类限单字节编码,不支持 Go RE2 专属语法、命名捕获组和 replace_fn |
| 部分支持 | time、term、path、thread/warp |
只实现部分函数;time.after_chan 不可用,线程/warp 不提供真正并行调度;Windows 盘符路径语义未完整实现 |
| 当前未实现 | load、binary、compress、event、crypto、ocr、aes、rsa、ssl、cli、http、socket、raw、sync、sys、log、toml、xml、yaml、reflect、ffi、lstd、c、cuda、yui |
Windows 原生 runtime 未提供这些命名空间的实现;调用时会报告不支持的命名空间函数 |
上表以当前 Windows runtime 实际实现为准;支持范围及 Wine 验证覆盖详情见
ysc-Compiler/README.md。
构建解释器需要 Go 工具链。进入 yscript/ 后使用其 Makefile:
cd yscript
make解释器可以通过 Go 的 GOOS 和 GOARCH 交叉构建。启用 cgo 或使用依赖本机原生库的功能时,
还需要相应平台的 C 编译器、SDK 和依赖库。
构建 yscc 本身(不是用 yscc 编译用户程序)需要以下工具和开发文件:
- Rust stable/Cargo(edition 2024)及对应目标的 Rust standard library;Makefile 会在可用时 通过 rustup 安装目标库。
- Go 工具链,用于编译共享的
ysc前端。 - LLVM 23.1.4 开发安装,包含 LLVM C headers、
libclang、llvm-config所需信息和完整的 静态 LLVM.a归档。交叉构建时必须使用与产物平台/ABI 匹配的 LLVM 安装;单体libLLVM*.a或组件归档均可,组件归档还要提供正确顺序的静态库清单。构建不会在静态库缺失时 静默退回动态 LLVM。 clang,用于将ysc-Compiler/runtime/runtime.c编译为各目标的 LLVM IR;交叉构建目标 runtime 时还需该目标的 SDK/sysroot 和相关 C headers。pkg-config与libffi开发文件(标准构建启用--cysC ABI/FFI)。- 目标 C linker;交叉构建还需相应的目标工具链、SDK/sysroot 和平台静态系统库。
Go 构建共享前端,Clang 生成内嵌 runtime IR,LLVM 生成原生目标代码。Linux 和 Windows
版 yscc 会静态链接 C runtime;macOS 版保留 Apple 系统库依赖(包括 libSystem 和系统
C++ runtime)。Linux 静态版使用非 PIE 链接模型,因此不具备 PIE 提供的 ASLR。各平台的
额外依赖及构建命令见下节。
- 本机 Linux 构建:安装带完整 LLVM 23 静态归档的 LLVM 开发包、Clang、
libclang、pkg-config和libffi开发包,并提供系统 C linker(如cc)及静态 libc/linker 依赖。构建结果通过-static链接,不需要目标机器安装 LLVM 或 libc 共享库。 - 从 Linux 交叉构建 Linux amd64:使用
make package-linux-amd64。若目标 sysroot 或运行时头文件 不在默认位置,设置LINUX_AMD64_SYSROOT、LINUX_AMD64_CFLAGS。 - 从 Linux 交叉构建 Linux arm64:使用
make package-linux-arm64。除 AArch64 GCC 和 sysroot 外,目标 LLVM 前缀的lib/还需提供 AArch64 静态libz.a与libzstd.a;构建会通过-lz -lzstd静态链接这两个 LLVM 压缩依赖。
- 本机 Windows GNU 环境:准备 Rust GNU 工具链、Go、LLVM 23、Clang、
pkg-config、libffi开发文件和 MinGW-w64 linker。 - 若使用 Linux 版
yscc交叉编译 Windows 用户程序,需要 MinGW-w64 交叉编译器及make。 项目附带的poix/mingw-libgnurx-2.5会在构建yscc时自动编译 POSIX regex 运行库, 并将其静态链接进.exe,不需要libgnurx-0.dll;Windows 系统 API/UCRT DLL 仍由系统提供。 LGPL 许可证及上游源码归档放在build/deps/。详情见ysc-Compiler/README.md。 - 从 Linux 交叉打包 Windows 版
yscc时,运行make package-windows-amd64 WINDOWS_AMD64_LLVM_PREFIX=/path/to/windows-llvm,并准备含 LLVM 静态.a归档的 Windows ABI LLVM 23、静态 MinGW runtime、 MinGW linker/sysroot。项目附带的 GNU regex 移植版会在构建时自动编译;如使用 自定义 regex 安装,可设置WINDOWS_AMD64_REGEX_PREFIX。这是构建 Windows 版编译器本身 所需的条件,详见ysc-Compiler/README.md。 - Linux 版
yscc交叉编译 macOS/Android 用户程序时,还需在构建yscc时提供相应 SDK: 使用YSCC_DARWIN_AMD64_SYSROOT、YSCC_DARWIN_ARM64_SYSROOT或YSCC_ANDROID_ARM64_SYSROOT指定目标 sysroot;生成程序时还需可用的目标 linker。 Linux arm64 可使用aarch64-linux-gnu-gcc或YSCC_LINUX_ARM64_SYSROOT。 - 从 Linux 交叉构建 Windows amd64 GNU:除 Rust target
x86_64-pc-windows-gnu外,还必须准备 Windows GNU ABI 的 LLVM 23 开发库、bin/llvm-config、MinGW-w64 C compiler 和 Windows sysroot。设置WINDOWS_AMD64_LLVM_PREFIX指向该 LLVM 安装根目录;可用WINDOWS_AMD64_LINKER、WINDOWS_AMD64_CC和WINDOWS_AMD64_SYSROOT覆盖工具路径。 Windows 版yscc强制静态链接 LLVM 和 MinGW runtime。仅有 LLVM DLL/import library 或 Linux 版libLLVM.so,不足以链接 Windows 版yscc;构建前会检查静态 LLVM 归档。
- 本机 macOS 构建:安装 Xcode Command Line Tools(提供 Apple SDK 和 linker)、Rust、
Go、LLVM 23、Clang、
pkg-config和libffi开发文件。 - 从 Linux 交叉构建 macOS:需要 macOS SDK、对应架构的 linker/sysroot,以及目标平台匹配
的 LLVM 23 静态归档;仅安装 Rust targets 不足以完成交叉构建。Linux 主机通常需
安装带有 macOS SDK 的 osxcross。amd64 和 arm64 分别设置
DARWIN_AMD64_LLVM_PREFIX、DARWIN_ARM64_LLVM_PREFIX,并按需配置DARWIN_AMD64_LINKER/DARWIN_AMD64_SYSROOT与DARWIN_ARM64_LINKER/DARWIN_ARM64_SYSROOT。arm64 默认使用项目自带的darwin-arm64-linker,通过 Clang/LLD 和 SDK 进行 arm64 链接;可用DARWIN_ARM64_CLANG指定 Clang,并通过DARWIN_ARM64_DEPLOYMENT_TARGET调整最低 macOS 版本(默认 11.0)。macOS arm64 需要包含arm64-macosslice 的 macOS 11 或更新 SDK。其 LLVM 前缀的lib/还需提供 arm64libzstd.a;Apple SDK 提供 zlib 系统 stub。 本机/opt/MacOSX26.1.sdk会被自动选作默认 SDK;可运行make package-darwin-arm64 WITH_YSCC=1构建并打包 arm64 版yscc。make all默认只为 Linux 包构建yscc;要生成 macOS arm64 编译器包,应显式启用WITH_YSCC=1。
- 在 Termux 构建或打包:准备 Rust/Go、LLVM 23、Clang、
pkg-config、libffi开发文件 和 Android arm64 linker。 - 从 Linux 交叉打包:需要 Android NDK 以及 Android arm64
目标的 LLVM 23 和相应运行时库;设置
ANDROID_ARM64_LLVM_PREFIX和ANDROID_ARM64_SYSROOT。 NDK 提供的 clang、 sysroot 和 Rust target 不能替代 LLVM 23 目标开发库。
本机编译时进入 ysc-Compiler/ 运行 make;只构建某个平台的 yscc 时,可在该目录运行
make yscc-linux-arm64 等 yscc-<platform> 目标,生成的二进制位于
target/<rust-triple>/release/,并复制一份带平台后缀的可执行文件到 ysc-Compiler/。
交叉平台 LLVM 前缀必须包含 LLVM 静态 .a 归档。单体 libLLVM-23.a / libLLVM.a
可自动发现;如果 LLVM 提供的是组件归档,需将目标环境 llvm-config --link-static --libnames
输出的有序文件名传给 LLVM_STATIC_LIBNAMES_<platform>。主机构建会自动搜索 PATH 和常见 LLVM
安装目录,选择版本、主机架构匹配且静态归档齐全的 LLVM。
若静态 LLVM 安装在非标准目录,可以用 HOST_LLVM_PREFIX 显式指定;例如仅打包本机 Linux amd64:
make package-linux-amd64 HOST_LLVM_PREFIX="$HOME/opt/llvm-23.1.4-static"此目录需包含 bin/llvm-config、include/llvm-c/ 和 lib/。运行 make all 时,
该设置仅供本机目标使用;其他交叉目标仍需各自的 LLVM 前缀。若未找到完整静态 LLVM,
构建会报告缺失库并失败,不会回退到动态链接。
若交叉构建的 LLVM 静态归档依赖额外库,可用 LLVM_STATIC_SYSTEM_LIBS_<platform> 传入
linker 库参数;依赖也必须有目标平台的静态归档。Windows GNU 构建会使用
ysc-Compiler/scripts/windows-static-linker,避免 Rust/LLVM 将这些库重新切换为动态链接。
Linux/Windows 构建会检查最终文件不是依赖动态 loader/第三方 DLL 的程序;Windows 仍会导入
系统提供的 API/UCRT DLL。
跨平台打包时可从项目根目录运行 make all、对应的
make package-<platform> 或 make package-android-arm64,也可在 ysc-Compiler/ 目录运行
相同的单平台 make package-<platform> 目标。make all 会为 Linux 平台打包 ysc 和 yscc,
其他平台只打包 ysc;单独调用 make package-<platform> 时仍默认同时构建 yscc,可传
WITH_YSCC=0 仅打包解释器。Makefile 可在 rustup 可用时安装 Rust target,
但不会自动安装 LLVM、SDK、sysroot、linker 或 libffi。
cd ysc-Compiler
make
./yscc --version若 YScript 源码不在默认的 ../yscript,可指定前端源码位置:
YSCRIPT_SOURCE=/path/to/yscript make项目根目录的 Makefile 可将 ysc 和 yscc 打包为同一个 .tar.xz 文件。
make all 默认构建 Linux amd64/arm64、Windows amd64 GNU 和 macOS amd64/arm64:
Linux 归档包含 ysc 与 yscc,Windows/macOS 归档仅包含 ysc。Linux amd64/arm64 包名以
yscript- 开头,其他平台解释器包名以 ysc- 开头。各交叉目标需要对应的 Rust target、
LLVM 23、sysroot/SDK 及 linker;Android/Termux 使用独立目标。
如果对应目录存在,Makefile 会自动使用 /opt/LLVM-23.1.4-Linux-ARM64 和
/opt/LLVM-23.1.4-macOS-ARM64 作为 Linux arm64、macOS arm64 的 LLVM 前缀;
也可通过 LINUX_ARM64_LLVM_PREFIX 或 DARWIN_ARM64_LLVM_PREFIX 覆盖。自动设置 LLVM 前缀
不会替代目标平台所需的静态系统库、SDK/sysroot 和 linker。
# 构建全部默认平台
make all
# 只构建指定平台
make package-linux-amd64
make package-linux-arm64 LINUX_ARM64_LLVM_PREFIX=/path/to/linux-arm64-llvm
make package-windows-amd64 \
WINDOWS_AMD64_LLVM_PREFIX=/path/to/windows-static-llvmLinux 与 Windows 的 yscc 不携带 LLVM 或 C runtime DLL/共享库;Windows 仍会导入系统提供的
Windows API DLL。交叉链接器包装脚本已嵌入 yscc,发布包无需再单独携带 yscc-linker。
macOS yscc 不携带 LLVM 动态库,但依赖 Apple 系统库,包括 libSystem 和系统 C++ runtime。
Termux arm64 使用单独目标,不包含在 make all 的平台矩阵中:
make package-android-arm64 \
ANDROID_ARM64_LLVM_PREFIX=/path/to/android-arm64-llvm-23 \
ANDROID_ARM64_SYSROOT=/path/to/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/sysrootdist/ 中的 .tar.xz 文件是构建产物,不是构建 ysc 或 yscc 的必需输入。
当前发布版本:v1.0-release。
