当前位置:  开发笔记 > 编程语言 > 正文

链接语言

如何解决《链接语言》经验,为你挑选了4个好方法。

我之前问了一个问题,关于用于AI原型的语言.共识似乎是,如果我想要它快,我需要使用像Java或C++这样的语言,但Python/Perl/Ruby对接口位有好处.

所以,这引出了另一个问题.将这些语言链接在一起有多容易?哪种组合效果最好?那么,如果我想要一个调用C++或Java AI函数的Ruby CGI类型程序,那么这很容易吗?我在哪里寻找有关做这类事情的信息的指针?或者不同的组合会更好吗?

我编写Web应用程序的主要经验是从C++ CGI开始,然后转移到Java servlet(大约10年前),然后经过长时间的编程后,我做了一些PHP.但是我没有使用脚本语言编写Web应用程序的经验,然后编写了一个编译语言来获取速度关键位.所以欢迎任何建议!



1> Pieter..:

Boost.Python提供了一种将C++代码转换为Python模块的简便方法.它相当成熟,在我的经验中运作良好.

例如,不可避免的Hello World ......

char const* greet()
{
  return "hello, world";
}

可以通过编写Boost.Python包装器来暴露给Python:

#include 

BOOST_PYTHON_MODULE(hello_ext)
{
  using namespace boost::python;
  def("greet", greet);
}

而已.我们完成了.我们现在可以将其构建为共享库.现在可以看到生成的DLL.这是一个Python会话示例:

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

(来自boost.org的例子)



2> Ryan Ginstro..:

首先,一个元评论:我强烈建议用高级语言对整个事物进行编码,像疯了一样进行分析,并仅在分析显示必要时进行优化.首先优化算法,然后是代码,然后考虑引入重铁.如果您需要在较低级别的语言中重新实现,拥有最佳算法和干净的代码将使事情变得更加容易.

对于Python来说,IronPython/C#可能是最简单的优化路径.

使用C++的CPython是可行的,但我发现C更容易处理(但并非一切都那么简单,是C).两个缓解这个的工具是cython/pyrex(用于C)和shedskin(用于C++).这些将Python编译成C/C++,从那里你可以访问C/C++库而不需要太多麻烦.

我从未使用过jython,但我听说jython/Java优化路径并不是那么糟糕.



3> 小智..:

我同意首先使用Python,Profiling等高级语言进行编码,然后实现任何需要在C/C++中加速并将其包装在高级语言中的代码.

作为boost的替代方案,我想建议SWIG从C创建Python可调用代码.它使用起来相当轻松,并且将为各种语言编译可调用模块.(Python,Ruby,Java,Lua.仅举几例)来自C代码.

包装过程是半自动化的,因此无需向基本C代码添加新功能,从而使工作流程更加顺畅.



4> Brad Gilbert..:

如果选择Perl,则有足够的资源来连接其他语言.

Inline :: C
Inline :: CPP
Inline :: Java

来自Inline :: C-Cookbook:

use Inline C => <<'END_C';

  void greet() {
    printf("Hello, world\n");
  }
END_C

greet;

使用Perl 6,使用NativeCall从本机库代码导入子例程变得更加容易.

use v6.c;

sub c-print ( Str() $s ){
  use NativeCall;

  # restrict the function to inside of this subroutine because printf is
  # vararg based, and we only handle '%s' based inputs here

  # it should be possible to handle more but it requires generating
  # a Signature object based on the format string and then do a
  # nativecast with that Signature, and a pointer to printf

  sub printf ( str, str --> int32 ) is native('libc:6') {}

  printf '%s', $s
}

c-print 'Hello World';

这只是一个简单的例子,您可以创建一个具有Pointer表示的类,并且某些方法是您正在使用的库中的C代码.(仅当C代码的第一个参数是指针时才有效,否则你必须将它包装起来)

如果您需要Perl 6子例程/方法名称不同,则可以使用is symbol特征修饰符.

Perl 6也有Inline模块.

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有