Releases: ByUsiStudio/Code-CIN
Releases · ByUsiStudio/Code-CIN
Release list
v5.5.3
Full Changelog: v5.5.0...v5.5.3
pip install codecin==5.5.3[5.5.3] - 2026-09-26
以「消除静默算错地址」为主线的一次修复发布:两个会读错/写错内存且不报错的
代码生成缺陷,配套文档站独立与 CI 适配。
修复 (Fixed)
嵌套下标算错基址(静默读写错误内存)
A[B[i]]一类的嵌套下标把外层基址弄丢。编译器约定是"任何跨子表达式存活
的临时值都存栈",但_gen_index把数组/字符串基址暂存在x3才去求下标;
内层下标自己也要用x3存基址,于是外层ADD用的是内层数组的基址:
A[B[i]]被算成&B[0],读取静默得到错值、赋值静默写到别的变量内存上
(不越界、不报错)。实测 11 个用例里 10 个算错。
现在基址改为入栈(PUSH/POP),Python 与 Go 两个编译器同步修复。- 同类缺陷一并修掉:
_gen_assign把待写入的值放在x2之后才求左值地址
(A[f(i)] = v会存错值);gen_init_2d_literal把行指针数组x4、当前行
x5跨元素表达式存活(int[][] m = {{g(1), g(2)}, ...}元素含函数调用时写错行)。
两处均改为求值前入栈。
浮点下标被当成字节偏移
G_C[(lo + hi) / 2]抛address 379800000000000 out of bounds
(issue #1)。/恒为浮点除法,所以下标类型是 float,而_gen_index是唯一
漏掉"int 上下文隐式截断"的地方:float 的 IEEE-754 位模式被直接当作字节偏移
乘 8(249.5 的位模式 × 8 =0x0379_8000_0000_0000,正是报告里那个恒定高位
0x3798)。标准 Hoare 快排因此完全无法运行。现在数组与字符串下标都会先按
与int x = 1.9一致的规则向零截断,且截断发生在边界检查之前。
变更 (Changed)
- 文档站迁至独立仓库 Code-CIN-Docs:
本仓库不再内嵌docs/子模块(.gitmodules不再使用),README 相应改为单独克隆;
ISA 指令表文档一致性由文档仓库自己保证(script/gen_isa_docs.py保留为生成器)。 - CI 适配 Node 20 下线(GitHub 于 2026-09-23 移除 Node 20 运行时):工作流里
全部动作升级到 Node 24 版本 ——checkout@v6、setup-python@v7、setup-go@v7、
upload-artifact@v7、download-artifact@v7、softprops/action-gh-release@v3。 - 修复
release.yml的非法工作流:4 个 checkout 步骤各写了两个with:键,
GitHub 会判Invalid workflow file(发布流程此前根本跑不起来)。同时移除所有
submodules: recursive与已失效的文档一致性检查步骤。 requirements-dev.txt补PyYAML:tests/test_workflows.py用
pytest.importorskip('yaml'),缺依赖时整块门禁被静默跳过 —— 上面那个重复键
错误就是这样漏过 CI 的。该文件现在还会检测同层重复键(PyYAML 默认静默
后者覆盖前者)。.gitignore/leak-check 排除表补.gotmp、.gocache、pytest-cache-*
(都是记录在案的临时/构建目录);MANIFEST.in去掉已不存在的docs/条目。
测试 (Tests)
- 新增
tests/test_nested_subscript_codegen.py:17 个嵌套下标用例 × 解释器/JIT/
原生三条路径,另有"写A[B[i]]不得触碰B的内存"用例;回退修复后 52 条中
46 条失败。 codecin/native/compiler/compile_test.go新增同类 Go 侧用例(编译后直接在
Go VM 中执行)。
v5.5.0
Full Changelog: v5.4.2...v5.5.0
pip install codecin==5.5.0[5.5.0] - 2026-09-24
以「Python 只做 CLI、Go 是唯一实现」为主线的架构收敛,配套标准库打包修复与 AOT 依赖加固。
详见 第二轮更新建议。
新增 (Added)
- 原生库改为"安装时编译":PyPI 包不再携带任何预编译库(
package-data与
MANIFEST.in都移除了*.dll/*.so/*.dylib)。setup.py: BuildPyWithNative
在构建时调用codecin/native/build.*用用户机器的 Go 工具链现场编译,
并把产物单独拷进安装目录 —— 所以pip install codecin(sdist)装完即带原生加速。
build.sh/build.bat相应改为只发布 sdist:若同时发布 wheel,pip 会优先装
wheel 而不执行构建,用户就拿不到原生加速。没有 Go 的用户可从 Release 下载预编译库。 - 原生库新增 ARM64 目标:Release 现在为 五种平台组合构建 c-shared 库 ——
linux/amd64、linux/arm64(ubuntu-24.04-arm)、darwin/amd64、darwin/arm64、
windows/amd64。
资产名带平台-架构后缀(如libcodecin_native-linux-arm64.so):
此前各平台产物同名,release汇总时会互相覆盖,只剩最后一个。 - 产物架构校验:每个原生库构建后都用
go version -m读出真实的GOOS/GOARCH
并断言与资产名一致,杜绝把错架构的库以 arm64/x64 的名义发出去。 - 原生库查找支持架构专属名:
codecin/native.py: _lib_candidates现在按
架构专属名 → 通用名 的顺序查找,同目录下同时存在两种架构的库时会优先选本机的那个。
变更 (Changed)
get_engine不再因原生库 ABI/符号不符而中断运行:此前只捕获OSError,
旁边放一个旧版或架构不符的库会抛AttributeError并让整个运行崩掉(哪怕
native.py承诺过"加载失败自动回退纯 Python")。现在同时捕获AttributeError,
逐候选继续尝试,全部失败时记一条 warning 再回退。- Go 侧不再提供 CLI:删除
codecin/native/cmd/codecin/(独立 Go CLI)、codecin/native/tmpdump/
与仅供 CLI 调用的codecin/native/aot/build.go。语言实现仍在 Go 侧
(CIN 编译器、字节码 VM、CROM、AOT stub),但只以库的形式存在;
CI 新增门禁断言codecin/native/下不存在package main。 - 唯一 CLI 入口是 Python:
python cpu.py/ 安装后的codecinconsole script。 - 内置标准库迁入包内:
lib/→codecin/lib/,并通过
[tool.setuptools.package-data]与新增的MANIFEST.in进入 wheel/sdist —— 修复
「pip install codecin之后所有import "lib/*.cin"直接编译失败」的问题。 - CIN import 解析规则 (B3):
import "./x.cin"/import "../x.cin"—— 相对当前 .cin 文件所在目录;- 其余任何形式(
import "x.cin"、import "lib/x.cin")—— 直接解析到
codecin 内置标准库codecin/lib/(lib/前缀保留为兼容写法)。
仓库内示例与测试已统一为裸名字形式。
- AOT 依赖检查与嵌入:
--build-exe现在会先解析 import 闭包做依赖完整性检查
(缺失/循环引用报AotError而不是等到go build失败),把依赖清单打印出来,
并在编译期把依赖库全部展开嵌入产物;数据段越界不再静默丢弃,而是报错并提示
--mem-size。Windows 目标未带.exe的输出路径会自动补上后缀。 - 发布与 CI:移除
release.yml的 Go CLI 构建矩阵;原生库资产补上架构维度
(macOS x64/arm64)并使用与本地一致的静态链接参数;workflow_dispatch现在
会 checkout 输入 tag;新增dist作业断言 wheel/sdist 内含 19 个内置标准库模块
并实际安装后跑一个使用标准库的程序;CI 补timeout-minutes与permissions,
覆盖率合并为一次运行并设--cov-fail-under=70。 - 移除旧的安装/打包脚本:
install.sh/install.ps1/codecin.spec/
codecin_linux.spec/build_win.bat已删除,相关文档同步更新为 pip 安装路径。
修复 (Fixed)
python cpu.py --help的首行版本号长期停留在Code CIN v5.3,现直接取
codecin.__version__(此前是全仓唯一残留的版本串)。--build-exe在程序文件不存在时抛裸FileNotFoundErrortraceback,现在与普通路径
一样给出Build Error面板。--build-exe传给build_program的显式输出路径在 Windows 上不再产生无法执行的
无扩展名文件。
v5.4.2
Full Changelog: 5.3.0...v5.4.2
pip install codecin==5.4.2[5.4.2] - 2026-09-13
以「消除静默错误 + 工程可信度」为主线的一次修复与加固,详见
优化建议报告。测试从 158 项增至 413 项(Python)+ 2 个 Go 测试包。
修复 (Fixed)
会静默产生错误结果的缺陷
- 汇编器把十六进制立即数的尾字母
F当类型后缀吃掉:#0x1F曾被解析成1、
#0xABCDEF成703710、#0xFF直接抛异常。改为先判进制再剥后缀(assembler.py)。 - Go
genSwitch负 case 永远匹配不上:旧实现用-1当 default 哨兵并跳过raw < 0,
于是switch(x){case -1:...}走 default(Python 侧正确)。改为按无符号位模式比较。 - Go
genSwitch非常量 case 造成标签错位:旧实现遇到求值失败的 case 只continue
不补标签,导致后续 case 的标签贴到别人的语句体上(静默错误分派);现在与 Python 一致报编译错误。 switch内continue泄漏选择器栈槽:两端都绕过ADDI SP,SP,8,每轮迭代漏 8 字节、
长循环必然栈堆碰撞。现在 continue 先弹出选择器再跳转。- Go 代码生成大面积静默吞错:
println(foo())输出0、~1.5输出 float 位模式、
s += "b"静默无操作、未定义变量/成员访问/越界下标/浮点取模等都产出静默错误的字节码。
引入粘性错误通道 (compiler.err+failf),在Compile末尾统一返回编译错误,文案对齐 Python。 - 内置函数缺参数导致崩溃:
sqrt()、substr("a",1)在 Go 侧 panic、Python 侧抛裸IndexError;
两端统一为CompilerError,并新增参数个数表。 - 步数用尽伪装成正常结束:原生 VM 返回
StatusDone、解释器只 warning 后 break,进程仍以 0 退出。
现在两端都报instruction limit reached,CLI 退出码为 1。 - 数值字面量:
0xFFu/42u/1.5f在 Python 侧抛裸ValueError(Go 侧十六进制正确、十进制报错);
十进制超出 64 位范围时 Python 静默截断、Go 报错。两端现在行为一致,越界一律报错。 - 带 UTF-8 BOM 的源文件
import静默失效(Windows 编辑器常见),两端均已修复。 - CROM 解压无上限(zip bomb):65KB 的合法文件可解出 64MB+;Python 侧还无条件下按旧版
裸格式加载任意文件(如NOTACROMFILE)。两端统一上限为mem_size + 4MiB并校验头部自洽。 - 原生库信任不可信字节码头部:
count直接用作make容量(13 字节输入可触发 137GB 预分配)、
版本字节与参数个数从不校验(越界 panic)。现在解码阶段一次性拒绝。 - VM 输出无上限:新增 16 MiB 输出上限,超限报错;HTTP 下载与本地资源读取同样加上限。
性能 (Performance)
- 原生路径不再逐条记账:
_apply_native_state曾按指令数在 Python 里循环调用
record_instruction(且算出的直方图随即被clear()丢弃)。改为 O(1) 批量写入:
62 万条指令的基准从 ~838ms 降到 ~14ms(约 60 倍),吞吐 0.4M → 45M instr/s。 - 解释器快路径:无断点/单步/JIT/追踪/节流时走紧凑循环,解释执行提速约 1.15x。
新增 (Added)
- AOT 静态编译: 编译成独立可执行文件 (Windows / Linux / macOS):
python cpu.py program.cin --build-exe app或codecin build program.cin -o app,
支持--target OS/ARCH交叉编译(windows/amd64|arm64、linux/amd64|arm64、darwin/amd64|arm64)。
产物内嵌 UCBC 字节码与初始内存镜像,由内置 Go VM 执行,不依赖 Python、Go 工具链、
libc 或任何动态库(CGO_ENABLED=0,Linux 产物无PT_INTERP);入口 shell 模板由
Go 与 Python 两侧共用(codecin/native/aot/stub_main.go.txt)。 - 官方标准库新增 6 个模块(
lib/,共 19 个):
bits.cin(位运算/popcount/clz/ctz/循环移位/位域)、stat.cin(顺序统计量:中位数/
众数/百分位/直方图/方差)、hash.cin(djb2/FNV-1a/sdbm/整数混合/桶映射)、
validate.cin(字符类别判定与安全解析:val_is_int/val_is_ident/val_parse_int)、
matrix.cin(行主序方阵:加减乘/转置/迹/对称判定/行列式)、
queue.cin(定长环形队列与栈)。 - 编译器产物级差分:Go CLI 新增
--dump-bytecode;script/diff_go_python.py现在先比对
编译出的 UCBC 字节、再比对 stdout ——examples/*.cin6 个示例(5.6KB~211KB 字节码)逐字节一致。 - Go 侧测试:新增
compiler与engine两个测试包(switch 语义、错误通道、字节码校验、
CROM 往返与 zip bomb、步数上限),CI 以-race运行。 - CI
integration作业:真实编译 Go CLI 与原生库后运行全量测试与差分测试,并断言原生库已加载
(否则红灯,不再静默 skip 约 20 个原生用例);另加"被.gitignore吞掉的源码"守卫与 gofmt 门禁。 release.yml:打 tag 时校验 tag 与codecin.__version__一致,构建 5 平台 Go CLI、
三平台原生库与 sdist/wheel 并发布到 Release。- 版本单一真源:
pyproject.toml改为dynamic = ["version"](源自codecin.__version__),
Go 侧版本由script/gen_native_isa.py生成并由 CI--check校验;新增codecin --version;
原生库不再自报与包版本无关的1.0。 - 打包配置:新增
[build-system]、[project.scripts]、[tool.setuptools];
PyInstaller 两个 spec 补上lib/、misc/vim数据文件与平台原生库。 .gitattributes/.editorconfig:统一 LF(避免 Windows 下生成物被写成 CRLF 导致
gofmt -l误报与整文件 diff)。- ISA 单一真源守卫:新增测试校验
ARG_COUNTS、stats.latency、jit._JIT_OPS
与Opcode表一致(防拼写/漏项漂移)。
变更 (Changed)
.gitignore重写:删除*cache*/*tmp*两个会吞掉真实源码的通配
(tests/test_cache.py曾因此不在仓库中,现已补回);补齐*.so/*.dylib/*.dll
与各类缓存目录。- 构建产物不再入库:
git rm --cached codecin/codecin_native.dll—— 旧产物由
9a3087c(脏工作树)构建却随源码长期提交,用户拿到的二进制与源码不对应。 - ruff 规则集扩充:从
["E9","F63","F7","F82"](基本等价于"能否 import")
扩到E4/E5/E7/E9/F/I/UP/B/SIM/C4,并清理全部违规。 - 文档修正:
go.mod改为go 1.26并与 README/BUILDING/安装脚本统一为「Go 1.26+」;
删除架构图中的 "C++ 生成";补docs/ISA.md到文档索引;纠正basic.cin 400 行等错误陈述;
Termux 安装脚本不再编译 Go CLI 的真实情况同步到 README/CHANGELOG。
v5.3.0
Full Changelog: 5.2.0...5.3.0
[5.3.0] - 2026-09-11
项目正式重命名为 Code CIN,从 Python 优先架构切换为 Go 优先 架构。新增完整的 Go 原生 CIN 编译器与独立 CLI,
扩展 CIN 高级语言语法、官方标准库、跨平台宿主能力(2D 画布 / 联网音频 / 系统交互 / Termux API),
并引入 CROM v3 压缩格式、MMU 分页与远程调试服务。
新增 (Added)
Go 原生工具链
- Go 版 CIN 编译器 (
codecin/native/compiler/):完整的词法分析、类型系统、语法分析器与代码生成,
与 Python 编译器产物逐字节等价,由script/diff_go_python.py差分校验。 - 独立 Go CLI (
codecin命令):全 Go 链路执行,无需 Python 依赖。 - 字节码中间表示 IR (
codecin/native/ir/):Go 侧 CIN 编译的中间表示定义。 - 一键安装脚本:
install.sh(Linux/macOS/Termux)、install.ps1(Windows PowerShell)、
script/install_termux.sh(Termux 克隆 + 依赖 + 编译 + 启动器)。
CIN 高级语言
- 位运算与复合赋值:
& | ^ ~ << >>及&= |= ^= <<= >>=;idiv()整数除法;s[i]字符串单字节读取。 - 内建函数扩展:
floor / ceil / round / min / max / atoi / trim / ltrim / rtrim。 - 类型与字面量:
char / short / long / unsigned类型;0x / 0b / 0o与字符字面量;++ / --自增自减;
类型转换内建函数。 - 控制流:
break / continue、do-while、switch / case、三目运算符。 - 比较运算符作为值表达式:比较结果可直接用于赋值与运算。
- 模块化
import:行级file:line定位,支持 DAG 层层引用。
官方标准库 (lib/)
新增 13 个标准库模块,覆盖纯 CIN 与宿主能力两类:
| 库 | 主要能力 |
|---|---|
math.cin |
浮点/整数绝对值、地板、天花板、四舍五入、最值、clamp |
str.cin |
大小写、包含、前缀/后缀、计数、重复 |
array.cin |
求和、最值、查找、计数、反转、填充、复制、下界查找 |
sort.cin |
冒泡/选择/插入/快速排序、有序判定、二分查找 |
conv.cin |
进制转换、填充、字符/整数/浮点解析 |
vec.cin |
向量求和、均值、方差、标准差、点积、归一化、线性插值 |
rand.cin |
范围随机、布尔、浮点、洗牌、选择、概率 |
json.cin |
扁平 JSON 取值(字符串/整数/浮点/布尔/存在判定) |
time.cin |
时间戳、时分秒、毫秒、时长格式化 |
io.cin |
文件读写追加、存在/大小/删除、目录创建/列表、路径处理 |
gui.cin |
2D 画布:颜色、清屏、矩形、柱状图、折线图、网格、保存、显示 |
termux.cin |
Termux API:通知、吐司、剪贴板、震动、TTS、短信、电池、定位、WiFi |
test.cin |
断言框架:整数/字符串/近值/真假判定与汇总报告 |
宿主能力 (Host Capabilities)
- 2D 绘图画布:
canvas / set_color / fill_rect / fill_circle / draw_line / draw_text,
save_png()导出 PNG,show_canvas()弹窗预览(新增CANVASSHOW系统调用)。 - 联网音频:
audio_play(url) / audio_stop / audio_volume / audio_wait(HTTP 下载 + WAV 播放)。 - 跨平台系统交互:
file_read / file_write / file_append / file_exists / file_delete / file_size、
mkdir / dir_list、exec / exec_output、getenv / setenv、
os_name / hostname / username / cwd / home_dir(Windows / Linux / macOS)。 - Termux API 支持:通知、吐司、剪贴板、电池、震动、TTS、定位、WiFi、对话框、短信。
运行时与基础设施
- CROM v3 格式:zlib 压缩 + CRC32 校验 + 元数据头,Go/Python 双实现。
- MMU 分页 (
--mmu):identity 页表,未映射页触发缺页错误;页表可持久化到 CROM v3。 - 远程调试服务 (
--debug-server <port>):TCP 换行文本协议,支持 step / continue / break / regs / mem / history。 - 确定性执行 (
--seed):随机种子固定输出。 - 反汇编 (
--disasm):.bin / UCBC 反汇编为文本清单。 - 数组越界检查 (
--bounds-check):CIN 数组运行时越界检测。
示例与测试
- 新增示例:
control_flow.cin、literals_types.cin、modules_demo.cin、bitwise_builtins.cin、
stdlib_demo.cin、system_interaction.cin、asm_constants.asm。 - 新增测试:
tests/test_libs.py(标准库全覆盖)、CIN 宿主能力测试、Go CLI 集成测试、三路径一致性测试。 - Vim 语法高亮:
misc/vim/下.cin/.asm语法与文件类型检测。
变更 (Changed)
- 架构切换:从 Python 优先改为 Go 优先,Go 原生库接管字节码 VM、CROM 与 CIN 编译器;
Python 保留为 CLI 壳与回退路径(原生库缺失时自动降级纯 Python)。 - 项目重命名:UCPU → Code CIN,包结构
codecin/,版本号升至 5.3.0。 - 原生 VM 指令集扩展:新增
ASR(算术右移,保留符号)等指令的原生实现支持。 - 日志系统统一:全线日志与错误输出基于
rich(彩色表格、面板、traceback),--debug模式提供
逐指令 / 寄存器 / 内存 / 栈 / 缓存的超详细追踪。 - CLI 参数管理:改用
argparse统一管理命令行参数。 - 原生引擎重构:
codecin/native/engine/代码结构与导出接口优化。
修复 (Fixed)
- 原生 VM
LW指令符号扩展与地址检查。 - 原生 VM 缺失
ASR指令导致算术右移输出截断的问题。 - Go 编译器数值处理逻辑修复。
stdlib_demo.cin二分查找测试用例预期结果修正。- 原生运行时错误处理:同步状态并抛出异常。
- 汇编器数据标签在程序编码期间的传递问题。