Compiler construction 如何流式处理程序代码?

Compiler construction 如何流式处理程序代码?,compiler-construction,streaming,lisp,Compiler Construction,Streaming,Lisp,我最近一直在学习Lisp(不同程度的Scheme、Racket和Clojure),并阅读了有关著名Playstation开发者顽皮狗的相关文献 提到他们的流媒体引擎除了游戏数据外,实际上还在游戏代码中流媒体。 现在,他们有一种被广泛使用的Lisp方言。 我知道Lisp的“代码作为数据”,尽管我还没有完全了解这个概念。因此,我想知道流式代码的能力是否是他们的代码的一个属性,即Lisp数据或编译的机器代码,而不是可以在许多语言中使用的通用设计模式 有人能给我指一下关于这个话题的文献吗 奖励:有人能告

我最近一直在学习Lisp(不同程度的Scheme、Racket和Clojure),并阅读了有关著名Playstation开发者顽皮狗的相关文献

提到他们的流媒体引擎除了游戏数据外,实际上还在游戏代码中流媒体。 现在,他们有一种被广泛使用的Lisp方言。 我知道Lisp的“代码作为数据”,尽管我还没有完全了解这个概念。因此,我想知道流式代码的能力是否是他们的代码的一个属性,即Lisp数据或编译的机器代码,而不是可以在许多语言中使用的通用设计模式

有人能给我指一下关于这个话题的文献吗


奖励:有人能告诉我一些关于长期监听编译器的文献吗?

他们的流媒体引擎或多或少地复制了DLL(windows)、SO(Linux)或动态库加载在更一般的操作系统上的功能,除了他们自己实现了这一功能之外,这些都不那么有趣。这与他们使用的语言无关。就长期侦听编译器而言,这是我第一次听到编译器将“编辑并继续”归因于它,它通常是调试器的一个功能

Lisp speak中的“Listener”是REPL(Read-Eval-Print循环)。侦听器通常提供多种服务,如集成调试器、命令历史记录、命令解释器等。在许多情况下,监听器在所使用的Lisp中运行。在某些情况下,所有输入到REPL/侦听器的代码都是在执行之前编译的(例如Clozure-CL、SBCL)。如果不是这样,则可以根据需要编译代码(请参阅Common Lisp中的COMPILE或COMPILE-FILE函数)

在这里,我想开发环境是在Allegro Common Lisp中实现的,运行时运行在Playstation上。开发环境提供了一个与运行时对话的接口,并允许编译代码并将其下载到运行时。我猜编译器不是在Playstation上运行的,而是在开发环境中运行的。然后,侦听器还提供查看Playstation上正在运行的应用程序的状态的功能,包括符号表。因此,您可以将开发环境连接到Playstation的运行应用程序,并与之交互,包括更改数据和代码


由于Lisps可以在运行时同时加载源代码和编译后的代码,“流式”代码并不难。这只意味着玩家在游戏中四处移动时加载代码(可能在后台)。如果代码是以某种方式组织的,那么一旦不再需要它,也可以对其进行垃圾收集。例如,如果游戏中的“房间”是一个对象,并且房间通过名称指向各种功能,那么如果玩家在房间中,这些功能可以根据需要自动加载。如果玩家离开房间,代码可以自动或半自动卸载。在典型的Lisp中,垃圾收集器将收集未引用的代码。在游戏中,这可能不是GC的任务,而是其他更“手动”的过程。这将是目标运行时的一项功能。与不能垃圾收集卸载代码的普通JVM(AFAIK)相比,我在Common Lisp中已经对这类事情做了一些研究,您的代码可能是这样的:

on connection:
   read Lisp form
   eval Lisp form
   close connection
从概念上讲,它与粘液没有很大的不同


还要注意,由于公共Lisp的性质,热插拔代码没有什么大不了的

没错,谢谢你提醒我!一位自己做过一些评测项目的朋友告诉我去看看调试器是如何做的。这里的“长期听力编译器”的特殊措辞确实使我偏离了轨道。为了便于参考,我找到了这个链接:这是关于C和C++类型语言的编辑和继续或热交换类型系统的一点细节。