Releases: tphp-lang/TinyPHP
Releases · tphp-lang/TinyPHP
Release list
v0.2.0-beta.11
What's Changed
Full Changelog: v0.2.0-beta.10...v0.2.0-beta.11
新增
- 编译缓存机制(
tphp.php):用源文件 SHA256 + TPHP_VERSION + common.h 哈希作为缓存 key,跳过未变化的重复转译。头文件变更时缓存自动失效 - CI 质量基础设施(
.github/workflows/test.yml+.github/scripts/run_tests.php):- ASan job(GCC + sanitizer)
- SHA256 下载校验框架
- doc_check 纳入 tools-tests(文档完整性检查)
@expect-error负面测试注解(期望编译失败)-j N并行测试执行
变更
- CodeGenerator 拆分(
src/CodeGenerator.php+ 6 个 trait):主文件 14,212 → 4,102 行(-71.1%),提取 CodeGenData/TypeCast/VarWrap/Array/Call/Enum trait + CodeGenTypes 统一 C 类型常量 - 消除重复代码:NameResolver 统一 6 处重复、tphp.php
preprocessFlags()/resolvePlatform()合并、Helpers.php 提取 7 个辅助函数 - Channel 自旋优化(
include/object/channel.h):自旋次数 750→64,每轮thrd_yield()让出 CPU,减少高竞争下无效锁竞争 - 字符串搜索优化(
include/std/core.h):strpos/strrpos/stripos/strripos用memchr快速跳过首字节,替代逐字节线性扫描 - 测试素材管理规范化:25 张测试图片迁移至
test/fixtures/images/,.gitignore 用通配符规则区分输入素材和输出产物
修复
- Windows GCC 测试超时(
.github/scripts/run_tests.php):超时 60s→300s,GCC-O2编译大型 C 文件(如 gd font_test 含 15 个 zlib 源文件)耗时接近 60s,CI 更慢导致超时 - 缓存命中时变量未定义(
tphp.php):$debugMode/$extraFlags/$lateLinkFlags在缓存检查前预初始化,修复缓存命中时 Undefined variable - unlink 文件锁 warning(
tphp.php):unlink→@unlink抑制 Windows 文件锁 "Resource temporarily unavailable" warning - run_tests.php Windows stream_select 引用参数错误:
stream_select()要求引用参数,不能内联赋值 - run_tests.php macOS 管道丢数据:Linux/macOS 恢复
system()+shell 重定向替代proc_open - CI exif/gd 测试静默崩溃:测试素材图片纳入 git 跟踪 +
t_be.jpg路径修复 - doc_check 误报:过滤内部 C 宏/实现函数,消除 257 个误报;移除硬编码白名单改用模式匹配
- CI tools-tests shell 语法错误:移除 here-string,简化 shell 语法
清理
- 删除 5 个死代码文件(
builtin_full.h/std/builtins.h/klib//Compiler.php) - 根目录残留 .exe/临时文件清理
- PHP 8.2+ 动态属性 Deprecated 警告修复
Compiler.php残留引用移除- 并行测试 .c 文件同名冲突修复
文档
- README.md:性能声称从 "300-500x" 修正为 "up to 36x"
- FUNCTIONS.md / BENCHMARK_RESULTS.md:函数数统一为 450+
ext/openssl/src/openssl.h:SSL_VERIFY_NONE 警告增强- CONTRIBUTING.md:更新
v0.2.0-beta.10
What's Changed
Full Changelog: v0.2.0-beta.9...v0.2.0-beta.10
新增
- stdClass 动态属性对象支持(
include/object/stdclass.h+ 编译器集成):兼容 PHP 原生new stdClass(),支持字面量属性名的动态属性读写、isset/unset、foreach 遍历、(object)/(array)类型转换、get_object_vars()内置函数。- AOT 兼容性:仅支持字面量属性名(编译期已知),不支持
$obj->$var动态属性名(与$$var同理,AOT 约束)。json_decode保持返回 array(不改为 stdClass,因 JSON 键运行时才知道) - 运行时实现:
tphp_class_stdClass结构体(t_object header + t_array* props 动态属性表),基于 array.h 的哈希索引实现 O(1) 属性查找。提供new_stdClass/tphp_fn_stdclass_get/set/isset/unset/clone/count/from_array/to_array10 个运行时函数 - 编译器特判:visitNew/visitPropertyAccess/visitAssignPropStmt/isset/unset/foreach 在对象类型为
tphp_class_stdClass*时生成运行时函数调用;新增wrapTVar辅助方法将任意类型包装为 t_var,emitStdClassForeach生成属性遍历代码 - 类型转换:
(object) $array通过tphp_fn_stdclass_from_array复制键值对创建 stdClass;(array) $stdClass通过tphp_fn_stdclass_to_array提取属性表为关联数组 - var_dump 适配:stdClass 输出 PHP 兼容格式
object(stdClass)#N (count) { ["k"]=> val ... },递归显示所有动态属性 - isset 语义:与 PHP 一致,null 值属性返回 false(不仅检查键存在性,还检查值非 null)
- Parser 支持:新增
(object)cast 类型识别(Lexer 中object非类型关键字,需 Parser 特判) - 测试覆盖:6 个测试文件(basic/cast/isset_unset/foreach/functions/edge),TCC/GCC/Clang 三编译器全部通过
- AOT 兼容性:仅支持字面量属性名(编译期已知),不支持
修复
- macOS Metal shader 缺失(
ext/ui/src/ui.h):shader 源码只有SOKOL_GLCORE和SOKOL_GLES3两个条件编译分支,macOS 使用SOKOL_METAL后端时_sr_vs_src/_sr_fs_src未声明导致编译失败。添加SOKOL_METAL分支提供 MSL(Metal Shading Language)源码,通过_SR_VS_ENTRY/_SR_FS_ENTRY宏为 Metal 后端设置显式 entry 函数名(vs_main/fs_main) - Android NDK CI 报错 "built-in TCC not found"(
tphp.php):-os android时默认尝试找 TCC,但 Linux CI 环境未安装 TCC。Android 目标使用 NDK clang,跳过 TCC 存在性检查;$ccClass在条件编译求值阶段(Phase 1)提前设为 'Clang'(而非等到 NDK 探测逻辑 Phase 2)
v0.2.0-beta.9
What's Changed
Full Changelog: v0.2.0-beta.8...v0.2.0-beta.9
[0.2.0-beta.9] — 2026-08-02
新增
- ext/ui(
ext/ui/):基于 sokol C 库的跨平台图形界面扩展(纯 phpc 模式)。9 个 PHP 类 + 9 个枚举,覆盖窗口管理、2D 绘图、控件体系、布局系统和事件处理。- 底层依赖:内置 sokol C 库源码(sokol_app/sokol_gfx/sokol_glue/sokol_log/sokol_time),位于
ext/ui/sokol/,零运行时依赖 - 平台后端:Windows/Linux = OpenGL (SOKOL_GLCORE),macOS = Metal (SOKOL_METAL)。TCC 缺失
windowsx.h,故 Windows 使用 OpenGL 而非 D3D11 - 核心类:
App(窗口生命周期 + onInit/onFrame/onEvent 回调)、Window(静态:width/height/dpiScale/setCursor)、Event(fromPtr 解析 sapp_event 指针)、Color(RGBA + toUint 0xAABBGGRR)、Rect(contains 命中测试)、Graphics(静态:clear/fillRect/drawText/drawLine/drawRect/drawCircle) - 控件体系:
Widget抽象基类(init/draw/setPos/proposeSize/pointInside + 事件方法)、WidgetContainer(addChild/drawAll/hitTestIndex/dispatch*)、Button(press/release/click + onClick)、Label、TextBox(focus/blur/handleKeyDown/handleChar)、CheckBox(toggle/setChecked + onChange)、Slider(beginDrag/drag/endDrag/setValue + 值夹紧) - 布局系统:
Layout抽象基类(addWidget/updateLayout/asWidget)、Stack(flex 风格,row/column 静态方法,Compact/Stretch/Fixed 尺寸模式)、CanvasLayout(绝对定位) - 软键盘桥接:
SoftInput静态类(show/hide/isVisible/onInput/dispatch/clear),桌面端 show/hide 为 no-op,移动端未来支持 - 枚举:EventType(22 值)/ Key(ASCII+VK_*)/ MouseButton / KeyMod / Cursor / Direction / WidgetState / LayoutAlign / ChildSize
- 绘图契约:所有
Graphics::*方法必须在onFrame回调内调用,否则抛Exception("drawing outside frame callback") - 事件契约:sokol
sapp_event*指针以t_int流转(intptr_t 转换),PHP 侧通过Event::fromPtr($evPtr)解析 - 回调安全:
onInit/onFrame/onEvent/SoftInput::onInput注册的闭包通过phpc_env_pin钉在全局 pin 表,防异步回调 UAF - TCC Windows 兼容:
RegisterRawInputDevices/GetRawInputData在 user32.def 缺失,提供 stub 满足链接器(仅 mouse_lock 时调用,UI 测试不使用) - 测试:
test/ui/ui_color_test.php(Color 单元测试)+test/ui/ui_widget_smoke_test.php(Widget/Layout 冒烟测试)+ 4 个集成测试(ui_basic.php/ui_events.php/ui_widget_render.php/ui_layout_render.php,标记@skip需图形环境)
- 底层依赖:内置 sokol C 库源码(sokol_app/sokol_gfx/sokol_glue/sokol_log/sokol_time),位于
v0.2.0-beta.8
🎉 New Features
异步与协程通信库 (Channel / Future / chan_select)
参考 vlang CSP 模型设计的异步通信原语,采用 tphp OOP 思想:
- Channel — CSP 风格有界通道,环形缓冲区实现(push/pop 零 malloc),阻塞前自旋 750 次减少 syscall。9 个方法
- Future — 一次性异步结果传递,支持
await/then/catch链式调用 +all/race组合器。10 个方法 - chan_select — 多通道多路复用,支持超时机制
- 内存安全:push 时 retain,close 时遍历释放,dtor 保证不泄漏
- 新增
ChannelClosedException/FutureRejectedException异常类型
ext/pgsql + ext/pdo_pgsql
PostgreSQL 扩展(纯 C 协议实现,支持 trust/md5/SCRAM-SHA-256 认证):
- 78 个
pg_*函数(连接/查询/预处理/结果集/COPY/DML/Large Object/持久连接/通知回调) - ~60 个常量
- 参考 vlang Pool+IdleSlot 模式实现
pg_pconnect持久连接池 pdo_pgsql驱动复用 ext/pgsql 协议实现
🐛 Bug Fixes
- fix(ci): 修复 TCC on macOS 定义
__GNUC__导致误命中 GCC__atomic_*内建,283 个测试全部编译失败 - fix(pdo_pgsql): 修复
c_int()截断 64 位 dbh 指针导致多平台段错误 - fix(pgsql): 修复 notice 回调段错误 + TypeChecker 常量 null type 警告
- fix(ext): pgsql/pdo_pgsql 改用 phpc 正确前缀 + 修复常量引用类型推导
- fix(ci): Windows PostgreSQL 改用 EnterpriseDB binaries ZIP 包手动安装
Full Changelog: v0.2.0-beta.7...v0.2.0-beta.8
What's Changed
Full Changelog: v0.2.0-beta.7...v0.2.0-beta.8
v0.2.0-beta.7
What's Changed
- P2 by @KingBes in #4
- P2 by @KingBes in #5
Full Changelog: v0.2.0-beta.6...v0.2.0-beta.7
v0.2.0-beta.7 — cURL/GD 扩展 + array 类型系统 + 异常处理跨编译器修复
新特性
cURL 扩展 (ext/curl/)
- 纯 phpc 实现 HTTP/HTTPS 客户端,不依赖 libcurl C 库
- 35 个函数 + 690 个常量 + 6 个类(CurlHandle/CURLFile 等)
- 复用 ext/openssl(mbedTLS)和 ext/stream 的 socket 抽象
- 支持 multipart 文件上传、chunked 解码、FOLLOWLOCATION 重定向
GD 扩展 (ext/gd/)
- 纯 phpc 实现图像处理,不依赖 libgd/libpng/libjpeg
- ~90 个函数 + 89 个常量 + 2 个类(GdImage/GdFont)
- 支持 PNG/GIF/BMP/GD/GD2/WBMP/XBM/TGA 共 8 种编解码
- 不支持格式(JPEG/WebP 等)调用时抛 RuntimeException 明确报错
array 泛型数组类型系统
- array 编译期单态化为独立 C 类型(t_arr_int/t_arr_str 等)
- 元素紧凑存储(array 比 array 节省 67% 内存)
- 协变转换机制 + 元素类型追踪 + 特化排序/洗牌
修复
异常处理机制 (include/object/try.h)
- TP_SETJMP 宏:MinGW x86_64 SEH + GCC -O2 下使用 _setjmp(buf, NULL)
跳过 RtlUnwindEx,修复 longjmp 跨函数跳转时 ACCESS_VIOLATION - _tp_do_longjmp noinline 辅助函数:隔离 longjmp 调用,防止 GCC 内联
优化破坏 SEH unwind 表 - TP_FINALLY 不再吞掉未处理异常:新增 _tp_need_rethrow 标志和保存变量,
TP_END_TRY 据此重抛,修复 try { throw } finally { ... } catch 语义
其他修复
- 对象唯一 ID 机制(t_object 新增 id 字段,替代 refcount & 0xFFFF)
- 数组元素引用计数系统性修复(fetchAll 悬垂指针 use-after-free)
- 数组重赋值自赋值 guard 双重释放
- stream_socket_accept 错误处理契约(真错误抛异常,EAGAIN 返回 -1)
- macOS -framework 链接支持(TCC 不识别 -framework X 语法)
- gcc/clang 下特化排序/洗牌函数指针类型不兼容
- isset/empty 返回类型推导缺失
- mbedTLS 相关:声明顺序、参数类型、aesni.c 源文件缺失
- gcc/clang 静态库归档命令不兼容(改用系统 ar)
v0.2.0-beta.6
v0.2.0-beta.5
Full Changelog: v0.2.0-beta.4...v0.2.0-beta.5
v0.2.0-beta.4
v0.2.0-beta.4
重点关注:内存安全(数组引用计数系统性修复)、编译器兼容性(gcc/clang 全平台通过)、PDO MySQL 驱动。
新增
- PDO MySQL 驱动:在 SQLite 驱动基础上新增 MySQL 驱动,实现 PDO 驱动抽象层。CodeGenerator 自动注入驱动注册代码,
PDO::__construct("mysql:...")开箱即用。CI 已覆盖 Linux/Windows/macOS 三平台 MySQL 集成测试。 - 字符串函数:
strrpos/stripos/strripos三个查找函数。 stream_context_create:占位实现,接收 options 数组参数保持签名兼容。
修复
- 数组元素引用计数系统性修复:
arr_push/arr_set_int/arr_set_str存储数组/对象值时未 retain,导致PDOStatement::fetchAll中result[] = row后 row 被重赋值 free,result 残留悬垂指针(use-after-free)。 - 对象唯一 ID 机制:
t_object新增独立id字段(全局递增计数器),替代refcount & 0xFFFF,var_dump输出符合标准 PHP 行为。 - 数组重赋值双重释放:
$result = func(..., $result, ...)时函数内部 realloc 了旧指针,guard 再次 free 导致堆损坏。新增exprIsCallWithVarArg检测跳过此类释放。 - gcc/clang 编译兼容性:修复多处
static inline前向声明缺失导致的implicit declaration/conflicting types错误(array.h / pcre.c / iconv 等),三平台 gcc/clang/tcc 全部 222 测试通过。 - 闭包
$this捕获:闭包内使用$this时自动捕获 self 指针并增加引用计数。 - 继承类结构体:子类不再重复
_obj字段,修复 upcast 指针偏移错误。 - 注解
newInstance()类型推断:foreach (ROUTE as $v)遍历注解数组时正确推导返回类型,修复Call to undefined method转译错误。 stream_socket_accept错误处理:真正错误抛异常(可 try-catch),超时/EAGAIN 返回 -1,符合 AOT 错误处理原则。- runtime 错误处理:所有公共函数/对象方法改用
tp_throw抛异常,消除静默错误处理。 - Windows
stream_isatty:用GetFileType替代_isatty避免崩溃。 $obj->prop[] = value语法:Parser 支持属性数组 push 赋值。- 命名空间兼容性:类前向声明、静态属性方法调用、拓扑排序等命名空间场景修复。
- macOS
-framework链接:TCC 透传-framework X给系统 ld。 - #2
变更
- PDO 驱动注册自动化:CodeGenerator 自动注入驱动初始化代码到
main(),无需手动注册。
Full Changelog: v0.2.0-beta.3...v0.2.0-beta.4
v0.2.0-beta.3
Full Changelog: 0.2.0-beta.2...v0.2.0-beta.3
v0.2.0-beta.3
本次版本聚焦测试体系对标 PHP 原生和PHP 8.5 兼容性修复,同时包含多个扩展补全。
🎯 核心亮点
1. 测试体系对标 PHP 原生
- 测试数量 169 → 209(+40,超出 200+ 目标)
- 目录结构对齐 PHP
tests/原生布局(lang//func//array//strings//math/等) - 移植 50+ PHP 8.5 原生
.phpt测试,每个文件标注原生测试编号 - 跨平台 CI 全绿:Windows AMD64 / Linux x86_64 / Linux aarch64 / macOS arm64
2. PHP 8.5 兼容性修复(14 项)
- 嵌套数组深层访问:
$arr[0][1][2]、$m["items"][0]["id"]现可正确读取(新增 AST 追踪 + 嵌套深度推断) - list/[] 解构类型推断:混合类型数组
[$a1, [$a2, [$a3]]] = [10, [20, [30]]]正确解构(per-index 类型推断) ??数组键语义:$arr["missing"] ?? "default"用array_key_exists检查,缺失键返回右侧而非 getter 默认值- 数学函数语义对齐:
abs(float)返回 float、pow(int, -1)返回 float、sqrt(-1)返回 NAN、count($arr, COUNT_RECURSIVE)递归统计 - 数组函数补全:
array_pad()新实现、array_keys($arr, $search)搜索参数、max(1,2,3)/min(...)可变参数形式
3. 扩展补全
- PDO 扩展(SQLite 驱动):首个基于类的扩展,33 个方法
- stream 扩展:新增 6 个函数(15 → 21)
- OpenSSL 扩展:内置 mbedTLS 3.6.6 静态编译,21 个函数,零运行时依赖
- zlib 扩展:新增 22 个函数(gz 文件流 + 增量上下文 API)
- zip 扩展:新增 5 个函数
📊 数据对比
| 指标 | beta.1 | beta.3 | 变化 |
|---|---|---|---|
| 测试数量 | 161 | 209 | +48 |
| 内置函数 | 281+ | 345+ | +64 |
| 跨平台 CI | 3 平台 | 4 平台 | +macOS arm64 |
⚠️ 已知限制
array_splice需要 by-reference 修改支持,AOT 下不支持,测试保留@skip- macOS + TCC:Generator 通过 pthread 线程模拟实现
- TCC + Windows:使用 ELF 目标格式,与 MinGW COFF
.a库不兼容
📚 详细变更
完整变更记录见 CHANGELOG.md
0.2.0-beta.2
Full Changelog: 0.2.0-beta.1...0.2.0-beta.2
修复phpc部分问题。
参加测试的项目:https://github.com/tphp-lang/tphp-raylib
实测Windows/Linux成功,macos未测试