embedded - 是否有可能在词法范围内实现硬实时?

标签 embedded lisp scope real-time lexical

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

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

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

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

最佳答案

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

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

有一大堆 additional optimizations可以避免分配,但当然有确实需要分配新闭包的情况。但是这些地方是静态可识别的,如果您真的关心此类分配,那么破解一个警告您此类分配的编译器应该不难。有许多这样的语言,例如参见 GOAL ,非常低的水平prescheme .但 IME 大多数人很快就掌握了窍门,而且分配发生的位置变得很明显——因此您可以获得高级语言的好处,当涉及到您想要优化的某些代码时,很容易看到分配发生的位置,并且很容易以通常的方式避免它。 (当然,所有这些都与优化分配无关。)

关于embedded - 是否有可能在词法范围内实现硬实时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5841830/

相关文章:

c++ - 将调试语句重定向到 stderr 时出现奇怪的情况

linux - emacs 中的串行终端

assembly - Cortex M0+ (SAMD21) 未执行待处理中断

emacs:当光标突出显示括号时评估闪烁匹配打开

scope - 在当前环境中未找到该引用

python - Python 中的自由变量被视为全局变量吗?

php - 理解为什么 echo 在 php 类函数中不起作用

c - Arduino UNO LCD代码循环显示数据

scheme - lisp S-exp中间的字符串?

java - 在 Lisp 应用程序创建的 Java 源代码上,从 Common Lisp 应用程序调用 Java 编译器