在 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++ 代码中运行算法?的主要内容,如果未能解决你的问题,请参考以下文章