手写 Python 虚拟机
海纳
华为资深编译专家,原 Huawei JDK 团队负责人
1296 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已更新 30 讲/共 30 讲
导学|直播加餐:三小时掌握C++ (3讲)
现代语言:提升开发效率的若干特性 (2讲)
手写 Python 虚拟机
15
15
1.0x
00:00/00:00
登录|注册

26|动态扩展库:Python大流行的最根本保障

你好,我是海纳。
上一节课,我们初步构建了加载模块的能力。模块功能是现代语言的必备功能,只有通过模块组成的库,现代编程语言才有可能进行大规模的软件复用。
除了使用 Python 语言开发的库,还有一些功能是依赖于操作系统平台的,比如图形用户界面、文件、网络等功能。这些功能显然更适合以库的形式存在,而不是直接集成在虚拟机中。这一节课,我们就来研究虚拟机如何管理这种依赖于具体平台的动态库。

加载动态库

几乎所有的编程语言虚拟机都会支持使用 C++ 写扩展库,一是因为 C++ 的库非常多,很多十分重要的基础库,都是由 C++ 写成的,另一个原因是 C++ 及其编译器在性能方面的表现确实处于十分领先的位置,一些性能敏感的部分必须使用 C++ 来写本地扩展库。
注:关于动态链接的更多知识,请参阅《编程高手必学的内存知识》
这种扩展库往往是以动态链接库的形式组织的,在 Linux 上,动态链接库默认以 so 作为后缀,在 Windows 上,则多用 dll 作为后缀。当然,这种后缀名只是一种习惯,并不是强制的,我们完全可以把动态库的后缀改成其他的,并不影响库的正常加载和运行。
举个例子,如果我们想为某个虚拟机编写一些额外的扩展功能,第一种办法就是找到这个虚拟机的源代码,直接将这些功能写在虚拟机里,然后重新编译,得到一个新的虚拟机可执行文件。这种方式就是静态链接,它有两个缺点,一是代码的开发和维护非常困难,在动手修改虚拟机之前,要求开发者必须非常熟悉虚拟机的代码。二是扩展功能的部署、分发都非常困难,要使用新的功能就必须重新安装虚拟机。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. 动态链接库是现代编程语言进行大规模软件复用的必备功能,几乎所有的编程语言虚拟机都支持使用C++编写扩展库。 2. 动态链接库以动态链接库的形式组织,可以在虚拟机运行时加载,实现功能开发与虚拟机独立,部署轻松。 3. 使用dlopen函数在虚拟机中加载动态链接库,可以通过运行时加载的办法实现功能,dlopen用于打开动态库,dlsym用于查找动态库中的符号,dlerror用于处理错误,dlclose用于关闭动态库。 4. 加载动态库时需要定义虚拟机与动态库之间的接口,借鉴了CPython中的做法,需要提供一个init方法,以便虚拟机正确地打开并识别加载动态库。 5. 在加载动态库的过程中,需要注意符号导出的问题,以及在C++编译器下使用extern "C"解决命名重复的问题。 6. 动态链接库的加载和使用需要考虑操作系统的差异,如在Windows系统上需要使用具有相同功能的Windows API来代替dlopen/dlsym。 7. 在Windows系统上,可以使用MinGW进行编译,而在其他系统上可以使用POSIX接口。 8. 动态链接库的使用需要保持与Python等其他虚拟机的兼容性,以确保功能的正确性和可靠性.

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手写 Python 虚拟机》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部