基本概念
本章将介绍 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
作用域规则
- 内部作用域可以访问外部作用域的变量
- 外部作用域不能访问内部作用域的变量
- 同一作用域内不能重复声明同名变量
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 的类型系统包括:
- 基础类型:int, string, bool, singlef, multif
- 复合类型:数组、对象、结构体
- 用户定义类型:类、接口
- 特殊类型:void, unknown
类型系统将在后续章节详细讨论。
编译和执行模型
编译过程
Sii 2 的编译过程包括:
- 词法分析:将源代码分解为标记(tokens)
- 语法分析:构建抽象语法树(AST)
- 语义分析:类型检查和语义验证
- 代码生成:生成目标代码(JS/TS/WASM/LLVM IR)
执行模型
- 解释执行:编译到 JavaScript/TypeScript,在运行时解释执行
- 原生执行:编译到原生代码,直接执行,性能更高
小结
本章介绍了 Sii 2 的基本概念:
- 类型安全:强类型系统确保代码正确性
- 显式语法:清晰的语法提高代码可读性
- 简洁表达:简洁但不失表达力的语法
- 作用域规则:理解变量和函数的作用域
- 可变性控制:使用 let 和 const 控制可变性
下一章我们将深入学习 Sii 2 的数据类型系统。