Embedded 有没有可能通过词法范围实现硬实时?

Embedded 有没有可能通过词法范围实现硬实时?,embedded,lisp,scope,real-time,lexical,Embedded,Lisp,Scope,Real Time,Lexical,我在读关于funarg问题的书,这实际上是维护词法闭包环境的问题。这是一篇旧论文,我不确定作者的结论是否仍然成立,但他强烈暗示,为了拥有词汇范围而不是动态范围,必须放弃传统的C风格堆栈,而是拥有一个从堆中分配的环境树结构 这是否使得在任何硬实时系统中都不可能有词汇范围的闭包?在实时嵌入式系统中,延迟是以微秒为单位测量的,堆分配通常是被禁止的,因为它引入了不确定的延迟 这一直是我的一个无聊的好奇心,因为我主要是作为一个固件开发人员来谋生,而C是事实上的语言。有一段时间,我似乎一直在用我的脑力来找出

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

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

这一直是我的一个无聊的好奇心,因为我主要是作为一个固件开发人员来谋生,而C是事实上的语言。有一段时间,我似乎一直在用我的脑力来找出如何强迫C让我用更复杂的语言做免费的事情。因此,我开始想知道您是否可以实现一个专门用于硬实时嵌入式微控制器系统的micro lisp编译器


顺便说一句:我最近对闭包和对象是如何等价的等深层主题有了深刻的见解,这让我对Stallman、Rich Hickey和Paul Graham这样的人更加敬畏。对我来说,从头开始实现Lisp似乎是一项艰巨的任务。很难知道从哪里开始。(可能是PG实现了麦卡锡最初的评估功能IDK)。无论如何,我离题了。

我发现了一些实时分配器,所以我想说。词法范围可以实时显示:

在编写我自己的micro-lisp之前,我会尝试为所讨论的嵌入式系统找到或移植。它非常小,提供了很多LISP:一流的函数、闭包、没有延续,但有共同的例程

Lua很小

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

卢阿是免费的

Lua是免费的开源软件, 以非常自由的方式分发 许可证(著名的麻省理工学院许可证)。 它可以用于任何目的, 包括商业用途,在 绝对没有成本。下载就行了 并使用它


词法范围显然可以通过“硬实时”实现——毕竟,你说你正在使用C来实现实时应用程序,而C是一种词法范围语言。我猜你实际上关心的是一级函数,而不是词法范围。假设这样,有一大堆已知的编译技术可以有效地处理一类函数

首先,你会在教科书中看到,etc几乎总是使用通常的树形环境,但实际上,如果函数不用作值,则根本不需要这样做。实际上,每一个像样的函数式语言编译器都会识别这样的代码,并使用堆栈,因此分配的开销为零。(注意,在这一点上,这意味着,如果你限制你自己在C中编写的那种东西,那么就不需要分配)。然后,还有一组额外的方法来减少分配——例如,考虑一些类似于<代码>(lambda(x)(*x 9))< /> >这个函数并没有真正关闭任何自由标识符,因此编译器会将它放在最上面,这样就有了函数的一个副本,同样,没有分配。(相关说明:通过此优化,您已经获得了比C提供的更多的资源,但仍然没有分配。)


有很多方法可以避免分配,但是当然,在有些情况下,您确实需要分配一个新的闭包。但是这些位置是静态可识别的,如果您真的关心这样的分配,那么就不难破解一个编译器来警告您这样的分配。有许多这样的语言,例如,见极低级别。但是大多数人很快就掌握了分配的诀窍,分配发生的地方也变得很明显——因此你可以从高级语言中获益,当它涉及到一些你想要优化的代码时,很容易看到分配发生的地方,也很容易用通常的方法避免它。(当然,所有这些都与优化分配无关。)

您可能想看看Lua的闭包实现,如(第8+页)所述,但其余部分可能也很有趣。它相对复杂,并且比简单的实现有更低的开销。这很酷,而且,正如你所说的,复杂。这里有一篇关于嵌入式方案的论文:“BIT:一个非常紧凑的嵌入式应用方案系统”()啊,这是一篇非常有趣的论文!嵌入式开发人员通常使用固定大小的池来避免堆的不足,这是一个难题。对于malloc()来说,拥有一个时间有限的真正堆确实是一件好事。应该是第一类函数——第一阶与之相反。另外,这与“闭包”(闭包是一级函数的常见实现技术)的意思是一样的。@Eli谢谢,我想写的是高阶函数。更正。好吧,高阶函数并没有什么特别的——事实上C有它们。这是带来闭包分配问题的第一类函数。@Eli我睡过了,回忆又回来了,你就在这里。