Python成为胶水语言有一个发展过程,并不是一步实现的。Python设计初期就面向科研人员,降低编程难度,提高编程效率。在现代也有其他按照这个思路发展的语言,比如R和Matlab。也有一些思路有些许相似的玩法,比如面向特定领域的语言,像Lua、JavaScript。在与C库的互操作性方面也是个重要的问题。

任何编程语言发展初期都会遇到标准库如何构建的问题。而每种语言的发展思路却有所不同。

C和C++的思路类似,就是提供一个较小的标准库,这使得标准库在各个平台的移植过程工作量较小。但也这个思路也带来一个问题,就是标准库一直保持较小的状态,就会导致一些必要的功能需要第三方库甚至用户自己去实现,这些实现之间又不兼容,就导致了很多悲剧。比如一些常见的数据结构,buffer、stack、queue。在C/C++的各种第三方库里几乎都有各自的buffer实现,stack和queue也有多种实现。C++为部分解决此问题,提供了STL库来实现更多的功能,以及Boost库提供更大范围但支持程度更低的实现。C/C++得益于几十年的发展,各种库还是非常丰富的,而且每当有新的领域兴起时,C/C++也几乎总是最早一批提供支持的。比如GPU编程等等。

R和Matlab一类的面向科研人员的语言,其设计目标就是降低编程难度,但在编程的通用型方面不足,难以出圈成为通用编程语言。另外就是在性能方面弃疗的也有些难堪。

Lua则是一开始就面向嵌入其他系统里的应用,比如早期的网络游戏,近些年的运营规则引擎,交换机策略等等。JavaScript从早期在浏览器里运行也发展到现在可以在一些环境里脱离浏览器,嵌入其他系统应用。Lua和JS的特征是很像的,就是面向很短的脚本应用,为了在这些短脚本里用的方便,语言上缺少大规模应用的良好支持。比如变量的作用域、模块、面向对象等,在Lua和JS里都缺少通用的实现,一些库和和应用需要自己去选择某种实现策略,这就导致了应用之间的兼容性困难。同时缺少这些功能也使得编写较大的Lua/JS程序时存在一些痛苦,项目越大就越需要大量trick来控制复杂度。

Python早期在面对缺少第三方库问题时,用的是那个时代的常见作法,即实现与C的高度互操作性。Python可以方便的编写C模块来调用各类C函数库,把一些结构体等封装成Python对象来进行更好的组织。在80-90年代这种思路是很常见的作法,那个时代的语言基本都会确保自己编译出来的obj文件可以与C的obj文件能链接(link)成一个可执行文件。Python没有编译过程,但至少是非常重视与C的互操作性问题的。

但进入90年代以后,Java的出现对与C的互操作性是非常不屑的。因为Java最初设计目标是用于嵌入式编程的,而引入与C的调用后,可能影响Java运行时的稳定性,因此Java在很长时期都不允许与C互相操作。在Java出现近10年后,才出现了JNI用于操作C库。自Java的思路以后,新出现的部分语言就不再开发与C库对接的API了。这导致了一段时期这些语言只能用其自身开发各类第三方库,进而影响了发展速度。

Python的C API本身设计的是不错的,相比其他多种脚本语言,我见过唯一比Python C API设计的更好的只有Lua了。这就使得一些新的领域出现以后,C/C++第一时间支持,之后在提高可编程性方面的第一选择了就是用Python C API来封装出给Python的接口。最近十几年的CUDA、OpenCL、OpenCV等,都是官方同时提供C++和Python的接口,使得应用质量上有很好的支持。

这里不得不提及的一个关键结点是numpy库。numpy库本身定义的数组(np.array)实际上成了多种Python高性能计算库的通用数据结构。numpy建立的多维数组,可以不经过转换就交给OpenCV做下一步计算,以及再交给CUDA做算法加速。加之numpy本身底层的BLAS经过了SIMD指令集加速,提供了非常高的性能,在常见密集计算里能提供比纯C/C++(没使用SIMD优化)还高几倍的计算性能。进而使得Python在最近几年的大数据、深度学习领域,能够同时获得易于编程和高性能的优势,自然也就成了更好的胶水。

过去这些年我意识到Python与C结合的强大威力后,就翻译了Python官方文档里《使用C/C++扩展Python》一文,并贴在了惊帆之静默 " Blog Archive " 使用C/C++扩展Python​gashero.yeax.com

最近一年多,Python开始组织文档翻译计划时,我也加入其中,并开始按照官方规范来进行更加严格的翻译工作。当前Python官方文档里的《扩展和嵌入Python解释器》就是我在翻译和维护,希望能为大家更好的应用Python与C的互操作提供帮助,相关技术问题也欢迎讨论。如下是Python2和Python3的中文版《扩展和嵌入Python解释器》的链接。扩展和嵌入 Python 解释器​docs.python.org扩展和嵌入 Python 解释器​docs.python.org

