【问题标题】:Can I use C as a scripting language for my engine?我可以使用 C 作为我的引擎的脚本语言吗?
【发布时间】:2011-08-31 19:35:13
【问题描述】:

我现在有一个游戏引擎,我正在为它寻找一种脚本语言。我尝试了 Lua,发现它非常好,但我想让我的脚本看起来像 C 或更好的 C++,或者看起来像虚幻引擎的脚本会更好。

这可能吗?

【问题讨论】:

  • 为什么要使用像 C 这样的语言作为脚本语言?您真的希望您的用户必须处理内存管理、低级字符串处理等吗?
  • (几乎)一切皆有可能。但是,如果您的要求与其他人已经构建并可供您使用的内容相差太大,您可能必须构建自己的解释器。
  • 相关链接:bellard.org/tcc
  • 您想要 C 还是类似 C 的语法? JavaScript 看起来有点像 C 语言,并且作为一种脚本语言非常成熟。
  • @detly 提出了一个非常好的观点。如果你想嵌入一个非常高效的 JS 解释器,请检查Google V8

标签: c scripting lua


【解决方案1】:

当然可以:P 如果你愿意,你可以做任何事情。

我目前看到这三种方式:

  • 要么自己编写代码来解析 C/C++ 代码,这确实不是一件容易的事
  • 您使用分析和解释 C 代码的解析器。 Ch Standard edition 应该可以解决问题,因为它可以作为脚本语言包含在自己的项目中。
  • 另一种方法是创建一个脚本,将用户生成的代码动态编译到一个共享库中,该共享库由您的引擎动态加载。虽然这不再是“脚本”了。

【讨论】:

  • 第三个选项的优点是比真正的脚本语言快很多(前提是不重复编译)。
  • 在游戏中使用脚本语言的全部原因在于它很容易在脚本引擎中编写代码,并且可以轻松调整(最好在运行时进行,这样可以节省大量调试时间)。 C/C++ 根本不符合这个要求。
  • @bitmask,罗伊 T:是的。但是为什么你们要在我的回复中添加这条评论而不是 OP 的问题呢?
  • 因为我不喜欢只说“嘿,这是另一个人说的;我只是为了虚假的名声而重复它!”的答案。这是你的答案,不是我的——我只是想帮助 OP 决定你的哪些建议最适合给定的要求。
  • @bitmask:对不起,这不应该是冒犯,我只是想知道。根据我的回复,实际上并没有真正理解。
【解决方案2】:

Metalua 是基于 Lua 代码库的语言实现系统,它公开了各种语言内部结构,例如解析器 (gg/mlp),因此允许您扩展语言或完全更改语法。想想 yacc 和 Lispy 元循环解释器之间的交叉。

我不太清楚您使用看起来像 C 或更好的 C++ 的目的是什么,但我认为这听起来是正确的,并且在实现简单性和灵活性之间提供了很好的平衡。 p>

【讨论】:

    【解决方案3】:

    就像@Charles 所说的那样,如果您想要一些易于实现且具有灵活性的东西,请使用 Metalua。如果您想要一种类似 C 的脚本语言,您可以尝试 ECMAScript 或其任何超集(JavaScript、JScript、ActionScript)。

    【讨论】:

      【解决方案4】:

      有许多脚本语言或多或少具有类似 C 的语法。其他人已经提到过 ECMAScript,另一个选择是 s-lang,它被设计为一种脚本语言,易于嵌入,并且语法非常接近 C。

      【讨论】:

      • 在我看来,ECMAScript 是要走的路。有可靠的引擎可用。我不知道 V8 的许可证,但如果你能使用它,你的状态就会很好。
      【解决方案5】:

      检查 AngelScript、GameMonkey,还有很多其他的

      http://codeplea.com/game-scripting-languages

      或者,也许可以将 CINT C/C++ 解释器 (http://root.cern.ch) 与 ROOT 库集成在一起。这个想法是您将解释您正在积极处理的所有 .c/.cpp 文件,而其余的则被编译(您的选择)。

      例如,您是音频程序员,您希望其余的非音频代码非常快,而您正在积极工作的东西不是这样,而是要快速迭代 - 热加载,更改飞等。

      此外,CINT 解释器具有额外的动态语言工具 - 您可以自省(反射) - 允许您创建例如序列化程序来打包您的游戏资产,或者您可能需要的任何东西。

      还有 UnderC、Ch(如前所述)和许多其他...

      【讨论】:

        【解决方案6】:

        TCC 有一个库,允许动态编译 C 代码,并且看到它作为 C 编译器非常快,它可以用来(几乎)即时编译东西,有一个非常基本的例子here,但是标题中的 TCC 文档在解释内容方面要好得多。

        它还带有一个自己的better example,它展示了如何在使用 libtcc 时向编译器公开符号,如果您禁用编译器的某些部分(主要是导入其他外部库),这可以让您对脚本进行沙箱处理比安全列表中的那些),这是可能的,因为它完全开源并且不是复杂,它有一些关于其内部结构的基本文档。

        【讨论】:

        • TCC 是一个很好的概念证明,但它没有被广泛采用,现在它似乎是废弃软件。很遗憾,但这可能不是解决提问者问题的好方法。
        • @CharlesStewart:TCC 邮件列表仍然有效,一些 CVS 分支也是如此,今年 2 月也发布了一个新版本。真正的重点是它体积小、使用简单且速度快。
        • 哦,我很高兴听到这个消息。几年前还没有最新版本,而我在编译旧版本时遇到了麻烦。我再看看。
        猜你喜欢
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 2015-12-20
        • 1970-01-01
        • 2012-12-26
        • 1970-01-01
        • 2012-07-12
        • 2016-04-15
        相关资源
        最近更新 更多