如何流式传输程序代码?

我最近一直在学习Lisp(Scheme,Racket和Clojure),并且已经阅读了着名的Playstation开发者Naughty Dog的相关文献。

这篇Gamasutra文章提到,除了游戏数据外,他们的流媒体引擎实际上还在游戏代码中流动。 现在,他们已经广泛地使用了一种名为GOAL的Lisp方言。 我知道Lisp的“Code as Data”,尽管我还没有充分理解这个概念。 所以,我想知道流式代码的能力是代码的一个属性,它们是Lisp数据还是编译机器代码,而不是一种可以在许多语言中使用的通用设计模式?

有人可以指点我关于这个话题的文献吗?

奖金:有人可以像我在维基百科文章中提到的那样向我指出关于长期倾听编译器的文献吗?


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

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

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


他们的流引擎或多或少地复制了DLL(windows),SO(Linux)或Dylib加载在更一般的操作系统上所做的事情,并且除了他们自己实现它之外并没有那么有趣。 它与他们使用的语言没有任何关系。 就长期监听编译器而言,这是我第一次听到编辑并继续归因于编译器,它通常是调试器的一个功能。


我在Common Lisp中对这类事情进行了很少的研究,你的代码可能是这样的:

on connection:
   read Lisp form
   eval Lisp form
   close connection

从概念上来说,它并不是完全不同的,比如粘液。

还要注意,由于Common Lisp的特性,热插拔代码并不是什么大问题。

链接地址: http://www.djcxy.com/p/60943.html

上一篇: How to stream program code?

下一篇: What's so great about Lisp?