跨语言和跨编译器的那些坑(CPython vs IronPython)

代码是宝贵的,世界上最郁闷的事情,便是写好的代码,还要在另外的平台上重写一次,或是同时维护功能相同的两套代码。所以才需要跨平台。

不仅如此,比如有人会吐槽Python的原生解释器CPython跑得太慢,或想让Python在.NET或JAVA虚拟机上运行,便开发了IronPython和Jython这样的工具。

Jython我并不了解, 就说说Irpy吧,开放源代码,并有动态语言运行时(DLR)加持,这样牛逼的代码焉有不看?!于是看了小一个礼拜,云里雾里,确实还是自己能力有限。

跨语言

回到之前“最郁闷的问题”,我写了一个功能不错的数据清洗类库,有Python和C#两个版本,数据清洗的流程是用xml定义的,之前这样设计,就是为了跨平台和语言。打个比方,当我设计好一个清洗流程后,就可以交给C#或者Python去执行了。听起来是不是很美好?

我很感慨Python的强大能力,通过元类,动态添加属性等特性,我把C#将近5000行的代码,被Python用300行不到的规模基本实现了。不少人可能会好奇这是怎么做到的。C#有麻烦的继承语法,而不同的类只是核心函数不同。而Py我只定义了核心函数,然后动态添加属性生成类,不少不需要实现的接口根本就不用关心,再加上Py本身比Linq还骚的生成器语法,这样压缩自然是情理之中。

然而,蛋疼的问题出现了。

因为两种语言都引用了第三方的html解析类库,分别是C#的HtmlAgilityPack,和Python的lxml, 然而两种类库对于XPath的解析是有细微区别的,如是否有form标签,导致能被C#解析的却不能被Py解析!真是日了狗了!

我准备写XPath的转换函数,然而发现这是个无底洞,不同的html都有细微区别。还有C#已经完善的自动登录功能,我却还需要在Python的海洋里查找对应的相似函数。

那怎么办呢?我讨厌同时维护两种语言的代码,那就放弃一边吧!

 

跨编译器

换在三年前,我肯定是放弃Python而去接着开发C#(我确实有类似处女座的强迫症,因噎废食),但如今,我被py漂亮的语法和众多第三方包倾倒,明显优先支持Py。

我想到了IronPython, 这是.NET平台下能够运行Python的一套引擎,能够很方便地让C#和Python集成。这下简单了吧?我用Python实现核心代码,再用C#包装到外部界面上,那么就同时满足了一切需求!

然而,蛋疼的问题接着出现。。。。

IronPython的性能还是不错的,甚至运行起来比CPython还快!但是,回到那个解析html的Python类库,让Iron去执行引用lxml的Python代码是会出错的。翻遍了国内外论坛,大致意思是lxml(包括scipy和numpy)为了速度考虑,都是c语言扩展,而ironpython是不支持c语言扩展的模块的,所以,ironpython下不能使用lxml!

呵呵。

强迫症再一次发作,。我能怎么做?给lxml写一个纯Python的版本?或是,去研究某个能够支持IronPython支持c语言扩展的工具?每个任务都不简单,理性告诉,耗在这件事情上没有意义。

跨平台的意义:折腾

这就是工程脆弱性,一旦某个接口对不上了,整个类库都没法使用了。即使是python这样的语言,在2和3两种版本之间都让人颇为头疼。纵然有IronPython这种微软官方支持的强大工具,也充其量只能为一个玩具。原因很简单,在不同的底层基础上实现完全相同的上层,这是非常有难度的,一点点细微的区别,就会导致上层行为上的巨大不同。比如Python的生成器语法,在IronPython上就有问题。报出的错误让人匪夷所思,根本不知道怎么修改。

做编译器的人,自然是手握重剑,哪里不对改哪里。但我们这些小白怎么办,还要去搬砖呢!

这也是开源的重要性,万不得已,还能够去修改源代码。也是“使用被反复验证的稳定工具”的重要性,不要去使用莫名其妙的编译器/工具,否则本来应该思考美好的算法,而现在却在错误代码的海洋中抓破脑袋。一些新技术非常不确定,甚至已经停止维护,把时间浪费在这些事情上不值得的。

这也是工程的痛苦,也是工程的美妙。做研究的人,写了几行公式完事了,做工程的人,却不得不思考各种细节,从综合成本和效率的角度去做,做工程的人如果也是偏执狂,那他早就死掉了。

结语

那我还能怎么做呢?那就先这样吧,数据抓取/清洗继续用C#,分析用Python,清晰的分割线,中间用“利万物而不争”的文本做存储,让它们亲密接触的事情,再放放吧。

时间: 2024-07-28 21:17:10

跨语言和跨编译器的那些坑(CPython vs IronPython)的相关文章

苹果机器学习期刊「Siri 三部曲」之一:通过跨带宽和跨语言初始化提升神经网络声学模型

近日,苹果 Siri 团队在苹果机器学习期刊上连发三文<Improving Neural Network Acoustic Models by Cross-bandwidth and Cross-lingual Initialization>.<Inverse Text Normalization as a Labeling Problem>.<Deep Learning for Siri』s Voice: On-device Deep Mixture Density Net

