差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
manual:reference:grammar:function:main_page [2021/07/02 16:28] – [6.1 定义] rend | manual:reference:grammar:function:main_page [2023/03/23 17:16] (当前版本) – mikecovlee | ||
---|---|---|---|
行 1: | 行 1: | ||
====== Covariant Script 函数 ====== | ====== Covariant Script 函数 ====== | ||
- | ----- | ||
- | \\ | ||
- | |||
===== 6.1 定义 ===== | ===== 6.1 定义 ===== | ||
行 19: | 行 16: | ||
**函数在被调用时,将传入参数的引用,返回时也将返回引用** | **函数在被调用时,将传入参数的引用,返回时也将返回引用** | ||
- | 函数的变体包括[[reference: | + | 函数的变体包括[[:manual:reference: |
----- | ----- | ||
\\ | \\ | ||
行 45: | 行 42: | ||
可变参数函数被调用时,可变参数列表会被以数组的形式呈现,若需要二次转发可使用展开运算符'' | 可变参数函数被调用时,可变参数列表会被以数组的形式呈现,若需要二次转发可使用展开运算符'' | ||
+ | ===== 6.3 协程(Coroutine) ===== | ||
+ | |||
+ | // | ||
+ | |||
+ | CovScript 函数可以转换为协程(Coroutine) | ||
+ | |||
+ | {{: | ||
+ | |||
+ | 相对于线程(Thread),多个协程不会同时运行,仅在单个线程内进行函数执行上下文的切换,从而实现了并发编程 | ||
+ | |||
+ | 更进一步说,线程是由调度器进行**抢占式调度**,在多 CPU 系统中会**并行**执行; | ||
+ | |||
+ | 而协程是主动**让出(yield)**时间片,仅运行在单个 CPU 核心上,属于**协作式调度** | ||
+ | |||
+ | CovScript 协程是**堆栈式非对称协程(Stackful Asymmetric Coroutine)**: | ||
+ | * 堆栈式意味着每个协程都拥有独立的栈,并会随着协程切换而一同切换 | ||
+ | * 非对称式意味着语言运行时不会对协程进行主动调度,需要由协程主动进行调度 | ||
+ | |||
+ | <code matlab> | ||
+ | function co_func() | ||
+ | system.out.println(" | ||
+ | context.yield() | ||
+ | system.out.println(" | ||
+ | end | ||
+ | var co = context.create_co(co_func) | ||
+ | system.out.println(" | ||
+ | context.resume(co) | ||
+ | system.out.println(" | ||
+ | context.resume(co) | ||
+ | </ | ||
+ | |||
+ | 这是一个简单的示例,命令行会依次输出: | ||
+ | |||
+ | <code bash> | ||
+ | Launch coroutine | ||
+ | Coroutine started | ||
+ | Resume coroutine | ||
+ | Coroutine resumed | ||
+ | </ | ||
+ | |||
+ | 更多协程相关的 API 可参考 [[manual: |