# goal **Repository Path**: langhat/goal ## Basic Information - **Project Name**: goal - **Description**: Goal是一种不广泛使用的跨平台编程语言,于2025年推出。它以 “一次编写,到处粗糙”(Write Once,be Ragged Anywhere, WORA)的特性著称,不广泛应用于企业级应用开发、移动应用、大数据、后端服务等领域。 - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-03 - **Last Updated**: 2025-08-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Goal Goal介绍 Goal是一种不广泛使用的跨平台编程语言,于2025年推出。它以 “一次编写,到处粗糙”(Write Once,be Ragged Anywhere, WORA)的特性著称,不广泛应用于企业级应用开发、移动应用、大数据、后端服务等领域。 核心特性 跨平台性(平台无关性) 程序通过编译生成字节码(Bytecode),可在任何安装了 **Goal 虚拟机(GVM, Goal Virtual Machine)** 的操作系统(Windows/macOS/Linux 等)上运行,无需重新编译。 # 口号 ``` WORA:Write Once,be Ragged Anywhere MAGA:Make guAua Great Again MIMU:Make It More Useless ``` # 一些基本帮助 你可以通过下载最新版并输入`goal -h`,以获取一些帮助(划重点) 如果有疑问或bug,可以创建issue或发到3662000756@qq.com 当然如果你想加入本项目,可发到3662000756@qq.com,如果你想发一篇文章到goal的aou功能里,你也可以 发到3662000756@qq.com # 鸣谢 [杨某一辰](https://gitcode.com/langhat)-我本人 Q:366200756 V:\_15605943095 Deepseek/豆包-提供了宝贵的bug反馈和修复建议 # 帮助 # Goal 语言文档 ## 一、语言简介 Goal 是一种轻量级的脚本式编程语言,设计目标是简化中间代码生成与执行流程,支持函数式编程特性(如管道表达式、lambda)和结构化编程(如条件、循环)。其语法简洁,通过编译器(`goal.exe` 或 `goal`)将源文件(`.gl`)编译为中间代码文件(`.gir`),最终通过解释器执行。 - **设计理念**:兼顾灵活性与执行效率,支持变量封装、函数组合和模块化编程。 - **文件格式**:源文件后缀为 `.gl`,编译后的中间代码后缀为 `.gir`。 ## 二、基本语法 ### 2.1 注释 使用 `;` 作为单行注释起始符,注释内容从 `;` 到行尾: ```gl ; 这是一条注释 5 ; 这是行内注释(常量5) ``` ### 2.2 空白字符 - 空格、制表符(`\t`)、换行符(`\n`)均视为空白,用于分隔语法单元。 - 空行(仅含空白或注释)会被编译器忽略。 ### 2.3 标识符 - 变量、函数、标签的名称由字母、数字组成(不能以数字开头)。 - 特殊规则:以 `_` 开头的标识符默认为局部变量(如 `_temp`)。 ### 2.4 常量 - **整数常量**:直接书写数字(支持正负),如 `5`、`-3`。 - **字符常量**:用单引号包裹单个字符,如 `'a'`(表示字符 `a` 的 ASCII 码)。 ## 三、数据类型与变量 ### 3.1 数据类型 Goal 语言的核心数据类型通过内存区域划分隐含定义: - **整数(int)**:默认数值类型,支持算术运算(`+`、`-`、`*`、`/` 等)。 - **字符(char)**:通过 ASCII 码存储,可参与整数运算。 - **向量(vector)**:通过 `_vec` 关键字定义的序列类型,长度由修饰符指定。 - **函数/ lambda**:可作为值传递,通过 `fn` 定义函数,`[]` 定义 lambda。 (fn应用fname #形式作为值访问,其他应使用$ name访问) ### 3.2 变量管理 变量通过内存地址自动分配,分为以下类型: - **全局变量**:内存地址 `0~1023`,程序生命周期内有效。 - **局部变量**:内存地址 `1089~1601`,通常用于函数或代码块内部(以 `_` 开头的标识符自动分配为局部变量)。 - **参数表**:内存地址 `1025~1088`,用于函数调用时传递参数。 - **常量区**:内存地址 `2627~4069`,存储不可修改的常量。 #### 变量定义与赋值 变量无需显式声明,首次使用时自动分配内存: ```gl x ; 定义全局变量x(自动分配地址) x = + $ x 1 ; x=x+1 ``` 使用 `let` 或 `=` 显式赋值: ```gl let a = 5 ; 等价 let c 6 b = 3 ; 同上,更简洁的赋值语法 ``` #### 安全变量 通过 `[safe]` 修饰的变量为安全变量,只能通过 `[ref]` 修饰访问其地址: ```gl [safe] x ; 定义安全变量x [ref] x ; 必须用[ref]才能获取x的地址(否则编译报错) ``` ## 四、控制流 ### 4.1 条件语句(if-else) 语法:`if 条件 { ... } else { ... }` 编译器会生成条件跳转指令,示例: ```gl if ; 标记条件判断开始 1 { ; 条件为真时执行 iout -> 1 () } else { ; 条件为假时执行 } ``` ### 4.2 循环语句(loop) 语法:`loop { ... }` 或 `lp { ... }`,配合 `bk`(break)跳出循环: ```gl a = 8 loop { if ! $ a { bk ;break } a = - $ a 1 } ``` ### 4.3 跳转语句(goto) 使用 `goto` 跳转到指定标签(需先定义标签): ```gl start: ; 定义标签start ; doing sth. goto start ; 跳转到start,形成循环 ``` ## 五、函数与 lambda ### 5.1 函数定义(fn) 语法:`fn 函数名 { ... }`,函数体用 `{}` 包裹,返回用 `ret`: ```gl fn add2 { ; 定义函数add2(接收参数x,返回x+2) ret + $ arg 0 2 } ``` ### 5.2 函数调用 通过 `()` 调用函数 ```gl add2 -> 3 () ;值为5 ``` 参数传递规则: - 参数表地址 `1025~1088` 用于存储实际参数。 - 地址 `1024` 存储参数个数(如 `push 1 → st 1024` 表示1个参数)。可以使用$ argc获得 ### 5.3 lambda 表达式([]) 使用 `[]` 定义匿名函数(lambda),可直接作为值传递: ```gl [] { // (x) => x*2 ret * $ arg 0 2 } ``` ## 六、特殊表达式 ### 6.1 管道表达式(-| X : F1 F2 ... Fn |>) 语法:`-| 初始值X : 函数1 函数2 ... 函数n |> `,等价于 `Fn(...F2(F1(X))...)`(函数从左到右依次调用,前一个函数的结果作为后一个的参数)。 示例: ```gl ; 定义函数:add2(x) = x+2,mul3(x) = x*3 -| 5 : add2 mul3 |> ; 等价于 mul3(add2(5)) = (5+2)*3 = 21 ``` 编译后生成的中间代码逻辑: ```gir push 5 ; 初始值X=5 st 1025 ; 参数存入参数表 push 1 ; 1个参数 st 1024 ; 记录参数数 jsr add2 ; 调用add2(5),结果为7 st 1025 ; 将7作为参数存入参数表 push 1 st 1024 jsr mul3 ; 调用mul3(7),结果为21 ``` ### 6.2 包装与操作符(pack / oprat) 通过 `pack` 定义包装,`oprat` 定义包装内操作符,使用 `<>` 调用包装内函数: ```gl pack pA oprat new [pA]pack { ret malloc -> 1 () } a = new -> <> [pA]pack ``` ## 七、修饰符([]) 通过 `[value]key`或`[key]`(等价`[1]key`) 形式的修饰符扩展语法功能,常用修饰符: - `[safe]`:标记变量为安全(需 `[ref]` 访问)。 - `[ref]`:获取安全变量的地址(否则无法访问)。 - `[n]num`:指定向量长度(如 `_vec [num:3]` 定义长度为3的向量)。 - `[k]onum`:用于序数词相关操作(如 `be [onum:2]` 表示“第二个元素”)。 示例: ```gl [safe] x = 10 ; 定义不可变变量x [ref] x ; 获取x的地址(否则编译报错) ``` ## 八、输入与输出 Goal 语言通过库内子程序实现输入输出 库导入方式:`library_name >:` 常用: - `out`:输出字符串(调用 `TRAP 5` 系统调用)。 - `iout`:输出整数(调用 `TRAP 2` 系统调用)。 示例: ```gl iout -> 5 () ;输出5 out -> 'y' () ;输出y ``` ## 九、编译与运行 ### 9.1 编译命令 通过编译器 `goal` 将 `.gl` 源文件编译为 `.gir` 中间代码: ```bash # Windows goal.exe test.gl test.gir # Linux/macOS ./goal test.gl test.gir ``` 若未指定输出文件,默认生成与源文件同名的 `.gir` 文件: ```bash goal.exe test.gl ; 生成 test.gir ``` ### 9.2 汇编中间代码 编译生成的 `.gir` 文件可通过汇编器汇编,虚拟机执行: ```bash gasm test.gir test.gvm gvm test.gvm ``` ## 十、错误处理 编译器会检测以下常见错误,并标记 `ce=1`(编译错误): - 语法不完整(如缺少 `->`、`:`、`-|` 等关键字)。 - 访问未定义的变量或函数。 - 安全变量未通过 `[ref]` 访问。 - 管道表达式为空函数列表。 错误信息会输出到控制台,例如: ``` Syntax error: '->' not found! ; 缺少函数调用的->分隔符 ``` ## 十一、其他 give some_var [up] 放弃一个变量 be vec_name [0th] := 2 vec_name [2rd] := 'y' 设置vec里的某个元素 ## 十二、示例程序 qwq_没写......