转 比较跨语言通讯框架:Apache Thrift和Google Protobuf

    前两天想在微博上发表一个观点:在现在的技术体系中,能用于描述通讯协议的方式很多,xml,json,protobuf,thrift,如果在有如此众多选择的基础上,在设计系统时,还自造协议,自己设计协议类型和解析方式,那么我只能说,您真的落后了,不是技术上,而是思想上.对于xml,和json我们不做过多描述了,参考相关文档就可以了.特别是json,如今在 web系统,页游系统的前后台通讯中,应用非常广泛.本文将重点介绍两种目前在大型系统中,应用比较普遍的两种通讯框架,thrift和Proto

.Net下如何跨语言调用Delphi写的报表引擎

我去年上半年之前一直使用的是Delphi,公司在这上面也积累了很多公共资源.在06年9月实现了一个 功能强大的报表引擎,公司到现在基本每个项目组都在使用它做报表.现在在.Net下,使用 OpenExpressApp,暂时也没有足够精力去重新开发一个报表引擎(OpenReport),所以就想到先重用以前 的报表引擎. 下面就介绍一下如何在WPF中使用Delphi下的功能. 封装Delphi引擎为一个OCX控件 之前的报表引擎是基于Delphi下的,在跨语言应用下,最容易想到的就是使用ActiveX

Java跨语言调用实现方案

Java 跨语言实现方案 背景: 在大型分布式 java 应用中,为了方便开发者,通常底层的 rpc 框架都会做一些调用的封装,让应用层开发人员在开发服务的时候只用编写简单的 pojo 对象就可以了,如流行的 spring remoting , jboss remoting 等等,都有这样的效果. 随着业务的需要,可能上层应用希望采用非 java 技术,如 php , ruby on rails ,而由于 java gc 和内存模型的限制,可能有的底层服务又需要采用更高性能和更加灵活的技术,如果

译见赋能跨语言大数据渠道生态

文章讲的是译见赋能跨语言大数据渠道生态,2016年11月18日,2016"赋能·译见"渠道招商大会在京圆满落幕.来自全国近二十个领域的上百家企业盛情赴会,共谋跨语言大数据未来发展.会上,中译语通科技(北京)有限公司(以下简称"中译语通")详细介绍了公司战略布局及解读跨语言大数据平台"译见"的渠道政策,并展示了"译见"在新闻.科技.医疗.工业.农业等垂直领域解决方案及智能搜索.实时热点分析等先进服务能力.会议现场,巨大的市场蛋糕

中译语通完成B轮2.5亿元融资加速布局跨语言大数据

2016年5月31日,中译语通科技(北京)有限公司(以下简称"中译语通")公布完成B轮2.5亿元融资.在本轮融资中,中国图书进出口(集团)总公司.上海新华发行集团有限公司.上海智德简理投资管理有限公司.上海文化产业股权投资基金和上海朝乾资产管理有限公司等机构参投.通过这轮投资和资源整合,中译语通将进一步加速在跨语言大数据分析服务领域的布局. 中国出版集团公司副总裁 潘凯雄 上海文化产业股权投资基金副总裁 刘彬 朝乾资本执行总裁 杨升东 中译语通成立于2013年,是中国出版集团公司旗下中

跨语言-能同时支撑多语言互为provider,consumer的分布式服务框架,开源的有吗?

问题描述 能同时支撑多语言互为provider,consumer的分布式服务框架,开源的有吗? 能同时支撑多语言互为provider,consumer的分布式服务框架,开源的有吗? 开源的分布式服务框架(dubbo,HSF等)都不支持跨语言(或许有其他,但是我不知道). 如果没有开源的,我的思路是基于同一种协议(hession,thrift,protobuff,avro等)把各种语言支撑的框架集成到一起(例如 php python c++ 的)形成一个支持多语言互为provider,consum

跨语言之间的对抗博弈,该如何演绎?| 论文访谈间 #08

利用非平行双语语料构建双语词典是一项长期存在的跨语言任务.其实现过程一般需要跨语言信息(如种子双语词典)作为监督信号来建立双语词汇之间的翻译关系,但对于完全缺乏双语资源的小语种和专门领域来说,获取其跨语言信息十分困难,那么如何在不使用任何跨语言监督信号的情况下通过无监督方法构建双语词典呢?来自清华大学的张檬博士.刘洋老师.栾焕博老师和孙茂松老师发表在 ACL2017 上的论文"Adversarial Training for Unsupervised Bilingual Lexicon Indu

Hprose 高性能跨语言 RPC —— 微服务首选引擎

Hprose 是高性能远程对象服务引擎(High Performance Remote Object Service Engine)的缩写 -- 微服务首选引擎. 它是一个先进的轻量级的跨语言跨平台面向对象的高性能远程动态通讯中间件.它不仅简单易用,而且功能强大.你只需要稍许的时间去学习,就能用它轻松构建跨语言跨平台的分布式应用系统了. 它提供了高效的序列化和反序列化库,并在此基础上提供了方便灵活的 RPC 引擎. Hprose 支持众多编程语言,例如: AAuto Quicker Action