【问题标题】:Common lisp: portabilityCommon lisp:可移植性
【发布时间】:2013-08-01 10:32:16
【问题描述】:

问题

如果我在 windows 上使用 clozure cl 在 common lisp(使用:lispbuilder-sdl、quicklisp、cffi)中制作 2d 游戏,我是否能够轻松将其移植到其他平台(linux/ iPhone(也许)/安卓)稍后? lisp “适合”安装程序吗?

信息

  1. 游戏将使用 OpenGL 绘制图形。很可能它将使用 sdl 进行输入/opengl 初始化,并使用 sdl 或 openal 进行音频。以后可能会使用我自己的库而不是 sdl。
  2. 为 cffi 编写几个 C++ 库(以“可移植”方式包装功能)不是问题。

推理

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

--编辑--

其他信息

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

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

【问题讨论】:

  • 我猜这取决于使用的库。如果它们也在其他操作系统下提供,问题应该出在哪里?应该与任何其他语言相同:保持给定的标准,检查使用的库是否被移植并且仍然提供相同的接口。不过,您的第二个问题非常模糊。 “合适的”和“可安装的程序”是什么意思?
  • “更强大”?比在 C++ 中?嘿,你确定你试过了吗?;)
  • @MichaelIV:7 年的经验应该足够了。
  • @Sim:我不确定当我尝试将完成的程序转换为可安装包时,CFFI + quicklisp 的效果如何。
  • 根据我的经验,common lisp 非常便携。

标签: opengl common-lisp portability


【解决方案1】:

便携性

您必须区分跨平台(例如,您在 Windows 上的 Clozure 下开发的程序是否可以在 Linux 上运行?)和跨实现(例如,您的 Clozure在 SBCL 下运行的程序?)

你需要仔细查看具体实现手册中的细节,但一般来说,如果你使用标准的 CL 功能加上 CFFI,你应该不会在任何一个方面遇到任何重大问题。

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

可安装性

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

【讨论】:

    【解决方案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】:

      ** 注意:对不起,如果我在这篇文章中陈述了明显的内容,我不确定你是否熟悉 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。这不是我的技术,但效果很好。

      以上要求您使用SLIME 或SLIMV,这意味着使用Vim 或Emacs。 SLIME 真的值得你花时间去看看!

      总而言之,祝你好运,开发 common lisp 非常有趣,虽然你可能会发现需要一段时间才能获得你喜欢的 opengl 工作流程,如果你有时间,我相信你会拥有一个美好的时光。

      期待看到比赛!

      【讨论】:

      【解决方案4】:

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

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

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

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

      然后,可移植性问题就变成了您可以控制的事情,通过在设计语言时查看一些首选目标以及如何制作包/二进制文件可以遵循目标的方式。

      【讨论】:

        猜你喜欢
        • 2017-02-12
        • 1970-01-01
        • 1970-01-01
        • 2013-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多