如何流程序代码?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何流程序代码?相关的知识,希望对你有一定的参考价值。

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

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

有人能指点我这个主题的文学作品吗?

额外奖励:有人能指出我在Wikipedia article中提到的关于长期听力编译器的文献吗?

答案

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

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

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

另一答案

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

另一答案

我在Common Lisp中对这类事情进行了一些调查,你的代码可能是这样的:

on connection:
   read Lisp form
   eval Lisp form
   close connection

从概念上讲,它与史莱姆的概念并无大不相同。

另请注意,由于Common Lisp的性质,热插拔代码并不重要。

以上是关于如何流程序代码?的主要内容,如果未能解决你的问题,请参考以下文章

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段

如何利用redis来进行分布式集群系统的限流设计

如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?

如何在片段中使用 GetJsonFromUrlTask​​.java

我应该如何使用 Outlook 发送代码片段?

如何将代码片段存储在 mongodb 中?