11 Star 114 Fork 15

JCNC/Snow

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0

Snow Icon

Snow编程语言

star fork

项目简介

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

Snow-Lang 官网

https://snow-lang.com

下载 Snow 发行版

https://gitee.com/jcnc-org/snow/releases

相关文档

Git 管理规范

SnowVM OpCode 指令表

Snow-Lang GraalVM AOT 打包指南

开发计划

Snow 语言现状和下一阶段开发路线图-2025-06-11-已废弃

开发环境安装

  1. 开发环境准备

    1. 安装集成开发环境 IntelliJ IDEA
    2. 安装 Java 开发工具 Graalvm-jdk-24
  2. 获取源码: 将项目源码下载或克隆到本地目录。

    git clone https://gitee.com/jcnc-org/snow.git
    
  3. 运行项目

    使用IDEA配置好的运行配置 Demo1

    IMG_运行配置文件_1.png

  4. 运行成功

     ## 编译器输出
     ### 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
    

编译 Snow 源代码

1. 独立编译 (Standalone Compilation)

独立编译不依赖 .cloud 文件,而是直接使用 Snow 编译器进行 .snow 文件的编译和执行。

独立编译步骤:

  1. 运行编译器: 你可以通过以下命令来编译单个或多个 .snow 文件,或者递归编译一个目录中的所有 .snow 源文件为.water虚拟机指令。

    • 单个文件编译:

      Snow complete [SnowCode].snow
      
    • 多个文件编译:

      Snow complete [SnowCode1].snow [SnowCode2].snow [SnowCode3].snow -o [Name]
      
    • 目录递归编译:

      Snow -d path/to/source_dir
      
  2. 查看编译输出: 编译过程会输出源代码、抽象语法树(AST)、中间表示(IR)以及虚拟机指令等内容。你可以看到如下几个分段输出:

    • AST(抽象语法树)部分以 JSON 格式输出。
    • IR(中间表示)部分会列出逐行的中间代码。
    • VM code(虚拟机指令)会展示虚拟机的字节码指令。
  3. 默认执行模式: 编译器会在 DEBUG 模式 下运行,显示详细的执行过程和状态,并且在虚拟机中执行编译后的代码,最后会打印出所有局部变量的值。


2. 集成编译 (Integrated Compilation)

集成编译需要使用 .cloud 文件来指定项目的配置和结构,适用于项目标准化、依赖管理、构建管理和项目分发等场景。

集成编译命令:

  1. 基本用法:

      snow [OPTIONS] <command>
    
  2. 命令选项:

    • -h, --help:显示帮助信息并退出。
    • -v, --version:打印 Snow 编程语言的版本并退出。
  3. 可用命令:

    • compile:将 .snow 源文件编译成虚拟机字节码文件(.water)。此命令会使用 .cloud 文件来指导编译过程。
    • clean:清理构建输出和本地缓存,移除中间产物,释放磁盘空间。
    • version:打印 Snow 的版本。
    • run:运行已编译的虚拟机字节码文件(.water)。
    • init:初始化一个新项目,生成 project.cloud 文件。
    • generate:根据 project.cloud 生成项目目录结构。
    • build:构建当前项目,按顺序解析依赖、编译和打包。
  4. 例如,执行集成编译命令:

    snow compile [SnowCode].snow
    
    • 此命令会使用 .cloud 文件中的配置信息来指导编译过程,并生成 .water
  5. 使用帮助: 如果你需要了解某个命令的详细选项,可以使用:

    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。函数体内先声明并初始化局部变量 num11,然后通过一个 loop 循环(从 counter = 1counter <= n)依次将 num1 乘以 counter,循环结束后返回 num1,即 n 的阶乘值。

更多示例代码见 playground 目录

项目结构说明

  • compiler/:Snow 编译器源代码目录

    • lexer/:词法分析模块,负责将源码切分为 Token
    • parser/:语法分析模块,将 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
  • QQ:1399528359
  • 邮箱:luke.k.xu [at] hotmail.com

空文件

简介

Snow 是一门面向 AI 时代的新型编程语言,灵感源自大模型(LLM)的发展趋势。它的设计初衷是让 LLM 更容易生成和理解代码,从而提升人与 AI 协同编程的效率。 该项目实现了 Snow 语言的完整编译流程。 展开 收起
取消

发行版 (13)

全部
9天前

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/jcnc-org/snow.git
git@gitee.com:jcnc-org/snow.git
jcnc-org
snow
Snow
v0.4.0

搜索帮助