不同系统(C#/Python/IronPython/Jython/C++)之间的技术整合


在python-cn讨论组看到某人咨询架构设计,心痒回复了一下,有点价值。放在这里大家共享一下。

Python的解释器可谓相当的丰富了,CPython,Jython,IronPython,他们分别可以以非常简单的方式与C,Java以及.NET调用, 但是它们也有严重的缺点—-他们都是单独的解释器,因此想把他们共同使用就比较麻烦了.

    最近工作上遇到这样的场景, 现有的代码中大部分代码是使用C#写的,考虑到性能以及工作量的问题, 这部分代码必须可以用上; 由于别人提供的工具中, 有大量Jython的代码, 这部分代码也不可能重写; 后续代码可能涉及到部分硬件相关代码,可能需要使用C/C++进行扩展编写; 最后后续的代码希望使用Python, 以保证开发的效率以及灵活性.  这样就遇到难题了, 如何保证这些不同语言编写的代码在同一个工程中使用呢?

    我也做了一些尝试,但是结果都不是非常理想:

        CPython: 1,使用C/C++标准扩展的方式重新将C#编写的.NET组件包装之后, 编译可以通过, 但是实际调用的时候会显示找不到目标, 使用ctypes调用用C/C++包装之后的.NET组件,报Windows Error错误, 网上随便搜索了下, CPython想使用.NET组件是个非常复杂的问题; (其实在这里我并不是非常理解C#编译成为DLL之后调用过程是怎么样的, 因为理论上C#也是一个解释型的语言, 他的执行过程是不是需要什么依赖呢? 在这里我做的实验是非常简单:使用C#实现一个类,里面有一个static method, 在C/C++的文件中调用C#中实现的static method编译为PYD文件给Python调用—-也许是我的调用逻辑有问题)

        2,同时CPython想使用Java代码比较繁琐. 

        Jython: 不支持ctypes, 使用C/C++代码相对繁琐, 与.NET组件的调用也比较繁琐, 同时Python的支持版本很低, 貌似开发进度比较不给力啊…..

        IronPython: C/C++标准扩展无法在IronPython中调用, 调用Java也相对比较繁琐.

    另外我还考虑过通过COM使用CPython调用.NET组件, 应该可行但是不想使用….

    也想过通过把不同的语言实现的部分分离在不同的进程中通讯也是可行的, 但是带来的性能问题以及稳定性难以评估.

由于时间比较仓促,需要尽快作一个技术上的选型, 所以没有更多的时间来做更多的实验, 所以在这里询问下, 不知道这里有没有以前遇到过类似问题,或者对这些有所了解的朋友, 还请不吝赐教!谢谢!

==================================

我的回答如下:

 

这个架构设计蛮有意思的,首先想问几个问题确定一下细节:

1)Python选型是否是官方意见?已经决定好的?还是仅仅是你个人的?
2)不同语言模块交换的工作是一次性的(就是用完就抛的)?还是说需要长期使用的?
3)这里需要重用的是数据?还是业务逻辑?还是仅仅就是模块?
4)你对整体设计是否有决定权?你对这些系统(Jython、CPython、C++、C#)是否了解?
5)当时做出这些选型是否考虑过整合?

说实话,从你的问题来看,你对整个系统了解程度还是不够的,这是设计的大忌。

建议你按照这些步骤来做:

1)确定真正的问题列表。把不同模块画出来,那些需要交换数据,那些需要重用逻辑。把不同系统之间的交互(已有的和将来要有的)列成表格,加上估计的技术难度以及估计的工作时间。
先把思路搞清晰,要把系统的真正问题了解透,这点最为重要。
再重复强调一次,编程是为了解决问题,重中之重就是确定你解决的是真正问题而不是枝节。

2)按照问题优先级,来进行技术分析。比如C#与Python的交互,需要Python调用C#的逻辑。最佳方案是C#暴露为service形式,可以通过web service(WCF)很容易实现,数据格式可以为xml或者json,都是语言无关的。
也可以C#作为COM组件形式暴露,优点是可重用性更好,C++也可以直接使用。

3)IronPython无法调用C扩展,但是很容易调用C#,可以考虑将其作为C#与CPython的包装层,仅此而已,不要用的太多。

4)Jython也是一样,仅用于Java与CPython的包装。

5)CPython与硬件可以通过C编写扩展来实现,不是很难。我最近在翻译的一本书就是有类似整合方法。

这里的设计方案是以CPython作为中心,其它方案向CPython靠拢。当然我觉得以C++为中心更好,但你未必能接受。


《“不同系统(C#/Python/IronPython/Jython/C++)之间的技术整合”》 有 1 条评论

  1. […] 上一次讨论http://sunxiunan.com/?p=1854 发出去以后提问者回复了一些问题,然后也提出一些新问题,觉得这种总体设计还是挺有趣的,值得发出来一起看看。     首先说明下为什么会有这样的想法吧—-公司里面有很多不同部门, 部门之间有不同的产品, 对于不同的产品和项目都有着自己的测试方案, 有手工的也有自动化的, 自动化的里面又有使用各种语言的(包括Tcl, Python, Lua等), 即使使用同一种语言, 也有使用各种框架的, 这样就导致了不同产品间很难沟通(最典型的案例就是需要互相借人的时候, 发现要重新学习一套测试方式, 周期太长), 同时也不便于管理. 于是呢, 领导们就突发奇想, 是不是可以统一一种语言和框架呢?为了能满足领导们以及测试部门等各方面的诉求,就有了以上的想法….. […]

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注