我正在读书关于 funarg 问题,这实际上是维护词法闭包环境的问题。这是一篇旧论文,我不确定作者的结论是否仍然成立,但他强烈暗示,为了拥有词法作用域而不是动态作用域,你必须放弃传统的 C 风格堆栈,而采用树结构环境,从堆分配。
这是否使得在任何硬实时系统中都不可能拥有词法范围的闭包?在实时嵌入式系统中,延迟以微秒为单位进行测量,通常会禁止堆分配,因为它会引入不确定的延迟。
这一直是我的一种无聊的好奇心,因为我主要是作为一名固件开发人员来制作面包的,其中 C 是事实上的语言,并且有一段时间,我似乎一直在使用我的脑力来弄清楚如何迫使 C让我用更复杂的语言免费做一些事情。因此,我开始想知道是否可以专门为基于微控制器的硬实时嵌入式系统实现一个 micro-lisp 编译器。
顺便说一句:我最近对诸如闭包和对象如何等价等深层主题有了深刻的见解,这让我对像 Stallman 和 Rich Hickey 以及 Paul Graham 这样的人更加敬畏。对我来说,从头开始实现 Lisp 似乎是一项艰巨的任务。很难知道从哪里开始。 (也许是通过 PG 实现 McCarthy 的原始 eval 函数,IDK)。无论如何,我离题了。
词法作用域显然可以通过“硬实时”实现——毕竟,你说你正在使用 C 来实现实时应用程序,而 Cis词法范围的语言。我的猜测是,您实际上关心的是一流函数,而不是词法范围。假设,有一大堆已知的编译技术可以有效地处理一流函数。
首先,您在教科书等中看到的几乎总是在执行通常的树形环境,但在实践中,如果不将函数用作值,则根本不需要这样做。实际上,每个像样的函数式语言编译器都会识别此类代码并使用堆栈,因此分配开销为零。 (请注意,此时这意味着,如果您将自己限制在用 C 编写的内容中,则不需要分配。)然后,有很多其他方法可以减少分配 - 例如,考虑类似(lambda (x) (* x 9))
-- 这个功能实际上并没有close超过任何自由标识符,因此编译器将lift http://en.wikipedia.org/wiki/Lambda_lifting它到顶部,因此只有该函数的单个副本,并且同样没有分配。 (相关说明:通过此优化,您已经获得了比 C 提供的更多的内容,但仍然没有分配。)
有一大堆额外的优化 http://en.wikipedia.org/wiki/Category%3aImplementation_of_functional_programming_languages避免分配,但当然有are您确实需要分配新闭包的情况。但这些地方是静态可识别的,如果您真的关心此类分配,那么破解一个警告您此类分配的编译器应该不难。有许多这样的语言,例如GOAL http://en.wikipedia.org/wiki/Game_Oriented_Assembly_Lisp, 非常低的水平预计划 http://en.wikipedia.org/wiki/PreScheme。但大多数人很快就掌握了 IME 的窍门,并且分配发生的位置变得越来越明显 - 因此您可以获得高级语言的好处,并且当它到达您想要优化的某些代码时,很容易看到分配发生的位置,并且通过通常的方式很容易避免它。 (当然,所有这些都与优化分配无关。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)