编程语言是什么?
其实,程序指的便是一系列指令,用来告诉计算机做什么,而编写程序的关键在于,咱们必须用计算机能够理解的语言来供给这些指令。
虽然借助 Siri(Apple)、Google Now(Android)、Cortana(Microsoft)等技术,咱们能够运用汉语直接告诉计算机做什么,例如“Siri,打开酷狗音乐”,但运用过这些系统的读者都晓得,它尚未完全成熟,再加上咱们语言充满了模糊和不精确原因,使得设计一个完全理解人类语言的计算机程序,仍然是一个有待处理的问题。
为了有效避开所有影响给计算机传递指令的原因,计算机专家设计了有些符号,这些符号各有其含义,且之间无二义性,一般被它们为编程语言。编程语言中的每一个结构,都有固定的运用格式(叫作为语法)以及精确的含义(叫作为语义)。换句话说,编程语言指定了成套的规则,用来编写计算机能够理解的指令。习惯上,咱们将这一条条指令叫作为计算机代码,而用编程语言来编写算法的过程叫作为编码。
本教程要讲解的 Python 便是一种编程语言,除此之外,你肯定亦听说过其他有些编程语言,如 C、C++、Java、Ruby 等。迄今,计算机专家已然研发了成百上千种编程语言,且随着时间演变,这些编程语言又产生了多个区别的版本。但无论是哪个编程语言,亦无论有多少个版本,虽然它们在细节上可能有所区别,无疑它们都有着固定的、无二义性的语法和语义。
以上说到的编程语言,都是高级计算机语言,设计它们的目的是为了方便程序员理解和运用。但严格来讲,计算机硬件只能理解一种非常低级的编程语言,叫作为设备语言。例如说,让计算机对 2 个数做求和操作,那样 CPU 可能要执行以下指令: 将位置于内存空间位置在 2001 的数加载到 CPU 中;再将位置于内存空间位置在 2002 的数亦加载到 CPU中;在 CPU中,对这 2 个数做求和操作;将结果存储在位置为 2003 的内存空间。能够看到,对 2 个数执行求和操作必须做这么多工作,且这还只是笼统地描述,实质会更加繁杂。而运用 Python 这般的高级语言,对 2 个数求和能够很自然地用 c = a + b 暗示,但由此带来的问题是,咱们必须设计一种办法,将高级语言翻译成计算机能够执行的设备语言,有两种办法能够实现,分别是运用编译器和解释器。运用编译器将自己等效转换成设备语言的高级语言,一般叫作为编译型语言;而运用解释器将自己转换成设备语言的高级语言,叫作为解释型语言,Python 便是解释型编程语言的一种。
编译型语言和解释型语言的区别
咱们编写的源代码是人类语言,咱们自己能够容易理解;然则针对计算机硬件(CPU),源代码便是天书,基本没法执行,计算机只能识别某些特定的二进制指令,在程序真正运行之前必要将源代码转换成二进制指令。
所说的二进制指令,亦便是设备码,是 CPU 能够识别的硬件层面的“代码”,简陋的硬件(例如古老的单片机)只能运用几十个指令,强大的硬件(PC 和智能手机)能运用成百上千个指令。
然而,到底在什么时候将源代码转换成二进制指令呢?区别的编程语言有区别的规定: 有的编程语言需求必要提前将所有源代码一次性转换成二进制指令,亦便是生成一个可执行程序(Windows 下的 .exe),例如C语言、C++、Golang、Pascal(Delphi)、汇编等,这种编程语言叫作为编译型语言,运用的转换工具叫作为编译器。有的编程语言能够一边执行一边转换,必须那些源代码就转换那些源代码,不会生成可执行程序,例如 Python、JavaScript、PHP、Shell、MATLAB 等,这种编程语言叫作为解释型语言,运用的转换工具叫作为解释器。简单理解,编译器便是一个“翻译工具”,类似于将中文翻译成英文、将英文翻译成俄文。然则,翻译源代码是一个繁杂的过程,大致包含词法分析、语法分析、语义分析、性能优化、生成可执行文件等五个过程,时期触及到繁杂的算法和硬件架构。解释器与此类似,有兴趣的读者请参考《编译原理》一书,本文再也不赘述。
Java 和 C# 是一种比较奇葩的存在,它们是半编译半解释型的语言,源代码必须先转换成一种中间文件(字节码文件),而后再将中间文件拿到虚拟机中执行。Java 引领了这种风潮,它的初衷是在跨平台的同期兼顾执行效率;C# 是后来的跟随者,然则 C# 始终止步于 Windows 平台,在其它平台鲜有做为。
图 1 编译型语言和解释型语言的执行流程
编译型语言
针对编译型语言,研发完成以后必须将所有的源代码都转换成可执行程序,例如 Windows 下的.exe文件,可执行程序里面包括的便是设备码。只要咱们持有可执行程序,就能够随时运行,不消再重新编译了,亦便是“一次编译,无限次运行”。
在运行的时候,咱们只必须编译生成的可执行程序,再也不必须源代码和编译器了,因此说编译型语言能够脱离研发环境运行。
编译型语言通常是不可跨平台的,亦便是不可在区别的操作系统之间随意切换。
编译型语言不可跨平台表此刻两个方面:
(1) 可执行程序不可跨平台
可执行程序不可跨平台很容易理解,由于区别操作系统对可执行文件的内部结构有着截然区别的需求,彼此之间亦不可兼容。不可跨平台是天经地义,能跨平台反而才是奇葩。
例如,不可将 Windows 下的可执行程序拿到 Linux 下运用,亦不可将 Linux 下的可执行程序拿到 Mac OS 下运用(虽然它们都是类 Unix 系统)。
另一,相同操作系统的区别版本之间亦不必定兼容,比如不可将 x64 程序(Windows 64 位程序)拿到 x86 平台(Windows 32 位平台)下运行。然则反之通常可行,由于 64 位 Windows 对 32 位程序作了很好的兼容性处理。
(2) 源代码不可跨平台
区别平台支持的函数、类型、变量等都可能区别,基于某个平台编写的源代码通常不可拿到另一个平台下编译。咱们以C语言为例来讲明。
【实例1】在C语言中想要让程序暂停能够运用“睡觉”函数,在 Windows 平台下该函数是 Sleep(),在 Linux 平台下该函数是 sleep(),首字母体积写区别。其次,Sleep() 的参数是毫秒,sleep() 的参数是秒,单位亦不同样。
以上两个原由引起运用暂停功能的C语言程序不可跨平台,除非在代码层面做出兼容性处理,非常麻烦。
【实例2】虽然区别平台的C语言都支持 long 类型,然则区别平台的 long 的长度却区别,例如,Windows 64 位平台下的 long 占用 4 个字节,Linux 64 位平台下的 long 占用 8 个字节。
咱们在 Linux 64 位平台下编写代码时,将 0x2f1e4ad23 赋值给 long 类型的变量是完全无问题的,然则这般的赋值在 Windows 平台下就会引起数值溢出,让程序产生错误的运行结果。
让人苦恼的,这般的错误通常不易察觉,由于编译器不会报错,咱们亦记不住区别类型的取值范围。
解释型语言
针对解释型语言,每次执行程序都必须一边转换一边执行,用到那些源代码就将那些源代码转换成设备码,用不到的不进行任何处理。每次执行程序时可能运用区别的功能,这个时候必须转换的源代码亦不同样。
由于每次执行程序都必须重新转换源代码,因此解释型语言的执行效率天生就小于编译型语言,乃至存在数量级的差距。计算机的有些底层功能,或关键算法,通常都运用 C/C++ 实现,仅有在应用层面(例如网站研发、批处理、小工具等)才会运用解释型语言。
在运行解释型语言的时候,咱们始终都必须源代码和解释器,因此说它没法脱离研发环境。
当咱们说“下载一个程序(软件)”时,区别类型的语言有区别的含义: 针对编译型语言,咱们下载到的是可执行文件,源代码被作者保存,因此编译型语言的程序通常是闭源的。针对解释型语言,咱们下载到的是所有的源代码,由于作者不给源代码就没法运行,因此解释型语言的程序通常是开源的。相比于编译型语言,解释型语言几乎都能跨平台,“一次编写,到处运行”是真是存在的,况且比比皆是。那样,为何解释型语言就能快平台呢?
这一切都要归功于解释器!
咱们所说的跨平台,指的是源代码跨平台,而不是解释器跨平台。解释器用来将源代码转换成设备码,它便是一个可执行程序,是绝对不可跨平台的。
官方必须针对区别的平台研发区别的解释器,这些解释器必要要能够遵守一样的语法,识别一样的函数,完成一样的功能,仅有这般,一样的代码在区别平台的执行结果才是相同的。
你看,解释型语言之因此能够跨平台,是由于有认识释器这个中间层。在区别的平台下,解释器会将相同的源代码转换成区别的设备码,解释器帮忙咱们屏蔽了区别平台之间的差异。
关于 Python
Python 属于典型的解释型语言,因此运行 Python 程序必须解释器的支持,只要你在不同的平台安装了区别的解释器,你的代码就能够随时运行,不消担心任何兼容性问题,真正的“一次编写,到处运行”。
Python 几乎支持所有平常的平台,例如 Linux、Windows、Mac OS、Android、FreeBSD、Solaris、PocketPC 等,你所写的 Python 代码无需修改就能在这些平台上正确运行。亦便是说,Python 的可移植性是很强的。
总结
咱们将编译型语言和解释型语言的差异总结为下表:
Python是什么?
编程语言有“高低”之分,而高级语言又有非常多种,例如 C++、Java、C#、PHP、JavaScript 等,Python 亦是其中之一。从本节起始,咱们将正式开始学习 Python 这门高级编程语言,然则这里之前,咱们有必要先讨论一下“Python 是什么”。
Python 英文原意为“蟒蛇”,直到 1989 年荷兰人 Guido van Rossum (简叫作 Guido)发明了一种面向对象的解释型编程语言,并将其命名为 Python,才赋予了它暗示一门编程语言的含义。
而在上文咱们已然解释了什么是解释型编程语言。
说道 Python,它的诞生是极具戏曲性的,据 Guido 的自述记载,Python 语言是他在圣诞节时期为了打发时间研发出来的,之因此会选取 Python 做为该编程语言的名字,是由于他是一个叫 Monty Python 戏剧团体的忠实粉丝。
Python 语言是在 ABC 教育语言的基本上发展来的;遗憾的是,ABC 语言虽然非常强大,但却无普及应用,Guido 认为是它不开放引起的。 基于这个思虑,Guido 在研发 Python 时,不仅为其添加了非常多 ABC 无的功能,还为其设计了各样丰富而强大的库,利用这些 Python 库,程序员能够把运用其它语言制作的各样模块(尤其是C语言和 C++)很容易地联结在一块,因此呢 Python 又常被叫作为“胶水”语言。
这儿的库和模块,简单理解便是一个个的源文件,每一个文件中都包括可实现各样功能的办法(亦可叫作为函数)。
从整体上看,Python 语言最大的特点便是简单,该特点重点表现在以下 2 个方面: Python 语言的语法非常简洁明了,即便是非软件专业的初学者,亦很容易上手。和其它编程语言相比,实现同一个功能,Python 语言的实现代码常常是最短的。针对 Python,网络上流传着“人生苦短,我用 Python”的说法。
因此呢,看似 Python 是“不经意间”研发出来的,但丝毫不比其它编程语言差。事实亦是如此,自 1991 年 Python 第1个公研发行版面世后: 2004 年起 Python 的运用率呈线性增长,持续受到编程者的欢迎和喜欢;2010 年,Python 荣膺 TIOBE 2010 年度语言桂冠;2017 年,IEEE Spectrum 发布的 2017 年度编程语言排行榜中,Python 位居第 1 位。直至此刻(2019 年 12 月份),按照 TIOBE 排行榜的表示,Python 亦居于第 3 位,且有继续提高的态势(如下图暗示)。
TIOBE 2019 年 12 月份编程语言排行榜(前 20 名)2019年12月2018年12月编程语言市场份额变化11Java17.253%
咱们不妨再看一下 Python 历年来的市场份额变化曲线,Python 的将来大势可期。
Python 历年来市场份额变化曲线
错失了 C/C++ 的 PC 时代,又错失了 Java 的互联网和智能手机时代,你还想错失 Python 的人工智能和大数据时代吗?Python 正位置于软件产业的第四次风口之上,把握好风口,你就能飞起来。
想学习Python的伴侣能够查看一下我往期的文案,有许多书籍及教程,都是能够直接下载的。
|