跨语言和跨编译器的那些坑(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 ...
随机推荐
- AFNetWorking设置HTTPRequestHeaders的坑
今天在项目中要封装一个请求头但是用如下方法总是失败: 求其原因不知道: 于是乎改用了属性对象后居然成功了..: // // RequestManager.m // 获取天气demo // // ...
- java分享第十七天-03(封装操作mysql类)
JAVA操作mysql所需jar包:mysql-connector-java.jar代码: import java.sql.*; import java.util.ArrayList; import ...
- STM32之通用定时器
广大的互联网的大家早上中午晚上..又好..没错了..我又来了..写博客不是定时的..为什么我要提写博客不是定时的呢??聪明的人又猜到我要说什么了吧.有前途.其实我还是第一次听到定时器有通用和高级之分的 ...
- Java的四种引用方式
一.引用基本概念 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用.虚引用. 1.强引用(StrongRef ...
- Excel Sheet Column Title
Given a positive integer, return its corresponding column title as appear in an Excel sheet. For exa ...
- es查询命令备份(只需要网页9200/_plugin/head/就可以访问)
本文只是写一些常用es命令,这里不用任何客户端,只用 9200/_plugin/head/ 那个端口网页就可以,然后是复合查询. 注意es其实一个idnex只能有一个type,如果一个index做了多 ...
- web应用程序
1.web应用程序和网站的区别 应用程序有两种模式C/S.B/S.C/S是客户端/服务器端程序,也就是说这类程序一般独立运行.而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助IE等浏览器来 ...
- java面向对象_static关键字
1. 修饰成员变量:有static修饰的为静态变量,没有static修饰的称为实例变量. 实例变量:属于对象的,一个对象有一份.在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响.存储 ...
- WinForm窗体 SSK 界面的使用
1.下载 SSk文件 找到 IrisSkin2.dll 文件和.SSK结尾的文件 为了防止万一粘贴到项目的bin>Debug下面 2. 打开工具箱 添加一个选项卡 3. 添加选择项& ...
- 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现
[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...