Repository navigation
Expand file tree
/
Copy pathchanges.log
More file actions
1119 lines (938 loc) · 84.2 KB
/
Copy pathchanges.log
File metadata and controls
1119 lines (938 loc) · 84.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
[0.2.44]
Changes:
- **`with` 的第一个参数是第一个普通参数**:`first_with_as_param(f)` 把函数第一个声明的 `with` 端口登记为第一个普通端口,其余 `with` 端口各前移一位;函数体不重读、节点原样带过,解析侧给调用定型与内核给返回的图定型共用同一条签名律。库层 `grad` 因此写作 `vjp(first_with_as_param(f))` 在种子 1 处读第一条余切;前向的 `with` 提升路径删除——它把 `with` 值当常量、切线取该类型的零,线性映射退化为零映射(`value=9.0 grad=0.0`,引擎给 3.0)。
- **`mean` 只剩一条声明**:`with <axis: int, keepdims: bool = false>`。定轴与不定轴原先是只差参数个数的两条声明,`mean_axis` 那个入口及其 `mean_axis::<T>` 条目随之移除,调用方不再需要判断某次调用指的是哪一条。
- **`sum_to` 的应答半边钉住**:它取目标范围作自己的参数,只做前导轴归约。新用例用两个操作数、三个目标逐条钉住答案:`[2,3]→[3]` 去掉前导轴,`[2,3,4]→[4]` 去掉两条,`[2,3,4]→[3,4]` 只去掉第一条。
- **次序链上的一格**:结构语句(拥有区域的 `BRCH`/`LOOP`,以及 `CALL`)在链上占一格,这一格从它的拥有节点开始、到它的 `JOIN` 结束;`JOIN` 不是一条单独的语句,而是这一格的出口。前一条语句的同步边进拥有节点,后一条语句的同步边从 `JOIN` 出来,封口检查按这条规则认起点与终点。
- **GC 毒窗的一侧持有者关掉**:draft group 在它存活期间为它读的程序提供根;另一侧仍是问题页,默认值写在那里,并未宣称缺陷已修复。
- **包模式在值位置与类型位置各有一个读法**:类型位置的包模式头部是泛型的、其余部分没有拼写;值位置的 `match type` 也绑定包模式里的名字,规则与类型位置相同。只由类型实参决定值的内建(如 `extent_of::<A>`)按通用规则当值取走,不按名字特判。
[0.2.43]
Changes:
- **未知转义是编译错误**:`"\q"` 不再"原样保留 + 一条警告";`LexicalDiag::InvalidEscapeSequence` 升为 error,码从警告段的 `0x100000` 换成词法错误段的 `0x000004`(发布过的码不搬家,换一段就是换一个码)。合法转义照旧;`\t`/`\r` 这类**合法**转义撞上 Windows 路径那一半不在这次裁定里,那种路径要写成 `/` 或者写成原始字符串。理由(作者 2026-11-02 14:20):一个静默变成别的字符串的字符串,比一个拒绝编译的字符串贵。
- **原始字符串**:`r"..."` 与 `r#"..."#`(`#` 可以多个,开引号前与闭引号后必须一样多),中间**不做任何转义处理**,所以 `r"C:\dir\file"` 就是那条 Windows 路径;没有闭合时报在**开引号那一处**,不是文件末尾。`std::cml` 把反斜杠多的字符串值打印回原始字符串形式,打印出来的程序再读回去,字符串值一字不差(round-trip 用例)。
- **自动微分的第二层**:`split` 读得到被捕获值的端口,`matmul_t` 在转置规则集里补上乘积的反向,二阶导数在可用的地方给出、在不可用的地方按名字拒绝;跨调用梯度不再是零——`g(3) = 18.0`、`g'(3) = 12.0`,`flat` 同,这些读数钉在用例里。
- **法则的自检**:新增法则 lint,把一条规则的端口与按它写下的函数体比对;导出的规则各自进入精度核对,库与引擎两条读数一致。
- **残差清单**:`split` 的残差列表写出被提升的图拿到哪些切线,一处静默的零值记为缺陷;一个节点的形状由定义它的那次读决定。
- **导出器**:`cpp` 导出给已声明结果的归约带上它回答的东西。
- **设备与 tiles**:`--devices cpu` 的运行在 `gpu_scope` 下写明它只选了宿主;窄归约在四个后端上核对。
- **性能**:分块哈希的门槛按工作量定(CPU 时间来自线程池的 `sys`,wall 不变),计划条目抬到与启动同档,断言未放宽。
- **平台**:CI 增加 macOS arm64 与无 JIT 两条腿;没有代码生成器的构建在 `std::jit` 上给出 `JitWithoutCodeGenerator` 警告(`-Wno-jit-without-code-generator` 关闭,`-Werror` 升为错误);浮点文本的往返在 Apple libc++ 上回退到 C 库,macOS 因此可以编译。
- **撤回**:`integ3/backlog-b` 的十车道与它们的 seal 判据一起撤回,因为 `std::opt` 在 `benchmarks/mlp/model.cml` 上把 `time:now` 放进不保证取到的分支臂;重新落地的前提是先修 `closeChainOver`,前提写在页面里。
- **记录**:诊断 308 条;问题页索引由同一函数生成并校验;分层运行输出其经过的检查项。
[0.2.42]
Changes:
- **`neq` 运算符的收敛**:`!=` 改为由 `eq` 取反构成,`!==` 即 `!(===)`,`!` 在 `bool[]` 上按元素取反而不是按数值取反;随之删除二十二行 `ne_`,前端与内核两侧分别完成。
- **打印器的往返**:具名结构体类型通过写出其声明来打印;识别同步块末尾的写入,不再拆分语句块;模块运算符打印为 `module::name`,无函数体的声明按所属模块名打印。
- **里程碑分层核对**:将三十个空读数重新归类为其他层的计划;新增 float64 清单,以及 P0-2、P0-3、P1-13 的逐项报告。
- **工具**:每次分层运行输出其经过的检查项,分层运行的读数可以逐次核对;新增 `tier-accounting.mjs` 与 `provenance.mjs`;性能核对完成,线程数由实测读数确定。
- **成员数检查**:元组值的成员数与类型声明不一致时报错并终止进程;GIR 侧改为通过 draft 节点的名称而不是地址查找其所属图,该身份由新增用例见证。
- **数组求导**:完成数组梯度与数组余切两轮改造,其中梯度覆盖五种参数形状;图的构建不再遗漏写同步边。
- **测试用例**:用例迁移至 `split` 当前回答的形状,残差闭包随之实现;数组用例的期望值随合并更新,异常表中的用例移入 plan 并标注为已知失败。
- **流程**:问题页索引改为由同一函数生成并校验,条目数与目录一致;合并检查扩展为四种冲突标记;作者关于 `ne_` 行删除与记录先于实现的裁定,记入相应页面。
[0.2.41]
Changes:
- **自动微分回到库里执行**:`vjp` 又只是库里的组合,不再是内核;一次展开产生的调用节点自己记下哪些实参是 lambda 自己的切向量(`GCNode::tangentArgs`),`transpose` 读节点而不读名字表,切线核那张表随之删除。跨分支也能转置:作者读数 `x=2` 得 `value=4.0 dfdx=4.0`、`x=-2` 得 `value=-6.0 dfdx=3.0`,`nvm` 与 `fvm` 一致。
- 第二步落在编译期:`jvp`/`split`/`transpose` 在编译期实例化,而不是另写一个 `vjp` 内核;一个 pullback 对每个形参只回答一个余切;带默认值的声明在前端就被物化。
- **元组的余量按成员算**:元组值逐槽携带余切,携带多个状态的循环因此可以转置而不是被拒;bool 的余量槽贡献零,元组套元组有它自己的规则;余量个数由跨过切口的那张图算出来,不再由签名猜。
- **分支的切法**:用条件挑中一条臂,挑中的那一步是一个余量;`transpose` 一个分支时每条臂走自己的链,臂的余切拼接。`remat` 以恒等落地,是一个图变换;异常表只有一个作者。
- **`:op/keep` 是可达的**,它只读它针对的那一种形状;一个没有具名结果的图现在是 dump 能显示的状态,不再当作内部错误。
- **数组算子是批处理规则**:进的是批处理表而不是另一个开关;每个 primitive 一次批调用,"问过"与"找到"各有计数,规则检查与它读的索引一致。
- 语言面:lambda 的参数表接受未标注的 `..xs`,按期望类型定型(`vjp` 因此是一个泛型);整轴归约、`argmax` 的元素类型、`one_hot` 声明的行数各有说法;一个调用对调用构成的环不按值特化,不收敛的重写报成内部错误。
- 结构与账本:一个节点是否在分支臂内改为问区域而不是问标志位;改写会话以每轮发出的 nonce 作特化键,因此收敛;自动微分的迁移账本是一个命令,每例按自己的期望计,ratchet 只许降(这一批诊断名从 22 到 14)。
- 记录:`keep` 可达的计数钉在测试里;一次调用用到的环境资源算进它的边界,bounds 与 effects 因此同步;原则 3.3 的读法落到"效应的最后一次使用算数据使用"。
[0.2.40]
Changes:
- **rank zero 就是空形状**:打印按形状取,`shape` 与取值一起由值本身给出;一个被折叠掉的常量同时持有它的元素与它的形状。
- `mean` 的类型就是元素类型;字面量的几种写法收口——嵌套字面量、多维字面量的拒绝共用一套诊断,扁平数组不留形状这一点写在错误里。
- **窄精度**:bf16 与 f16 的设备拒绝措辞统一成"后端能做什么",`gpubf16` 把这条接到设备一侧。
- 可达性与 dump:`keep` 是可达的,支撑这个结论的计数被钉在测试里;一个没有具名结果的图现在是 dump 能显示的状态,不再当作内部错误。
- 事务与账本:jvp 的成员图从事务里取,测试 pass 也经由它自己的事务读草稿,账本因此只认一个所有者。
- 图存储第六步;`facts`、`effects2`、`s1`、`m5`、`reinterp2`、`m4-assembly` 等一批 lane 的清理与读数。
- 记录:新增 72 小时批状态表(`docs/handover/batches-2026-10-31-72h.cn.md`);链检查的计数跟着基线走,不再跟着某次测试走;一次读数请求确认 pass 边界的检查一次也没有触发。
[0.2.39]
Changes:
- **"一个张量就是它那个带形状的数组"这条裁定落地**:`index`、`slice`、`count`、`total`、`mean`、`shape` 与按轴取的极值都落在带形状的值上,读的是元素而不是 rank;一个多维亚字面量被拒绝,因为扁平数组不留形状。
- 收窄(rank narrowing)有了自己的说法:形状判决与收窄拒绝各用各的词,bf16 的拒绝说的是后端**有什么**、而不是它没写什么。
- 窄精度往前走一步:bf16 与 f16 拿到切空间需要的 traits,cpp 一侧的拒绝改成本后端能力的话。
- 展示程序:d4 的 MCTS 里,张量以**计数句柄**过 C 桥,不再裸传指针。
- 算子族在库里该叫什么名字作为问题提出(`add` 已被占用),族名与文件名的关系有了记录。
- 一批并行清理:故障与探针(`lane-faults`)、缺省与守卫(`lane-guard`)、能力中止(`lane-capabort`)、环境开关检查(`lane-envsw`)、编译普查(`lane-census2`)、复审(`lane-recheck`)、图存储第二步(`lane-gs2b`)。
- 记录:问题页索引改成"目录本身就是索引",被答的问题页归档;诊断表与张量桶脚本按生成器重出。
[0.2.38]
Changes:
- **程序边界上多了一层事务**:一次调度或一个 pass 拿的都是同一个事务,写操作从事务里取自己的草稿,读的一侧到处借同一个事务,只读的辅助函数声明自己不产生故障;宏改写的桥也走这个事务,进程边界现在会报它在分配时遇到的失败。
- **pass 边界上的 effect-order 不变量**:实例身份与跨图所有权被写成可检查的规则;`GATE` 定为纯的传值节点(把值原样放行),它拿到 sync 前驱之后不再需要控制输入;一个区域拒绝某个算子时,探针能说出拒绝的原因。
- **generator 降成状态机**:生成器被降成"被拉的步骤"构成的状态机,状态结构按 handle 持有它的 cell。
- **按 rank 读值与打印**(一批 lane 合起来):`count`、`total`、`mean` 与按轴取的极值读的是元素而不是 rank;`shape` 算子读它描述的那个值;`index` 与 `slice` 落在带形状的值上;一个多维亚字面量被拒绝,因为扁平数组不留形状。
- 收窄与窄精度:bf16 的拒绝措辞说的是后端**有什么**,而不是它没写什么;两种窄宽度(bf16、f16)拿到了切空间需要的 traits;一个名字的分裂会让算子变得不可导出,这条现在有读数。
- 训练工作负载被登记为已知失败;探针与镜像检查(签名文件、跑不起来的检查)各自有名字。
- 图存储第二步、故障表审计与一批清理(`lane-gs2b` 19 次、`lane-faults` 15 次合并):编译普查、控制边的清单与读者、defunctionalization 的设计页。
- 记录:10-30 的批状态表与评审页归档。
[0.2.37]
Changes:
- **删除 `SYNC` 节点种类,边模型收口成三种边:数据边、同步边、顺序边**:数据边既说"值从哪来"也把"被用到"传给读它的节点,同步边只串同一个同步块里相邻的语句,顺序边只排序、不传"被用到";原来"一律生成控制边"的建图方式改为按来源生成这三种边,**"控制边"这个种类不再存在**,纯计算上不再有任何非数据边,优化遍不再被它挡住。`docs/design/effects/edges.cn.md` 与 `sync-and-control` 页按这条重写:内联的 body 拼进块的链而不是并排;分支的臂由 sync 边进入,臂的值就是那个写的值时以那个写收尾。
- **效应与顺序的四处修复**:同一资源上的两个效应保持书写的先后顺序;order 边停在包含它两端的控制区域,只挂在 BRCH 或 LOOP 上而不进区域内部;一个没被读的块值保留它原有值依赖的效应;改写会留下、无人再到达的效应被保留。
- `x op= e` 与 `x = x op e` 导出成同一个图;一个 sync 链分叉在提交时作为内部错误报出,不再走到调度器里。
- **类型包**:`..E` 只有一种读法和一种表示;rest 参数写出它类型展开的那个包;一个裸的包展开不是类型;`..` 绑定得比比较松、比 `->` 紧。
- 数组或元组类型里还残留 `Ref` 占位时,既不接受任何值也不被任何值接受;数组转换检查它实际持有的值,而不是它被接纳时的那对类型。
- 一个语句跟在 `return` 之后被诊断;被丢弃的错误值处处报出。
- **标准规则库第一次被证明**:用 SMT 求解器逐许可证判定,每条规则都通过运行两侧来验证;写在一个写之前的读,其后的排序由记录下来的边决定。
- **一致性矩阵成为常驻检查**:一个 runner、七个程序、五十六次运行,接进仓库自己的计划集,每台机器和 CI 都会跑;一次一致性运行会打印出"绿色读数"的七个限制。
- ONNX 把循环导出成 ONNX `Loop`;折叠能被物化的字节有了上界,大常量保持构造它的那个计算;内联器按函数写下的算子数度量,所以常量区间的循环也能导出。
- 修复与测试:优化后程序的 canonical 导出在 167 个语料程序上的崩溃修掉(静态槽只在它确实是函数时才当函数读);autodiff 保留被调函数写过的 `var` 的版本,一个写的排序边记作 open;没有命名卡片的 GPU 测试各分到一块空闲卡;未处理 pass 错误的用例改为断言诊断的站点与文字。
[0.2.36]
Changes:
- 控制边与 sync 边收口:sync 边写在链的位置上,控制边并排保留;CSE 能看穿只做转发的 gate;读控制边的读者也读被捕获 cell 的 sync 边;交给消费者的链 wait 按它原本的种类交(sync 仍是 sync);内联的链交接点挪到 capture 单元完成之后,`var` 的读和链交接都成立;一个 tile 区域的语句顺序由它的链承载,而不只是控制边;一条 order 边只在它的前驱有位置时才命名它;`ungated()` 收成一个函数;GIR 的两个版本都导出 sync 与 order 边。
- 一个链的成员每个图只构建一次;一个等不到任何东西的转发 gate 由前端消解,不再冻结成内部错误。
- 泛型重载按 `when` 选:候选的每个条件都会被读,被选中的那条按名字报出它自己的条件;一个文件里的 `import` 永远不会解析到它自己。
- 一次写被捕获变量的调用,在位置期望 `void` 时被交给被调方自己的值,`void` 臂仍 join 到 `void`,版本只在读的那一侧物化。
- 模块与类型:extent 变成表达式;tensor 库删掉 `flatten`、`range` 和 `new`;`constas` 参数进 `with` 列表;reshape 与按轴归约改用新的调用形式,benchmarks 与文档跟着改;native 的 merge 回来叫 `merge_sorted`;tensor、`nn`、`optim` 三个模块按所有者选择转给决策方。
- 新增 `erf` 与 `erfc`;`..` 的优先级在语言文档里修正,语法块按生成器重出。
- core 的 `idx_take` 只留一条求导规则;`ConstructNotSupported` 这个诊断码退役,循环与规则的上下文按今天的语言描述。
- 修复:checkpoint 用例里失败的保存不再丢掉它的错误;device-tree 用例把 float 写进 f32 结果的对齐到元素类型;两个受声明影响的生成文件按其脚本重生成,`05_effect_order` 的 exemplar 用脚本重录而不是手改。
- 这一批有十七个转交页往返(控制边的模型、纯值是否自带 wait、悬空的链尾、入口内联尺寸、内联自递归、tile 链成员、spliced body 等),作者答完或撤回的页已从树里删掉,`docs/handover/questions/` 目前是空的。
[0.2.35]
Changes:
- **`throw` 退役,改由 `fail` 报错**:`fail<'Kind'>(message): never` 是抛出失败的唯一写法,交给外部的错误值就是所声明 `T!` 的失败臂,底类型 `never` 存在——它可以进入 `with` 实参(和普通实参一样停止调用)和任何被标记的位置,不需要转换;`fail` 也可以作为一个语句。
- **`module` 声明退役:一个文件就是一个模块**,用它的文件名命名;写在一个文件里的名字按文件名归属和查找,候选名表随之删除,`camel check` 之类的程序级入口不再读前奏的声明文件。
- `module` 的退役带来一批随之的替换:文档注释属于它下面的声明(空行不再结束一段注释);一个模块的私有 kernel 从它自己的声明文件读,无论哪门语言实现这个模块;一个模块保留它声明但不导出的算子组,工具问起时按私有实体列出。
- 下标读它写在的那个维度:`a[i, j]` 的第一维、第二维各自成义,一个位置或一段区间的几种写法各自导出成一个 `Gather`;原则 5.4 逐维陈述这条规则。
- 复合字面量的洞按位置给的类型检查,三个位置报同一条诊断;计算出来的结构体字段走和数组、元组元素同一条路径。
- `when` 子句在挑选泛型重载时被读,每个候选的条件按名字报出;`import` 永远不会解析到写它的那个模块。
- 修复与收敛:分支的臂按它们给出的值 join(cell 类型的臂先读);`opt` 代数库的检查断言它的不变量,这份树再也产不出的冻结参考被删除;ONNX 的 f64 转置积按 `Gemm` 或 `Einsum` 导出给 cpu 目标,onnxruntime-cpu 用默认设置就能加载;tiles 的 cast 在元素类型相同时按元素表登记的任一名字都能落到设备程序。
- 记录:全层在批点 `e7a8b906d` 读到 `10050 / 通过 10020 / 失败 24 / 跳过 2`,每个红都落在 slow、perf 或 gpu 条目里,快层全绿;十二行尚未归因的逐条标为未归因,四个 `small` 条目按计划声明的预算记录。
[0.2.34]
Changes:
- 标准库长出新的一块:`bytes` 成为核心值类型(长度、连接、相等、切片),`re` 重写到 `Match` 上(`find`、`has_match`、`find_all`、`replace`、`split`、`validate`),`str` 按 Unicode 的大小写映射转换、按码点切片(像 rank-1 数组那样);字符串搜索按模块导出的 `index_of` 调用,`find` 成为模块私有的 kernel。
- pass 参数按它声明写的类型读:`int[]` 吃带方括号的一个词,`T?` 吃 `T` 的值或 `null`,`null` 默认值让参数可以省略;`std::opt growth_budget=[1,2]`、`…=null` 的错误改报 `ParamArgumentWrongType` 并在调用点给出行列;写 `int[]?` 的声明不再让进程退出,`onnx::export out=… dynamic_axes=[0]` 可以跑出模型。
- ONNX:181 个调用点改成具名 `with` 形式,模型文件、`dynamic_axes` 和目标按名字传,带 `with` 实参的调用不再让函数体的度量放弃;`onnx:export_model` 用一条声明替掉三条临时规则。
- 语言细则:混合 join 里具名类型胜出;arrow 接收者位置的复合字面量取参数类型;`??` 左侧是不可能为 null 的值时从错误降级为警告(`KnownNotNull`,`match` 的 `case null` 与 `void` 左侧仍按原样拒绝);`never` 作为 `with` 实参阻止调用;文档注释属于它下面的声明,空行不再结束一段;`var` 实参读最近一次写产生的版本,数据边替掉占位的控制边(写不产生版本处仍留控制边);被闭包捕获的流仍是同一个值、每条路径只读一次。
- 运行时修复:一个分支的臂按它们给出的值 join,cell 类型的臂在 join 前先读,作者自己的程序从四个后端 SIGSEGV 变成 85/85;每个 Context 拥有自己的 root set 与 sweeper 并按所有者登记,内置求导规则只注册一次;模块与执行器管理器不再持有自己的 Context,同一进程里的第二个 Context 能走到析构、只交回自己的分配器登记;pass 失败用错误值报告(`GraphPassFailed`、`GpuScopeUnsupported` 退役,tiles pass 在错误值里点名拒绝的作用域、每个被拒的算子和原因);擦除节点时把它带的 wait 交给会失去唯一 wait 的用户,被折叠的写把链上位置让给接手值的写。
- 门禁与测试:**没有 CPU 时间的平台跳过超时余量检查并写明原因**,不再把墙钟当读数;红家族逐族 bisect,24 行逐条复跑并保留失败原文,其中两行重新归类(一行其实是 `onnxruntime` 建会话时失败,一行是训练步的 `NoMatchingFunction`);全层在 `27ef118c4` 读到 `10176 / 通过 10146 / 失败 24 / 跳过 2`,8 项静态检查全绿。
[0.2.33]
Changes:
- `slice` 收口成 core 的一个算子:任意轴、任意秩都用六个词回答;模块自己的 `slice` 与重复的常量步长拒绝删除,每一次切片调用都是那个 core 下标;负数边界是错误,而不是"从末尾数";除常量 0 以外的步长都接受,两种写法下的零步长由同一条有名字的诊断回答。被切轴的边界是常量时,结果写出每个轴的长度。
- 下标也按轴取:后一维上的一个位置合法,原则 5.4 逐维陈述下标规则;写下标"一个位置"或"一段区间"时都降为那个轴上的 core slice。
- 流成为一等:`yield` 语法落地(关键字、语句、AST、格式化,以及按名字的拒绝);流的值就是它的步函数加状态,所以在 `for` 处融合只是优化——流上的 `for` 展开成已有的 `while`,`stream::unfold` 用 Camel 写在标准库里。流上的 `for` 每次取值前先问条件(和数组一样);同一条流在每个执行路径上只能消费一次,第二次使用会同时指出两处并给出能合法化的 `tee`。
- `Tensor` 这个名字不再导出、也不再打印,过渡期的按内容比较注册表删除,参数不写元素类型时打印为 `number[..]`;十二组按元素类型各写一遍的 tensor 定律合并成每组一条、用元素类型做守卫;一次性的大字面量迁移工具删除。
- 类型运算符离开语言:文法、AST 与编译器里的五条产生式、六处拒绝和两段死代码删除,反斜杠不再是记号;类型转换在自己的类型处结束,`x as T + U` 读作 `(x as T) + U`。只留能给出意义的拼写,四种模式写法与后缀 `!` 成为普通语法错误。
- 承诺成为可检查的声明:手写的子句是对外的承诺、违反它是编译错误;调用按包含关系匹配参数;没有子句的函数值带着它实测到的资源集,于是穿过参数调用也会在实例化时被看到;写了纯却调用资源泛型参数的函数在自己的子句处被拒绝,诊断是 `UsesPromiseViolated`。
- 元素类型只剩一条规则:加宽式提升连同它的文档删除,标准库把掩码写成选择或转换,编译器自己的梯度按张量的元素类型转换;梯度操作数的混合只看元素类型(形状事实不再被当成数字);归约回答它元素的类型,八个梯度算子按被微分值的宽度声明。
- 空数组字面量不声明元素类型:需要它的调用在推理时被拒绝,并指出该写的类型实参;元素类型为 void 的数组打印成它本来就是的那个空字面量。
- 纯数据聚合体可以按字节读写:转换逐叶走数据布局,`from_bytes` 只有一个受 `is_plain` 守卫的签名。
- `when` 子句可以读 `static loop` 绑定的字段类型(普通结构体、嵌套结构体与元组的谓词被求值,而不是被拒绝),也可以求值常量实参上的普通纯函数。
- 已写变量的读从写取数据边,对同一变量的写之间有序,折叠不得把已写槽的值变成常量。
- 注释、诊断与计划描述改为引用设计原则或设计草案,不再引用裁定记录;任务号从注释、测试与忽略文件里撤出。拒绝信息再补四处有名字的位置,注册表会拒绝花括号无法替换的消息。
- Linux wheel 只留一个 libcamel,链接行写上 Threads 与 dl,CPython 版本跟随镜像自带的 python,构建树的 RUNPATH 不再进入 wheel,按步长紧凑的 DLPack 张量被接受。
[0.2.32]
Changes:
- 数组翻转的 P4 落地:tensor 别名变成 array,模块自己的 `slice` kernel 与"按谁的数组分派"删除,标准库签名区改写成元素类型,梯度类型分成用户与内部机制,全部生成物从合并后的树重新生成。作者随后裁定删除步骤:`Tensor` 名字、按内容比较的注册表、模块 slice 的内部使用者、tensor 规则的副本与注释都要删(删除本身随下一个版本落地)。
- 规则像函数一样声明 `with` 参数:绑定它们得到一个 Rule 值,没有默认值又未绑定的参数在写它的地方被拒绝;规则与事实共用一个实例化通道;`analysis` 声明由 `fact` 取代,事实也带 `with` 参数(参数不同就是不同的事实)。规则的条件必须是纯的,`RewriteConflict` 取代 `RewriteInvalid`(与更新过的程序冲突是写者自己的失败)。
- 效应与不可折叠性分成两个算子属性;规则条件里的效应在写它的地方报告,以规则的声明作为相关信息;`#gpu` 作用域里写的效应会真的运行——自己观察的节点是执行计划的根,值在观察点被下载。
- tag:实参写在括号里、属于 tag 自己;参数像函数一样声明(类型参数加 `when` 子句);`func` 成为参数种类的唯一名字,函数别名删除;字段 tag 的实参按声明的参数类型还原(`#width<8>` 保留实参);同名的两个 tag 一起被拒绝;namespace block 的 tag 只到达它自己的声明。
- GPU 的放置事实与作用域:不支持的算子被拒绝、不新增 pass、派生图继承原始的放置;设备后端没有程序的图和没有自己设备的运行都按名字拒绝。
- 数组:原地更新在执行计划里只决定一次;数组自己的计数在运行期回答,值有多个名字时每个名字都计数(一个名字的写不再影响另一个);取任意秩第一维的一行、梯度按重复下标累加散射;具名维度不制造实例;类型实参在调用环上增长时在第一次增长处被拒绝;只有常量 0 步长被拒绝,且在写它的地方拒绝。
- 元素级 `===` 与 `!==` 返回同形的 bool 数组,`==` 仍是一个 bool,含义不再取决于元素类型是怎么写出来的;规则左边匹配不到任何常量时在定义处就被拒绝。
- `static for` 的头部不写括号,与 `static loop` 共用一份名字表。
- 诊断:停下 limit 的那条诊断挂在异常上、其它失败不再被改写成规则错误,调试器拿到命令行的编译上限;一个共享判断决定它是否已经输出过,JSON 模式下 stderr 始终是一个数组。
- 教程重写落地:为什么优先的开篇,第一部分(值、函数与管道、分支与 match、聚合、缺失与失败)两种语言写完;示例程序成为 105 个带 golden 的受检用例;第 10 章讲效应与顺序,第 17 章教一条被事实守护的定律;页面里的图由生成器产出,不能与示例漂移。
- AI 参考:why-first 重写、正文收紧,附录不再挤占正文预算而成为两个查找文件(诊断表与标准库签名),每条规则只说一次。
- 语法闭包收紧:去掉六个保留字,formatter 加上换行处理,编辑器语法的快照不再跳过。
- runner 与门禁:三层各自按名字给出,用例账本只算代码真的读到的用例;一次运行只选一次安装并传给每一层。
- Linux wheel 流水线在 manylinux 上被证明:auditwheel 的复合平台标签被接受,retag 把 Tag 写进 WHEEL 头,workflow 读 PEP 639 许可证。
[0.2.31]
Changes:
- `static loop` 的序列只按一条判据判断(由它已有的常量折叠器折叠),元素是元组时按轮次绑定元素;`static` 头可以只命名元素的一部分,formatter 打印头部写下的每个名字。
- 类型同一性按结构:一个类型只有一个 id,图比较的是规范 id,不再取决于它是怎么写出来的。
- 删除 `wait` 剩下的机制;技术页、教程与语言参考改为描述今天的语言,被取代的语言参考页删除。
- `CAMEL_EXE` 开关全部退役:一次运行用哪个编译器是显式参数,每种语言一个 helper。
- 测试计划的清单成为一项检查:每个计划文件都必须有一个去处(快层、慢层、或按策略排除),没有去处的计划让 `release-gate` 与合并门禁直接拒绝开跑;性能计划按各自的性质分类(基准、浸泡、或按计数而不按时间)。合并门禁还会报出它量的是哪个编译器。
- 直接运行的标准库检查器也要求安装戳属于本树,并报出它量的是哪一份安装。
- 测试:复制带宽守卫改为按最快一次运行计时,阈值有真实余量;重复运行与直接调用的用例各自留出余量。
[0.2.30]
Changes:
- 语法与关键字退役:`when` 条件移到函数体之前;`sync func` 前缀与 `wait` 关键字删除(顺序由 sync 函数体自身保持);`static loop` 的头部不再写括号;`range` 只留半开区间一种写法,两参数写法与 `?..` 从语言删除,循环直接走边界元组、不再构造区间。
- 非逃逸的 `var` 变成 SSA:写它读它的 cell 消失,只留它写下的值。
- 流成为独立类型 `T..`:生成器用 `yield`,`tee` 用无界缓冲共享一次消费,组合写 `f..g` 并接收位置的期望类型;流不能做数组的元素。
- `match` 的 case 可以带 guard 条件(guard 为假就试下一个 case,带 guard 的 case 不计入穷尽性);lambda 的参数必须写括号;`null` 是可空类型上的编译期常量。
- 复合赋值只有一条规则:`a op= b` 就是 `a = a op b`,只要该算子可用并给出同一类型,无论谁声明它。
- 期望类型穿过字面量与调用:调用的结果位置会解出实参留下的类型变量,元组字面量只舍入一次。
- 诊断自带修复:14 个诊断码给出机器可用的编辑,注册表写明其余 246 个为什么给不出;文本输出打印 JSON 里带的修复,编辑器可以按 code action 应用。
- Python 绑定成为一等:数组零拷贝跨越,诊断以带位置的异常到达 Python,wheel 装上即可运行示例。
- 新增 `docs/reference/camel-for-ai.md`:由源生成、例子都经过编译的一页参考。
- GPU:`#gpu` 作用域的臂与循环各自成为区域,一个作用域只报一条拒绝;梯度图在编译期生成,`#gpu` 里可以求梯度;tiles 的常驻判定改由节点驱动。
- 具名实参到达算子组:一个名字的每条规则都是它的一条声明,同一个位置在它的所有重载里共用一个名字。
- 按元素类型声明:归约与排序每种元素类型一条声明、一个算子名,不再有运行期类型切换;bf16 与 f16 成为 `check` 能构造的类型,各有自己的 epsilon。
- 裸 `Tensor` 签名改为显式元素类型加从实参取秩(六个张量函数),执行器接受原生数组;`load_npy` 命名它的元素类型;秩零在实例化时决定;扁平字面量不再当成二维常量;步进切片是"先复制"而不是拒绝。
- 规则:泛型规则的实例真实存在并在匹配处实例化;`check` 发布 proved / refuted / sampled 的判定表,种子跟着规则的身份走;规则翻译器把图变成整数标量项,没有求解器就不声称判定。
[0.2.29]
Changes:
- 图上的边分成三类:data、sync、order。order 边成为独立的一类,图按它们布局;任何问顺序的消费者都读它们,sync 块不再向内延伸。
- 优化器库用 Camel 写成,与原生实现按值一致;新增 `std::opt::fold`(在常量上折叠一个操作);每个优化器只有一种状态类型、每个一条重载。
- 张量元素类型:秩零就是元素类型本身;张量叶子保留它写下的元素类型;空数组字面量按它填充的字段取型,数组字面量受位置声明的长度约束;广播梯度一律经 `sum_to`,f64 与 f32 同。
- 规则:`when` 里的 `const` 参数就是那个常量的值,并且按声明的类型做匹配;条件可以带节点参数、部分查询与顺序无关;泛型规则的实例是真实存在的,失败时保留函数体的判定。
- 半精度:bf16/f16 的值按自身类型打印最短文本。
- 运行时:语句链在语句被遍改写、被内联调用穿过时都保持完整;分支语句的链挂在它的汇合点上;`when` 条件调用读到的规则对象被正确 root。
- 诊断:目录从注册表重新生成,不再来自一份带冲突的暂存表。
- C++ 自测移进独立的单元测试可执行文件,不再进发布的编译器;`--time-phases` 的每一项除墙钟外还给出 CPU 时间。
- 新增 `showcase` 的 MCTS 示例(Camel 实现、Python 基线、无可调容差)。
- 测试:超时余量、慢层用例的界与声明的成本都按用例自身的 CPU 时间判。
[0.2.28]
Changes:
- 遍成为标准库声明:核心的在 `stdlib/std.cml`、模块的在 `stdlib/<模块>.cml`,无函数体的 `export func` 就是遍,`registerModulePass` 只绑它的内核;编译器不为这种声明建图或算子组。模块遍改名:`onnx::export` 现在是 `onnx::export_model` 的短别名。
- 遍参数按声明给它的类型读:`bool`/`int`/`float` 参数取 Camel 常量表达式,`string` 参数按原样取词——`onnx::export out=model.onnx` 不用引号;带空格时把整个遍词引起来。
- `#impl<kernel>`:同一模块的内核被执行,Camel 函数体仍是它的语义;标签的承诺是一次比较,写错的内核由这次比较抓住。声明模块里可以写 Camel 定义,泛型函数可以带内核。
- 节点属性:每个属性要么随导出存活,要么按名字被拒绝;`#impl` 标签归入属性分类。
- 优化:新增 `std::opt::saturate`(饱和标准规则库,留下"一个值有几种写法"的状态,不提取;`std::gir`/`std::rgir`/`std::jgir` 把等价类画成一个虚线簇,并标出提取会选哪一个);`cse` 与 `dce` 由 Camel 库给出。
- 自动微分:`#vjp` 规则的链记为一组,节点 VM 一趟跑完;GELU 的梯度一趟完成;分子被读到的除法 VJP 仍融合乘与取负。
- 数值:bf16/f16 成为一等标量(有 `min`/`max`/`abs`),归约在 f64 里累加、舍入一次。
- 张量:库 GEMM 的线程数取自这次运行的预算,在一处花掉;逐元素算子各有自己的循环;列带只打包一次。
- 工具:一个融合组在 profile 里是一行,在调试器里是一个停点。
- 测试与构建:成本按用例自身的 CPU 时间判,测试槽在进程退出时归还;删除 `mnist_py` 示例与它的数据加载器、`phot`/`pyphot` 演示;构建戳移到独立翻译单元(改一次 0.7 s 而非 35 s);源码没变的树不再重建。
[0.2.27]
Changes:
- 遍是标准库声明:遍的参数像函数参数一样声明;命令行不再写括号,写 `std::opt safe_fp=true` 而不是 `std::opt(safe_fp=true)`。
- bf16/f16:张量按声明的元素类型存储与计算(单精度),文法里是内置类型名;标准库知道这两种类型,不能用它们的地方明确拒绝。
- 自动微分:梯度保留它所属值的元素类型;数组算子的二阶导(六个里四个);穿过 `with` 参数的值也保留梯度。
- 诊断:一张注册表分配所有诊断码,构建拒绝重复;16 个不可达的码删除,其余每个都可达。
- 调试器:可以读一次改写的 `Proof`,也可以在帧上求值一个值。
- 张量:库的 GEMM 能进梯度,形状决定走哪条路径。
- `rewrite`:解释一次改写、整组改写,以及一条规则为什么没有应用。
[0.2.26]
Changes:
- 参数:普通参数与 `with` 参数都可以有默认值、可以按名字传,调用处的顺序统一(先位置参数,再命名参数)。类型参数在声明头部写出,不再自动绑定;类型变量由参数类型第一次写下它的地方绑定。
- `typeas` 删除;`constas` 放宽为值参数,可以接受任意编译期常量,出现在任何值位置。
- 数组字面量的形状写在源码里,每个 rank 一个 pack;数组类型带 extent;支持步进切片 `xs[a:b:2]` 与 tuple 参数。
- `when` 谓词可以像纯泛型函数一样调用,能穿过 import 解析、按类型同一性匹配,`sum` 由 `is_numeric` 保护;声明带适用条件,在实例化时检查。
- 规则是一等值:`rule` 是值、规则集按循环调度、一次应用是带字段的 `Run` 值;`rewrite` 把每次改写归到它的规则,并给出 `Proof` 链。
- 规则库:`accuracy` 与 `fusion` 两套库(标量定律与计数);accuracy 的改写需要 `refine_accuracy`,`check` 比较误差而不是位。
- `std::cml`:把程序打印回 Camel 源码(覆盖分支、循环、闭包与参数),写之前先检查能不能打印。
- `#gpu` 作用域:设备做不到的工作直接拒绝;`#cpu` 块是唯一允许在主机上执行的地方;shape-generic 的 resident 调用留在设备上。
- 一个线程预算:`-t` 决定所有池,环境变量不再参与。
- 自动微分:离散值的导数为零;数组上的循环、切片 adjoint 都能求导;张量拒绝会被构建改写的元素类型。
- 示例:naive Transformer 训练步与 PyTorch 对照、naive showcase 及其测量(机器、命令、方差、原始结果)。
- 标准库:`math` 可比较字符串与 bool,`min`/`max` 接受所有有序类型;`algo` 折进 `array`;`tree` 的递归与 same-shape 推导式用 Camel 写。
[0.2.25]
Changes:
- 声明化收尾:`algo`、`math`、`graph`、`para`、`random` 的可声明算子搬进 `stdlib/<模块>.cml`;此后声明写不下的只剩按类型计算的名字,和尚未迁移的 `ckpt`。
- `import` 只写模块名,不写路径;解析顺序依次是导入方自己的目录、各模块根(`-I`)、`stdlib`。28 个模块里有 26 个的 import 不执行代码,另外两个(`python`、`pyplot`)改成首次使用时才创建解释器,`import pyplot` 少约 8 ms。
- rest 参数 `..ts` 可以解析,在调用点原地展开,不产生实例。
- 八进制转义不再接受:`\0`、`\12` 在三种字符串形式里都是未知转义;八进制字面量写 `0o77`。
- `.cmc` 缓存:整个导入流程少 26%,典型场景少 11%。
- 规则语言第二版:`when` 是唯一的适用条件,一个遍变换一个函数,匹配按模式变量写下的类型绑定。
- `#impl` 取代 `#kernel`:库就是模型;`@gpu` 装饰器与它的两个算子删除,`#gpu` 作用域拒绝设备做不到的工作,而不是退回主机。
- 数组类型带 extent,形状检查在核里;值的参数可以接受任意编译期常量,也可以固定成实例的一部分;命令行点名的设备在执行任何图之前检查。
- 诊断:重复的诊断码让构建失败。`eprintln` 进前奏,不用 import;`CAMEL_JSON_MAX_DEPTH` 删除,JSON 的深度上限是固定常量 10000,超过是错误值 `JsonTooDeep`;终端模式并入 `stdin`,与读输入互相有序。
- `tree` 成为 Camel 库,`ckpt` 是检查点模块的名字。
[0.2.24]
Changes:
- 标准库改名:`sys` 是 `env`、`os` 是 `process`、`crypto` 是 `hash`、`tree` 是 `ckpt`;旧名不再是模块,导入它只得到普通的 `ModuleNotFound`,没有别名,也没有指向新名的提示。
- 终端算子从 `os` 移进 `io`:`set_terminal_raw_mode`、`has_input`、`get_char`、`get_chars`、`clear_input_buffer`;`process` 只有 `exit`、`sleep`、`whoami`、`cpu_count`,其中 `exit`、`sleep` 仍是内建,不用 import。
- `str::bytes`/`str::from_bytes` 删除:字符串与 UTF-8 字节之间只经 `bytes::encode`/`bytes::decode`;非法 UTF-8 现在是 `decode` 返回的 `EncodingError` 错误值,不再是 `from_bytes` 的故障。
- 标准库的签名改由声明给出:`stdlib/<模块>.cml` 里无函数体的 `export func` 就是签名,26 个模块已迁(185 个声明名、301 条声明);`stdlib/signatures/` 还剩 14 个文件,12 个是已迁模块里按类型计算的名字,2 个属于尚未迁移的模块(`ckpt` 和内建的 `globals`)。`inspect --ops` 与 `docs/stdlib-reference.md` 由声明生成,错元数、错类型在调用处拒绝并列出声明里的签名(含参数名)。
- 结果类型随实参变的少数签名仍由 C++ 计算,声明文件里以 `// dynamic func` 或 `stdlib/signatures/<模块>.cml` 记下;`Tensor.shape` 这类限定名写不进声明,仍由 C++ 发布、指向声明的同一个算子,照常可用。
- 资源名按设计原则 3.3 写平:`stdout`、`stdin`、`stderr`、`clock`、`env`、`rng`(原 `io:stdout`、`io:stdin`、`io:stderr`、`time:clock`、`process:environment`、`rand:generator`);`process`、`fs`、`tensor:*`、`tiles:*`、`para:rendezvous`、`io:terminal` 不变。
- ONNX 导出:只改名的聚合类型转换按目标类型标注、不生成算子——结构体字面量进入它命名的类型不再被拒,也不再写出 ONNX 没有的 `Cast`;循环体尾部的转换先脱掉,臂的叶子接受命名类型与字段顺序相同的匿名类型。
- 数值许可成为标签:`@numeric(...)` 删除(写了是 `InvalidAnnotation`);`#strict` 只拿走许可,不禁止逐位等价的改写(需要 `reassociate` 的重结合仍被拒,`x + x` 换成 `x * 2.0` 照常命中);`rule` 可以带 `when` 条件,用 `#requires<...>` 声明许可。
- 位置的期望类型只套在值上,不落进操作数:`let o: bool? = true || false` 能编译,`&&`/`||` 两侧仍是 `bool`,`??` 的两臂按 payload 取类型。
- 两层标记的顺序写在文档里:`T?!` 是 fallible(nullable(T))、`T!?` 是 nullable(fallible(T)),`match` 只拆最外层(解析与打印本来就是这个顺序)。
- 一个算子的标签、许可与读者由同一份声明事实给出,不再各读一份;读了算子声明的事实随声明纪元过期,过期读作“没有”。
- 规则与饱和:运算符声明了交换律时,定律按任一操作数顺序匹配;抽取只保留有副作用、承载顺序与被写入的变量的节点,纯节点按可达性,饱和造出的死写法不再留在结果里。
- 数组可以切片、按下标数组取元素:`xs[a:b]`、`xs[:]`、`xs[idx]`(`take`);切片共用数据块、左闭右开,负下标不是从尾部数(`xs[-1]` 是 `IndexOutOfRange`,最后一个元素写 `last(xs)`);步长不为 1 与多维视图仍未落地。
- 泛型第一期:`match type` 按结构选择类型分支,`static for`/`static loop` 在编译期展开,省略返回类型的泛型函数按实例定下返回类型。
- `macro` 修饰符删除,只写声明标签 `#macro`;求值失败是遍运行中的故障(`pass:std::macro`),不再是编译错误。
- 遍模块有语法错误时,该遍以 `InvalidPassParameter` 失败并指出语法错误,进程不再无输出退出。
- 遍不能解析时写明模块到底提供什么:`PassNotProvidedByModule`(模块在、遍不在)与 `PassNotExportedByModule`(声明了但没有导出),消息只写模块名与它确实提供的遍。
- `-I`/`--include` 是模块搜索根,按顺序生效:入口目录、各 `-I`、`CAMEL_PACKAGES`、安装的模块;从文件加载的模块先在自己的目录里找。不存在的 `-I` 根不会被静默跳过,`ModuleNotFound` 会点名那个根。
- 新增 `std::profile`(训练步的分阶段剖析);`--timeit` 失败时指出第几轮(JSON 带 `iteration`);`--devices` 选择设备,点名的设备不存在报 `DeviceUnavailable`。
- Tiles:一棵树的叶子作为一批跨到设备;元素类型不同的 `cast_like` 改为拒绝而不是原样返回。
- 循环的一轮在形状允许时编译成原生代码(35.6 → 7.0 ns),解释执行的一轮也不比它模拟的尾递归贵。
- 放不下的数字文本一律拒绝:小到四舍五入成零或超出类型时,字面量、入口参数与转换都报错,不再读成 0 或截断;前导零的源码数字(`09`、`077`)是词法错误,八进制写 `0o77`,诊断目录删掉了 `IntegerLiteralTruncated`。
- 导入标准库的程序启动多花约 4–5 ms(每条声明约 20 µs;导入全部模块时 CPU +32%,只导 `math` 也 +2.4 ms):声明在启动时解析并编译,没有缓存。
- 发布包的指令集基线是 `x86-64-v3`(AVX2 与 FMA);没有 AVX2 的机器不能启动 wheel。
[0.2.23]
Changes:
- enum 可以作键;诊断指向它所说的表达式。
- grad 拒绝不存在的梯度;循环里的 append 构建一个数组。
- 分支臂与循环在书写处构建:前端直接建区域,循环是 LOOP 节点所在的区域。
- 每个后端在函数的帧里跑循环的轮次:NodeVM、FastVM 与 JIT(新指令 LBEG/LTST/LEND)、Taskflow、宏求值器,std::cpp 写成 for (;;);轮次计数放在帧槽位里。
- 设计原则补上离散值的导数(9.9)与 enum 作键的要求(11.3)。
[0.2.22]
Changes:
- 源码与入口参数共用一套数字文法;文本值报出自己所在的位置;带符号的整数零保留符号。
- 名义结构体的 C++ 翻译按其声明;结构体字面量的字段类型不符时回退到普通构造。
- 声明可以带 tag,tag 指明可放置的位置与读取方;遍可以 import Camel 库,参数可以来自 with。
- 官方示例 C2:在 MNIST 上训练 MLP,与 PyTorch 用同一批序对比并记录结果。
- 原生多维数组与缓冲区的计划(七个可独立构建的步骤)。
[0.2.21]
Changes:
- 规则引擎:rule 声明(解析、格式化、编译成函数)、RuleSource 与 compileRule、rewrite/saturate/extract/check,以及 rules 模块的标准整数与浮点规则库(26 条精确规则)和 rules::simplify/rules::saturate_all。
- 遍可以用 Camel 写:遍模块按程序编译(模块级值存在)、可 import Camel 库、参数可以来自 with;新增 PassNeedsExtraction 与 std::opt::extract。
- 图 API 起步:句柄类型与 NodeKind、Program 的图遍历、is_written_slot、图的写作与等价类、按代价抽取。
- 分支臂成为 Arm region:前端直接建、各后端与调试器读,锚点删除;导出表改为从 libcamel 的导入对象生成,不再手写。
- 名义结构体:类型是它的声明而不是字段,C++ 翻译、ONNX 导出与 LSP 随之更新。
[0.2.20]
Changes:
- 区域成为图的一列,内联器把被内联的函数体放进 Inline 区域;新增 std::gir_regions 与 std::rgir_regions。
- 提交时强制边不变量(无环、边上类型一致);不可执行的会话只能提交私有程序,会话报告与新程序的冲突。
- 图空间纳入 GC:Program 与图版本在不可达时释放。
- 新增图 API:句柄类型与 NodeKind、句柄的相等比较、Program 的图遍历。
- 修复:出错的循环释放自己持有的帧,帧日志不再打印整个数组;入口参数与数字转换用语言自己的数字文法,文本当数字但类型放不下时改为类型不符。
- Debug 构建的工具栈高于语言的递归上限。
[0.2.19]
Changes:
- 图存储:图引用一律走 GraphId、只提交发生变化的图、未变的节点列在版本间共享、节点按句柄存放、节点列按 256 个一块。
- 每个图版本一份执行计划,NodeVM、FastVM、Taskflow、宏求值器与各 emitter 共用;扩展槽删除,节点 VM 每个节点只解析一次。
- 复数收尾:一个格式说明作用于两部分、NaN 不带符号、进入 C++ 后端与 DLPack,入口参数可读复数。
- 修复 fvm/jit 上元组数组 reduce 的视图被下一元素覆盖;Debug 层加入视图逃逸检查。
- 性能:plan 用一次加载校验记录,闭包遍历读缓存的引用表,内联器保留跨重启学到的闭包信息。
[0.2.18]
Changes:
- 核心的缓冲区改为数据块:存储按纯数据布局,Bytes 基于它;值的内存布局由类型决定而不是大小(破坏性变更)。
- 新增复数类型 c64/c128 与虚数字面量,re/im/conj/abs/exp,整数指数按反复平方计算。
- 运行时的图 id、帧槽位与 FastVM/JIT 操作数改为 32 位,去掉图数量上限。
- 重载先按精确匹配选择,两个都合适即报歧义。
- 字面量元素在书写处诊断;部分应用的上下文实参随形参进入;管道调用保留额外实参。
[0.2.17]
Changes:
- 字面量在其余位置取类型;分支臂的值取表达式类型,复合字面量保持精确值。
- 复合字面量作实参进入形参类型;编辑器语法认识 constas。
- 路径赋值按整体重新绑定(var 的字段与下标),元组从位置取类型。
- 小程序变慢定位为代码布局问题并修复;循环状态的原地写推广到每个状态;缓冲空间加上可调用的计数器并去掉两个旧名字。
[0.2.16]
Changes:
- 字面量按上下文取类型(带类型的 let、形参、返回、match 模式、二元运算另一侧、数组与结构体元素),字面量之间的运算在编译期按精确值算完。
- 自动微分改为对第一个普通参数求导:grad 与 value_and_grad,权重回到 with 参数,变换名为 with_grad,旧写法直接删除。
- 新增原生数组与计数缓冲区,数组的切向量按元素类型,缓冲空间默认上限 2 GB;循环的梯度是一次前向收集加一次反向循环。
- tensor 增加按行取索引与带键随机数;tree 的检查点整目录原子替换,fs 增加删除。
- 官方示例扩到线性/逻辑回归、VAE 与 Tree-LSTM,各带 PyTorch 对照与基线;C2 的 MLP 按评审修订。
[0.2.15]
Changes:
- 新增反引号格式化字符串:${表达式} 插值、${表达式:格式说明},与 format 同树同语义,可跨行嵌套。
- for 可以遍历字符串的码点、映射的键值对与张量的第一维;循环可以每轮收集一个值,作为循环求导的 tape。
- 张量类型可用 constas 命名维度并在调用处检查;ONNX ArgMax 按语言的规则导出,切片边界取自下标声明;math 模块写明每个算子的数值语义。
- 测试套件并行执行并分 fast/slow 两层(--jobs、--tier、--changed),每个用例写自己的临时目录。
- 修复:深数据(递归 enum、嵌套数组)不再耗尽原生栈,打印、JSON、GC 与类型字符串改为显式栈;递归 enum 可翻译为 C++;调用定位在调用起点;路径、参数与环境值全程 UTF-8;补齐 enum match 诊断与导出拒绝顺序。
- 建图器拆分为 11 个文件(纯搬移);新增首个官方示例:MNIST 上的 MLP,带 PyTorch 对照。
[0.2.14]
Changes:
- 新增名义枚举 enum:变体可带位置或具名数据,match 支持变体模式与穷尽检查,同类型按变体与字段相等、按源码写法打印,支持泛型与递归,可跨模块使用,并在各调度器与独立 C++ 导出上运行;类型位置上的 A | B 与 T ? U 退役。
- string 改为始终合法的 UTF-8,长度与下标按码点;新增内建 Bytes 与 bytes 模块,fs 提供二进制文件读写,crypto 的 sha256 同时接受 string 与 Bytes;str 的按字节函数与 char_* 退役。
- 标注可以写在代码块之前,库可以声明授予节点属性的标注;# 不再是注释,只忽略首行的 #!。泛型的类型变量可以只出现在返回类型,类型实参可以按名字给出(pair::<A = int, B = string>);match 可以匹配任意表达式。
- 流水线改为显式组合:导入模块不再向其中加入遍(--no-module-passes 退役),核心的遍统一到 std::opt::*,模块的遍写成 tiles::compile、tensor::fuse、onnx::export;新增遍参数 name(key=value)(如 std::opt(safe_fp=true)、std::fvm(native_loop=true)、onnx::export(out="m.onnx")),原来经环境变量设置的遍设置退役。
- std::opt 成为集成优化入口,循环执行去虚化、特化、内联、折叠、CSE、标量算式化简与死代码消除,并新增 std::opt::ctrl 控制边消除;std::opt::algebra 默认允许局部重结合,safe_fp=true 恢复严格等价的浮点改写。
- Tiles 把静态循环编译为设备上的递推,在一颗内核里执行多状态循环,跨调用复用已编译区域,自己管理异步提交与跨流依赖,并按上限租借复用设备与锁页内存。
- 新增参数树与检查点:tree_map、tree_reduce、tree_unzip、tree_leaves、tree_paths 按类型展开为普通图,save_tree、load_tree 以整目录原子替换和结构、类型、尺寸、SHA-256 校验保存带类型的训练状态;张量可按小端精确字节读写,二进制训练数据与 UTF-8 文件接口分离;补充扩散训练所需的批量矩阵乘与 BF16 GPU 路径。
- 调试器区分尾调用的单步与步过、显示新一轮实参与入口快照,优化遍之后仍能停在断点;格式化器支持 enum、显式类型实参与任意 match 主体;std::stats 报告图存储占用的字节数。
- 修复 std::prl 动态调用子图中的循环下降、宏求值替换图载体前释放根、内联完成门复用、无 main 的库模块图转储,以及 ONNX 导出在运行期分支与被内联成局部变量等情形下的拒绝定位。
[0.2.13]
Changes:
- 新增 Tiles 静态区域抽取与 @gpu 执行;GPU 不可用或算子不支持时在执行前回退到原有 CPU 图。
- 增加区域间传输规划、驻留值复用、静态预编译和数值感知计划缓存,修复并发图发布与驻留存储构建问题。
- NodeVM、FastVM/JIT 和并行调度器支持原生调用 Camel 子图,保持递归、故障与 GC 语义。
- 新增版本化 std::jgir JSON 图导出,明确 std::gir、std::rgir 与注释导出格式;调试器增加节点断点、暂停内存检查和 Release 编译边界。
- 修复 int64 求和、exp 次正规数、argmax/argmin、空均值和 CBLAS 矩阵乘许可,并增加超越函数 ULP 验证。
- ONNX 仅导出已证明安全或带运行时故障保护的切片,完善图重复输入与输出类型元数据。
- wheel 构建改用配置的 Python 解释器。
[0.2.11]
Changes:
- 新增 Tiles GPU 编译模块,支持 CUDA 内核生成、计算融合、设备驻留值及相关执行与性能验证。
- 完善源码级调试,支持调用栈与变量检查、断点和步进;扩展语言服务的工作区查询与命名空间成员展示。
- 重构冻结图存储为 16 字节节点记录、稠密节点编号和每图引用表,统一边与子图引用的存储。
- 修复带类型声明的值检查,允许对已收窄的非空值使用可空操作并给出警告,完善相关诊断。
- json.decode 改为返回 Json!,无效 JSON 返回错误值;完善链式访问、数值转换和越界处理。
- 完善模块自导入、跨模块类型环与歧义诊断;C++ 模块可导出值,math::pi、e、inf、nan 改为值而非函数。
- 完善运算符重载优先级、由 == 派生 != 及命名空间重载;移除 sorted,统一使用返回新数组的 sort,并支持安全的就地优化。
- 独立 C++ 程序支持通过 --arg 传入 main 的标量参数,移除 std::cpp::bench;修复格式化打印换行与前缀运算符格式化。
[0.2.10]
Changes:
- 重构 std::cpp 导出,受支持的程序可编译为不依赖 libcamel 的 C++20 程序;尚未独立实现的模块算子保留运行时桥接。
- 扩展独立 C++ 程序对数组、元组、结构体、可空与错误值、函数值、变量及随机数等的支持,新增与 std::fvm 的编译运行对照测试。
- append、extend、apply 及 algo 排序算子改为返回新数组;支持重新绑定时的安全就地优化,并诊断被丢弃的纯计算结果。
- 支持通过 func operator 在 Camel 源码中定义运算符重载,补齐复合赋值、重载选择及相关诊断。
- 调整图帧布局的构造与生命周期,减少 NVM 递归调用的栈占用,完善 Windows 原生栈限制回归。
- 完善 ONNX 对动态增长数组的拒绝诊断,更新前端工具、标准库签名、语言设计说明与回归用例。
[0.2.9]
Changes:
- 优化 AST 与构造树的 arena 存储,统一符号、算子及类型驻留,新增编译阶段计时与分配基准。
- 完善幂与一元运算优先级、浮点指数字面量、导入重命名和文档注释,增加 loop 表达式的语法解析。
- 将 && / || 实现为短路分支,支持可空值判空与分支内类型收窄,提示未处理的错误值。
- 统一模块 root 与捕获绑定,支持模块级值、相互导入、顺序无关的顶层声明,并规范命名空间查找规则。
- 收紧类型系统并拒绝显式 any;json.decode 改为自描述的 Json 类型,提供类型明确的访问与转换。
- 扩展 JIT 对运行时调用及对象常量的编译支持,分代 GC 改为默认回收器,保留 mark-sweep 选项。
- 并行调度器将串行子图交给字节码解释器,统一递归限制,改进跨平台浮点与随机数一致性及 Windows DLL 初始化。
[0.2.8]
Changes:
- 新增 --gc / CAMEL_GC 回收器选择,分代 GC 作为可选模式,默认保持 mark-sweep。
- 修复移动回收中的大对象引用、晋升、foreign 释放、宏常量及 JIT safepoint 问题。
- 优化 RootHandle、写屏障和老年代分配,完善堆上限、nursery 与大对象阈值设置。
- 新增 safepoint poisoning、GC 压力与浸泡回归、内存上限验证及基准报告。
- 修复 help/note 换行:按实际终端宽度折行,读取不到宽度时单行输出。
- 减少信息命令及纯词法/语法检查的启动初始化,保留参数校验、诊断格式和错误上限。
[0.2.7]
Changes:
- 新增执行观察器、源码级调试核心、DAP 协议和 VS Code 调试配置。
- 支持行断点、步进、调用栈、变量与图节点视图,并补齐协议测试。
- 隔离调试观察开销,完善错误呈现、保留名检查、重载选择和字面量转换诊断。
- 扩展随机程序测试,修复 nullable 分支槽类型问题。
[0.2.6]
Changes:
- 以手写词法和语法分析器替换 ANTLR,格式化器和 LSP 改用新的具体语法树。
- 优化并行调度的锁、帧分配、safepoint 和 map 分块开销。
- 完善分支/match、nullable 转换、部分应用、列表推导和泛型高阶调用。
[0.2.5]
Changes:
- 新增语义查询、LSP 导航/补全/重命名/语义标记和 VS Code 扩展。
- 新增多后端故障隔离和运行结束时的资源释放。
- Map/Set 改用持久化 B+ 树,统一集合调用形式。
- 完善字面量、集合比较、浮点输出及导入诊断。
[0.2.4]
Changes:
- 新增泛型函数与类型、T?/T!、解包与异常相关语言能力。
- 新增 Map/Set、JSON 按类型解码及 array、str、math、statistics 标准库。
- 完善诊断代码、源码定位、递归限制与 JIT 故障处理。
- 新增随机程序生成与多后端差分验证,补齐相关回归测试。
[0.2.3]
Changes:
- 扩展 ONNX 递归与 Loop 导出、局部变量导出和闭包自动求导。
- 新增带声明形状的 Tensor 类型及受检查的类型转换。
- 恢复并行任务图执行,完善 main 参数、结果输出和运行时诊断。
- 修复调度、GC、优化与构建兼容性问题。
[0.2.2]
New Features:
- 新增逐 pass 图快照、图差异工具、效应追踪和流水线诊断。
- 完善 var 引用语义、捕获写入追踪、sync/wait 顺序与副作用警告。
Bug Fixes:
- 修复图优化、分支调度及 ONNX 导出的顺序和诊断问题。
[0.2.1]
New Features:
- 新增节点断点、单步和逐 pass 图查询。
- 完善 ONNX 分支、动态 batch、Adam 状态和训练态 BatchNorm 导出。
Bug Fixes:
- 修复语言服务器诊断与格式化。
Technical Notes:
- 补齐部署、跨框架对齐和性能归因工具。
[0.2.0]
New Features:
- 重构 Tensor 算子与内核,优化矩阵和向量计算。
- 引入静态图自动求导、高阶梯度、自定义导数及参数树优化器。
- 新增图优化、ONNX 函数与训练步导出。
Technical Notes:
- 完善运行时图编译、VM/JIT、诊断及验证工具。
[0.1.23]
New Features:
- 新增 refinement 类型统一与拓宽接口。
Bug Fixes:
- 修复特殊类型的可赋值性判断。
- 修复文件头更新脚本的换行符保留。
[0.1.22]
New Features:
- 引入并完善垃圾回收(GC)运行时能力:写屏障、safepoint 约束、外部资源句柄与 GC 观测/验证控制进一步落地。
- 启动路径与运行时分配行为优化,降低初始化阶段的额外预分配开销。
- 补充分支/发布工作流规范文档,明确 feature、develop、main 之间的合并与发布顺序。
Bug Fixes:
- 修复 GC safepoint 周围的 VM 性能回退问题。
- 修复 Python 嵌入运行时的宿主环境继承边界,稳定虚拟环境包复用与测试环境变量覆盖行为。
- 修复 MNIST Python 可视化输出目录缺失导致的结果图保存失败问题。
Technical Notes:
- GC tracing、运行时生命周期、验证计划与 young-copying 相关测试覆盖进一步收敛。
- Python 与 pyplot 模块的嵌入式解释器初始化逻辑统一加强,新增更可控的环境变量隔离策略。
- 测试运行器统一使用 `envs` 字段传递环境变量,GC 计划同步整理。
Others:
- 更新分支规范,要求发布前确认版本号、下一开发版本号以及 `changes.log` 内容。
[0.1.21]
New Features:
- 重构测试系统:统一 plan 组织与运行入口,补齐功能、性能与快照验证能力。
- 新增命名空间支持,包括限定导入、命名空间类型构造与更清晰的 GIR DOT 导出。
- 自动求导模块扩展:补全图式 autograd step、softmax cross entropy、embedding、attention 等神经网络算子支持。
Bug Fixes:
- 修复格式化器、GraphViz / GIR 输出、golden snapshot 归一化及 benchmark 样本展示等已知问题。
- 稳定 macro、module、parallel 相关测试运行,并修复 GIR 同步与 DREF 图完整性问题。
- 修复 pre-commit 自动暂存约束与测试验证脚本中的边界问题。
Technical Notes:
- 测试目录重组到按用途分类的新结构,verify 脚本与 timeit 工作流重建。
- GIR DOT 标识、结构类型标注与 trace 输出路径进一步整理。
- 命名空间与 autograd 相关实现跨编译、执行与测试层面完成一轮系统性收敛。
[0.1.20]
New Features:
- 移除编译期 GIR,转向新的运行时图结构与执行链路,相关模块完成大规模重构。
- Logger 进一步优化,补充 GHA / PyPI 打包与跨平台构建流程支持。
- Linux 下 JIT 性能优化与若干运行时细节能力补齐。
Bug Fixes:
- 修复 Linux 下 JIT 计算错误、NodeVM 尾调用、PORT 节点识别及 duplicate value input 等问题。
- 修复部分 FILL 运行时处理、编译产物组织与若干已知兼容性问题。
Technical Notes:
- 运行时图重写、GIR 运行时对象、direct-call 布局与模块/路由加载机制持续重构。
- 清理旧 GIR API 与历史实现,文件结构、测试目录、打包脚本与 GHA 工作流同步调整。
- 编译告警、日志模块与若干底层实现细节完成一轮系统整理。
[0.1.19]
New Features:
- 新增装饰器语法并持续完善实现。
- 图生命周期管理、内联图重写遍与 Inline pass 完成一轮较大规模优化。
- JIT 编译策略与适配性继续增强。
Bug Fixes:
- 修复 EXIT 类型 GIR 节点相关适配问题与若干内联 / 生命周期边界问题。
Technical Notes:
- GIR 完成多阶段重构,包含一至三阶段整理与更深一轮结构收敛。
- JIT、Inline 与装饰器实现围绕新 GIR 结构同步适配。
[0.1.18]
New Features:
- 引入宏调度遍与 CPP 转译遍。
- FastVM 与 JIT 完成一轮重构优化,性能与执行路径进一步增强。
- 新增 Python 模块测试用例,退出码机制优化。
Bug Fixes:
- 修复 JIT 逻辑 bug、编译问题及若干已知问题。
Technical Notes:
- FastVM 调度模型、JIT 优化链路与部分脚本/注释同步整理。
[0.1.17]
New Features:
- 诊断系统优化,支持节点源码逆映射与语义级源码映射。
- 恢复 TaskFlowVM 与 Tensor 支持,加入运行时配置和线程安全内存分配器改进。
- Profiler、Debugger 与相关接口继续完善。
Bug Fixes:
- 修复 NodeVM、Tensor、诊断与若干运行时已知问题。
Technical Notes:
- NodeVM 功能恢复与优化,模块组织、文档与日志体系进一步整理。
- 执行器、调试器与内存管理相关代码完成一轮系统重构。
[0.1.16]
New Features:
- 内存调试器及 Debugger WebUI 初步实装,支持 GIR 可视化与渲染优化。
- NodeVM 性能优化,GIR 节点改用裸指针以降低开销。
- 默认 Pass 改为 NodeVM。
Bug Fixes:
- 修复 Debugger UI 下 GIR 渲染生成异常。
- NodeVM 已知问题修复,功能初步恢复可用。
- 修复 Array 错误接口。
- 修复 debug 模式下编译链接失败问题。
Technical Notes:
- 内置模块拆解为独立 .cmo,模块与类型系统协同优化。
- GIR 节点改为裸指针管理,不再使用智能指针分布式引用。
- 移除旧 Python 内嵌方式,重构 CMake 与文档、CLI 脚本,链接过程优化。
- 类型转换与安全检查方法更新。
- 内置模块目录与职责整理。
Others:
- 新增开源标准文档:贡献指南、行为准则、安全策略及 Issue 模板。
[0.1.15]
New Features:
- 模块系统升级:支持加载 .cmo 动态模块与动态链接库,构建产物与文件结构拆解重构。
- 新增 Python 调用模块,优化模块加载逻辑与内置库交互。
- 实装动态类型转换。
- 移除不需要的 phot 模块。
Bug Fixes:
- 已知问题修复及细节优化。
Technical Notes:
- 代码结构与链接方式大幅调整,链接库拆解。
- 模块系统重构,移除非诊断报错路径。
- 新增并优化代码历史统计脚本。
[0.1.14]
New Features:
- FastVM 初步实装 JIT 编译:支持 trampoline、异步 JIT、调试跟踪与失败原因返回。
- MIR 层完善(虚拟寄存器、寄存器分配、溢出分配),输出格式增强。
- 类型系统内存管理重构,改为裸指针。
- 运行时数据与类型分离,函数/数组类型构造与算子接口重构。
- 恢复 TaskFlow 虚拟机与 NodeVM。
- 添加 CMake 选项、测试脚本与语言参考文档。
- phot 模块加载与默认类型字节数更新。
Bug Fixes:
- 修复 JIT 在 build 模式下崩溃及关闭 JIT 时编译失败问题。
- 修复 fib 计算逻辑错误与已知问题。
Technical Notes:
- 标准槽容器构造方式与字符串连接、函数闭包处理逻辑重构。
- 项目结构与测试用例整理。
[0.1.13]
New Features:
- FastVM 性能优化:支持静态类型转换与 as 关键字,采用密集字节码指令集与字节码链接器,执行链接后字节码,算子内联与跳转表优化分派开销。
- 新增链接后字节码打印遍。
- 新增 plot、phot 及部分 Python 交互算子。
Bug Fixes:
- 修复 plot 相关问题及已知问题。
Technical Notes:
- 字节码链接器实现,内联算子抽离与重新接入。
- 代码结构整理。
[0.1.12]
New Features:
- 栈帧管理重构:释放策略与模块实现优化,函数返回与 slot 解读逻辑改进。
- FastVM 功能完善:字节码优化遍、性能统计模块与特殊算子实现。
- 内置库新增统计模块,字符串格式化算子优化。
- FILL 节点修复初步完成。
Bug Fixes:
- 修复漏释放栈帧及已知问题。
Technical Notes:
- 引入字节码优化与性能统计,FastVM 代码结构整理。
- 测试样例更新。
[0.1.11]
New Features:
- 引入垃圾回收(GC)系统:GC 算法与内存分配器实现,GCArray 与数据结构重构,类型编码布局与类型对象生命周期绑定。
- 编译时到运行时数据转换打通。
- Frame 实现调整,object 新增 equals 与 print 接口。
- FastVM 初步适配新内存模型。
- Graph 信息读取性能优化,移除内联算子字节码以降低开销。
Bug Fixes:
- 修复链接与部分编译错误、已知问题及警告。
Technical Notes:
- data 模块初步重构,Linux 下缺失头文件补全。
- 部分未完成重构代码暂时注释。
[0.1.10]
New Features:
- 张量(Tensor)计算支持与运算符、打印逻辑优化,张量计算示例整理。
- FastVM 函数调用与尾调用优化,支持 Mark 算子。
- 移除 to_float。
Bug Fixes:
- 修复递归嵌套函数中无法访问闭包变量的问题及已知问题。
Technical Notes:
- Tensor 算子代码与测试用例整理。
[0.1.9]
New Features:
- 并行调度器适配现有框架,新增性能基准与归并排序测试基准,并发基准跑通。
- 新增排序相关算子与 random 模块,排序性能优化。
- 基础类型名不再作为关键字保留,新增类型转换算子并做部分函数重命名。
- 默认执行遍调整。
Bug Fixes:
- 并行调度器与框架适配问题修复。
Others:
- 归并排序样例与代码结构、测试调整。
[0.1.8]
New Features:
- 初步支持张量计算,Tensor 计算库优化并新增测试用例。
- 添加内存性能分析工具,进行 Arena 等内存方案探索。
Bug Fixes:
- Tensor 计算库已知问题修复。
Technical Notes:
- 代码整理,函数声明与定义分离,注释补充。
[0.1.7]
New Features:
- 支持算子内联与分支内联优化,常用算子可内联为字节码,初步实现分支内联优化遍。
- 支持用户自定义类型与 Tensor 类型识别,增加对三方类型的赋值检测。
- Tensor 计算库进一步完善,张量计算初步可用。
Technical Notes:
- 跨平台构建与运行优化。
[0.1.6]
New Features:
- 新增字节码虚拟机 FastVM,完成初步设计与实现,相关模块重构。
- 字节码设计重构,支持预编译。
- Frame 设计优化。
Bug Fixes:
- 已知问题修复。
Technical Notes:
- 算子与 operator 类型定义重构。
- 占位与代码整理。
[0.1.5]
New Features:
- 初步实现闭包机制,禁止跨图连接,改为闭包传递。
- 栈帧轻量化,线性调度器将 Frame 构造优化在栈上。
Bug Fixes:
- 修复 foreach 等算子不支持闭包的问题。
- 函数声明与定义分离过程中的错误修正。
- 已知问题修复。
Technical Notes:
- 函数声明与定义分离,代码整理。
[0.1.4]
New Features:
- 移除上下文参数传递运算符,相关算子实现风格统一调整。
- 测试样例整理为当前倡导写法。
Technical Notes:
- 算子实现与接口调整。
[0.1.3]
New Features:
- 正式启用静态类型校验系统,完成静态类型解析与基本类型系统重构。
- 内置算子类型解析器与类型签名、算子重载系统(二)及 TypeMangling 接入。
- FILL 节点类型处理与 GIR 节点值类型信息完善。
- 诊断系统与报错行为优化,诊断信息懒加载。
- 并行调度器新增两个并行迭代算子。
- 移除 Entity,算子实现映射更新。
Bug Fixes:
- 修复并行调度器 BRCH-JOIN 在部分条件下依赖异常的问题及已知问题。
Technical Notes:
- FuncResolver 与内置图重写遍文件结构优化。
- 与 develop 同步。
[0.1.2]
New Features:
- 初步引入并行解释调度器与图重写遍调度模块,支持指定图重写遍。
- 初步添加 TypeResolver。
- 暂时移除命名参数支持,函数类型重构。
Bug Fixes:
- 修复 TNS 打印失败问题。
Others:
- 版权注释补充。
[0.1.1]
New Features:
- 初步引入并实现 Profiler 模块。
Bug Fixes:
- Profiler 及已知问题修复。
[0.1.0]
Technical Notes:
- 项目文件整理与冗余文件清理,作为 0.1 线首个稳定标记版本。
[0.0.22]
New Features:
- GIR 小规模重构以支持高阶函数:节点设计与数据存储方式调整,减少冗余智能指针,TLI 执行性能优化。
- 支持转义序列与终端管理算子。
- 默认整数类型改为 Int32,整数显示优化。
- 图节点捕获追踪与 Access 节点执行实现。
- 返回函数节点构造与函数组合运算符支持优化。
- 新增算子,BIND 的 GCT 节点改为宏算子。
- neuro 用例与贪吃蛇示例跑通。
Bug Fixes:
- 修复全局变量无法初始化、栈上复制 Graph 导致错误、Dict 构造中 Ref 误用等问题。
- 热点代码优化。
Technical Notes:
- GIR 数据存储与节点类型设计重构。
- 已知警告修复,测试用例补充与优化。
[0.0.21]
New Features:
- 支持尾调用优化。
- 模式匹配初步支持,Match 表达式正式支持并补全 AST。
- struct 算子与 StructNode 优化,遍历算子调通并新增部分算子。
- mark 运算符尝试实现,彩蛋加入。
- Linux 适配。
- 新增 perf 相关命令与 profile 编译/构建模式。
Bug Fixes:
- 修复 logger 在 build 模式下性能占用、参数无法传入 lambda、parsing 阶段报错异常等问题。
- 编译错误修复。
Technical Notes:
- 部分模块重构,psrgen 脚本与文档、测试样例更新。
- HelloWorld 与辅助脚本、pre-commit 更新。
[0.0.20]
New Features:
- 执行机制初步完善:引入栈帧,分支功能跑通,DataLink 链接前移除 CtrlLink。
- 基于 AST 的代码生成:inspect 新增 --gen 与 codegen,支持从 AST 生成源码。
- 返回节点与 ReturnNode 加入,算子接口重构。
- 算子模块重构初步完成,新增部分基础算子。
- 诊断系统优化,成环检查加强。
- 标准库与 LOGO 更新。
Bug Fixes:
- 修复 TNS 打印与 var 在部分情况下不可用等问题及已知问题。
Others:
- 格式化与图标、图床、Readme、测试样例更新。
[0.0.19]
New Features:
- 拓扑执行与拓扑调度器初步实现,执行流程调通。
- Executor 设计与加载执行流程初步实现。
- 执行器与算子执行器初步实现,Data 支持打印。
- 基础算子与二元运算算子补充。
- diagnostic 与 diagCode 完善。
- 文件结构与诊断系统重构。
Bug Fixes:
- 编译错误修复。
Technical Notes:
- 类型系统优化,算子模块与定义重构。
- 代码结构大规模重构、格式化与命名调整。
[0.0.18]
New Features:
- 拓扑节点序列(TNS)打印与拓扑排序遍初步实现,拓扑遍代码结构成型。
- 图依赖与被依赖项追踪。
- GIR 打印与模块导入行为优化。
Bug Fixes:
- 修复 Release 模式编译、Graph 自引用与返回值 GIR 构造等问题。
- 已知细节问题修复。
Technical Notes:
- Logger 与模块加载行为优化。
[0.0.17]
New Features:
- 模块系统初步实现:import 语法与包导入机制优化,内置模块导入与导出、搜索目录顺序查找支持。
- GIR 打印优化。
- Profiler 服务支持初步添加。
- 部分基础模块就绪。
Bug Fixes:
- 已知问题修复。
Technical Notes:
- 代码统一格式化与细节调整。
[0.0.16]
New Features:
- GIR 构造与打印模块大规模重构完成,GraphViz 打印初步实现。
- sync 语句块与副作用控制追踪加强,分支支持加入。
- Scope 与断言模块优化。
Bug Fixes:
- 修复子图被释放、全局算子初始化与重复添加节点等问题。
- 图渲染与已知问题修复。
Technical Notes:
- GIR 构造与 code 侧 GIR 构造大规模重构。
[0.0.15]
New Features:
- GCT 构造模块重构完成,tree 底层结构设计更新。
- VARI、WAIT 节点实装,Index 语法加入。
- AST 构造记录 token 范围,AST 打印中 WAIT 等修饰展示优化。
- 函数结构与报错行为优化。
- Camel 之禅文档添加。
Bug Fixes:
- 已知问题修复,S0–S4 与 full 用例通过。
- 参数传递与模块导入的 AST 构造问题修复。
Technical Notes:
- 报错系统重构。
- GCT 构造与 GCT 大规模重构(一)。
- ABOUT 显示与代码细节调整。
[0.0.14]
New Features:
- AST 构造大规模重构,语法与 ASDL 完善,AST 打印初步实现。
- LetDecl、Implmark 与 @ 运算符加入,元数据注解语法移除。
- Executor 框架初步添加与实现。
- GCT 构造部分实现并推进。
- 测试驱动开发样例添加。
Bug Fixes:
- 上下文参数传递运算符优先级调整。
- AST 构造通过全部测试与 s0–s4 验证。
- gct.h 与 AST 构造/打印问题修复。
Technical Notes:
- 代码架构重调,AST 与 GCT 初步区分。
- AST 代码风格整理。
- demo 与过时 cml 示例清理。
[0.0.13]
New Features:
- 部分语法重构,示例代码与 MLP 目标用例添加。
- CST->GCT 构造(一)实现。
- Formatter 适配新语法,GCT 头文件与 Formatter 脚本可自动生成。
- CST 打印修复与自动修复脚本加入。
- 程序退出返回值优化。
Bug Fixes:
- CLI 与编译过程、GCT 构造相关编译问题修复。
- 细节问题修复。
Technical Notes:
- main 函数与 json 输出细节整理。
- Copyright 更新。
[0.0.12]
New Features:
- CLI 重构,AST 与 GCT 初步区分,命名空间与命令细节优化。
- 构建方式改为源码集成 ANTLR。
- README 与 logo 更新。
Bug Fixes:
- CST 打印失败、gitcnt 统计与 CLI 问题及 warnings 修复。
Technical Notes:
- 切换至 C++23,环境配置与 Help 命令优化。
- 辅助脚本(check、gitcnt)与说明文档、版本号更新。
[0.0.11]
New Features:
- 语法大幅优化与重构,支持高阶特性,复数支持移除。
- 新语法适配(一至三)与 macro 修饰符加入,GIR 序列化可复现性增强。
- 调式模式与 format 初步可用,Formatter 优化。
- PyPI 模块与打包机制初步实现。
- C++20 支持。
Bug Fixes:
- Formatter 及相关问题修复。
Technical Notes:
- 自动脚本与 CMakeLists 优化,setver 等脚本添加。
- 部分文档中英双语。
- 无关依赖清理。
[0.0.10]
New Features:
- 添加 GraphViz 格式导出。
- 初步实现 graphviz 的 pass,引入 Pass,文件结构调整。
- Formatter 深度优化。
- 提升类型与函子声明解析顺序,进一步优化 GIR 构造过程与函子 dump 效果。
Bug Fixes:
- GIR 构造 BUG 修复:修复链接函子时错误共享函子节点、多次调用同一函子实体的问题。
- 修复 graphviz 导出标识符无法识别、无法正确 dump 子图的问题。
- 修复深度作用域嵌套时中间层被意外释放的问题。
- 修复 Lambda 类型 AST 构建失败、无法正确识别三元表达式等问题。
Others:
- 若干细节调整与问题修复。
[0.0.9]
New Features:
- 初步添加内置算子,GIR 构造模块初步完成,GIR 构造进一步实现(五至十)。
- 类型系统与类型数据系统进一步实现,实现序列类型数据向 PARAMS 的转换。
- 优化语法,分号可选,加回参数可变声明。
- 添加 SYNC 修饰符,重构 REF 解析机制,函子修饰符检查优化。
- 更新对可变参数的 AST 支持。
- 添加取消分号时的 Formatter 支持,减小语法在无分号时的歧义性。
Bug Fixes:
- 修复部分逻辑错误、函数参数不可作为函子被调用、找不到某些内置函子等问题。
- 修复 Formatter 误删注释、LINK 函子结点越界、图节点所有权导致的内存泄漏、Context 初始化异常等问题。
- 修复不能正确识别 shared 修饰符、大量语法错误、解析非法 Map 字面量崩溃、函子参数为 DREF 时不在 AST 上等问题。
Technical Notes:
- 重构 data/type 模块文件结构,重构文件结构。
- 大量应用命名空间优化与关键概念重命名。
Others: