Snow编程语言
项目简介
Snow 是一门受 LLM 时代启发的、面向 AI 友好的编程语言。它设计目标是让 LLM 更容易生成和理解编程代码。
该项目实现了 Snow 语言的完整编译流程,包括词法分析,语法分析,语义分析,中间表示(IR)生成以及最终的虚拟机(VM)指令生成和执行器,提供从源码到字节码再到自研编程语言虚拟机 ( SnowVM) 的完整编译-执行链路。
通过 Snow 编译器,可以将 .snow 源文件编译为 .water虚拟机指令,并在 SnowVM 上直接运行。
从源码编译、构建管理、依赖管理、项目标准化、可视化调试面板到原生镜像发布,全部由 Snow 官方工具完成,降低学习与集成成本。
背景理念
Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的语法和严格的类型系统,以帮助 LLM 更好地理解程序。
语言使用显式的 module 声明来组织代码,用 function,params,returns,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 | init, compile, run, clean, build, generate,debug |
Snow-Lang 官网
下载 Snow 发行版
https://gitee.com/jcnc-org/snow/releases
相关文档
开发计划
Snow 语言现状和下一阶段开发路线图-2025-06-11-已废弃
开发环境安装
-
开发环境准备:
- 安装集成开发环境 IntelliJ IDEA
- 安装 Java 开发工具 Graalvm-jdk-24
-
获取源码: 将项目源码下载或克隆到本地目录。
git clone https://gitee.com/jcnc-org/snow.git -
运行项目
使用IDEA配置好的运行配置
Demo1 -
运行成功
## 编译器输出 ### Snow 源代码 #### Main.snow module: Main import:Math function: main returns: int body: Math.add(6,1) return 0 end body end function end module line col type lexeme ---------------------------------------------------- 1 1 KEYWORD module 1 7 COLON : 1 9 IDENTIFIER Main 1 13 NEWLINE \n 2 5 KEYWORD import 2 11 COLON : 2 12 IDENTIFIER Math 2 16 NEWLINE \n 3 5 KEYWORD function 3 13 COLON : 3 15 IDENTIFIER main 3 19 NEWLINE \n 4 9 KEYWORD returns 4 20 COLON : 4 22 TYPE int 4 25 NEWLINE \n 5 9 KEYWORD body 5 13 COLON : 5 14 NEWLINE \n 6 13 IDENTIFIER Math 6 17 DOT . 6 18 IDENTIFIER add 6 21 LPAREN ( 6 22 NUMBER_LITERAL 6 6 23 COMMA , 6 24 NUMBER_LITERAL 1 6 25 RPAREN ) 6 26 NEWLINE \n 7 13 KEYWORD return 7 20 NUMBER_LITERAL 0 7 21 NEWLINE \n 8 9 KEYWORD end 8 13 KEYWORD body 8 17 NEWLINE \n 9 5 KEYWORD end 9 9 KEYWORD function 9 17 NEWLINE \n 10 1 KEYWORD end 10 5 KEYWORD module 10 1 EOF ## 词法分析通过,没有发现错误 #### Math.snow module: Math function: add params: declare n1: int declare n2: int returns: int body: return n1 + n2 end body end function end module line col type lexeme ---------------------------------------------------- 1 1 KEYWORD module 1 7 COLON : 1 9 IDENTIFIER Math 1 13 NEWLINE \n 2 5 KEYWORD function 2 13 COLON : 2 15 IDENTIFIER add 2 18 NEWLINE \n 3 9 KEYWORD params 3 18 COLON : 3 19 NEWLINE \n 4 13 KEYWORD declare 4 21 IDENTIFIER n1 4 23 COLON : 4 25 TYPE int 4 28 NEWLINE \n 5 13 KEYWORD declare 5 21 IDENTIFIER n2 5 23 COLON : 5 25 TYPE int 5 28 NEWLINE \n 6 9 KEYWORD returns 6 20 COLON : 6 22 TYPE int 6 25 NEWLINE \n 7 9 KEYWORD body 7 13 COLON : 7 14 NEWLINE \n 8 12 KEYWORD return 8 19 IDENTIFIER n1 8 22 PLUS + 8 24 IDENTIFIER n2 8 26 NEWLINE \n 9 9 KEYWORD end 9 13 KEYWORD body 9 17 NEWLINE \n 10 5 KEYWORD end 10 9 KEYWORD function 10 17 NEWLINE \n 11 1 KEYWORD end 11 5 KEYWORD module 11 1 EOF ## 词法分析通过,没有发现错误 ## 语义分析通过,没有发现错误 ### AST [ { "type": "Module", "name": "Main", "imports": [ { "type": "Import", "module": "Math" } ], "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 13 2 0007: I_STORE 2 0008: I_PUSH 0 0009: I_STORE 3 0010: I_LOAD 3 0011: HALT 0012: HALT 0013: I_LOAD 0 0014: I_LOAD 1 0015: I_ADD 0016: I_STORE 2 0017: I_LOAD 2 0018: RET 0019: RET Written to D:\Devs\IdeaProjects\Snow\target\Demo1.water === Launching VM === Calling function at address: 13 Return 7 Process has ended Operand Stack state:[0] --- Call Stack State --- ### VM Local Variable Table: 0: 6 1: 1 2: 7 3: 0 === VM exited ===
编译 Snow 源代码
1. 独立编译 (Standalone Compilation)
独立编译不依赖 .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)以及虚拟机指令等内容。你可以看到如下几个分段输出:
- AST(抽象语法树)部分以 JSON 格式输出。
- IR(中间表示)部分会列出逐行的中间代码。
- VM code(虚拟机指令)会展示虚拟机的字节码指令。
-
默认执行模式: 编译器会在 RUN 模式 下运行,DEBUG 模式显示详细的执行过程和状态,并且在虚拟机中执行编译后的代码,最后会打印出所有局部变量的值。
2. 集成编译 (Integrated Compilation)
集成编译需要使用 .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
returns: int
body:
Math.factorial(6)
return 0
end body
end function
function: factorial
params:
declare n:int
returns: int
body:
declare num1:int = 1
loop:
init:
declare counter:int = 1
cond:
counter <= n
step:
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 pkgdsl/:.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 项目。
仓库地址: https://gitee.com/jcnc-org/snow
本项目依据 Apache 2.0 许可证 进行许可和发布。
“SnowLang 项目”为由许轲(Luke)发起的独立开源项目。
未来,项目可能会成立正式的组织或实体,以进一步负责本项目的开发和管理。
支持我们
如果你喜欢我们的项目,欢迎给我们一个 Star!
你们的关注和支持,是我们团队持续进步的动力源泉!谢谢大家!
加入我们
- 微信:
xuxiaolankaka - QQ:
1399528359 - 邮箱:
luke.k.xu [at] hotmail.com
