我记得某期《程序员》在介绍 Lua 时说“Lua 的协同程序类似 Scheme 的延续,只是自由度更高。”。我认为这样的说法是欠妥的,因为事实上协同的能力比延续要弱。
首先来看下延续。理论上,延续是这样一种编程风格:对于每个函数,增加最后一个延续参数,所有的函数都不返回值,而把返回值作为参数传给延续参数。这样一来,建立延续标记的函数(如 call/cc)就可以获取调用路径中任何一个标记,并把它绑定到自己的参数函数的第一个参数上。看到 Scheme 的 call/cc,知道的人都会会心一笑,因为他古怪的标记绑定方法正是最初 lambda 演算隐藏掉所有的延续参数后的结果。实际上,延续为每个要标记的调用点在栈上都做了标记,使得调用路径上的函数可以跨越闭包设定的返回路径返回值到任意一个标记上。
再来看协调程序。协同程序事实上是弱化了的延续。它只能标记出一个函数前一次延续绑定的位置,也就是说,对于某个调用路径上的函数来说,它最多只能跳回到上一次绑定的返回出口上。协同的能力介于正常返回值和延续之间。
那么 Lua 这样做有什么意义呢?意义还是有的。一方面,真正标记出所有的位置是一个正常的编译器不可能做的事情。完全支持延续的编译器都对延续进行了大量优化,而且如果是较纯的函数式编程语言,还在闭包变换时可以消去对某些函数而言达不到的延续。但 Lua 虽然在支持 FP 方面比 Ruby,Python 之流做得更加出色,但本质上还是命令式语言,做这样的优化代价太大;另一方面,Scheme 是追求完备性的语言,需要用延续来辅助程序逻辑;Lua 因为是命令式语言,已经提供了不错的异常处理和生成器支持,也就是说延续能实现的主要的流程控制都以实现,完全实现延续以支持函数风格的自动回溯不再值得,Lua 只需要一个能够产生瘦线程的特性即可,不想要在函数间逻辑地、合理地任意跳转的能力,而协同就可以做到;最后一点,延续本身存在安全跟踪延续路径和清理上的困难(为此 Scheme 还额外提供了 dynamic-wind 来限制延续在闭包之外的重复跳转),为简化程序员的工作,增加限制不正是 RoR 等成功例子所颂扬的“约定大于配置”的金科玉律吗?
分享到:
- 2008-02-01 12:21
- 浏览 3016
- 评论(5)
- 论坛回复 / 浏览 (4 / 3354)
- 查看更多
相关推荐
Lua 协同程序demo.
在Lua中的协同程序示例,首先定义了两个创建协同程序的函数`createCoroutineA`和`createCoroutineB`,这两个函数分别创建了两个协同程序并打印出它们的初始状态。然后通过`coroutine.resume`函数激活其中一个协同...
"luac4解密工具"和"luac解密工具"则是指用于处理LUAC 4或者其他LUAC版本的解密和反编译软件。这些工具可能包括离线的桌面应用程序,也可能是前面提到的在线服务。它们的工作原理可能包括破译LUAC的加密算法,然后...
Lua协同程序,或称为coroutine,是一种轻量级的并发机制,它在Lua编程语言中扮演着重要的角色。不同于线程,协同程序在概念上更接近于子程序,但它们允许非阻塞的暂停和恢复,使得在单线程环境中实现异步操作成为...
Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器配置等领域。Lua源代码是文本形式的,易于阅读和编写,但为了保护代码不被轻易篡改或盗用,开发者通常会将Lua代码编译成字节码(.lua.c文件或.luac...
所有版本LUA源码 lua-5.3.5 lua-5.3.4 lua-5.3.3 lua-5.3.2 lua-5.3.1 lua-5.3.0 lua-5.2.4 lua-5.2.3 lua-5.2.2 lua-5.2.1 lua-5.2.0 lua-5.1.5 lua-5.1.4 lua-5.1.3 lua-5.1.2 lua-5.1.1 lua-5.1 lua-5.0.3 lua-...
这个压缩包提供了在Windows环境下运行和开发Lua程序的基本组件。 首先,我们来了解一下Lua 5.1.4的关键特性。Lua 5.1引入了一些重要的改进,比如元表(metatable)的增强,这使得对象行为的自定义更加灵活。此外,...
lua51.lib包含了与Lua交互所需的所有函数声明,使得C/C++代码能够调用Lua API,创建和控制Lua虚拟机,注册C函数供Lua调用,以及在Lua和C之间传递数据。 在实际应用中,这些组件通常一起使用,通过lua51.lib构建与...
2. **lua静态.e** 和 **lua静态.ec**:这是易语言的源代码文件和编译后的执行文件,可能是用来演示如何静态链接Lua51.DLL。静态链接意味着将Lua的函数直接编译进易语言程序,无需在运行时依赖额外的DLL文件,这样...
内含luaDll,luacom以及luaiconv源码。luaDll和luaiconv直接打开sln在Visual studio中即可进行编译。luacom可使用nmake进行编译。也可直接使用已经生成了的dll.
移植Lua到STM32F407首先需要准备以下资源:Lua源码、STM32的交叉编译工具链,以及一个合适的嵌入式Lua库,如luac跨编译器和lua虚拟机。这里的关键步骤包括: 1. **构建Lua环境**:下载Lua的源代码,使用针对STM32的...
Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器应用程序等。在编程领域,加密和解密是常见的安全措施,尤其是对于脚本代码,以保护源代码不被轻易查看和篡改。"LUAC解密工具"就是针对Lua编译后的二...
Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器配置等领域。LuaEditor是一款专为Lua编程设计的中文编辑器,它为程序员提供了方便的开发环境,提高了编写和调试Lua代码的效率。luaEditor-v4.10是该...
Lua是一种轻量级、高效且可嵌入的脚本语言,广泛应用于游戏开发、Web应用和其他领域。《Programming in Lua》一书由Lua的主要开发者之一 Roberto Ierusalimschy 撰写,深入浅出地介绍了Lua语言的核心概念及其在实际...
"Lua程序设计和lua-5.1中文手册"是针对Lua编程语言的学习资源,其中包含了对Lua 5.1版本的详细解释和实例指导。 在"Lua程序设计"中,你可以了解到Lua的基本语法和特性,包括变量、数据类型、控制结构(如if语句、...
JS和LUA交互,主要是JS和LUA交互实现模版,可以作为参考
ios版本将lua加密成luac
《Lua实例代码大全》是针对Lua编程语言的一份详尽实例集合,涵盖了多个核心库和扩展库的使用,包括luacurl(网络连接)、luafilesystem(文件系统操作)、luajson(JSON处理)、luasocket(网络套接字)、luasql...
LuaBitOp-1.0.2 是一个针对 Lua 语言的位操作库,它提供了对二进制数据进行位运算的功能。位操作是计算机科学中的基础概念,它们在底层编程...通过阅读和理解源码,开发者可以学习到更多关于 Lua 扩展和位操作的知识。
Lua是一种轻量级的脚本语言,常被用于游戏开发、服务器配置、嵌入式系统等领域,因其简洁的语法和高效性能而受到欢迎。在本文中,我们将深入探讨如何在C++程序中集成Lua,实现C++调用Lua函数以及Lua调用C++函数。 ...