compiler-construction - 如何流式传输程序代码?

标签 compiler-construction streaming lisp

我最近一直在学习 Lisp(不同程度的 Scheme、Racket 和 Clojure),并阅读了著名 Playstation 开发商 Naughty Dog 的相应文献。

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

谁能告诉我关于这个主题的文献?

奖励:谁能给我指点一下 Wikipedia article 中提到的关于长期监听编译器的文献? ?

最佳答案

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

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

由于典型的 Lisps 可以在运行时加载源代码和编译代码,因此“流式”代码并不难。这只是意味着当玩家在游戏中四处移动时加载代码(可能在后台)。如果代码以某种方式组织,一旦不再需要它也可以被垃圾回收。例如,如果游戏中的“房间”是一个对象,并且房间通过名称指向各种功能,则如果玩家在房间内,则可以按需自动加载这些功能。如果玩家离开房间,代码可以自动或半自动卸载。在典型的 Lisp 中,垃圾收集器会收集未引用的代码。在游戏中,这可能不是 GC 的任务,而是其他一些更“手动”的过程。这将是 GOAL 运行时的一项功能。将其与无法垃圾收集卸载代码 (AFAIK) 的普通 JVM 进行比较。

关于compiler-construction - 如何流式传输程序代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4320166/

相关文章:

c++ - 英特尔 C++ 编译器了解执行了哪些优化

c++ - 有没有一种方法可以在不增加二进制大小的情况下使用 C++ 中的异常?

c - 下面文法的左推导和右推导

javascript - 可以在不使用 RTSP 的情况下流式传输实时视频吗?

iphone - ffmpeg : playing udp stream

javascript - 如何使用递减运算符解析表达式(例如 "c--")?

networking - 音乐流使用哪种协议(protocol)?

lisp - 使用 Hunchentoot/html-template/Lisp 提供动态网页

lisp - 在 lisp 列表中显示特定原子的不同列表

list - 在 Lisp 中获取多括号列表的第一个元素