在 Java/PHP/Python 框架内的编译 C/C++ 代码中运行算法?

Posted

技术标签:

【中文标题】在 Java/PHP/Python 框架内的编译 C/C++ 代码中运行算法?【英文标题】:Running algorithms in compiled C/C++ code within a Java/PHP/Python framework? 【发布时间】:2012-08-19 18:27:10 【问题描述】:

偶尔,我遇到过涉及使用 Java、php 或 Python 创建应用程序框架或网站的编程技术,但当需要复杂算法时,可以使用 C 或 C++ 编写这些算法,并在您的内部将它们作为类似 API 的函数调用运行Java/PHP/Python 代码。

我一直在网上搜索和搜索这个,除非我不知道这种做法的名称,否则我似乎找不到任何东西。

简单来说,我该怎么做:

    用 C 或 C++ 创建函数或类 将它们编译成 DLL/二进制/某种形式 从 - Java PHP Python 我怀疑必须在 Java/PHP/Python 和 C/C++ 函数之间创建类似 JSON/XML 的输出和输入,以便轻松桥接数据,但这没关系。

我只是不确定如何使用这种技术,但它似乎是一种非常聪明的方法,可以利用 Java、PHP 和 Python 的强大功能,同时利用非常快速的编程语言进行大型, 复杂的任务。

另一个想法是,如果我在 Java/PHP/Python 中仅使用文字创建函数,它会不会和 C 一样快?

我希望使用 C/C++ 处理的具体任务是大规模循环、ping 数据库和分析地图。还没有开始工作,现在都是理论。

【问题讨论】:

听起来像是通过使用多种语言进行的微优化,最终实际上导致了一个难以维护且复杂的应用程序。我不确定 PHP 中的哪些框架用 C/C++ 编写了一些函数 您可以使用 C/C++ 扩展 Python:docs.python.org/extending/extending.html 这些语言都提供了调用本机代码的方法,只是接口不同。但是,在绝大多数情况下,用脚本语言“本地”编写所有功能通常就足够了。 【参考方案1】:

您可以使用 Boost.Python 轻松地使用自定义 C++ 代码扩展 python 脚本,有关详细信息,请参阅此网站:http://www.boost.org/doc/libs/1_50_0/libs/python/doc/

你可以这样使用它:

char const* greet()

   return "hello, world";


#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)

    using namespace boost::python;
    def("greet", greet);

你需要把它编译成一个共享库。您将在 Windows 上获得一个 .dll,在 Linux 上获得一个 .so。该库将包含必要的代码以使其可用于 python。使用示例:

>>> import hello_ext
>>> print hello_ext.greet()
hello, world

这里有更多示例:http://www.boost.org/doc/libs/1_50_0/libs/python/doc/tutorial/doc/html/index.html

在使用 Boost.Python 时,如果您不使用弱动态链接,请记住将您的共享对象链接到 python。 PHP 和 Java 也有类似的情况。

至于其他语言,我从未在 Java 中使用自定义共享库,但在 PHP 中使用过,而且使用本机 Api 很痛苦。我发现使用swig 更愉快。

【讨论】:

感谢 SWIG 的提示,我会调查的。看起来 SWIG 准确地回答了我的问题【参考方案2】:

尽管我同意 cmets(你可能会这样做是为了好玩,但对于商业来说这是个坏主意)你可能会对这个 similar question 感兴趣。提到的SWIG framework 支持 你提到的所有语言。我在一个包含大量遗留 C 代码的项目中使用它。不是很简单,但非常强大。

【讨论】:

【参考方案3】:

对于Java,你可以搜索JNI(Java Native Interface),有很多指南告诉如何使用它。

【讨论】:

【参考方案4】:

与其他提议的解决方案略有不同,您可以查看Gearman

基本上,它是一个经纪人系统。您有工作人员,在您的情况下可以用 C 编写,您可以从您的 python / php / java / w/e 代码委派任务。

重点是您将两个应用程序解耦(如果您用另一种语言重写您的应用程序,您可能会减少工作量,因为您只需要让应用程序与 Gearman 对话)。

不好的是,我认为您会增加开销,这可能会使性能提升无关紧要。

【讨论】:

以上是关于在 Java/PHP/Python 框架内的编译 C/C++ 代码中运行算法?的主要内容,如果未能解决你的问题,请参考以下文章

在Django rest框架中过滤给定距离内的用户

UIPopoverController 内的移动框架

如何在类成员函数内的 printf 中获得编译警告

在虚拟机内的 nfs 共享目录中编译时执行格式错误

python重点串讲

编译时内的模板参数展开for循环?