跳到主要内容

基本概念

本章将介绍 Sii 2 语言的核心概念和设计理念,帮助您建立对语言的全面理解。

什么是 Sii 2?

Sii 2 是一门现代化的、强类型的编程语言,旨在提供简洁的语法、强大的类型系统和出色的性能。它支持多种编程范式,包括过程式、函数式和面向对象编程。

核心设计原则

1. 类型安全

Sii 2 是一门强类型语言,所有变量和函数参数都必须明确指定类型。这有助于:

  • 早期错误检测:在编译时发现类型错误,而不是运行时
  • 代码可读性:类型信息让代码更容易理解
  • IDE 支持:更好的自动完成和重构支持
// 类型必须明确指定
let age: int = 25; // √ 正确
let name: string = "Alice"; // √ 正确
// let value = 10; // × 错误:必须指定类型

2. 显式优于隐式

Sii 2 倾向于显式的语法,避免隐式的行为。这使代码更加清晰和可预测。

// 显式的类型转换
let num: int = 10;
let text: string = num.toString(); // 显式转换

// 显式的返回值
func add(a: int, b: int): int {
back a + b; // 使用 back 关键字显式返回
}

3. 简洁而不失表达力

Sii 2 的语法简洁,但功能强大,能够表达复杂的逻辑。

// 简洁的函数定义
func square(x: int): int {
back x * x;
}

// 简洁的条件表达式
let result: string = if (x > 0) { "positive" } else { "non-positive" };

程序结构

文件组织

Sii 2 程序由多个 .sii 源文件组成:

  • 源文件扩展名.sii
  • 入口文件:通常命名为 main.sii,但可以自定义
  • 模块文件:其他 .sii 文件可以作为模块被引用

程序执行

Sii 2 程序的执行从顶层代码开始,或者从 main 函数开始(如果存在)。

// 顶层代码直接执行
let greeting: string = "Hello, World!";
sii.io.print(greeting);

// 或者定义 main 函数
func main(): void {
sii.io.print("Hello, World!");
}

标识符和命名

标识符规则

  • 可以包含字母、数字和下划线
  • 不能以数字开头
  • 区分大小写
  • 不能使用保留关键字
// 合法的标识符
let userName: string = "Alice";
let user_age: int = 25;
let _private: bool = true;
let UserName: string = "Bob"; // 与 userName 不同

// 不合法的标识符
let 123name: string = "test"; // × 不能以数字开头
let user-name: string = "test"; // × 不能包含连字符
let let: int = 10; // × 不能使用关键字

命名约定

虽然 Sii 2 不强制命名约定,但建议遵循以下规范:

  • 变量和函数:使用小驼峰命名(camelCase)
  • 类和类型:使用大驼峰命名(PascalCase)
  • 常量:使用全大写,单词间用下划线分隔
  • 私有成员:以下划线开头
// 变量和函数
let userName: string = "Alice";
func calculateTotal(): int { back 0; }

// 类和类型
class UserProfile { }
type UserId = int;

// 常量
const MAX_RETRY_COUNT: int = 3;
const API_BASE_URL: string = "https://api.example.com";

// 私有成员
let _internalState: int = 0;

关键字

Sii 2 的保留关键字包括:

声明关键字

  • let - 声明可变变量
  • const - 声明常量
  • func - 定义函数
  • class - 定义类
  • struct - 定义结构体
  • interface - 定义接口

类型关键字

  • int - 整数类型
  • string - 字符串类型
  • bool - 布尔类型
  • singlef - 单精度浮点数
  • multif - 多精度浮点数
  • arr - 数组类型
  • obj - 对象类型
  • void - 无返回值类型
  • unknown - 未知类型

控制流关键字

  • if - 条件语句
  • else - 否则分支
  • forloop - 循环语句
  • while - while 循环
  • break - 跳出循环
  • continue - 继续下一次循环
  • back - 返回语句

