一方面大年夜之前的分析中也能看出,并不是所有的源码编译成目标文件都可以被 Python 引用;另一方面,最重要的是 Objective-C 办法调用的特点。我们知道办法调用实际上会被编译成 msg_Send 并交给 runtime 处理,最终找到函数指针并调用。这里 Objective-C 的 runtime 其实是一个用 C 说话实现动态链接库,它可以懂得为 Objective-C 运行时情况的一部分。换句话说,没有 runtime 这个库,包含办法调用的 Objective-C 代码是弗成能运行起来的,因为 msg_Send 这个符号无法被重定向,运行时将找不到 msg_Send 函数的地址。就连原生的 Objective-C 代码都须要依附袈渌行时,想让 Python 直接调用某个 Objective-C 编译出来的库就更弗成能了。
总之,直接的语法转换是一个好梦的设法主意,但实现起来难度大年夜,收益有限,平日是为了移植已经用某个说话写好的框架,或者开个暮朐赌暌姑于进修,但实际应用处景并不多。
Python 一个很强大年夜的特点是胶水说话,可以把 Python 懂得为各类说话的┞烦合剂。对于 Python 可以处理的逻辑,用 Python 代码即可完成。如不雅寻求极致的机能或者调用已经实现的功能,也可以让 Python 调用已经由其余说话实现的模块,以 Python 和 C 说话的交互解释一下。
起首,如不雅是 C 说话要履行 Python 代码,显然须要一个 Python 的说冥器。因为在 Mac OS X 体系上,Python 说冥器是一个动态链接库,所以只要导入一下头文件即可,下面这段代码可以成功输出 “Hello Python!!!”:
- #include <stdio.h>
- #import <Python/Python.h>
- int main(int argc, const char * argv[]) {
- Py_SetProgramName(argv[0]);
- Py_Initialize();
- PyRun_SimpleString("print 'Hello Python!!!'\n");
- Py_Finalize();
- return 0;
- }
如不雅是在 iOS 应用里,因为 iOS 体系没有对应的动态库,所以须要把 Python 的说冥器打包成一个静态库并且链接到应用中,网上已经有人做好了: python-for-iphone,这就是为什愦我们看到一些教导类的应用模仿了 Python 说冥器,许可用户编写 Python 代码并获得输出。
Python 调用 Objective-C/C 也不复杂,只须要在 C 代码中指定要裸露的模块 A 和要裸露的办法 a,然后 Python 就可以直接调用了:
- import A
- A.a()
具体的教程可以看这里: 若何实现 C/C++ 与 Python 的通信?
有时刻,如不雅能把本身熟悉的说话应用到一个陌生的范畴,无疑会大年夜大年夜降低上手的难度。以 iOS 开辟为例,开辟者的日常其实是应用 Objective-C 语法来描述一些逻辑,最终应用 UIKit 等框架完成和应用的交互。 一种很天然而然的设法主意是,能不克不及用 Python 来实现逻辑,并且调用 Objective-C 的接口,比如 UIKit、Foundation 等。实际上前者是完全可以实现的,然则 Python 调用 Objective-C 远比调用 C 说话要复杂得多。
想用 Python 写开辟 iOS 应用是有可能的,比如: PyObjc,但最终照样要依附 Runtime。大年夜概的思路是起首用 Python 拿到 runtime 这个库,然后经由过程这个库去和 runtime 交互,进而具备了调用 Objective-C 和各类框架的才能。比如我要实现 Python 中的 UIView 这个类,代码会变成如许:
- import objc
- # 这个 objc 是动态加载 libobjc.dylib 获得的
- # Python 会对 objc 做一些封装,供给调用 runtime 的才能
- # 实际的工作照样交给 libobjc.dylib 完成
- class UIView:
- def __init__(self, param):
- objc.msgSend("UIView", "init", param)
这么做的性价比并不高,如不雅和 JSPatch 比拟,JSPatch 应用了内置的 JavaScriptCore 作为 JavaScript 的解析器,而 PyObjc 就得本身带一个 libPython.a 说冥器。此外,因为 iOS 体系的沙盒限制,非逃狱机械并不克不及拿到 libobjc 库,所以这个对象只能在逃狱手机上应用。
OCS
当然,最终照样要和 Objective-C 的 Runtime 打交道,如许才能调用 UIKit 等框架。因为对虚拟机的实现道理并不清跋扈,这里就不敢多匠了棘欲望在进修完 JVM 今后再做分享。
推荐阅读
【51CTO.com原创稿件】稀有据猜测,2017年中国差旅市场支撑或跨越3000亿美元,将代替美国成为全球最大年夜的商旅市场。近日《2017年德国嘉惠国际商旅治理研究申报》宣布,个中稀有据表示中>>>详细阅读
地址:http://www.17bianji.com/lsqh/35915.html
1/2 1