作家
登录

大前端开发者需要了解的基础编译原理和语言知识

作者: 来源: 2017-06-27 09:01:33 阅读 我要评论

一方面大年夜之前的分析中也能看出,并不是所有的源码编译成目标文件都可以被 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!!!”:

  1. #include <stdio.h> 
  2. #import <Python/Python.h> 
  3.  
  4. int main(int argc, const char * argv[]) { 
  5.     Py_SetProgramName(argv[0]); 
  6.     Py_Initialize(); 
  7.     PyRun_SimpleString("print 'Hello Python!!!'\n"); 
  8.     Py_Finalize(); 
  9.     return 0; 

如不雅是在 iOS 应用里,因为 iOS 体系没有对应的动态库,所以须要把 Python 的说冥器打包成一个静态库并且链接到应用中,网上已经有人做好了: python-for-iphone,这就是为什愦我们看到一些教导类的应用模仿了 Python 说冥器,许可用户编写 Python 代码并获得输出。

Python 调用 Objective-C/C 也不复杂,只须要在 C 代码中指定要裸露的模块 A 和要裸露的办法 a,然后 Python 就可以直接调用了:

  1. import A 
  2. 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 这个类,代码会变成如许:

  1. import objc 
  2.  
  3. # 这个 objc 是动态加载 libobjc.dylib 获得的 
  4. # Python 会对 objc 做一些封装,供给调用 runtime 的才能 
  5. # 实际的工作照样交给 libobjc.dylib 完成 
  6.  
  7. class UIView: 
  8.     def __init__(self, param): 
  9.         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

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)