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
《手写 Python 虚拟机》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论