python能完全取代java和C++吗?用python开发的软件能在安卓苹果上运行吗?

########## 以下所有文字均为答主手敲,转载请注明出处和作者 ##########

属于混合编程的问题。较全面的介绍一下,不仅限于题主提出的问题。

以下讨论中,Python指它的标准实现,即CPython(虽然不是很严格)

练习本文中的例子,需要搭建Python扩展开发环境。具体细节见

你也可以在自己的程序中调用Python,看起来非常容易:

在Linux下编译命令为

产生可执行文件后,直接运行,结果为输出

虽然非常简单,但这段代码除了能用C语言动态生成一些Python代码之外,并没有什么用处。我们需要的是C语言的数据结构能够和Python交互。

下面举个例子,比如说,有一天我们用Python写了一个功能特别强大的函数:

接下来要把它包装成C语言的函数。我们期待的C语言的对应函数应该是这样的:

接下来就要用C来调用Python了,完整的代码如下:

从上述代码可以窥见Python内部运行的方式:

  • 也可以创建Python类型的变量,使用PyXXX_New可以创建类型为XXX的变量。
  • 不仅Python语言很优雅,Python的库函数API也非常优雅。

现在我们得到了一个C语言的函数了,可以写一个main测试它

编译的方式就用本节开头使用的方法。

在Linux/Mac OSX运行此示例之前,可能先需要设置环境变量:

这种做法称为Python扩展。

比如说,我们有一个功能强大的C函数:

期望在Python里这样使用:

考虑最简单的情况。我们把功能强大的函数放入C文件 great_module.c 中。

