Snow 是一门受 LLM 时代启发的、面向 AI 友好的编程语言。它设计目标是让 LLM 更容易生成和理解编程代码。
该项目实现了 Snow 语言的完整编译流程,包括词法分析,语法分析,语义分析,中间表示(IR)生成以及最终的虚拟机(VM)指令生成和执行器,提供从源码到字节码再到自研编程语言虚拟机 ( SnowVM) 的完整编译-执行链路。
通过 Snow 编译器,可以将 .snow
源文件编译为 .water
虚拟机指令,并在 SnowVM 上直接运行。
从源码编译、构建管理、依赖管理、项目标准化、可视化调试面板到原生镜像发布,全部由 Snow 官方工具完成,降低学习与集成成本。
Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的语法和严格的类型系统,以帮助 LLM 更好地理解程序。
语言使用显式的 module
声明来组织代码,用 function
,parameter
,return_type
,body
等关键字分隔不同代码块,语法结构固定且易读。此外,Snow
实现了语义分析来检查变量作用域和类型一致性,在编译阶段捕获错误并确保生成的中间代码正确无误。这种自上而下的编译流程,使得代码设计和生成更加模块化,可解释,也有利于调试和优化。
相关背景: 心路历程
类别 | 关键特性 |
---|---|
语言层 | module / import / function / loop / if–else / Pratt 表达式解析静态类型检查 & 作用域分析 |
编译器前端 | Lexer / Parser / Semantic Analyzer 全栈自研,生成 JSON-AST |
IR & 后端 | 三地址式 IR ➜ 线性扫描寄存器分配 ➜ SnowVM 指令 |
虚拟机 | 栈 + 寄存器混合架构、GUI 局部变量监视 |
snow pkg | - .cloud DSL 描述项目、依赖与构建- 预设 clean / compile / run / package / publish 任务- 离线缓存与远程仓库解析 |
CLI | snow init , snow compile , snow run , snow clean , snow build , snow generate |
https://gitee.com/jcnc-org/snow/releases
Snow 语言现状和下一阶段开发路线图-2025-06-11-已废弃
开发环境准备:
获取源码: 将项目源码下载或克隆到本地目录。
git clone https://gitee.com/jcnc-org/snow.git
运行项目
使用IDEA配置好的运行配置 Demo1
运行成功
## 编译器输出
### Snow 源代码
#### Main.snow
module: Main
import:Math
function: main
return_type: int
body:
Math.add(6,1)
return 0
end body
end function
end module
#### Math.snow
module: Math
function: add
parameter:
declare n1: int
declare n2: int
return_type: int
body:
return n1 + n2
end body
end function
end module
### AST
[
{
"type": "Module",
"name": "Main",
"imports": [
{
"module": "Math",
"type": "Import"
}
],
"functions": [
{
"type": "Function",
"name": "main",
"parameters": [
],
"returnType": "int",
"body": [
{
"type": "ExpressionStatement",
"expression": {
"type": "CallExpression",
"callee": {
"type": "MemberExpression",
"object": {
"type": "Identifier",
"name": "Math"
},
"member": "add"
},
"arguments": [
{
"type": "NumberLiteral",
"value": "6"
},
{
"type": "NumberLiteral",
"value": "1"
}
]
}
},
{
"type": "Return",
"value": {
"type": "NumberLiteral",
"value": "0"
}
}
]
}
]
},
{
"type": "Module",
"name": "Math",
"imports": [
],
"functions": [
{
"type": "Function",
"name": "add",
"parameters": [
{
"name": "n1",
"type": "int"
},
{
"name": "n2",
"type": "int"
}
],
"returnType": "int",
"body": [
{
"type": "Return",
"value": {
"type": "BinaryExpression",
"left": {
"type": "Identifier",
"name": "n1"
},
"operator": "+",
"right": {
"type": "Identifier",
"name": "n2"
}
}
}
]
}
]
}
]
### IR
func main() {
%0 = CONST 6
%1 = CONST 1
%2 = CALL Math.add, %0, %1
%3 = CONST 0
RET %3
}
func add(%0, %1) {
%2 = ADD_I32 %0, %1
RET %2
}
### VM code
0000: I_PUSH 6
0001: I_STORE 0
0002: I_PUSH 1
0003: I_STORE 1
0004: I_LOAD 0
0005: I_LOAD 1
0006: CALL 12 2
0007: I_STORE 2
0008: I_PUSH 0
0009: I_STORE 3
0010: I_LOAD 3
0011: HALT
0012: I_LOAD 0
0013: I_LOAD 1
0014: I_ADD
0015: I_STORE 2
0016: I_LOAD 2
0017: RET
Written to D:\Devs\IdeaProjects\Snow\target\Demo1.water
=== Launching VM ===
Calling function at address: 12
Return 7
Process has ended
Operand Stack state:[0]
--- Call Stack State ---
### VM Local Variable Table:
0: 6
1: 1
2: 7
3: 0
独立编译不依赖 .cloud
文件,而是直接使用 Snow
编译器进行 .snow
文件的编译和执行。
运行编译器:
你可以通过以下命令来编译单个或多个 .snow
文件,或者递归编译一个目录中的所有 .snow
源文件为.water
虚拟机指令。
单个文件编译:
Snow complete [SnowCode].snow
多个文件编译:
Snow complete [SnowCode1].snow [SnowCode2].snow [SnowCode3].snow -o [Name]
目录递归编译:
Snow -d path/to/source_dir
查看编译输出: 编译过程会输出源代码、抽象语法树(AST)、中间表示(IR)以及虚拟机指令等内容。你可以看到如下几个分段输出:
默认执行模式: 编译器会在 DEBUG 模式 下运行,显示详细的执行过程和状态,并且在虚拟机中执行编译后的代码,最后会打印出所有局部变量的值。
集成编译需要使用 .cloud
文件来指定项目的配置和结构,适用于项目标准化、依赖管理、构建管理和项目分发等场景。
基本用法:
snow [OPTIONS] <command>
命令选项:
-h, --help
:显示帮助信息并退出。-v, --version
:打印 Snow 编程语言的版本并退出。可用命令:
compile
:将 .snow
源文件编译成虚拟机字节码文件(.water
)。此命令会使用 .cloud
文件来指导编译过程。clean
:清理构建输出和本地缓存,移除中间产物,释放磁盘空间。version
:打印 Snow 的版本。run
:运行已编译的虚拟机字节码文件(.water
)。init
:初始化一个新项目,生成 project.cloud
文件。generate
:根据 project.cloud
生成项目目录结构。build
:构建当前项目,按顺序解析依赖、编译和打包。例如,执行集成编译命令:
snow compile [SnowCode].snow
.cloud
文件中的配置信息来指导编译过程,并生成 .water
。使用帮助: 如果你需要了解某个命令的详细选项,可以使用:
snow <command> --help
例如,查看 compile
命令的具体选项:
snow compile --help
以下是一个简单的 Snow 代码示例,演示模块定义,导入和函数声明的基本语法:
module: Math
function: main
return_type: int
body:
Math.factorial(6)
return 0
end body
end function
function: factorial
parameter:
declare n:int
return_type: int
body:
declare num1:int = 1
loop:
initializer:
declare counter:int = 1
condition:
counter <= n
update:
counter = counter + 1
body:
num1 = num1 * counter
end body
end loop
return num1
end body
end function
end module
上述代码定义了一个名为 Math
的模块,其中包含两个函数:
main
:不接收任何参数,返回类型为 int
。在函数体内调用了 Math.factorial(6)
,然后返回 0
。factorial
:接收一个 int
类型的参数 n
,返回类型为 int
。函数体内先声明并初始化局部变量 num1
为 1
,然后通过一个
loop
循环(从 counter = 1
到 counter <= n
)依次将 num1
乘以 counter
,循环结束后返回 num1
,即 n
的阶乘值。更多示例代码见 playground 目录
compiler/
:Snow 编译器源代码目录
lexer/
:词法分析模块,负责将源码切分为 Tokenparser/
:语法分析模块,将 Token 流解析为 AST(含模块/函数/语句解析)semantic/
:语义分析模块,负责符号表管理、类型检查等ir/
:中间表示(IR)模块,生成并管理三地址码形式的中间代码backend/
:编译器后端模块,将 IR 翻译为虚拟机指令,包含寄存器分配和指令生成器vm/
:虚拟机相关源代码目录
commands/
:定义 SnowVM 指令集的具体实现engine/
:核心执行引擎,提供指令执行和寄存器/栈管理execution/
:执行流程控制(按指令顺序执行、分支跳转等)io/
:输入输出辅助类(加载指令、文件解析等)gui/
:Swing 可视化调试面板,实时展示局部变量表factories/
、utils/
:指令创建、日志调试等公共工具pkg/
:内置构建与包管理器 snow pkg
dsl/
:.cloud
描述文件解析器tasks/
:预设任务实现(clean · compile · run · package · publish
等)resolver/
:本地/远程仓库解析与缓存lifecycle/
:任务生命周期钩子(pre/post 脚本等)model/
:项目、依赖、版本等模型utils/
:文件、日志、校验和等通用工具doc/
:开发者文档与示例 .cloud
配置cli/
:独立的命令行前端
commands/
:compile
/ run
/ pkg
等子命令实现api/
:公共选项解析、终端交互抽象utils/
:终端颜色、进度条、异常格式化等SnowCLI.java
:CLI 主入口版权所有 © 2025 许轲(Luke),代表 SnowLang 项目。
本项目依据 Apache 2.0 许可证 进行许可和发布。
“SnowLang 项目”为由许轲(Luke)发起的独立开源项目。
未来,项目可能会成立正式的组织或实体,以进一步负责本项目的开发和管理。
xuxiaolankaka
1399528359
luke.k.xu [at] hotmail.com
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型