词法作用域是否可以实现硬实时?

2024-01-15

我正在读书关于 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(使用前将#替换为@)

词法作用域是否可以实现硬实时? 的相关文章

  • Linux malloc() 在 ARM 和 x86 上的行为是否不同?

    这个网站上有很多关于内存分配的问题 但是我 找不到专门解决我的问题的人 这 问题 https stackoverflow com questions 19148296 linux memory overcommit details似乎最接近
  • 使用 PREEMPT_RT 构建 RT 应用程序

    我想在使用实时 PREEMPT RT 的同时编写实时 Linux 程序 我找到了官方维基 https rt wiki kernel org index php HOWTO Build an RT application https rt w
  • 快速CRC算法?

    我想从 ASCII 字符串创建一个 32 位数字 CRC32 算法正是我正在寻找的 但我无法使用它 因为它需要的表太大了 它适用于资源非常稀有的嵌入式系统 那么 对于快速且精简的 CRC 算法有什么建议吗 当冲突的可能性比原始 CRC32
  • JavaScript作用域问题

    我正在调用此函数 将结果分配给回调中的变量 然后记录结果 但我一直未定义 var id test getID function result id result console log id 如果我将其更改为下面的代码 那么我可以看到记录的
  • 如何停止优化器丢弃未使用的变量?

    我想调试我的代码 但无法访问进程中的内部层 因为这会干扰与硬件的通信 在监视列表会干扰基本读取访问的情况下执行易失性操作 因此 我正在测试接口的返回值 但 IAR 编译器甚至会优化未使用的易失性变量 和这样的声明 i object foo
  • 有人有关于 C 语言设计和错误跟踪/控制系统的好指南吗?

    我是 C 开发的软件工程方面的新手 有没有人有关于如何为 C 项目 尤其是嵌入式 设计错误跟踪或错误控制系统的良好指南 谈论 C 库的错误跟踪也会有帮助 根据我的经验 这里的策略分为几个阵营 全局变量ala的使用errno http www
  • Node.js |如何通过串口向设备发送和接收一个字节?

    我正在尝试编写使用以下方法的 Node js 脚本serialport https serialport io 用于读取和写入数据的 npm 包COM5串行端口 使用 RS 232 电缆连接到设备 该设备会自动传输其拥有的数据 要检索设备内
  • 仅使用视频标签实时流式传输到 HTML5(不带 webrtc)

    我想将实时编码数据包装到 webm 或 ogv 并将其发送到 html5 浏览器 webm 或 ogv 可以做到这一点吗 Mp4 由于其 MDAT 原子而无法做到这一点 无法实时将h264和mp3打包并发送给客户端 假设我正在从网络摄像头输
  • 为什么 Ruby 解析文件时常量不像局部变量那样被初始化?

    在 Ruby 中 我知道我可以做这样的事情 if false var Hello end puts var 应用程序不会崩溃 并且var只需设置为nil 我读到 这种情况的发生是由于 Ruby 解析器的工作方式造成的 为什么同样的方法不适用
  • Android:实时图像处理

    我有一个应用程序 它进行相机预览 对每一帧执行一些基本的图像处理功能 例如边缘检测 颜色变化 图像扭曲等 并 实时 将修改后的帧显示到屏幕上 类似于Android Market中的 Paper Camera 应用程序 我的方法总结 我也做过
  • JavaScript 变量作用域

    我遇到了 JavaScript 全局变量 称为 TimeStamp 未在加载时定义的问题 至少我认为这就是问题所在 我从这里开始 定义时间戳 document ready function AddTest var TimeStamp nul
  • 在 python 中检查堆栈中的局部变量

    我编写了一个小函数 它在堆栈中查找一级并查看其中是否有变量 但是我如何将这个函数变成一个可以在堆栈中一直查找直到找到一个局部变量并购买某个特定名称的函数 import inspect def variable lookup variable
  • 在我的 Linux 机器上安装 lisp

    我使用 Vim 作为我的编辑器 Practical common Lisp 建议安装 Lispbox 我不知道如何使用 emacs 不知道如何用那个 T T 运行 lisp 代码 之后我找到了一个名为 limp vim 的 vim lisp
  • IIFE 和 call 的区别

    之间有区别吗 function call this and function or var MODULE function this hello world call MODULE and var MODULE function m m h
  • 通过 :: 调用包中的函数是一个好习惯吗

    我正在编写一些 R 函数 这些函数在其他包中使用一些有用的函数 例如stringr and base64enc 不打电话好不好library or require 首先加载这些包但要使用 直接引用我需要的功能 比如stringr str m
  • 在 while 循环之外使用变量(作用域)

    关于 PHP 范围的小问题 我似乎无法在 while 循环之外调用变量 report 我尝试过各种事情 包括return 这不起作用 这里唯一起作用的两个函数是如果我echo变量 report在循环内 或者如果我print它 我不想这样做
  • MISRA C++(规则 18-4-1)和动态内存分配 - 是否允许 std::string?

    MISRA C 规则 18 4 1 说 不得使用动态堆内存分配 See http dist sonarsource com reports coverage misra c 2008 html http dist sonarsource c
  • 在嵌入式 Jetty 上使用 DefaultServlet 提供静态 html 文件

    我正在开发一个需要独立的项目 因此我决定将 Jetty 嵌入到我的应用程序中 我将提供静态 HTML 页面 一些 JSP 页面 并且还将使用一些自定义 servlet 我找到了一个完美的示例 说明如何设置嵌入式 Jetty 来完成所有这一切
  • 学习 Lisp 的资源 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 CF10 中确定闭包变量的范围?

    引自Adobe ColdFusion 10 使用闭包文档 http help adobe com en US ColdFusion 10 0 Developing WSe61e35da8d31851842acbba1353e848b35 8

随机推荐

  • C# 中的 Group By Sum Linq to SQL

    确实坚持使用 Linq to SQL 分组和求和 到处搜索 但我还不够了解 无法将其他解决方案应用到我自己的解决方案中 我的数据库中有一个名为 view ProjectTimeSummary 的视图 它具有以下字段 string UserD
  • 将表数据保存到 HTML5 LocalStorage

    我创建了一个 JSFiddleHere http jsfiddle net sethe23 j44tyjg6 我想做的是从以下代码保存表数据 save click function dataTable find tbody append t
  • 动态设置自定义AlertDialog内容

    我有一个自定义对话框 我将其设置为函数 public void customDialog Bitmap bm String title TextView dialogtext TextView findViewById R id layou
  • 在 ELKI 中运行聚类算法

    我需要以编程方式使用 ELKI 运行 k medoids 聚类算法 我有一个相似度矩阵 我希望将其输入到算法中 是否有任何代码片段可用于如何运行 ELKI 算法 我基本上需要知道如何创建Database and Relation对象 创建自
  • Qt4 自定义窗口框架像 Office 2007 中的那样吗?

    有没有办法强制 Qt4 绘制类似于 Office 2007 2010 的窗框 我希望我的应用程序在所有 Windows 版本中看起来都一样 而不仅仅是 vista 7 也许 QMainWindow 有一些扩展 感谢帮助 您必须删除标题栏并自
  • ScrollView 或其父级没有用

  • HTML 中的相对路径

    我正在创建一个网站localhost 我想将我网站中的所有链接资源设置为相对路径 我的意思是仅内部资源 网站位于 http localhost mywebsite 我读了这个有用的问题绝对 URL 与相对 URL https stackov
  • 避免静态方法过度使用的技巧

    我正在重构一些代码 并且正在查看一个名为 HFile 的类 HFile 具有所有私有构造函数 因此您无法实际创建它的实例 而不是创建 HFile 实例 如下所示 var file new HFile filename file Save 所
  • Androidmonkeyrunner的help.py在哪里

    我只是找不到help py文件以便创建 API 参考monkeyrunner 该命令描述于安卓参考 http developer android com guide developing tools monkeyrunner concept
  • 使用闪亮的文本输入和 dplyr 来过滤数据框中的行

    我正在尝试使用闪亮的应用程序上的文本输入小部件来过滤数据框中的行 但我无法让它工作 Dataset df1 lt data frame Name c Carlos Pete Carlos Carlos Carlos Pete Pete Pe
  • UITextView shouldChangeTextInRange 委托未调用

    我正在使用此代码来设置我视图中的 uitextview 的参数 textview UITextView alloc init textview setUserInteractionEnabled FALSE textview text Wr
  • 如何在powershell中仅显示用户所属组的组名

    所以我有以下脚本 但它列出了 AD 组的全名 例如 CN GroupName OU OUName DC DomainName DC com 如何仅指定组的名称 以便它仅列出名称本身 之后的部分CN 我试过 group Name但没有这样的运
  • “此 SqlTransaction 已完成;它不再可用。”...配置错误?

    我已经为此工作了大约一天半的时间 并在网络上搜索了大量博客和帮助文章 我发现了几个与此错误相关的问题 但我认为它们不太适用于我的情况 或者在某些情况下 不幸的是 我无法很好地理解它们来实现 P 我不确定我能否很好地描述这一点以寻求帮助 但这
  • Five9 的 API:如何使用 SOAP API 和基本身份验证提取报告

    我们正在尝试使用 Five9 的服务器报告 API 访问数据 我们在下面编写了代码 但没有得到任何结果 对我来说 问题似乎出在 Five9 服务器的身份验证上 请检查帮助我们了解如何定期提取特定活动的数据并将其存储在数据仓库中
  • php - 取消链接引发错误:资源暂时不可用

    这是一段代码 public function uploadPhoto filename storage temp image jpg file put contents filename file get contents http exa
  • Python 中 Chromedriver Selenium 的“Eager”页面加载策略解决方法

    我想加快 selenium 上页面的加载时间 因为除了 HTML 之外我不需要任何其他内容 我正在尝试使用 BeautifulSoup 抓取所有链接 使用 PageLoadStrategy NONE 无法抓取所有链接 并且 Chrome 不
  • UIActionSheet 事件未触发

    我有一个 UIActionSheet 来在表视图控制器上提供用户选项 我之前已经实现了这一点 没有出现任何问题 但现在由于某种原因 单击按钮时我的事件处理程序不会触发 在我的头文件中 我已经实现了正确的委托 如下所示 interface G
  • Django:此函数的关键字参数无效

    我想将一些数据插入到多对多字段中 我收到此错误 user 是该函数的无效关键字参数 我也尝试了相关名称 但仍然不起作用 我的模型如下所示 模型 py class Workspace models Model user models Many
  • 增加 Tomcat 堆大小

    我正在尝试增加 tomcat 的堆大小 这样我可以优化 GeoServer 性能 我所做的是 将 tomcat 默认文件中的 JAVA OPTS 值更改为 JAVA OPTS Djava awt headless true Xmx3072m
  • 词法作用域是否可以实现硬实时?

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