除了功能强大的函数great_function外,这个文件中还有以下部分:

  • 导出表GreateModuleMethods。它负责告诉Python这个模块里有哪些函数可以被Python调用。导出表的名字可以随便起,每一项有4个参数:第一个参数是提供给Python环境的函数名称,第二个参数是_great_function,即包裹函数。第三个参数的含义是参数变长,第四个参数是一个说明性的字符串。导出表总是以{NULL,
  • 导出函数initgreat_module。这个的名字不是任取的,是你的module名称添加前缀init。导出函数中将模块名称与导出表进行连接。

在Windows下面,在Visual Studio命令提示符下编译这个文件的命令是

/LD 即生成动态链接库。编译成功后在当前目录可以得到 great_module.pyd(实际上是dll)。这个pyd可以在Python环境下直接当作module使用。

在Linux下面,则用gcc编译:

  • 《Python源码剖析-深度探索动态语言核心技术》是系统介绍CPython实现以及运行原理的优秀教程。
  • Python 官方文档的这一章详细介绍了C/C++与Python的双向互动
  • 关于编译环境,本文所述方法仅为出示原理所用。规范的方式如下:
  • 作为字典使用的官方参考文档

用以上的方法实现C/C++与Python的混合编程,需要对Python的内部实现有相当的了解。接下来介绍当前较为成熟的技术Cython和SWIG。

在前面的小节中谈到,Python的数据类型和C的数据类型貌似是有某种“一一对应”的关系的,此外,由于Python(确切的说是CPython)本身是由C语言实现的,故Python数据类型之间的函数运算也必然与C语言有对应关系。那么,有没有可能“自动”的做替换,把Python代码直接变成C代码呢?答案是肯定的,这就是Cython主要解决的问题。

在Windows环境下依然需要Visual Studio,由于安装的过程需要编译Cython的源代码,故上述命令需要在Visual Studio命令提示符下完成。一会儿使用Cython的时候,也需要在Visual Studio命令提示符下进行操作,这一点和第一部分的要求是一样的。

这其中有非Python关键字cdef和public。这些关键字属于Cython。由于我们需要在C语言中使用“编译好的Python代码”,所以得让great_function从外面变得可见,方法就是以“public”修饰。而cdef类似于Python的def,只有使用cdef才可以使用Cython的关键字public。

这个函数中其他的部分与正常的Python代码是一样的。

编译命令和第一部分相同:

在Linux下编译命令为

这个例子中我们使用了Python的动态类型特性。如果你想指定类型,可以利用Cython的静态类型关键字。例子如下:

这样的话,我们的main函数已经几乎看不到Python的痕迹了:

在这一部分的最后我们给一个看似实用的应用(仅限于Windows):

会得到一个dllmain.dll。我们在Excel里面使用它,没错,传说中的Excel与Python混合编程

参考资料:Cython的官方文档,质量非常高:

用C/C++对脚本语言的功能扩展是非常常见的事情,Python也不例外。除了SWIG,市面上还有若干用于Python扩展的工具包,比较知名的还有Boost.Python、SIP等,此外,Cython由于可以直接集成C/C++代码,并方便的生成Python模块,故也可以完成扩展Python的任务。

答主在这里选用SWIG的一个重要原因是,它不仅可以用于Python,也可以用于其他语言。如今SWIG已经支持C/C++的好基友Java,主流脚本语言Python、Perl、Ruby、PHP、JavaScript、tcl、Lua,还有Go、C#,以及R。SWIG是基于配置的,也就是说,原则上一套配置改变不同的编译方法就能适用各种语言(当然,这是理想情况了……)

SWIG的安装方便,有Windows的预编译包,解压即用,绿色健康。主流Linux通常集成swig的包,也可以下载源代码自己编译,SWIG非常小巧,通常安装不会出什么问题。

用SWIG扩展Python,你需要有一个待扩展的C/C++库。这个库有可能是你自己写的,也有可能是某个项目提供的。这里举一个不浮夸的例子:希望在Python中用到SSE4指令集的CRC32指令。

首先打开指令集的文档:

可以看到有6个函数。分析6个函数的原型,其参数和返回值都是简单的整数。于是书写SWIG的配置文件(为了简化起见,未包含2个64位函数):

注意输出文件名前面要加一个下划线。

现在可以立即在Python下使用这个module了:

回顾这个配置文件分为3个部分:

  1. %{ %} 包裹的部分是C语言的代码,这段代码会原封不动的复制到mymodule_wrap.c
  2. 欲导出的函数签名列表。直接从头文件里复制过来即可。

还记得本文第2节的那个great_function吗?有了SWIG,事情就会变得如此简单:

换句话说,SWIG自动完成了诸如Python类型转换、module初始化、导出代码表生成的诸多工作。

对于C++,SWIG也可以应对。例如以下代码有C++类的定义:

对应的SWIG配置文件

这里不再重新敲一遍class的定义了,直接使用SWIG的%include指令

SWIG编译时要加-c++这个选项,生成的扩展名为cxx

在Python交互模式下测试:

SWIG非常强大,对于Python接口而言,简单类型,甚至指针,都无需人工干涉即可自动转换,而复杂类型,尤其是自定义类型,SWIG提供了typemap供转换。而一旦使用了typemap,配置文件将不再在各个语言当中通用。

SWIG的官方文档,质量比较高。

有个对应的中文版官网,很多年没有更新了。

由于CPython自身的结构设计合理,使得Python的C/C++扩展非常容易。如果打算快速完成任务,Cython(C/C++调用Python)和SWIG(Python调用C/C++)是很不错的选择。但是,一旦涉及到比较复杂的转换任务,无论是继续使用Cython还是SWIG,仍然需要学习Python源代码。

文中所述原理与具体环境适用性强。

文章所述代码均用于演示,缺乏必备的异常检查

虽然 Python 语言让编程变得更加简单,但它最初的设计目的是在拥有足够的处理、内存和外设资源的个人电脑及其他机器上运行。而对于面临较严格的资源和接口限制的嵌入式系统,针对微控制器优化的版本 MicroPython 日益受到欢迎。甚至开源社区也一直在针对特定的微控制器和开发板来修改 MicroPython,以支持严谨的微控制器开发工作。

最初的 Arduino 开发板及其诸多后续产品都是深受用户欢迎的微控制器开发板,适用于创客、业余爱好和学生项目,以及嵌入式原型。但是,Arduino IDE 和编程语言基于 C++,这是一种功能强大但又复杂的编译语言,语法怪异,标点规则僵化,令众多新手程序员望而生畏。

Python 是一种更新的编程语言。它是面向对象的解释型交互语言,将出色的编程功能与极其清晰的语法集于一体。该语言以可写性和可读性以及简化的语法而著称。这些特性结合在一起,可减少编程错误的数量,简化代码重复使用,从而加快软件开发速度。

该语言的解释型特性可为程序员提供即时反馈,鼓励他们进行试验和快速学习。出于这些原因,Python 现在成为众多学生和创客学习的首选编程语言。

但 Python 有一个缺憾,其设计目的是在个人电脑和大型机器上运行,这些设备拥有足够的 RAM、大量存储空间和完整用户界面,还配备了键盘、大型显示器和鼠标。它并不用作嵌入式编程语言。但是,Python 3 编程语言有一个名为 MicroPython 的精简高效版本,它经过专门创建和优化,可在微控制器的受限资源中运行。

开源社区认识到 MicroPython 作为嵌入式编程语言的前景,一直在针对特定的微控制器和开发板来修改 MicroPython,以支持严谨的微控制器开发工作。例如,Adafruit 开发了符合自身需求的 MicroPython,名为 CircuitPython。CircuitPython 旨在简化低成本微控制器板上编程任务的试验和学习过程,它是针对 Adafruit 开发板上的微控制器和硬件资源而量身定制。CircuitPython 预安装在 Adafruit 的几款开发板上,也可安装在其他开发板上。

鉴于 Arduino IDE 的强劲发展势头和普及,而且市场上有很多 Arduino 开发板,我们有理由要问:为什么需要专用版本的 Python 来进行嵌入式开发?通过对两种语言进行比较,我们可以知道答案。

C++ 是旧版 C 语言的扩展,提供面向对象的扩展。即便有了这些扩展,C++ 代码还是有些晦涩难懂,因为它保留了 C 语法,这种语法最初是由贝尔实验室的 Kernigan 和 Ritchie 在上世纪 60 年代末和 70 年代初创建。C 语言原先的目的是要容易地映射到目标处理器的机器指令。该语言更加偏重于机器的需求,而非程序员的需求,这一点在其语法中体现得格外明显。由于商用微处理器直到 1971 年才出现,因此 C 语言最初是针对小型计算机而开发。上世纪 80 年代,微处理器的 C 编译器逐渐演进为有用工具。C 语言一直是编译型语言,C++ 也同样如此。

丹麦计算机科学家 Bjarne Stroustrup 在 1979 年开始开发 C++。他撰写的第一本有关该语言的教科书在 1985 年问世,而 C++ 直到 1998 年才成为标准编程语言。与 C 语言相同,Stroustrup 的 C++ 语言最初也是面向大型计算机。2003 年开发的 Arduino IDE(集成开发环境)使得 C++ 适用于微控制器。

Python 也是面向对象的语言。它由荷兰程序员 Guido van Rossumin 开发,最初在 1991 年发布。Python 的语法设计重点强调代码对于人的可读性 — 这是 Python 和 C++ 之间的一个关键差异。可写性与可读性密切相关,这是 Python 的另一大特点。可写性意味着 Python 受到程序员的广泛赞誉,它让程序员能够更快速地编写应用程序,这样可以鼓励试验,缩短原型设计和开发周期。

第二个主要差异在于 Python 是一种解释型语言,这一点与 Basic 编程语言非常相似。后者最初出现在上世纪 60 年代,针对小型计算机而开发,之后随着微型计算机的引入,在 70 年代真正得以蓬勃发展。与 Basic 相同,Python 的解释型特性摒弃了用于编译编程语言的编辑/编译/下载/运行开发周期,从而鼓励试验和学习。但与 Basic 不同的是,Python 是一种更高级别的面向对象的现代语言,它融合了自最初开发 Basic 以来半个世纪内,我们在计算机科学领域取得的进步成果。

例如,Python 的变量无需在使用之前进行声明和指定类型。程序员无需担忧某个变量应该是整数还是浮点数。Python 解释器可以解决该问题,并在运行时做出适当的选择。

C++ 和 Python 之间的另外两个差异是字符串处理和标点。很多程序员发现 C++ 中的字符串处理不仅麻烦,而且令人困惑。Python 的字符串处理则要简单得多,让人很容易想到 Basic 的深受大家喜爱的简单字符串处理功能,它长期以来都被视为 Basic 的一大优点。

同样,C 和 C++ 语言的标点 — 特别是大括号 ({})— 对于新手甚至是经验丰富的程序员来说,都是另一块会经常遇到的绊脚石。程序员总是感觉程序中似乎有奇数个大括号,这意味着他们必须深入检查代码,找到缺失的大括号所应该放置的位置。Python 没有繁琐的标点,但确实使用了缩进,增加了 Python 代码的可读性。

与 C 和 C++ 相同,Python 最初的设计目的也是在大型计算机上运行。因此,该语言需要过多的资源来用于微控制器编程。澳大利亚程序员兼物理学家 Damien George 因此开发了一个名为 MicroPython 的 Python 版本,可在微控制器更有限的资源上运行。Arduino 开发板是 MicroPython 的早期硬件目标。

MicroPython 的交互特性集中体现在它的命令界面上,该界面的正式名称为 REPL(读取-求值-输出-循环)窗口,通常通过串行连接(将主机 PC 连接到微控制器开发板)运行。REPL 界面与上世纪 70 年代和 80 年代的 Basic 命令行界面非常相似。该界面接受用户输入(单个表达式或语句),对其进行计算,然后通过 REPL 窗口将结果返回给用户,或者执行嵌入在语句中的命令。

使用 REPL 界面,可以查询变量、切换 I/O 行,或将字符串发送到相连的外设。命令行经过解析后,一旦按下 Enter 键,便会立即执行。这是解释型语言的特性。

MicroPython 的这种特性有利于探索性的编程和调试,也是使得 MicroPython 语言易于使用的诸多方面之一,无论对于初学者还是经验丰富的程序员都是如此。与 Arduino IDE 的传统“编辑-编译-运行-调试”周期相比,REPL 用户界面有助于缩短开发周期。即使经验丰富的程序员也能够使用 MicroPython 的 REPL 用户界面,以交互方式来试验新类型的外设,并因此从中受益。

每个微控制器都有一系列独特的外设,各开发板也不例外。这些外设需要支持库,对于 Arduino IDE 和 MicroPython 来说也是如此。此外,还有很多附加的外设,例如 Adafruit 的 1655 NeoPixel 可寻址 RGB LED,它们也需要库支持。

为了提供更高程度的支持,Adafruit 开发了自己的 MicroPython 版本,名称为 CircuitPython,旨在满足该公司的一些廉价微控制器开发板的特定需求。该公司还将来自庞大 Arduino 集合的很多外设库转换为 CircuitPython 库,为 CircuitPython 提供大量的外设支持库,而且还在不断增加。

Adafruit 设计了一系列微控制器开发板,以特意支持 CircuitPython,其中包括:

3501 Gemma M0 的尺寸大约与 25 美分硬币相同,可从其 USB 端口或单独电池端口供电(图 3)。

微控制器。这三款开发板所基于的两种微控制器都在芯片上集成了低功耗蓝牙 (BLE) 技术,并提供适当的软件支持。

Adafruit 已采用一种独特的方法,将 CircuitPython 装载到直接支持该语言的开发板上。将上述开发板中的其中一块插入主机 PC 的 USB 端口,该开发板将显示为 PC 的磁盘驱动器。该磁盘驱动器的根目录显示关键的 CircuitPython 文件,包括解释器和用户程序,以及一个包含库文件的文件夹。这种布置让主机 PC 能够使用现有文件系统和驱动程序,轻松地访问开发板。

主机 PC 上的 CircuitPython 用户界面需要可下载的免费开源编辑器和 REPL 界面。Adafruit 推荐使用名为 Mu 的开源应用程序,如图 6 所示。Mu 屏幕分为代码窗口和 REPL 控制及监控窗口,程序员可在前一个窗口中进行编辑,在后一个窗口中控制开发板的 CircuitPython 解释器。

在代码窗口中键入程序,然后单击 Mu 的“保存”按钮,即可将代码保存在 Adafruit 的 CircuitPython 开发板上,该板位于 SAMD21 微控制器的大型片上闪存中。所有 CircuitPython 代码都位于微控制器闪存中的开发板上。请记住,CircuitPython 开发板看起来就像 PC 的一个磁盘驱动器,因此从操作系统的视角来看,这属于常见操作。

Python 语言为程序员带来了诸多益处,包括交互式的编程、试验和调试。它提供简化且更人性化的语法,无需进行变量声明和类型指定,也没有繁琐的标点。MicroPython 是 Python 3 的另一个版本,它让我们能够使用 Python 进行微控制器编程。

作为一名it从业者和计算机专业教育者,让我来回答这个问题。

首先,编程语言本身与应用场景有着密切的关系。通常,不同的开发场景会使用不同的编程语言,所以编程语言种类繁多,总共有600种左右。有几十种比较常见的编程语言,其中Java、Python和PHP是比较常见的编程语言。

编程语言之间没有直接关系,但在相同的技术架构下,多种编程语言可以协作。例如,人工智能平台可以使用java开发,但是在开发特定的应用程序时,可以使用python语言。

从应用场景的角度来看,Java和python属于全场景编程语言,可以应用在很多开发场景中,如web开发、大数据开发、移动互联网开发、物联网开发等。目前,在大数据和人工智能领域,Python的应用更为广泛。随着大数据和人工智能的发展,Python语言在未来的发展前景十分广阔。

PHP语言的主要应用场景是web开发。虽然应用场景比较单一,但是由于PHP语言在web开发领域的高份额,使得web开发领域有大量的PHP程序员。虽然目前移动开发已经取得了快速的发展,开发规模比较大,但是PHP仍然是比较重要的编程语言之一。对于基础薄弱的初学者来说,从PHP开始也是一个不错的选择。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任。如有侵权/违法内容,本站将立刻删除。

我要回帖

更多关于 python真的超过java了吗 的文章

 

随机推荐