想在Web应用程序中使用本地C库,我的选项有哪些?

4

我有许多用于数值分析和科学计算(如模拟)的遗留C库,我想在正在构建的Web应用程序中使用它们(到目前为止,我只使用JavaScript来制作用户界面)。在客户端和/或服务器端执行此操作的选项是什么?我听说可以在Chrome上使用本地客户端,但我不喜欢客户端必须开启本地客户端标志来完成此操作。


问题是“数值分析和科学计算”应该放在客户端还是服务器端?在Web应用程序中,您有这样的选择。但是,如果您希望他人帮助您,您应该提供更多关于应用程序的详细信息。 - Stan
称呼C代码为“遗留代码”可能不会在那些关注c标签的人中赢得你的粉丝,除非你只是指它是以旧/糟糕的风格编写的C代码(例如全局变量、#ifdef混乱、不可移植的结构和未定义行为等)。 - R.. GitHub STOP HELPING ICE
6个回答

4

服务器端

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

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

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

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

客户端

好消息和坏消息:

您可以在Chrome浏览器中使用PNaCl(便携式本机客户端)。它将默认启用。
但是,第一个公开发布版本预计在2013年底寻找PNaCl


CGI的低效性被高度夸大了;在现代系统上,启动一个新进程所需的时间大致与打开、读取和关闭一个中等大小的文件(比如你可能在Web服务器上提供的文件)相当。这比大多数脚本语言解释器/运行时的开销要小得多。 - R.. GitHub STOP HELPING ICE
但我仍然认为 - 大量的请求将导致同时进行很多进程 - 这可能会对服务器造成一些真正的压力。 - Ujjwal Singh
在做出假设之前,我会进行测试。根据我的经验,在thttpd上运行外部CGI(甚至是运行perl解释器)比Apache中的mod_perl快一个数量级。 - R.. GitHub STOP HELPING ICE
明白;先进行测试听起来不错,但无论如何,FastCGI可以解决这个问题,它允许同一个进程长时间运行以处理多个请求,应该能够克服这个限制。 - Ujjwal Singh
我想在这里补充一点,即基于Node.js的服务器也有一个不错的调用服务器端进程的方式。 - user1027169

1

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

最简单的方法是编写你想要的服务器端,然后通过 Web 接口访问它们。许多用于服务器端脚本编写的语言可以访问本地 C 库,或者你甚至可以编写普通的 C 应用程序并将其作为脚本代理运行。

在“非常奇特”的类别中,如果你将其嵌入到足够受保护的环境中,就可以在客户端上运行起始为 C 代码的内容。例如,查看如何通过嵌入在 Java 中编写的 MIPS 模拟器,将 SQLite(一种 C 数据库应用程序)制作成 100% 纯 Java 应用程序的描述。

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


0

你看过 Wt 吗?它非常不错。

此外,你还可以选择使用 cgi(丑陋)进行编码。

虽然不是 C 语言,但它是用 C++ 编写的。如果你可以忽略这一点:Wt at your service


0

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

请注意,Emscripten不是概念验证或类似的东西。它非常强大,并已用于将复杂的代码移植到Web上。您可以查看演示文稿(列在上面的URL中)以了解可以使用它完成什么。


0

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


0
另一种可能性是使用您选择的Web服务器传输普通文件,并使用一个自定义的Web服务器(不需要支持完整的HTTP规范)连接到您的C代码,以与客户端Javascript进行通信。
您可以使用两个最小的Web服务器作为基础:libuv-webservernweb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接