From f97bb24cd845beebd35ca1b5e5f760e9aa7c25c8 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 1 Oct 2026 23:03:38 +0800 Subject: [PATCH] =?UTF-8?q?docs(wiki):=20=E4=BF=AE=E5=A4=8D=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E5=86=85=E9=83=A8=E9=93=BE=E6=8E=A5=EF=BC=8801-overvi?= =?UTF-8?q?ew.md=20=E6=94=B9=E4=B8=BA=20README.MD=EF=BC=89=E5=B9=B6?= =?UTF-8?q?=E8=A1=A5=E9=BD=90=E5=B0=8F=E8=8A=82=E9=94=9A=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 02-type-system.md | 2 +- 03-variables.md | 2 +- 04-functions.md | 2 +- 10-imports.md | 2 +- 11-builtins.md | 2 +- 12-project.md | 2 +- README.MD | 4 ++++ 7 files changed, 10 insertions(+), 6 deletions(-) diff --git a/02-type-system.md b/02-type-system.md index eef8c91..c84ae88 100644 --- a/02-type-system.md +++ b/02-type-system.md @@ -716,7 +716,7 @@ data: uint8* = uint8*(s) ## 宏定义常量 -使用 `t.CDefine` 定义编译时常量(新写法用软关键字 `define X = v` / `define X: T = v`)。`t.CDefine` 不是数据类型,而是编译时元指令——标记为 `t.CDefine` 的常量在 LLVM IR 中不生成任何全局变量,而是在引用处直接内联展开。详见 [01-overview.md 中 t.CDefine 深度解析](01-overview.md#tcdefine-深度解析)。 +使用 `t.CDefine` 定义编译时常量(新写法用软关键字 `define X = v` / `define X: T = v`)。`t.CDefine` 不是数据类型,而是编译时元指令——标记为 `t.CDefine` 的常量在 LLVM IR 中不生成任何全局变量,而是在引用处直接内联展开。详见 [README.MD 中 t.CDefine 深度解析](README.MD#tcdefine-深度解析)。 ```python define MAX_SIZE = 1024 # 推荐:等价 MAX_SIZE: t.CDefine = 1024 diff --git a/03-variables.md b/03-variables.md index 4bb6d69..a358bd9 100644 --- a/03-variables.md +++ b/03-variables.md @@ -186,7 +186,7 @@ define PAGE_SIZE: uint32 = 4096 # 带显式底层类型 MAX_SIZE2: t.CDefine = 1024 # 等价旧写法 ``` -`t.CDefine` 不是数据类型,而是编译时元指令——常量在 LLVM IR 中不生成全局变量,而是在引用处直接内联展开。详见 [01-overview.md 中 t.CDefine 深度解析](01-overview.md#tcdefine-深度解析)。 +`t.CDefine` 不是数据类型,而是编译时元指令——常量在 LLVM IR 中不生成全局变量,而是在引用处直接内联展开。详见 [README.MD 中 t.CDefine 深度解析](README.MD#tcdefine-深度解析)。 > `define` 有两种形态:带 `=`(`define X: T = Y` / `define X = Y`)是**编译期常量**;带 `(`(`define F(...) -> T`)是**宏函数**。详见 [04-functions.md 宏函数](04-functions.md#宏函数-define)。 diff --git a/04-functions.md b/04-functions.md index d117bbe..8b0355b 100644 --- a/04-functions.md +++ b/04-functions.md @@ -38,7 +38,7 @@ void print_msg(const char* msg) { ### 导出函数 `export` -`export` 控制符号可见性——不加 SHA1 前缀,裸名导出、全局可见。详见 [01-overview.md 中 t.CExport 深度解析](01-overview.md#tcexport-深度解析)。 +`export` 控制符号可见性——不加 SHA1 前缀,裸名导出、全局可见。详见 [README.MD 中 export 深度解析](README.MD#tcexport-深度解析)。 ```python export def _start() -> int: diff --git a/10-imports.md b/10-imports.md index 9791cb6..178695b 100644 --- a/10-imports.md +++ b/10-imports.md @@ -223,7 +223,7 @@ Viper 的 `import` 是编译时操作,不涉及运行时模块加载。完整 ### SHA1 命名空间与导入 -每个模块的函数和结构体在 LLVM IR 中自动加上 SHA1 前缀,消除跨模块符号冲突。SHA1 取文件内容 `sha1` 摘要的**前 8 字节**(16 个十六进制字符)。豁免(保留裸名)的符号:`t.CExport` / `t.CExtern` / `t.State` 标记的函数、以及 `main`。详见 [01-overview.md 中 SHA1 命名空间机制](01-overview.md#sha1-命名空间机制)。 +每个模块的函数和结构体在 LLVM IR 中自动加上 SHA1 前缀,消除跨模块符号冲突。SHA1 取文件内容 `sha1` 摘要的**前 8 字节**(16 个十六进制字符)。豁免(保留裸名)的符号:`t.CExport` / `t.CExtern` / `t.State` 标记的函数、以及 `main`。详见 [README.MD 中 SHA1 命名空间机制](README.MD#sha1-命名空间机制)。 ### 跨模块约束 diff --git a/11-builtins.md b/11-builtins.md index 225e072..fdb6e5d 100644 --- a/11-builtins.md +++ b/11-builtins.md @@ -11,7 +11,7 @@ print("Hello, World!") print(x, y) # 多参数输出 ``` -`print` 目前是**编译器内建**:类型感知格式化(按实参静态类型选格式)+ 默认换行,最终经 `printf` 族输出;**后续计划下降到标准库**用 Viper 实现。详见 [01-overview.md 的「print 是编译器内建」](01-overview.md#print-是编译器内建)。 +`print` 目前是**编译器内建**:类型感知格式化(按实参静态类型选格式)+ 默认换行,最终经 `printf` 族输出;**后续计划下降到标准库**用 Viper 实现。详见 [README.MD 的「print 是编译器内建」](README.MD#print-是编译器内建)。 ### len diff --git a/12-project.md b/12-project.md index 70c1498..1dc90e1 100644 --- a/12-project.md +++ b/12-project.md @@ -293,4 +293,4 @@ SHA1 同时服务于命名空间隔离和增量编译: - **命名空间**:未 `export` 的函数(内部非 `t.CExport`)和结构体使用 SHA1 前缀,消除符号冲突 - **增量编译**:SHA1 不变则缓存命中,SHA1 变化则重新生成 -详见 [01-overview.md 中 SHA1 命名空间机制](01-overview.md#sha1-命名空间机制)。 +详见 [README.MD 中 SHA1 命名空间机制](README.MD#sha1-命名空间机制)。 diff --git a/README.MD b/README.MD index 27f4932..a7c24a6 100644 --- a/README.MD +++ b/README.MD @@ -232,6 +232,8 @@ SHA1 同时服务于增量编译: 理论上,如果一个未经变动的模块的依赖路径上存在变动的模块,暂时的方法是将其简单做 SHA1 替换,暨将旧 SHA1 替换为新 SHA1,但不适用于签名改变的情况,不过签名改变这个未经变动的模块必然也需要改变,但是由于宏展开的存在,不能完全保证不会发生错误情况。且依赖路径的 SHA1 替换成功性未经完整测试,可能出现未定义行为。 + + ## 编译期常量与宏(`define` / `t.CDefine`)深度解析 `t.CDefine` 是编译时元指令(**推荐用软关键字 `define` 书写**),控制编译器的代码生成行为——它不是真实的数据类型。 @@ -287,6 +289,8 @@ define DATA_SEG: uint16 = 0x10 > 旧写法 `CODE_SEG: t.CDefine | t.CUInt16T = 0x08` 等价,手写可用但不推荐。 + + ## `export` 深度解析(内部标记 `t.CExport`) `export` 软关键字控制函数的符号可见性,是 SHA1 命名空间的豁免机制(内部改写为返回注解中的 `t.CExport` 标记)。