Skip to content
xiguayiqiuPublic

About

网络安全开发的专用脚本语言

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

6 Commits

Folders and files

Repository files navigation

YScript

YScript logo

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
./hello

ysc 负责运行脚本、交互式执行、语法检查和项目管理;yscc 则使用共享的 Go 前端解析 YScript,再通过 LLVM 生成并链接原生程序。编译器支持优化等级、调试信息、死代码清理、 多种输出格式和 C ABI/FFI(通过 --cys 启用)。语言语法、标准库和使用示例详见 yscript/README.md;编译器选项和实现说明详见 ysc-Compiler/README.md。

yscc 的编译目标与支持范围(编译器正在逐渐完善中,暂不提供预编译发布二进制)

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 不提供这些目标

Windows amd64 GNU 标准库支持

下表描述的是 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。

构建条件

构建解释器 ysc

构建解释器需要 Go 工具链。进入 yscript/ 后使用其 Makefile:

cd yscript
make

解释器可以通过 Go 的 GOOS 和 GOARCH 交叉构建。启用 cgo 或使用依赖本机原生库的功能时, 还需要相应平台的 C 编译器、SDK 和依赖库。

构建编译器 yscc

构建 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 开发文件(标准构建启用 --cys C 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

  • 本机 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

  • 本机 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

  • 本机 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-macos slice 的 macOS 11 或更新 SDK。其 LLVM 前缀的 lib/ 还需提供 arm64 libzstd.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(Android arm64)

  • 在 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-llvm

Linux 与 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/sysroot

dist/ 中的 .tar.xz 文件是构建产物,不是构建 ysc 或 yscc 的必需输入。

当前发布版本:v1.0-release。

About

网络安全开发的专用脚本语言

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages