# qinjs **Repository Path**: alamhubb/qinjs ## Basic Information - **Project Name**: qinjs - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-09 - **Last Updated**: 2026-01-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # QinJS - 用 Java 构建 ESTree AST 的语言 **我们的语言语法就是用 Java 生成 ESTree AST!** 这是一个创新的语言设计:使用 Java 作为 DSL(领域特定语言)来构建 ESTree AST,然后编译为可执行的 Java 字节码。 ## 设计理念 - **语法 = Java 代码**:用 Java 代码构建 ESTree AST 节点 - **AST = 程序**:ESTree AST 就是我们的程序表示 - **后端 = 字节码生成**:将 ESTree AST 编译为 Java 字节码 ## 功能特性 - ✅ ESTree AST 节点定义(Program, ExpressionStatement, CallExpression, Identifier, Literal) - ✅ AST 到 Java Class File 的转换器 - ✅ 使用 Java Class File API (Java 22+) 生成字节码 - ✅ 支持生成可运行的 Java 类文件 - ✅ 基于 GraalVM 编译为原生可执行文件 ## 项目结构 ``` src/main/java/ ├── estree/ # ESTree AST 节点定义 │ ├── Node.java │ ├── Program.java │ ├── ExpressionStatement.java │ ├── CallExpression.java │ ├── Identifier.java │ └── Literal.java ├── compiler/ # 编译器后端 │ ├── AstToClassFile.java # ESTree -> Class File 转换器 │ └── Demo.java # 演示程序 └── Main.java ``` ## 语言示例 ### 示例 1:Hello World ```java import compiler.*; import java.nio.file.Paths; // 这就是我们的"源代码" - 用 Java 构建 ESTree AST Program program = AstBuilder.program( AstBuilder.expr( AstBuilder.call( AstBuilder.identifier("println"), AstBuilder.literal("Hello, World!") ) ) ); // 编译为可执行类 AstToClassFile.compile(program, "HelloWorld", Paths.get("build", "HelloWorld.class")); ``` **运行:** ```bash java -cp build HelloWorld # 输出: Hello, World! ``` ### 示例 2:多个语句 ```java Program program = AstBuilder.program( // 第一条语句 AstBuilder.expr( AstBuilder.call( AstBuilder.identifier("println"), AstBuilder.literal("First") ) ), // 第二条语句 AstBuilder.expr( AstBuilder.call( AstBuilder.identifier("println"), AstBuilder.literal("Second") ) ) ); ``` ### 方式二:直接创建 AST 节点 ```java import estree.*; import java.util.Arrays; // 创建字面量 Literal helloLiteral = new Literal("Hello, World!"); // 创建标识符 Identifier printlnId = new Identifier("println"); // 创建函数调用 CallExpression callExpr = new CallExpression(printlnId, Arrays.asList(helloLiteral)); // 创建表达式语句 ExpressionStatement exprStmt = new ExpressionStatement(callExpr); // 创建 Program Program program = new Program(Arrays.asList(exprStmt)); // 编译为类文件 Path outputPath = Paths.get("build", "HelloWorld.class"); AstToClassFile.compile(program, "HelloWorld", outputPath); ``` ### 运行生成的类 ```bash java -cp build HelloWorld # 输出: Hello, World! ``` ## 运行 Demo ```bash # 编译项目 qin compile # 运行 Demo java -cp build/classes compiler.Demo ``` ## 编译为原生可执行文件 使用 GraalVM native-image 将生成的类编译为原生可执行文件: ```bash native-image -cp build/classes GeneratedClass ./GeneratedClass ``` ## 技术栈 - **Java 25** (GraalVM) - **Java Class File API** - 用于生成字节码 - **ESTree** - AST 规范 - **Qin** - Java 构建工具 ## 语言特性 ### 当前支持 - ✅ 字面量(字符串、数字) - ✅ 标识符 - ✅ 函数调用表达式 - ✅ 表达式语句 - ✅ Program 节点 ### 未来扩展 - [ ] 变量声明和赋值 - [ ] 控制流(if/else, for, while) - [ ] 函数定义 - [ ] 类型系统 - [ ] 更多 ESTree 节点类型 ## 设计优势 1. **类型安全**:使用 Java 的类型系统,编译时检查 2. **IDE 支持**:完整的代码补全、重构、调试支持 3. **可扩展**:可以轻松添加新的 AST 节点类型 4. **无解析器**:不需要实现词法分析和语法分析 5. **直接编译**:AST 直接转换为字节码,性能优秀