Skip to content

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 等页面。

最小可运行程序 ​

cin
function main() -> int {
    println("Hello, Code CIN!")
    println("2 + 3 = " + (2 + 3))
    return 0
}
bash
codecin hello.cin
text
Hello, Code CIN!
2 + 3 = 5
Go 原生引擎意味着什么?

v5.9.0 起为 native-only:纯 Python 解释器与 JIT 已删除,全部程序由同一个 Go 原生引擎执行。

  • 宿主能力(绘图 / 音频 / 文件 / 网络 / FFI / 系统交互)直接由引擎的 SYS 调用实现;
  • 内存默认 1 GiB(OS 按需提交),大数组不再需要 --mem-size;
  • --sandbox 下仅放行内存与计时 SYS,其余宿主能力被拦截;
  • 程序文件名之后的裸参数直传给 CIN 程序(arg_count() / arg(i))。

详见 Go 原生运行时 与 宿主能力。

语言特性地图 ​

主题你会学到的内容页面
词法规则注释、标识符、字面量、转义、语句分隔与续行、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数组
structstruct Point { float x\n float y }struct
enumenum Color { RED, GREEN = 5, BLUE }类型系统
成员访问p.x = 1.0、r.bottom_right.xstruct
条件if (x > 0) { ... } else { ... }控制流
循环while (n > 0) { ... }、for (int i = 0; i < 10; i++) { ... }控制流
范围 forfor (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 必须在文件顶部列首):

cin
// 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
}
text
hello 25

执行顺序:先按源码顺序执行全部全局初始化,再进入函数。约定入口是 main;不写 main 时程序从第一条指令开始顺序执行(docs/CIN_GUIDE.md 第 1 节)。

语句与换行 ​

语句以换行结尾(推荐),也可用 ; 显式分隔。注意:换行在花括号块内是语句终止符, 不能随意折行;需要折行时用行尾运算符或括号(详见 词法规则)。

cin
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、 接口、泛型、闭包,也没有包级别的可见性关键字。

语言限制速览 ​

  1. 无指针/取地址运算:* 是乘法、& 是位与;"引用"只通过数组 / struct 传参隐式实现。
  2. / 恒为浮点除:整数除法用 idiv(a, b)(向零截断);% 仅整数。
  3. 位运算仅整数:& | ^ << >> ~ 拒绝 float / string;>> 为算术右移(符号位扩展)。
  4. 递归深度受限:默认内存 1 GiB,大数组开箱即用;栈与堆相向生长, 过深递归仍会触发 Stack overflow: frame needs ...,可用 --mem-size 扩容。
  5. struct 字段不能是变长指针数组(T[]),只允许标量、嵌套 struct 与固长数组。
  6. 字符串不可原位修改:strcpy 返回新堆块,s[i] 不能作为赋值左值。
  7. 函数先定义后使用不强制:同文件内函数可互相调用(两遍编译);但变量必须先声明后使用。
  8. 同一函数内不要重名声明:同名局部声明会共用同一个槽位(详见 变量与作用域)。
  9. 范围 for 只遍历定长数组:for (T v : arr) 不支持 int[] 指针形式与多维数组,请用下标循环。
  10. enum 成员是只读常量:成员不能赋值,初值表达式只能引用先前已定义的成员。

排错从这里开始

完整报错表、错误面板格式与排错命令见 限制与常见错误。 遇到 Unknown function / Undefined variable 这类报错,先检查拼写与声明顺序。

下一步 ​

文档由 VitePress 构建