5

我正在阅读这篇关于 funarg 问题的论文,这实际上是维护词法闭包环境的问题。这是一篇旧论文,我不确定作者的结论是否仍然成立,但他强烈暗示,为了拥有词法而不是动态范围,您必须放弃传统的 C 样式堆栈,而是使用树结构环境,从堆中分配。

这是否使得在任何硬实时系统中都不可能有词法范围的闭包?在实时嵌入式系统中,延迟以微秒为单位测量,堆分配通常是被禁止的,因为它引入了不确定的延迟。

这一直是我的好奇心,因为我主要以固件开发人员的身份制作面包,其中 C 是事实上的语言,有一段时间以来,我似乎一直在使用我的脑力来弄清楚如何迫使 C让我用更复杂的语言做一些免费的事情。因此,我开始怀疑您是否可以专门为基于硬实时嵌入式微控制器的系统实现 micro-lisp 编译器。

作为旁注:我最近对诸如闭包和对象如何等效等深层主题有了深刻的见解,这让我对 Stallman 和 Rich Hickey 以及 Paul Graham 等人更加敬畏。从头开始实施 Lisp 对我来说似乎是一项艰巨的任务。很难知道从哪里开始。(也许与 PG 对 McCarthy 的原始 eval 函数 IDK 的实现有关)。无论如何,我离题了。

4

2 回答 2

3

“硬实时”显然可以实现词法作用域——毕竟,您说您将 C 用于实时应用程序,而 C一种词法作用域语言。我的猜测是您实际上关心的是一流的函数,而不是词法范围。假设,有一大堆已知的编译技术可以有效地处理一流的函数。

首先,您将在教科书等中看到的几乎总是在做通常的树形环境,但在实践中,如果函数不用作值,则根本不需要这样做。几乎每一个体面的函数式语言编译器都会识别出这样的代码并使用堆栈来代替,因此分配开销为零。(请注意,此时这意味着如果您将自己限制在用 C 编写的那种东西,那么就不需要分配。)然后,还有很多其他方法可以减少分配——例如,考虑类似的东西(lambda (x) (* x 9))—— - 这个函数并没有真正关闭任何自由标识符,因此编译器会提升它到顶部,所以有一个函数的副本,同样,没有分配。(相关说明:通过这种优化,您已经获得了比 C 给您更多的东西,但仍然没有分配。)

有一大堆额外的优化可以避免分配,但是当然有些情况下你真的需要分配一个新的闭包。但是这些地方是静态可识别的,如果您真的关心此类分配,那么破解一个警告您此类分配的编译器应该不难。已经有许多这样的语言,例如GOAL,非常低级的预方案. 但是 IME 大多数人很快就掌握了事情的窍门,并且分配发生的位置越来越明显——因此您可以从高级语言中受益,并且当它到达您想要优化的某些代码时,很容易看到分配发生的位置,并且很容易以通常的方式避免它。(当然,所有这些都与优化分配无关。)

于 2011-04-30T17:01:34.027 回答
1

我找到了一些实时分配器,所以我想说。实时的词法作用域是可能的:

http://rtportal.upv.es/rtmalloc/

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.106.441&rep=rep1&type=pdf

添加到您的消化,在编写我自己的微 lisp 之前,我会尝试为有问题的嵌入式系统查找或移植lua。它非常小,并提供了 LISP 的大部分功能:一流的函数、闭包、没有延续但协程。

Lua 很小

将 Lua 添加到应用程序不会使其膨胀。Lua 5.1.4 的 tarball 包含源代码、文档和示例,需要 212K 压缩和 860K 未压缩。源代码包含大约 17000 行 C。在 Linux 下,使用所有标准 Lua 库构建的 Lua 解释器需要 153K,Lua 库需要 203K。

Lua 是免费的

Lua 是免费的开源软件,在非常自由的许可证(著名的 MIT 许可证)下分发。它可以用于任何目的,包括商业目的,完全免费。只需下载并使用它。

于 2011-04-30T12:54:08.647 回答