因此,假设我有一个包含一些 C 代码的字符串,可以预测地从一个文件中读取,该文件中除了普通的 C 代码之外还有其他内容。我如何将此字符串转换为程序可用的代码?我是否必须编写一个完整的解释器,或者是否有一个库已经为我完成了这项工作?有问题的代码可能会调用我在实际 C 文件中声明的子例程,因此仅考虑常用 C 命令的子例程可能不起作用。
2 回答
哇。对于 C,这实际上非常困难。
你基本上有几个选择:
解释代码
为此,您将不得不编写一个解释器,而解释 C 是一个相当困难的问题。过去有可用的 C 解释器,但我最近没有读到过。无论如何,除非你真的真的需要这个,否则编写自己的解释器是一个大工程。
谷歌搜索确实显示了几个开源(部分)C 解释器,比如picoc
编译并动态加载
如果您可以捕获代码并将其包装成句法完整的 C 源文件,那么您可以将其编译为 C 动态可加载库:Windows 中的 DLL,或更多 UNIX 变体中的 .so。然后你可以在运行时加载结果。
现在,通常会导致某人这样做是需要能够表达一些复杂的脚本功能。您是否考虑过使用不同语言的可能性?Python、Scheme (guile) 和 Lua 很容易作为脚本语言添加到 C 应用程序中。
C 没有这种性质。这是因为 C 是编译的,并且编译器需要在代码开始运行之前对代码进行大量构建(因此接收一个字符串作为输入),它不能真正轻松地即时更改。编译语言对它们具有刚性,而解释语言具有灵活性。
您正在考虑 Perl、Python PHP 等以及所谓的“第四代语言”。我确信在 cs 中有一个技术术语来表示这种灵活性,但 C 没有它。如果您有一项需要大量使用这种字符串的任务,则需要切换到其中一种语言(并放弃性能)。/e
例如,用正则表达式检查 Perl 的标志。
在 C 中,您需要设计您的应用程序,因此您不需要这样做。这通常是非常可行的,因为它的非面向对象和其他缺陷,许多巨大、复杂的应用程序在编写良好的 C 上运行得很好。