【问题标题】:Want to use native C libraries in a web application, what are my options?想在 Web 应用程序中使用本机 C 库,我有哪些选择?
【发布时间】:2012-10-10 09:55:03
【问题描述】:

我有许多用于数值分析和科学计算(例如模拟)的遗留 C 库,我想在我正在构建的 Web 应用程序中使用它们(到目前为止,我只使用 Javascript 来制作用户界面)。在客户端和/或服务器端执行此操作有哪些选择?我听说过将原生客户端与 chrome 一起使用,但我不喜欢客户端必须打开原生客户端标志才能执行此操作。

【问题讨论】:

  • 问题是“数值分析和科学计算”应该放在哪里——在客户端还是服务器端?您在 Web 应用程序中有这样的选择。但是,如果您希望他人对您有所帮助,您应该向其他人提供有关该应用的更多详细信息。
  • 将 C 代码称为“遗留”可能不会在追随 c 标签的人中赢得粉丝,除非您只是说它是用旧/坏风格编写的 C 代码(如全局变量,#ifdef 地狱,不可移植的构造和未定义的行为等)

标签: c++ c html web-applications libraries


【解决方案1】:

服务器端

首先,CGI(通用网关接口)是能够在 Web 应用程序中使用本机 C 库的最基本方法 - 其中您委托一个可执行文件(例如用 C 编写)来生成服务器端 Web 内容。

但是 CGI 非常原始且效率低下。每个命令都可能导致在服务器上创建一个新的Process。因此,这里有其他可行的替代方案:

  1. Apache 模块让您可以在 Web 服务器本身内运行第三方软件。
  2. FastCGI - 单个进程处理多个用户请求。
  3. SCGI - 简单的 CGI

参考:http://en.wikipedia.org/wiki/Common_Gateway_Interface#Alternatives

客户端

好消息和坏消息:

您可以在 chrome 中使用 PNaCl(便携式本机客户端)。它默认开启。
但是第一个公开版本预计会在 2013 年底发布。Look for PNaCl

【讨论】:

  • CGI 的低效率被高度夸大了;在现代系统上,启动一个新进程所花费的时间与打开、读取和关闭一个中等大小的文件(就像您可能在 Web 服务器上提供服务的文件一样)所花费的时间大致相同。这比大多数脚本语言解释器/运行时的开销要少得多。
  • 但我仍然认为 - 大量请求会同时导致 大量 进程 - 这可能会对服务器造成一些真正的压力。
  • 我会在做出假设之前进行测试。根据我的经验,thttpd 提供的外部 CGI(甚至运行 perl 解释器)比 Apache 中的 mod_perl 快一个数量级。
  • 罗杰那;首先测试 - 听起来不错 - 但无论如何 - FastCGI,其中同一进程持续运行很长时间以处理多个请求,应该克服这个限制。
  • 我想在这里补充一点,我基于 node.js 的服务器也有一种调用服务器端进程的好方法。
【解决方案2】:

您不能在客户端做太多事情 - 您无法期望客户端拥有这些库,也没有安全的方式来下载和运行它们。

最简单的方法是根据需要编写服务器端,并通过 Web 界面访问它们。许多通常用于服务器端脚本的语言都可以访问本机 C 库,或者您甚至可以编写普通的 C 应用程序并将它们作为脚本代理运行。

在“非常奇特”类别中,可以在客户端运行以 C 代码开头的内容 如果您将其嵌入到受充分保护的环境中。例如,看描述 sqlite(一个 C 数据库应用程序)是如何变成一个 100% 纯 Java 应用程序的 嵌入一​​个用java编写的mips模拟器。

http://blog.benad.me/2008/1/22/nestedvm-compile-almost-anything-to-java.html

【讨论】:

    【解决方案3】:

    看过Wt了吗?它非常整洁。

    您还可以选择用 cgi 编写代码(丑陋)。

    虽然不是 C,但它是用 C++ 编写的。如果你可以忽略那部分:Wt at your service

    【讨论】:

      【解决方案4】:

      要在客户端执行此操作,您可以使用Emscripten。但是,这很可能需要对现有代码进行一些重构以适应 JavaScript 的异步主循环要求。

      请注意,Emscripten 不是概念证明或类似的东西。它非常强大,并且已经用于将复杂的代码移植到网络上。您可以查看演示(在上面的 URL 中列出),看看可以用它做什么。

      【讨论】:

        【解决方案5】:

        听起来您最好将遗留的 C 库方法表示为服务器端的一种 (WEB) 服务。对于这种方法来说,原始 CGI 应用程序似乎是一个相当低级的点,但通常是正确的。 有 C/C++ 框架可用于创建 Web 服务服务器,以及支持 Web 服务访问和数据表示的客户端库。例如,对于服务器端,您可以使用 gSoap

        【讨论】:

          【解决方案6】:

          另一种可能性是使用您选择的网络服务器来传输普通文件并使用连接到您的 C 代码的自定义网络服务器(不需要支持完整的 HTTP 规范)与客户端 Javascript 进行通信。

          您可以用作基础的两个最小网络服务器是 libuv-webservernweb

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-08-24
            • 1970-01-01
            • 1970-01-01
            • 2011-03-31
            • 1970-01-01
            • 1970-01-01
            • 2011-01-31
            相关资源
            最近更新 更多