CIN 语言总览
CIN 是 Code CIN 的高级语言:一门语法近似 C / Go 的静态类型语言,源码编译为 UCBC 字节码, 再由运行时执行。它保留了 C 风格的表达式、控制流与块结构,同时去掉了指针算术、头文件与手动内存管理, 用 struct、固长数组、字符串与内建函数覆盖常见编程需求。
- 源文件扩展名
.cin,用codecin prog.cin编译并运行; - 语句以换行结尾(分号可选),字符串用
+自动拼接与字符串化; - v5.9.0 起为 native-only:全部程序由 Go 原生引擎执行(纯 Python 解释器与 JIT 已删除), 宿主能力(绘图 / 音频 / 文件 / 网络 / FFI / 系统交互)也由引擎的 SYS 调用实现。
阅读顺序
完全没接触过 CIN 建议先看 初学者教程 (13 章、从零开始、每段代码都有实测输出) 或 快速开始;本页负责给出全局地图, 细节分散在同目录的 lexical / types / variables / operators / control-flow 等页面。
最小可运行程序
function main() -> int {
println("Hello, Code CIN!")
println("2 + 3 = " + (2 + 3))
return 0
}codecin hello.cinHello, Code CIN!
2 + 3 = 5Go 原生引擎意味着什么?
v5.9.0 起为 native-only:纯 Python 解释器与 JIT 已删除,全部程序由同一个 Go 原生引擎执行。
- 宿主能力(绘图 / 音频 / 文件 / 网络 / FFI / 系统交互)直接由引擎的 SYS 调用实现;
- 内存默认 1 GiB(OS 按需提交),大数组不再需要
--mem-size; --sandbox下仅放行内存与计时 SYS,其余宿主能力被拦截;- 程序文件名之后的裸参数直传给 CIN 程序(
arg_count()/arg(i))。
语言特性地图
| 主题 | 你会学到的内容 | 页面 |
|---|---|---|
| 词法规则 | 注释、标识符、字面量、转义、语句分隔与续行、BOM | 词法规则 |
| 类型系统 | int/float/bool/string/struct、enum、固长数组、指针形式数组、默认值 | 类型系统 |
| 变量与作用域 | 全局变量(数据区)、局部变量、一行多声明、数组字面量初始化 | 变量与作用域 |
| 运算符 | 14 级优先级、算术/比较/逻辑短路、位运算、复合赋值、三目 | 运算符 |
| 控制流 | if / while / for(含范围 for)/ do-while / switch(多值与 lo..hi 范围)/ break / continue | 控制流 |
| 函数 | function 定义、参数传递、递归、返回值 | 函数 |
| struct | 成员访问、嵌套、值语义、作字段的固长数组 | struct |
| 数组 | 多维下标、行主序、数组传参衰减 | 数组 |
| 字符串 | NUL 结尾、拼接、字节下标、\x/\u 转义、字符串内建 | 字符串 |
| 内建函数 | 数学、字符串、转换、数值工具、多参数 print/println | 内建函数 |
| 宿主能力 | 绘图、音频、文件与路径、网络、FFI、哈希、桌面集成、系统交互、Termux/Android API | 宿主能力 |
| 模块与标准库 | import 解析规则、codecin/lib/<name>/src/ 函数清单 | 模块与标准库 |
| 内嵌 CPU 指令语句 | set / add / multiply 等 7 条寄存器风格语句 | 内嵌 CPU 指令语句 |
| 限制与常见错误 | 禁用特性、报错表、排错入口 | 限制与常见错误 |
语法速览表
| 特性 | 语法 | 对应页面 |
|---|---|---|
| 函数定义 | function add(int a, int b) -> int { return a + b } | 函数 |
| 变量声明 | int x = 1、float f、string s = "hi" | 变量与作用域 |
| 一行多声明 | int a = 1, b = 2 | 变量与作用域 |
| 固长数组 | int a[5]、float m[3][4] | 数组 |
| 数组字面量 | int v[4] = {1, 2, 3, 4} | 变量与作用域 |
| 指针形式数组 | function sum(int[] arr) -> int | 数组 |
| struct | struct Point { float x\n float y } | struct |
| enum | enum Color { RED, GREEN = 5, BLUE } | 类型系统 |
| 成员访问 | p.x = 1.0、r.bottom_right.x | struct |
| 条件 | if (x > 0) { ... } else { ... } | 控制流 |
| 循环 | while (n > 0) { ... }、for (int i = 0; i < 10; i++) { ... } | 控制流 |
| 范围 for | for (int v : arr) { ... } (arr 必须是定长数组) | 控制流 |
| 后置条件循环 | do { ... } while (cond) | 控制流 |
| 多分支 | switch (x) { case 1: ... break default: ... } | 控制流 |
| case 多值/范围 | case 1, 2, 7..9: (闭区间, 可混用) | 控制流 |
| 三目 | string s = (score >= 60) ? "pass" : "fail" | 运算符 |
| 位运算 | a & b、a | b、a ^ b、~a、a << n、a >> n | 运算符 |
| 字符串拼接 | "n = " + 42、"pi = " + 3.14 | 字符串 |
| 字符串转义 | "\xE4\xB8\xAD"(原始字节)、"\u4E2D"(码点) | 词法规则 |
| 内建调用 | println(x)、strlen(s)、sqrt(16)、println("a=", a) | 内建函数 |
| 模块引入 | import "math.cin"、import "./util.cin" | 模块与标准库 |
| 内嵌 CPU 语句 | set x 30、add x 12 | 内嵌 CPU 指令语句 |
| 断言 | assert(x > 0, "x must be positive") | 限制与常见错误 |
程序结构
一个 .cin 文件由四类顶层元素组成,顺序不限(但 import 必须在文件顶部列首):
// 1. 模块引入 (可省略, 必须在顶部; 同一行不能带行尾注释)
import "math.cin"
// 2. 全局变量 (进入数据区, 按声明顺序初始化)
int counter = 0
string greeting = "hello"
int primes[5] = {2, 3, 5, 7, 11}
// 3. struct 定义
struct Point {
float x
float y
}
// 4. 函数
function distance2(float x, float y) -> float {
return x * x + y * y
}
function main() -> int { // 入口函数
println(greeting + " " + float_to_str(distance2(3.0, 4.0)))
return 0
}hello 25执行顺序:先按源码顺序执行全部全局初始化,再进入函数。约定入口是 main;不写 main 时程序从第一条指令开始顺序执行(docs/CIN_GUIDE.md 第 1 节)。
语句与换行
语句以换行结尾(推荐),也可用 ; 显式分隔。注意:换行在花括号块内是语句终止符, 不能随意折行;需要折行时用行尾运算符或括号(详见 词法规则)。
function demo() -> int {
int a = 1; int b = 2 // 分号分隔, 合法
int c = a + b // 换行结尾, 推荐
return c
}与 C / Go 的主要差异
| 维度 | CIN 的做法 | C / Go 对照 |
|---|---|---|
| 指针 | 没有指针与取地址运算:* 只是乘法,& 只是位与 | C 有 */&;Go 有 */& 但无算术 |
| 字符串 | string 是 NUL 结尾字节序列的指针,不可原位修改 | C 同构但可写;Go 的 string 不可变但可切片 |
| 类型宽度 | 所有值都占一个 64 位槽,char/short/long 只是别名 | C 宽度不同;Go 有 int8/16/32/64 |
| 默认值 | 全局与数组为全零;局部变量的残留值不可依赖 | Go 保证零值;C 是未定义 |
| 除法 | / 恒为浮点除法,整数除法用内建 idiv(a, b) | C/Go 中整数 / 是整数除法 |
| 取模 | % 仅整数,浮点取模编译报错 | Go 同;C 需 fmod |
| 数组 | int a[5] 写在变量名后,值语义;参数用 int[] 指针形式 | C 同写法;Go 是 [5]int,切片 []int |
| 语句结尾 | 换行即结尾,; 可选 | C/Go 必须 ;(Go 由编译器插入分号) |
| 模块 | import "math.cin" 文本级展开,无独立编译单元 | C 用 #include;Go 是按包编译 |
| 汇编互操作 | 7 条内嵌 CPU 语句直接操作变量槽 | 无此特性 |
与 Go 相似的几点
function name(args) -> ret 的返回类型后置写法、import 模块化(字符串形式)、 for 三段式、:= 风格之外的显式声明,都接近 Go 的阅读习惯;但 CIN 没有 goroutine、 接口、泛型、闭包,也没有包级别的可见性关键字。
语言限制速览
- 无指针/取地址运算:
*是乘法、&是位与;"引用"只通过数组 / struct 传参隐式实现。 /恒为浮点除:整数除法用idiv(a, b)(向零截断);%仅整数。- 位运算仅整数:
& | ^ << >> ~拒绝 float / string;>>为算术右移(符号位扩展)。 - 递归深度受限:默认内存 1 GiB,大数组开箱即用;栈与堆相向生长, 过深递归仍会触发
Stack overflow: frame needs ...,可用--mem-size扩容。 - struct 字段不能是变长指针数组(
T[]),只允许标量、嵌套 struct 与固长数组。 - 字符串不可原位修改:
strcpy返回新堆块,s[i]不能作为赋值左值。 - 函数先定义后使用不强制:同文件内函数可互相调用(两遍编译);但变量必须先声明后使用。
- 同一函数内不要重名声明:同名局部声明会共用同一个槽位(详见 变量与作用域)。
- 范围 for 只遍历定长数组:
for (T v : arr)不支持int[]指针形式与多维数组,请用下标循环。 - enum 成员是只读常量:成员不能赋值,初值表达式只能引用先前已定义的成员。
排错从这里开始
完整报错表、错误面板格式与排错命令见 限制与常见错误。 遇到 Unknown function / Undefined variable 这类报错,先检查拼写与声明顺序。