加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 使用内联:: CPP与SWIG – 何时?

发布时间:2020-12-16 06:27:54 所属栏目:大数据 来源:网络整理
导读:在 this问题中,我看到了两个不同的答案,如何直接调用用C编写的函数 Inline::CPP(以及更多,如Inline :: C,Inline :: Lua等…) SWIG 手工制作(如daxim所说 – 大多数模块都是手写的) 我只是浏览了SO标签[perl] [swig]中的几乎所有问题,以便找到下一个问题的答
在 this问题中,我看到了两个不同的答案,如何直接调用用C编写的函数

> Inline::CPP(以及更多,如Inline :: C,Inline :: Lua等…)
> SWIG
>手工制作(如daxim所说 – 大多数模块都是手写的)

我只是浏览了SO标签[perl] [swig]中的几乎所有问题,以便找到下一个问题的答案:

>使用(选择)SWIG和Inline :: CPP或手写的主要区别是什么?
>何时是“良好做法” – 推荐使用Inline :: CPP(或内联:C)以及何时推荐使用SWIG或手写?

在我考虑它时,使用SWIG对于其他用途更为普遍,例如in this question和Inline :: CPP是特定于perl的.但是,从perl的角度来看,这里有一些(任何)重大差异吗?

解决方法

我没有使用过SWIG,所以我不能直接对它说话.但我 pretty familiar与 pretty familiar.

如果您想编写可编译的C代码并从Perl中调用,Inline :: CPP可以实现此目的.只要C代码没有改变,它应该只编译一次.如果你将模块基于Inline :: CPP,代码将在模块安装时编译,因此另一个用户从未真正看到第一次编译延迟;它发生在安装时,就在测试阶段之前.

Inline :: CPP并非100%免于可携带性.目标用户必须具有与用于构建Perl的C编译器类似的C编译器,并且C标准库应该是与Perl生成二进制兼容代码的版本. Inline :: CPP与CPAN测试人员的成功率大约为94%.而那些最后6%几乎总是归结为安装过程的问题,而不是正确解密使用的C编译器和库. ……而那些,通常归结为图书馆.

让我们假设您作为模块作者发现自己在95%的人中安装了Inline :: CPP没有问题.如果您知道目标受众将属于同一类别,那么基于Inline :: CPP生成模块很简单.你基本上必须添加一些指令(VERSION和NAME),并将你的Makefile.PL的ExtUtils :: MakeMaker调用换成Inline :: MakeMaker(它将调用ExtUtils :: MakeMaker).在创建发行版时,您可能还需要CONFIGURE_REQUIRES指令来指定当前版本的ExtUtils :: MakeMaker;这可确保您的用户获得更清晰的安装体验.

现在,如果您正在创建一般消费模块,并且不知道您的目标用户是否适合94%多数人可以使用Inline :: CPP,那么最好不要删除Inline :: CPP依赖项.您可能希望这样做只是为了最小化依赖链;它对你的用户来说更好.在这种情况下,编写代码以使用Inline :: CPP,然后使用InlineX :: CPP2XS将其转换为普通的旧XS模块.您的用户现在可以在没有首先拉入Inline :: CPP的过程的情况下进行安装.

C是一种大型语言,Inline :: CPP处理它的一大部分.注意typemap文件以确定可以自动传递(和转换)哪些类型的参数,以及使用“guts和API”调用更好地处理哪些类型.我不建议使用的一个功能是自动字符串转换,因为它会产生Unicode不友好的转换.最好通过API调用显式处理字符串.

Inline :: CPP未正常处理的C部分是模板元编程.您可以在代码中自由使用模板,并可以免费使用STL.但是,您不能简单地传递STL类型参数,并希望Inline :: CPP知道如何转换它们.它处理POD(基本数据类型),而不是STL的东西.此外,如果您编写基于模板的函数或对象方法,C编译器将不知道Perl计划调用该函数的上下文,因此它不知道在编译时应用于模板的类型.因此,直接暴露给Inline :: CPP的函数和对象方法需要是普通函数或方法;不是模板函数或类.

只要您知道会发生什么,实践中的这些限制就不难解决.如果要将模板类直接暴露给Inline :: CPP,只需编写一个包装类,该类继承或组合模板类,但为Inline :: CPP提供一个具体类型.

Inline :: CPP在为现有C库自动生成函数包装器时也很有用.文档说明了如何做到这一点.

Inline :: CPP优于Swig的优势之一是,如果您已经拥有perlguts,perlapi和perlcall的一些经验,那么您将感到宾至如归.使用Swig,您必须首先学习Swig的处理方式,然后弄清楚如何将其应用于Perl,以及如何以CPAN可分发的方式执行此操作.

使用Inline :: CPP的另一个好处是它在Perl社区中是一个有点熟悉的工具.您将找到更多了解Perl XS,Inline :: C以及某种程度上Inline :: CPP的人,而不是您会发现使用Swl和Perl的人.虽然XS可能会很乱,但与使用Perl和Swig相比,这是一条走得更远的道路.

Inline :: CPP也是inline@perl.org邮件列表中的常见主题.除了我自己之外,Inline :: C的维护者和其他几个Inline家庭维护者经常使用这个列表,并尽最大努力帮助那些需要使用Inline系列模块的人.

您可能还会发现my Perl Mongers talk on Inline::CPP对于探索它如何适用于您有用.此外,Math::Prime::FastSieve作为基于Inline :: CPP(具有Inline :: CPP依赖性)模块的概念验证.此外,Rob(sisyphus),当前的Inline维护者,以及InlineX :: CPP2XS的作者实际上已经在InlineX::CPP2XS发行版中包含了一个示例,它使用我的Math :: Prime :: FastSieve并使用他的InlineX将其转换为普通的XS代码:: CPP2XS.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读