我花了几天时间研究这个看似简单的问题:是否有可能在浏览器中运行C代码?基本上,我在Appengine中设置了一个站点,该站点需要运行由(一组可信的)用户提供的一些C代码并运行它,并将代码的输出返回给用户。我有两个选项:我要么需要在浏览器中完全运行代码,要么找到一些方法让Python运行这个C代码而不需要任何系统调用。
我的问题反应不一。我已经看过像Emscripten这样的解决方案,但这不起作用,因为我需要在浏览器中生成LLVM代码(我无法在AppEngine中运行编译器。)我'我尝试了各种技术,包括从codepad.org上的输出页面抓取,但我将生成的输出是如此之高,以至于我无法使用像codepad.org这样的服务,因为它们会削减输出(我的输出将是~20,000行约60)每个字符,由于超时而被键盘修剪)。我的最后一招是制作我自己的服务器,可以提供我的Appengine网站的请求,但这似乎有点极端。
我的用户提供的代码非常简单C.他们的代码没有调用I / O或系统操作。不幸的是,我可能不能简单地在代码中使用查找/替换操作将其转换为Javascript,因为它们可能使用多维数组甚至类的结构。
我可以将用户限制在一个跨平台的浏览器中,例如: Chrome或Firefox。任何人都可以帮我找到这个问题的解决方案吗?我好几天都被困惑了。
答案 0 :(得分:6)
古老的问题,但是对于那些在2018年登陆这里的人来说,值得一看的是Web Assembly。
答案 1 :(得分:1)
您可能需要查看Google Native Client,如上所述,它是一个沙箱,用于在浏览器中高效,安全地运行已编译的C和C ++代码,独立于用户的操作系统,允许基于Web的应用程序以接近原生的速度运行。 它还使用代码验证程序来防止使用不安全的指令,例如执行系统调用的指令。 Native Client提供GNU工具链的自定义版本,特别是GCC和binutils以及LLVM。
除了给出的官方链接外,您还可以查看Wikipedia article on Google NaCL,其中包含更多有用信息。
答案 2 :(得分:0)
这是令人震惊的邪恶,但你可以能够使用emscripten编译cint C / C ++解释器。这将为您提供一个仅限浏览器的环境,可以解释(缓慢)C或C ++程序。
不幸的是,cint声称支持将解释代码与预编译代码混合。这意味着它会想要做一些emscripten不支持的事情,所以你不得不破解它。
如果您愿意限制自己使用Chrome,您可能会发现通过NaCL插件系统编译cint更容易,因为这意味着您可以使用真正的x86工具链。但这不会让你使用真正的编译器; NaCL不允许动态生成机器代码,因此像tcc这样的系统不会起作用。但是,cint可能更容易在这个平台上移植。