三天上手仓颉编程语言开发:极速入门指南

2025-09-22 14:03:16
119次阅读
0个评论

第一天:基础语法快速掌握

1.1 环境配置(30分钟)

步骤一:安装仓颉SDK Windows,参考文章《仓颉语言编程入门:第一个 Windows 下的仓颉应用程序》https://blog.csdn.net/yyz_1987/article/details/151610900?spm=1001.2014.3001.5502

下载安装包运行,勾选"Add to PATH"


**步骤二:验证安装**
```bash
cjc --version
# 应输出类似:cangjie 1.0.0

步骤三:配置VSCode插件(可选)

  1. 安装官方插件"Cangjie Language Support"
  2. 启用语法高亮和代码补全

1.2 第一个程序(30分钟)

创建hello.cj文件:

// 单行注释
main() {
    println("Hello, 仓颉!")  // 打印语句
    
    // 变量声明
    let name = "新同学"     // 类型推断
    var age: Int64 = 20    // 显式类型
    
    // 字符串插值
    println("我叫${name},今年${age}岁")
}

运行程序:

cjc hello.cj -o hello && ./hello

1.3 基础语法要点(3小时)

数据类型

import std.collection.*

main() {
    println("Hello World")

    let a: Int64 = 42          // 整数
    let b = 3.14               // 自动推断为Float64
    let c: Bool = true         // 布尔值
    let s = "仓颉"             // 字符串
    let arr = [1, 2, 3]        // 数组
    println(arr)

    let arr1 = (1, 2, 3)       // 元组
    //println(arr1)
    // 正确打印元组的方式
    println("${arr1[0]}, ${arr1[1]}, ${arr1[2]}")  // 手动访问每个元素
    // 或者分开打印
    println(arr1[0])
    println(arr1[1])
    println(arr1[2])
    //let dict = {"a": 1, "b": 2} // 错误,暂无标准字典类型
    let dict = HashMap<String, Int64>([("a", 0), ("b", 1), ("c", 2)]) //暂无字典类型,有这个HashMap,需引入std.collection.*
    println(dict)
}

控制结构

// if条件
    let score = 85
    if (score >= 90) {
        println("优秀")
    } else if (score >= 60) {
        println("及格") 
    } else {
        println("不及格")
    }

    // for循环
    for (i in 0..5) {           // 范围0到4
        println(i)
    }

    // while循环
    var n = 3
    while (n > 0) {
        println(n)
        n -= 1
    }

函数基础

// 定义函数
func greet(name: String): String {
    return "Hello, ${name}!"
}

// 调用函数
println(greet("World"))

今日任务

  • 完成环境配置
  • 编写并运行第一个程序
  • 练习所有基础语法示例
  • 实现一个简易计算器(加减乘除)

第二天:核心概念突破

2.1 面向对象编程(2小时)

// 类定义
class Student {
    // 属性
    var name: String
    var age: Int64
    
    // 构造函数
    init(name: String, age: Int64) {
        this.name = name
        this.age = age
    }
    
    // 方法
    func introduce() {
        println("我是${name},今年${age}岁")
    }
}

main() {
    println("Hello World")
    // 使用类
    let stu = Student("张三", 20)
    stu.introduce()

}


2.2 错误处理(1小时)

文档地址:https://cangjie-lang.cn/docs?url=%2F1.0.1%2Fuser_manual%2Fsource_zh_cn%2Ferror_handle%2Fexception_overview.html

import std.collection.*

open class FatherException <: Exception {
    public init() {
        super("This is FatherException.")
    }
    public init(message: String) {
        super(message)
    }
    public open func getClassName(): String {
        "FatherException"
    }
}

class ChildTest <: FatherException {
    public init() {
        super("This is ChildException.")
    }
    public override func getClassName(): String {
        "ChildException"
    }

    // 可能抛出错误的函数
    func safeDivide(a: Int64, b: Int64):Int64 {
        if (b == 0) {
            throw IllegalArgumentException("Division by zero")
        }
        return a / b
    }
}

main() {
    println("Hello World")
    // 错误捕获
   try {
        let test = ChildTest()
        println(test.safeDivide(10, 2))  // 输出: 5
        test.safeDivide(10, 0)          // 抛出异常
    } catch (e: IllegalArgumentException) {
        println("错误: ${e.message}")
        0  // 显式返回 Int64
    }
}

2.3 集合操作(2小时)

import std.collection.*

main() {
    println("Hello World")

    let a: Int64 = 42          // 整数
    let b = 3.14               // 自动推断为Float64
    let c: Bool = true         // 布尔值
    let s = "仓颉"             // 字符串
    let arr = [1, 2, 3]        // 数组
    println(arr)

    let arr1 = (1, 2, 3)       // 元组
    //println(arr1)
    // 正确打印元组的方式
    println("${arr1[0]}, ${arr1[1]}, ${arr1[2]}")  // 手动访问每个元素
    // 或者分开打印
    println(arr1[0])
    println(arr1[1])
    println(arr1[2])
    //let dict = {"a": 1, "b": 2} // 错误,暂无标准字典类型
    let dict = HashMap<String, Int64>([("a", 0), ("b", 1), ("c", 2)]) //暂无字典类型,有这个HashMap,需引入std.collection.*
    println(dict)

    let numbers = [1, 2, 3, 4, 5]

   // 高阶函数
   let squares = numbers.map({x => x * x})  // [1, 4, 9, 16, 25]
//let evens = numbers.filter({x => x % 2 == 0})  // error: 'filter' is not a member of struct 'Array'
//let sum = numbers.fold(0, {acc, x => acc + x})  // error: 'filter' is not a member of struct 'Array'

 // 在仓颉语言中,Array 类型确实没有直接提供 filter 和 fold 方法。你需要使用标准库中的函数式操作函数来实现这些功能
 // 使用管道操作符 |> 和 collectArray 收集结果,map 和 filter 返回的是迭代器需要用 collectArray 转换为数组
 // 管道操作符 |>:仓颉语言使用 |> 将集合传递给操作函数
 // 不是 array.method() 的面向对象风格 而是 array |> function() 的函数式风格
 // 这种函数式风格是仓颉语言处理集合的标准方式,与许多其他语言的方法调用风格不同,需要特别注意。
    let evens = numbers |> filter({x => x % 2 == 0}) |> collectArray
    println(evens)  // 输出: [2, 4]
    
    let sum = numbers |> fold(0, {acc, x => acc + x})
    println(sum)  // 输出: 15

}

2.4 文件IO(1小时)

import std.collection.*
import std.fs.*
import std.io.*
main() {
    println("Hello World")
    // 写入文件
     let data = "Hello, Cangjie!"
    try {
        try (file = File("test.txt", Write)) {
            file.write(data.toArray())
        }
    } catch (e: FSException) {
        println("文件写入失败: ${e.message}")
    }

    // 读取文件全部内容(返回字节数组)
    let bytes = File.readFrom("test.txt")
    // 转换为字符串
    let content = String.fromUtf8(bytes)
    println(content)

    // 按行读取文件(适合大文件)
    try (file = File("test.txt", Read)) {
        let reader = StringReader(file)
        
        // 逐行读取
        while (true) {
            let line = reader.readln()
            if (line == None) {break}
            println(line.getOrThrow())
        }
    }
    //按字节块读取(灵活控制)
    try (file = File("test.txt", Read)) {
        let buffer = Array<Byte>(1024, repeat: 0) // 1KB缓冲区
        
        while (true) {
            let bytesRead = file.read(buffer)
            if (bytesRead <= 0) {break}
            
            // 处理读取的数据
            let chunk = String.fromUtf8(buffer.slice(0, bytesRead))
            print(chunk)
        }
    }
}

今日任务

  • 创建Student类并添加方法
  • 实现带错误处理的除法计算器
  • 练习集合的各种操作
  • 编写文件读写程序

第三天:项目实战应用

3.1 并发编程(2小时)

文档地址:https://cangjie-lang.cn/docs?url=%2F1.0.1%2Fuser_manual%2Fsource_zh_cn%2Fconcurrency%2Fconcurrency_overview.html


// 协程示例
func fetchData(url: String) {
    sleep(Duration.millisecond * 500) // 模拟耗时
    println("从${url}获取数据完成")
}

main() {
    println("开始执行")
    
    // 启动协程
    let task1 = spawn { fetchData("api/data1") }
    let task2 = spawn { fetchData("api/data2") }
    
    // 等待完成
    task1.get()
    task2.get()
    
    println("全部完成")
}

3.2 实战项目:学生管理系统(4小时)

功能需求

  1. 添加学生信息
  2. 查询学生列表
  3. 按成绩排序
  4. 数据持久化存储

核心代码结构

import std.collection.*
// 类定义
class Student {
    // 属性
    var name: String
    var age: Int64
    
    // 构造函数
    init(name: String, age: Int64) {
        this.name = name
        this.age = age
    }
    
    // 方法
    func introduce() {
        println("我是${name},今年${age}岁")
    }
}

class StudentManager {
    //仓颉语言的 Array 被设计为不可变集合,注意动态数组得用ArrayList
    var students = ArrayList<Student>()// 创建可变数组
    
    func addStudent(name: String, score: Int64) {
        students.add(Student(name, score))  // 使用add方法
    }
    
    func listStudents() {
       students.toArray() |> forEach { s: Student => println(s.name) }
       // 或者
       for (s in students) {
            println(s.name)  
        }
    }
    
    func saveToFile(path: String) {
       
    }
}

main() {
    println("Hello World")
    // 使用类
    let stu = Student("张三", 20)
    stu.introduce()

    let mang = StudentManager()
    
    mang.addStudent("yang",23)
    mang.listStudents()

}

3.3 调试与优化(2小时)

  1. 性能分析
cjc --profile myapp.cj

三日成果检验

  •  能独立编写基础程序
  •  理解面向对象核心概念
  •  完成学生管理系统
  •  掌握基本调试方法

学习资源速查表

资源类型 推荐内容 链接
官方文档 语言规范 cangjie-lang.cn/docs
在线练习 交互教程 codingground/cangjie
开源项目 学生管理系统 GitHub:cangjie-starter
社区支持 Q&A论坛 forum.cangjie-lang.cn

学习建议

  1. 每天保证3-4小时专注学习时间
  2. 每个语法点都要动手实践
  3. 遇到问题及时查阅文档
  4. 完成项目后尝试扩展功能

按照这个计划,三天后你将能够:

  • 理解仓颉语言的核心特性
  • 开发基础应用程序
  • 使用常用标准库功能
  • 为进一步学习打下坚实基础

现在就开始你的仓颉编程之旅吧!记住,编程的精髓在于实践,写代码是最好的学习方式

收藏10

登录 后评论。没有帐号? 注册 一个。