机会翼游 JHYY SELF-HOST CLOSURE REGRESS 158/158 TARGET amd64_win VER 4.0.6 MIT ← 官网
SYS · JHYY 机会翼游

用自身语言 编译自身

自研的静态类型、表达式导向、编译型系统编程语言。 编译器用 JHYY 写 JHYY —— 从 v1 编到 v5,五份中间表示字节完全相同, 并且这件事在第 10 代仍然成立。

158
REGRESSION TESTS
N≥10
SELF-HOST GENERATIONS
0
GC · RUNTIME OVERHEAD
29
SELF-HOSTED MODULES
JHYV
CH-01 自举闭环 / SELF-HOST LIVE
JHYV 4.0.6  (self-hosted)

GEN 1  jhyy_v1.exe  --compile-->  main.jhyy
GEN 2  jhyy_v2.exe  --compile-->  main.jhyy   byte-equal
GEN 3  jhyy_v3.exe  --compile-->  main.jhyy   byte-equal
GEN 4  jhyy_v4.exe  --compile-->  main.jhyy   byte-equal
GEN 5  jhyy_v5.exe  --compile-->  main.jhyy   byte-equal

  IL   1,378 MB    sha256 v2/v3/v4/v5  IDENTICAL
  N    >=10        fixed point  HELD
>> 不动点是吸引子,不是暂态。CLOSED.
CH-02 一段源码 / SOURCE READ
type Point = struct { x: i32, y: i32 }

fn dist_sq(a: Point, b: Point) -> i32 {
    let dx = a.x - b.x;
    let dy = b.y - a.y;
    dx * dx + dy * dy          // 无分号,末行即返回值
}

fn classify(n: i32) -> *u8 {
    match n {                       // 带穷尽性检查
        0       => "zero",
        1..10   => "single digit",
        10 | 20 => "round number",
        _        => "other",
    }
}

extern fn printf(fmt: *u8, val: i32) -> i32;   // FFI 到 C

fn main_jhyy() -> i32 {
    let p = Point { x: 3, y: 4 };
    printf("d² = %d\n", dist_sq(p, Point { x: 0, y: 0 }));
    let s = "机会翼游";              // UTF-8 原生字面量
    0
}
CH-03 编译器产物 / IR DUMP
$ cat compiler/tests/examples/hello.jhyy
fn main_jhyy() -> i32 {
    42
}

$ jhyy build hello.jhyy          # 第 2 代自举编译器
dbgfile "hello.jhyy"
export function w $main_jhyy() {
@start0
    dbgloc 1
    dbgloc 2
    %t1 =w copy 42
    ret %t1
}
$ ./hello.exe ; echo $?
42
CH-04 回归 / REGRESSION PASS
$ python regress.py --all
W-097  multi-field access emit     ..... 22 skipped
  1   exit code semantics            ...... ok
  2   struct pass-by-value           ...... ok
  3   float cast / fmod / signed zero  ...... ok
  4   arena alloc + reset            ...... ok
  5   match exhaustiveness           ...... ok
  ...
158 passed, 22 skipped, 0 failed

$ jhyy_selfhost_check
all_byte_equal = true
JHYV-MONITOR · 14″ · 1979
02

自举闭环 / SELF-HOST

BOOT

第 1 代编译器编出第 2 代,第 2 代编出第 3 代……一直编下去。 关键是:从第 2 代起,产物字节完全相同。它落在了一个不动点上。

GEN 1
jhyy.exeC 端 · 种子
→
GEN 2
jhyy_v1首代自举
→
GEN 3
jhyy_v2IL 基准
→
GEN 4
jhyy_v3byte-equal
→
GEN 5
jhyy_v4byte-equal
→∞
GEN N≥10
FIXED POINT10 代仍然相同
STAGE 2 · BYTE-EQUAL
5代产物 sha256 完全一致 · 1.378 MB IL

没有 fix-up 后处理。编译器对自己说的话,和它对别人说的话,是同一句。

ATTEMPT #7 · W-101
7次尝试后,gdb 一轮 RCA 抓到真根因

前 6 次都改错了地方,全被回滚。见 工程账本。

TWO IMPLEMENTATIONS
2份编译器,字节相同

