跨语言和跨编译器的那些坑(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,清晰的分割线,中间用“利万物而不争”的文本做存储,让它们亲密接触的事情,再放放吧。
跨语言和跨编译器的那些坑(CPython vs IronPython)的更多相关文章
- JVM笔记 -- Java跨平台和JVM跨语言
学习JVM的重要性 从上层应用程序到底层操作系统,到底有哪些东西? 平时开发的应用程序主要基于各种框架,譬如Spring,SpringMVC,Mybatis,而各种框架又是基于Java API来实现的 ...
- Golang通过Thrift框架完美实现跨语言调用
每种语言都有自己最擅长的领域,Golang 最适合的领域就是服务器端程序. 做为服务器端程序,需要考虑性能同时也要考虑与各种语言之间方便的通讯.采用http协议简单,但性能不高.采用TCP通讯,则需要 ...
- Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用
目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...
- C++ 跨语言调用 Java
C++ 跨语言调用 Java Java JDK 提供了 JNI 接口供 C/C++ 程序调用 Java 编译后的类与方法,主要依赖于头文件(jni.h) 和 动态库(jvm.so/jvm.dll),由 ...
- 跨平台、跨语言应用开发,Elements 介绍
目录 1,Elements 介绍 2,Elements 版本 3,Elements 能干嘛 4,Elements IDES 5,Elements 工具 1,Elements 介绍 RemObject ...
- Thrift 简单实现C#通讯服务程序 (跨语言 MicroServices)
Thrift是一种可伸缩的跨语言服务框架,它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,工作效率和无缝地与C++,C#,Java,Python和PHP和Ruby结合.thrift允许你定义一个 ...
- Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...
- Apache Thrift 跨语言服务开发框架
Apache Thrift 是一种支持多种编程语言的远程服务调用框架,由 Facebook 于 2007 年开发,并于 2008 年进入 Apache 开源项目管理.Apache Thrift 通过 ...
- Atitti 跨语言异常的转换抛出 java js
Atitti 跨语言异常的转换抛出 java js 异常的转换,直接反序列化为json对象e对象即可.. Js.没有完整的e机制,可以参考java的实现一个stack层次机制的e对象即可.. 抛出Ru ...
随机推荐
- Ajax基础(小猫)
Ajax 1.什么是Ajax: 不用刷新整个页面便可与服务器通讯的办法 2.Ajax的基本使用 2.1XMLHttpRequest l XMLHttpRequest对象 XMLHttpRequest是 ...
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate) 在CSS3中,可以利用transform功能来实现文字或图像的旋转.缩放.倾 ...
- Android与H5交互
1.初始化WebView控件 webView = (WebView) findViewById(R.id.webview); 2.设置WebView属性 WebSettings webSettings ...
- 如何去掉dede列表推荐时标题被加粗
dede在列表推荐文章默认为加粗不清楚的可以看图: 那个加黑的是默认的.如果你不想要被加黑,可以做如下改动.在include里找到文件:arc.listview.class.php查找并删除(注释掉也 ...
- Tomcat7安装配置 for Ubuntu
一.环境说明: 操作系统:Ubuntu 12.04.2 LTS Tomcat:apache-tomcat-7.0.52 二.下载 下载地址:http://tomcat.apache.org/ 这里下载 ...
- Cannot run gnome extension in browser
Error Message: We cannot detect a running copy of GNOME on this system, so some parts of the interfa ...
- USACO翻译:USACO 2012 FEB Silver三题
USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 搬家 英文题目名称 planting cowids relocate 可执行文件名 planting co ...
- Excel导入导出的业务进化场景及组件化的设计方案(上)
1:前言 看过我文章的网友们都知道,通常前言都是我用来打酱油扯点闲情的. 自从写了上面一篇文章之后,领导就找我谈话了,怕我有什么想不开. 所以上一篇的(下)篇,目前先不出来了,哪天我异地二次回忆的时候 ...
- UITableView(一)
#import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITableViewDataSource, ...
- 《HiWind企业快速开发框架实战》(3)使用HiWind创建和管理菜单
<HiWind企业快速开发框架实战>(3)使用HiWind创建和管理菜单 关于HiWind HiWind企业快速开发框架,是基于.NET+EasyUi(支持各种前端扩展,后面将扩展Boot ...