python为什么被称为胶水语言_为什么只有python成了胶水语言?相关推荐

  1. 浅谈python语言_浅谈Python语言基础知识点!

    一.Python 语言的简述 Python语言是一种解释型.面向对象的编程语言,是一种开源语言. Python属于动态类定义语言,也是一种强调类型语言. 二.Python 语言的特点 1.简单.高级 ...

  2. python怎么学习一门语言_如何学习Python这一门语言

    Python现在非常火,语法简单而且功能强大,很多同学都想学Python! 如果你选择了自学,我想给你提几点建议: 找浅显易懂,例程比较好的教程,从头到尾看下去.不要看很多本,专注于一本.把里面的例程 ...

  3. 哪个专业学python语言_想学Python编程?你真的适合吗?

    原标题:想学Python编程?你真的适合吗? 有的人说我想学什么.我想干什么,很多时候都是头脑发热,单凭一腔热血,可是这样的路即便走上去你又能坚持多久呢?所以,每每有人问我学Python编程怎么样,我 ...

  4. python和c和java难度_浅谈:Java和C语言各自的学习难度

    许多初学者在编程入门之前,都会在编程语言的选择上犹豫不决.一般来讲,Java和C语言是编程小白最青睐的两种编程语言.那么,Java和C语言哪个学习难度更大呢?虽然两者的区别挺大的,但是学习难度上并不能 ...

  5. 学python后做什么工作好_学习完Python课程后可以做什么工作?

    Python作为人工智能.大数据的首选编程语言,也是进入编程世界的理想选择,已经成为了大家都在追求学习的语言,那么学习Python之后到底可以做什么呢?为您详细的介绍一下. 什么是Python?Pyt ...

  6. python中继承是什么意思_如何理解Python中的继承?python入门

    如何理解Python中的继承?如今,python编程语言深受企业和个人的喜爱.python开发工程师是近年来互联网行业非常热门的职业岗位之一.学习python的人除了零基础的,还有一部分是在职运维.在 ...

  7. python意外缩进引发逻辑错误_如何编写 Python 程序

    如何编写 Python 程序 从今以后,保存和运行 Python 程序的标准步骤如下: 对于 PyCharm 用户 打开 PyCharm. 以给定的文件名创建新文件. 输入案例中给出的代码. 右键并运 ...

  8. python初学者用什么编辑器好_新人学 python 选什么编辑器比较好呢??

    点击上方蓝字关注我们 ↑关注 + 星标 ,每天学Python新技能 后台回复[大礼包]送你Python自学大礼! 新手学Python用什么编辑器比较好?工欲善其事必先利其器,选好工具学习更高效.市面上 ...

  9. python做一个单项选择题系统_(完整版)python选择题word打印版

    Python 单选题库 一. python 语法基础 1 . Python 3.x 版本的保留字总数是 A.27 B.29 C.33 D.16 2. 语言保留字的是 Python 不是 , 以下选项中 ...

  10. 基于python的智能文本分析 书_推荐一本Python数据分析必备工具书

    身处大数据领域,我们每天都不得不与各种各样的数据打交道,无论是围绕数据去进行计算还是分析,它们都分属大数据领域的一个细分领域.在数据分析领域,Python语言一直一枝独秀,本文作者在数据分析领域深耕多 ...

最新文章

  1. java 发送邮件
  2. 【转】Eclipse的Debug调试技巧大全
  3. JAVA调用C语言写的SO文件
  4. 一文看懂Python(九)-----可变参数函数
  5. k-modes算法mysql_第十一章 K-Means(K均值)算法模型实现(中)
  6. java中 怎么获取bean_java普通类如何得到spring中的bean类
  7. 一文看懂卷积神经网络
  8. 期盼数月的召唤|PaddlePaddle中文文档利剑来袭
  9. 【BZOJ1417】Pku3156 Interconnect
  10. 在CLR中自动本地化正在运行的.NET窗口
  11. 数学建模层次分析法例题及答案_数学建模之层次分析法
  12. 使用Aria2+AriaNG+FileManager来进行离线BT下载及在线播放
  13. 使用极大似然法对逻辑回归中的参数进行估计的数学原理
  14. 这4款浏览器必装插件,让浏览器使用体验上升100%
  15. java学籍管理系统部分代码_java学籍管理系统源代码
  16. 咏红梅花——曹雪芹_ywyuan_新浪博客
  17. [CF_GYM102900L]Traveling in the Grid World
  18. easyexcel实现导出
  19. 服务器托管是什么?和租用有什么区别?
  20. 2022年成都粘胶纤维产业申报条件、材料、流程

热门文章

  1. BT5 U盘制作方法
  2. oracle学习札记94
  3. 常用音频.mp3压缩方法(Mac端)
  4. 虚拟打印机安装后没了该怎么办
  5. 会议预约及信息发布服务器,会议预约系统
  6. 信息安全管理(CISP)—— 网络安全监管
  7. 计算机行业未来的规划模板,计算机专业个人职业规划优秀模板
  8. 微信小程序毕业设计 就餐预约点餐小程序毕业设计
  9. python调用打印机驱动下载_不要驱动,简单粗暴的用树莓派驱动USB打印机
  10. HTML实现页面跳转