C 端 src/*.c 与 JHYY 端 src0/*.jhyy 共存,互相校验。

03

语言 / THE LANGUAGE

SPEC
A-01类型
  • i8 i16 i32 i64 / u8 u16 u32 u64
  • f32 f64 / bool / *T
  • [T; N] 定长数组 / [*]T 切片
  • struct / enum
  • as 显式转换,含 *T ↔ i64
A-02控制流
  • if / else,本身是表达式
  • while / for i in a..b
  • break / continue
  • match:字面量 / 区间 / 或模式 / 通配
  • 分支穷尽性检查,漏一条编译期报错
A-03互操作
  • extern fn 直接调 C 函数
  • import + 多文件编译
  • mod::fn() 命名空间
  • const NAME: [T; N] 编译期进 .data
  • Arena 分配器经 FFI 接入
A-04系统级
  • inline asm
  • #[naked] / volatile
  • #[link_section] / 内存屏障
  • #[no_std] 免标准库
  • &mut + lifetime
STDLIB · src0/std/
arenafmtio mathmemos stringvec

标准库也是 JHYY 写的 —— 这是自举必须吞掉的那块最硬的骨头。

04

命令行 / COMMAND LINE

CLI
TERMINAL
$ jhyy --help
jhyy [--target=<triple>] [--help] <command> [args]

commands:
  compile <file.jhyy> [-o output]   compile to .obj
  build   <file.jhyy> [-o output]   compile + link to .exe
  run     <file.jhyy>              compile + link + execute
  dump    <file.jhyy>              print AST / typed IR

flags:
  --target=<triple>  default amd64_win
  --no-link          compile to .s only
  --help             show this message
TARGETS
amd64_winWindows x64 · 默认
amd64_sysvLinux / macOS · SysV ABI
freestanding无 OS · 写内核用
ENTRY

入口函数叫 main_jhyy 而不是 main —— 名字里带着这门语言, 免得和 C 的运行时抢。

05

工具链 / TOOLCHAIN

TOOLS
MCP SERVER · 11 工具

编译器自带一个 Claude Code MCP 服务,把「跑回归、看 IL、验自举」变成一句话。

jhyy_run jhyy_compile jhyy_check jhyy_get_il jhyy_regress jhyy_selfhost_check jhyy_il_diff jhyy_workarounds jhyy_lang_ref jhyy_abi_info jhyy_format
EDITOR

VS Code 扩展:语法高亮、文件图标、原生 Ctrl+F5 编译并运行。 仓库自带 .vscode/tasks.json,打开就配好终端 PATH。

CtrlShiftB 编译 + 运行
CtrlF5 扩展命令:Run JHYY File
DISTRIBUTION
  • One-shot 安装器 .exe:编译器 + 文件关联 + 扩展 + PATH 一步到位
  • MSI ~995 KB:企业 / SCCM 无人值守分发
  • VSIX ~13 KB:编辑器扩展
  • MIT 协议 · Windows x64 为当前主目标
GITHUB ↗
06

版本轴 / RELEASE AXES

HISTORY
v0.x
C 端编译器自身 —— 造出编译器,拿到自举门槛
完成冻结于 v1.0.0 baseline
v1.x
自举 —— 用 JHYY 重写 JHYY,字节相同 .il 闭环
完成v1.8.3 · 2026-08-29 · 终结
v2.x
自研后端 —— 砍掉 QBE,直接在内存里 emit x86-64;多目标 / freestanding
完成v2.16.0 · 2026-09-22 · 终结
v3.x
语言扩展 —— 为写 OS 铺路:inline asm / naked / volatile / no_std / lifetime
完成v3.4.2 · 2026-09-29 · 终结
v4.x
合流 —— 标准库 / 0-C 闭环 / async / trait / 包管理 / 多架构 / .jhyynb
进行中当前 v4.0.6 · v4.0.7 计划中
07

工程账本 / WORKAROUND LEDGER

LEDGER

每个已知缺陷编一个号(W-NNN),修不好就写进账本、写清状态、留证据。 修错了就回滚,把回滚也记下来。下面这段是账本上的真实一页。

W-101 · derived address tracking
#1REVERTEDbitmap 方案错方向
#2REVERTEDalloc pool disjoint 假设错
#3REVERTED深审计 checklist 后仍是错的
#4REVERTEDplan 方向被审计推翻
#5–6REVERTED改对了方向,写错了参数个数
#7SUCCESSgdb 一轮 RCA 拿到冒烟枪:少传了 state 指针

第七次成功的原因不是更聪明,是不再猜:先用 gdb 抓到 rcx=NULL 的那一行,再回头改。三行调用点改成三参数形式,歧义消失。

WHY IT MATTERS

大多数项目的 bug 列表读起来像功能缺陷清单。这个项目的账本读起来像 推理失败记录:哪一次假设错了、为什么错、拿什么证据推翻的。 对一个宣称自举的编译器来说,这比任何一处代码都更能说明它是不是真的。

OPEN ITEMS
  • W-097 —— 25 处多字段访问 emit 待真修(跨 10 个模块)
  • W-072 —— 多字段访问 emit
  • 规则:正式版发布前,活跃与延期项必须清零。
08

上手 / GET STARTED

START
BUILD
$ git clone https://github.com/JiHuiYiYou/JiHuiYiYou-compiler.git
$ cd JiHuiYiYou-compiler
$ make          # -Wall -Wextra,0 warning
$ ./compiler/build/bin/jhyy.exe run hello.jhyy

前置:MSYS2 + ucrt64 工具链(GCC / binutils)。别用 Git Bash 自带的 MinGW,链不上 PE。

HELLO.JHYY
fn main_jhyy() -> i32 {
    42
}
$ jhyy build hello.jhyy
$ ./hello.exe
$ echo $?
42
机会翼游 JHYY SOURCE ↗ OS PROJECT ↗