其他关键字

  • new - 创建实例
  • typeins - 类型检查
  • cite - 引用
  • share - 共享
  • from - 导入
  • as - 类型转换或别名
  • true / false - 布尔字面量

注释

Sii 2 支持两种注释方式:

行注释

使用 // 开始,到行尾结束:

// 这是一个行注释
let x: int = 10; // 这也是行注释

块注释

使用 /* */ 包围,可以跨多行:

/* 
这是一个
多行块注释
*/
let y: int = 20;

/* 单行块注释也可以 */

文档注释

虽然 Sii 2 目前不强制要求,但建议为公共 API 编写文档注释:

// calculateSum 计算两个整数的和
// 参数:
// a: 第一个整数
// b: 第二个整数
// 返回:两个整数的和
func calculateSum(a: int, b: int): int {
back a + b;
}

语句和表达式

语句

语句是执行操作的指令,通常以分号结尾:

let x: int = 10;           // 变量声明语句
x = x + 1; // 赋值语句
sii.io.print("Hello"); // 函数调用语句

表达式

表达式是产生值的代码片段:

10                          // 字面量表达式
x + 5 // 算术表达式
x > 0 // 比较表达式
calculateSum(3, 4) // 函数调用表达式

表达式可以出现在需要值的地方:

let result: int = x + 5;                    // 表达式作为初始值
let isPositive: bool = x > 0; // 表达式作为条件
let sum: int = calculateSum(3, 4); // 表达式作为函数参数

作用域

变量作用域

变量的作用域决定了它在哪些地方可以被访问:

let global: int = 100;  // 全局作用域

func test(): void {
let local: int = 50; // 局部作用域

if (true) {
let block: int = 25; // 块作用域
// 这里可以访问 global, local, block
}
// 这里可以访问 global, local
// 但不能访问 block
}
// 这里只能访问 global

作用域规则

  1. 内部作用域可以访问外部作用域的变量
  2. 外部作用域不能访问内部作用域的变量
  3. 同一作用域内不能重复声明同名变量
let x: int = 10;

func outer(): void {
let y: int = 20;

func inner(): void {
let z: int = 30;
// 可以访问 x, y, z
}
// 可以访问 x, y
// 不能访问 z
}

可变性

可变变量 (let)

使用 let 声明的变量可以重新赋值:

let counter: int = 0;
counter = counter + 1; // ✅ 可以修改
counter = 10; // ✅ 可以修改

不可变常量 (const)

使用 const 声明的常量不能重新赋值:

const PI: singlef = 3.14159;
// PI = 3.14; // ❌ 错误:常量不能重新赋值

何时使用 const

  • 值在程序运行期间不会改变
  • 希望防止意外修改
  • 提高代码可读性
const MAX_SIZE: int = 1000;
const APP_NAME: string = "MyApp";
const ENABLED: bool = true;

类型系统概述

Sii 2 的类型系统包括:

  1. 基础类型:int, string, bool, singlef, multif
  2. 复合类型:数组、对象、结构体
  3. 用户定义类型:类、接口
  4. 特殊类型:void, unknown

类型系统将在后续章节详细讨论。

编译和执行模型

编译过程

Sii 2 的编译过程包括:

  1. 词法分析:将源代码分解为标记(tokens)
  2. 语法分析:构建抽象语法树(AST)
  3. 语义分析:类型检查和语义验证
  4. 代码生成:生成目标代码(JS/TS/WASM/LLVM IR)

执行模型

  • 解释执行:编译到 JavaScript/TypeScript,在运行时解释执行
  • 原生执行:编译到原生代码,直接执行,性能更高

小结

本章介绍了 Sii 2 的基本概念:

  • 类型安全:强类型系统确保代码正确性
  • 显式语法:清晰的语法提高代码可读性
  • 简洁表达:简洁但不失表达力的语法
  • 作用域规则:理解变量和函数的作用域
  • 可变性控制:使用 let 和 const 控制可变性

下一章我们将深入学习 Sii 2 的数据类型系统。