Python是⼀门什么样的语⾔
先做个总结:Python是⼀门动态解释型的强类型定义语⾔。
那何为动态?何为解释?何为强类型呢?
我们需要了解编译型和解释型、静态语⾔和动态语⾔、强类型定义语⾔和弱类型定义语⾔这6个概念就可知晓。
编译型和解释型
我们先看看编译型,其实它和汇编语⾔是⼀样的:也是有⼀个负责翻译的程序来对我们的源代码进⾏转换,⽣成相对应的可执⾏代码。这个过程说的专业⼀点,就称为编译(Compile),⽽负责编译的程序⾃然就称为编译器(Compiler)。如果我们写的程序代码都包含在⼀个源⽂件中,那么通常编译之后就会直接⽣成⼀个可执⾏⽂件,我们就可以直接运⾏了。但对于⼀个⽐较复杂的项⽬,为了⽅便管理,我们通常把代码分散在各个源⽂件中,作为不同的模块来组织。这时编译各个⽂件时就会⽣成⽬标⽂件(Object file)⽽不是前⾯说的可执⾏⽂件。⼀般⼀个源⽂件的编译都会对应⼀个⽬标⽂件。这些⽬标⽂件⾥的内容基本上已经是可执⾏代码了,但由于只是整个项⽬的⼀部分,所以我们还不能直接运⾏。待所有源⽂件的编译都⼤功告成,我们就可以最后把这些半成品的⽬标⽂件“打包”成⼀个可执⾏⽂件了,这个⼯作由另⼀个程序负责
完成,由于此过程好像是把包含可执⾏代码的⽬标⽂件连接装配起来,所以⼜称为链接(Link),⽽负责链接的程序就叫链接程序(Linker)。链接程序除了链接⽬标⽂件外,可能还有各种资源,像图标⽂件、声⾳⽂件什么的,还要负责去除⽬标⽂件之间的冗余重复代码,等等,所以...也是挺累的。链接完成后,⼀般就可以得到我们想要的可执⾏⽂件了。
上⾯我们⼤概介绍了编译型语⾔的特点,现在再看看解释型。从字⾯上看,“编译”和“解释”的确有“翻译”的意思,他们的区别在于翻译的时机安排不⼤⼀样。打个⽐⽅:假如你打算阅读⼀本外⽂书,⽽你不知道这门外语,那么你可以⼀名翻译,给他⾜够的时间让他把整本书从头到尾翻译好,然后把书的母语版交给你阅读;或者,你也⽴刻让这名翻译辅助你阅读,让他⼀句⼀句给你翻译,如果你想往回看某个章节,他也得重新给你翻译。
两种⽅式,前者相当于我们说的编译型:⼀次把所有代码朱焕为机器语⾔,然后写可执⾏⽂件;⽽后这就相当于我们说的解释型:在程序运⾏的前⼀刻,还只有源程序没有可执⾏程序;⽽程序每执⾏到源程序的某⼀条指令,则会有有⼀个称为解释程序的外壳程序将源代码转换成⼆进制代码以供执⾏,总⾔之就是不断的解释、执⾏、解释、执⾏.....所以解释型程序是离不开解释程序的。像早期的BASIC就是⼀门经典的解释型语⾔,要执⾏BASIC。解释型程序中由于程序总是以源代码的形式出现,因此只要有相应的解释器,移植⼏乎不成问题。编译型程序虽然源代码也可以移植,但前提是必须针对不同的系统分别进⾏编译,对于复杂的⼯程来说,的确是意见不⼩时间的消耗,况且很可能⼀些细节的地⽅还要需要修
改源代码。⽽且,解释型程序省却了编译的步骤,修改调试也⾮常⽅便,编辑完毕之后即可⽴即执⾏,不必像编译程序⼀样每次进⾏⼩⼩改动都要耐⼼等待漫长这样的编译链接过程。不过凡事有利有弊,由于解释型程序是将编译的过程放到执⾏过程中,这就决定了解释型程序注定要⽐编译型慢上⼀⼤截,像⼏百倍的速度差距也是不⾜为奇的。
编译型和解释型各有利弊。前者由于程序执⾏速度快,同等条件下对系统要求较低,因此像开发操作系统、⼤型应⽤程序、数据库系统时都采⽤它,像C/C++、Pascal/Object Pascal(Delphi)、VB等基本都可视编译语⾔,⽽⼀些⽹页脚本、服务器脚本及辅助开发接⼝这样的对速度要求不⾼、对不同系统平台间的兼容性有⼀定要求的程序则通常使⽤解释型语⾔,如Java、JavaScript、VBScript、Perl、Python等等。
但既然编译型和解释型各有优缺点⼜互相对应,所以⼀批新兴的语⾔都有把两者折中起来的趋势,例如Java语⾔虽然⽐较接近解释型语⾔的特征,但执⾏之前已经预先进⾏⼀次预编译,⽣成的代码是介于机器码和Java源代码之间的中介代码,运⾏的时候则由JVM(Java的虚拟机平台,可视为解释器)解释执⾏。它既保留源代码的⾼抽象、可移植的特点,⼜已经完成了对源代码的⼤部分预编译⼯作,所以执⾏起来⽐“纯解释型”程序要快许多。⽽像VB6(或者以前版本)、C#这样的语⾔,虽然表⾯上看⽣成的是.exe可执⾏程序⽂件,单VB6编译之后实际⽣成的也是⼀种中介码,只不过编译器在前⾯安插了⼀段⾃动调⽤某个外部解释器的代码(该解释程序独⽴于⽤户编写的程序,存放于系统的某个DLL⽂件中,所有以V
B6编译⽣成的可执⾏程序都要⽤到它),以解释执⾏实际的程序体。C#(以及其他的语⾔编译器)则是⽣成⽬标代码,实际执⾏时则由解释系统(就像JVM⼀样,也是⼀个虚拟平台)进⾏执⾏。当然⽬标代码已经相当低级,⽐较接近机器语⾔了,所以仍将其视为编译语⾔,,⽽且其移植程度也没有Java号称的这么强⼤,Java号称是“⼀次编译,到处执⾏”,⽽则是“⼀次编码,到处编译”。总⽽⾔之,随着设计技术与硬件不断发展,编译型与解释型两种⽅式的界限正在不断变得模糊。
动态语⾔和静态语⾔
通常我们说的动态语⾔和静态语⾔是指动态类型语⾔和静态类型语⾔。
(1)动态类型语⾔:冬天类型语⾔是指在运⾏期间才去做数据类型检查的语⾔,也就是说,在⽤动态类型语⾔编译的时,永远也不⽤给任何变量指定数据类型,该语⾔会在你第⼀次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是⼀种典型的动态类型语⾔,其他的各种脚本语⾔如VBScript也多少属于动态类型语⾔。
(2)静态类型语⾔:静态类型语⾔和动态类型语⾔正好相反,它的数据类型是在编译期间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语⾔的典型代表,其他的静态类型语⾔还有C#、Java等。
强类型定义语⾔和弱类型定义语⾔
basic语言解释程序属于什么
(1)强类型定义语⾔:强制数据类型定义的语⾔。也就是说,⼀旦⼀个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例⼦,如果您定义了⼀个整型变量a,那么程序根本不能将a当做字符串类型处理。强类型定义语⾔是类型安全的语⾔。
(2)弱类型定义语⾔:数据类型可以被忽略的语⾔。它与强类型定义语⾔相反。⼀个变量可以赋不同数据类型的值。
强类型定义语⾔在速度上可能略逊⾊于弱类型定义语⾔,但是强类型定义语⾔带来的严谨性能够有效的避免许多错误。另外,“这门语⾔是不是动态语⾔”与“这门语⾔是否类型安全”之间是完全没有联系的!
例如:Python是动态语⾔,是强类型定义语⾔(类型安全的语⾔);VBScript是动态语⾔,是弱类型定义语⾔(类型不安全的语⾔);Java是静态语⾔,是强类型定义语⾔(类型安全的语⾔)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论