【问题标题】:Running C in A Browser在浏览器中运行 C
【发布时间】:2014-11-01 00:28:17
【问题描述】:

我花了几天的时间研究这个看似简单的问题:是否可以在浏览器中运行 C 代码?基本上,我在 Appengine 中设置了一个站点,需要运行一些由(一组受信任的)用户提供的 C 代码并运行它,并将代码的输出返回给用户。我有两个选择:要么我需要在浏览器中完全运行代码,要么找到某种方法让 Python 在没有任何系统调用的情况下运行这个 C 代码。

我看到了对我的问题的不同回答。我见过像 Emscripten 这样的解决方案,但这不起作用,因为我需要在浏览器中生成 LLVM 代码(我无法在 AppEngine 中运行编译器。)我尝试了各种技术,包括从 codepad.org 上的输出页面抓取,但我将产生的输出非常高,以至于我无法使用像 codepad.org 这样的服务,因为它们会修剪输出(我的输出将是大约 20,000 行,每行约 60 个字符,已修剪由于超时而通过键盘)。我最后的办法是制作自己的服务器来处理来自我的 Appengine 站点的请求,但这似乎有点极端。

我的用户提供的代码将是非常简单的 C。他们的代码不会调用任何 I/O 或系统操作。不幸的是,我可能不能简单地在他们的代码中使用查找/替换操作将其转换为 Javascript,因为他们可能使用多维数组甚至类之类的结构。

我可以限制我的用户使用一个跨平台浏览器,例如铬或火狐。谁能帮我找到这个问题的解决方案?这几天我一直很困惑。

【问题讨论】:

  • 你能用 Emscripten 编译 LLVM 并运行它吗?
  • 是否可以纯粹使用 Javascript 将 C 编译为 LLVM?我不明白怎么做这样的事情。
  • 使用 Emscripten 编译 LLVM 编译器。
  • 看看Tiny CC:“直接编译执行C源”。也许,使用 libtcc,很容易集成到 Python 中。

标签: javascript python c google-app-engine browser


【解决方案1】:

老问题,但对于那些在 2018 年登陆这里的人来说,Web Assembly 值得一看。

【讨论】:

  • @Mawg 他来自未来
【解决方案2】:

您可能想看看Google Native Client,如上所述,它是一个沙箱,用于在浏览器中高效、安全地运行编译的 C 和 C++ 代码,独立于用户的操作系统,允许基于 Web 的应用程序以接近本机的速度运行。 它还使用代码验证器来防止使用不安全的指令,例如执行系统调用的指令。 Native Client 提供定制版本的 GNU 工具链,特别是 GCC 和 binutils 以及 LLVM。

除了官方给出的链接,你可以看看Wikipedia article on Google NaCL,里面有更多有用的信息。

【讨论】:

  • 注意弃用:wasm 发生了
【解决方案3】:

这是令人震惊的邪恶,但您也许能够使用 emscripten 编译 cint C/C++ 解释器。这将为您提供一个仅浏览器的环境,可以(缓慢地)解释 C 或 C++ 程序。

不幸的是,cint 声称支持将解释代码与预编译代码混合。这意味着它会想做一些 emscripten 不支持的事情,所以你必须破解它。

如果您愿意限制自己使用 Chrome,您可能会发现通过 NaCL 插件系统编译 cint 更容易,因为这意味着您可以使用真正的 x86 工具链。但这不会让您使用真正的编译器; NaCL 不允许动态生成机器代码,因此像 tcc 这样的系统将无法工作。不过,cint 可能更容易在这个平台上移植。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2012-04-12
    • 2011-10-26
    • 1970-01-01
    • 2015-03-21
    • 2019-01-23
    相关资源
    最近更新 更多