常见的lisp:可移植性

时间:2013-07-31 18:32:46

标签: opengl common-lisp portability

问题

如果我在Windows上使用clozure cl进行普通lisp(使用:lispbuilder-sdl,quicklisp,cffi)的2D游戏,我是否能够轻松将其移植到其他平台(linux / iPhone(也许)/ android)以后? lisp“适合”可安装的程序吗?

信息

  1. 游戏将使用OpenGL进行图形处理。很可能它会使用sdl进行输入/ opengl初始化,并使用sdl或openal进行音频处理。可能最终会使用我自己的库而不是sdl。
  2. 为cffi编写少量C ++库(以“便携”方式包装功能)不是问题。
  3. 推理

    我真的,真的厌倦了C ++。想要尝试更简单的语法+更强大的功能(不是python)。记住一个游戏项目,想知道如果我突然决定稍后分发/移植游戏,那么选择游戏的lisp是否意味着严重的麻烦。

    - 编辑 -

    其他信息

      

    “合适”和“可安装程序”是什么意思?

    如果我尝试将可以在我的机器上运行的已完成的程序转换为可安装的程序包(例如,Windows上的Windows安装程序),我不确定CFFI / quicklisp的效果如何。例如,quicklisp在用户的主目录中设置路径/存储库(这可能是不可接受的行为)并尝试从外部源自动下载包,这在您尝试分发程序并确保其工作时不是一件好事意。 CFFI在某些方面“绑定”外部库到lisp函数,并且我不清楚它是如何工作的,比如,如果我转储程序映像,将其嵌入到exe并在另一台机器上运行所述exe。根据常识,它应该可以正常工作,但在最坏的情况下,它可能导致我必须编写特定于lisp分发的复杂安装程序。

4 个答案:

答案 0 :(得分:11)

**注意:对不起,如果我在这篇文章中说明显而易见的,我不确定你对Common Lisp **的熟悉程度

继续从sds:

在Android上运行clozure似乎有点生命,但是可用的性能还有待观察。我们不太可能在iphone商店中看到lisp游戏,除非他们编译成运行时没有编译器的其他语言(参见Nu或专有选项见mocl哪个两者都有解决这个问题的方法)

可移植性 - 跨实现

在库中,让它们在尽可能多的实现中可移植地工作绝对是值得的,但是对于游戏我真的只需选择一个实现并在那里磨练你的代码。你可能会将你的游戏作为每个平台的包裹分发而不是通过quicklisp对吗?

可移植性 - 跨平台

确保在每个平台上查看您首选实施的进度,可能会有微妙的问题。对我来说,我使用的是SBCL,在Windows下只支持32位,而64位仍在开发中。

包装

对于packaging Clozure apps for Apple Mac Store was posted on openmcl-devel today的一些信息,这有一些很好的时机。我还没有很好的阅读,但该主题可能会提供更多信息。

Zach Beane也提出了buildapp for SBCL

lispbuilder人员似乎也有一些info on making standalone executables

工具

cl-opengl是一个非常好的opengl包装器。它支持旧的和现代的opengl样式,因此我发现尝试提供更高级别抽象的区域有点限制(我个人避开了cl-opengl的gl-arrays)。请阅读源代码,因为那里有一些很棒的东西,特别是当你开始编写更多的cffi代码时。 {cl-opengl仍在开发中并通过quicklisp提供 - 我已经在linux和windows下愉快地使用了它}

lispbuilder-sdl非常酷,但你可能会发现控制某些方面的冲动。例如,sdl:with-events宏很棒,但可以控制主循环和时间步骤处理。这对你来说可能是完美的,但如果不是,不要害怕去挖掘并写一些更好的东西来替换这些部分!

此外,lispbuilder还提供了一系列库,因此在使用它们之前,请检查quicklisp中是否存在更新的等效项。例如,lispbuilder有lispbuilder-opengl。不要使用它,坚持使用cl-opengl。 lispbuilder再次使用lispbuilder-regex,而使用CL-PPCRE可能要好得多。

我可能不会建议使用它,但我花了一点时间回去剥离所有lispbuilder-sdl that didn’t pertain to modern opengl games(所以没有sdl软件表面等)。我不认为人们应该使用它,但它可能会给你一些想法! {lispbuilder没有大量开发,但可以通过quicklisp获得 - 我已经在linux和windows下愉快地使用了它}

同时,当我拉扯伟人编写的代码然后被我撕裂时,请参阅this video on how to recompile parts of your game whilst it is running。这不是我的技术,但确实很有效。

以上内容将要求您使用SLIMESLIMV,这意味着使用Vim或Emacs。 SLIME非常值得您花时间去看看!

总而言之,祝你好运,普通的lisp非常有趣,而你可能会发现需要一段时间来获得你喜欢的opengl工作流程,如果你有时间我毫不怀疑你会有一个美好的时光。

期待看到比赛!

答案 1 :(得分:6)

可移植性

你必须区分平台上的可移植性(例如,你的程序是在Windows上的Clozure上开发的吗?在Linux上运行吗?)和实现(例如,你的Clozure)程序在SBCL下运行?)

您需要仔细检查具体实施手册中的详细信息,但一般来说,如果您使用标准CL功能和CFFI,则不应在任何方面出现任何重大问题。

实际上,您需要检查Clozure在您感兴趣的平台上运行的程度以及CFFI是否在这些平台上支持Clozure。这些问题最好向开发人员询问,而不是在这里。

安装性

所有CL实现都以某种方式进行“产品交付”,例如,通过创建可以打包和分发的独立可执行文件。

答案 2 :(得分:2)

  

我能否轻松将其移植到其他平台   (linux / iPhone(也许)/ android)以后?

嗯,这在很大程度上取决于你选择的图书馆。

我根本没有任何Android或iOS开发经验,但我目前正在开发Common Lisp中的小项目,使用lispbuilder-sdl,cl-opengl,quicklisp等,移植没有问题它介于Linux上的SBCL和Windows上的Clozure-CL之间。

此外,至少有一个有希望的移动Common Lisp实现:https://wukix.com/mocl

所以我认为移植您的代码没有问题,只需确保您的应用程序中使用的所有库都在每个平台和Lisp实现上都有适当的支持。

  

lisp“适用于”可安装的程序吗?

大多数Lisps都能够使用嵌入式库创建独立的可执行文件。 另一方面,如果您的项目变得足够大,您将不得不编写特定于平台的安装程序,而不管可能存在与Lisp相关的问题。我怀疑与Lisp相关的部分是最复杂的。 另请查看这篇文章:Lisp Executable,并考虑分发Lisp运行时映像而不是独立可执行文件的想法。

答案 3 :(得分:2)

使用Common Lisp作为游戏运行时,已经有了很好的答案。

我只想提一下PlayStation 2游戏Jak and Daxter: The Precursor LegacyCrash Bondicoot是使用Common Lisp以稍微不同的方式开发的。

他们在Commmon Lisp中拥有自己的开发环境并制作了一种游戏语言GOAL (later GOOL),这是一种带有汇编内联的高级语言(如C __asm__)。因此,在编制最终产品时,该产品与其开发环境几乎没有关系。

他们只针对一个平台(PS2),但我想可以制作语言结构,以便您可以使用几乎相同的方法优化多个平台。制作游戏语言会抽象出实际的硬件和库差异,并使编译器的复杂性低于尝试将Common Lisp编译为例如Dalvik直接。编译器实际上不需要最终作为目标代码。它可以编译为C / Java / Objective C。

在设计语言时,通过查看某个首选目标,以及如何使包/二进制文件可以遵循目标的方式,可移植性问题成为您可以控制的内容。