编程语⾔分类及python所属类型
编程语⾔分类及python所属类型
编程语⾔主要从以下⼏个⾓度为进⾏分类:编译型和解释型、静态语⾔和动态语⾔、强类型定义语⾔和弱类型定义语⾔。
编译和解释的区别是什么?
编译器是把源程序的每⼀条语句都编译成机器语⾔,并保存成⼆进制⽂件,这样运⾏时计算机可以直接以机器语⾔来运⾏此程序,速度很快;
⽽解释器则是只在执⾏程序时,才⼀条⼀条的解释成机器语⾔给计算机来执⾏,所以运⾏速度是不如编译后的程序运⾏的快的。
这是因为计算机不能直接认识并执⾏我们写的语句,它只能认识机器语⾔(是⼆进制的形式)
编译型vs解释型
编译型
优点:编译器⼀般会有预编译的过程对代码进⾏优化。因为编译只做⼀次,运⾏时不需要编译,所以编译型语⾔的程序执⾏效率⾼。可以脱离语⾔环境独⽴运⾏。
小g娜和吴亦凡事件
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运⾏环境⽣成机器码,不同的操作系统之间移植就会有问题,需要根据运⾏的操作系统环境编译不同的可执⾏⽂件。
解释型
优点:有良好的平台兼容性,在任何环境中都可以运⾏,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不⽤停机维护。
缺点:每次运⾏的时候都要解释⼀遍,性能上不如编译型语⾔。
⼀、低级语⾔与⾼级语⾔
新加坡郭美美
最初的计算机程序都是⽤0和1的序列表⽰的,程序员直接使⽤的是机器指令,⽆需翻译,从纸带打孔输⼊即可执⾏得到结果。后来为了⽅便记忆,就将⽤0、1序列表⽰的机器指令都⽤符号助记,这些与机器指令⼀⼀对应的助记符就成了汇编指令,从⽽诞⽣了汇编语⾔。⽆论是机器指令还是汇编指令都是⾯向机器的,统称为低级语⾔。因为是针对特定机器的机器指令的助记符,所以汇编语⾔是⽆法独⽴于机器(特定的CPU体系结构)的。但汇编语⾔也是要经过翻译成机器指令才能执⾏的,所以也有将
运⾏在⼀种机器上的汇编语⾔翻译成运⾏在另⼀种机器上的机器指令的⽅法,那就是交叉汇编技术。
⾼级语⾔是从⼈类的逻辑思维⾓度出发的计算机语⾔,抽象程度⼤⼤提⾼,需要经过编译成特定机器上的⽬标代码才能执⾏,⼀条⾼级语⾔的语句往往需要若⼲条机器指令来完成。⾼级语⾔独⽴于机器的特性是靠编译器为不同机器⽣成不同的⽬标代码(或机器指令)来实现的。那具体的说,要将⾼级语⾔编译到什么程度呢,这⼜跟编译的技术有关了,既可以编译成直接可执⾏的⽬标代码,也可以编译成⼀种中间表⽰,然后拿到不同的机器和系统上去执⾏,这种情况通常⼜需要⽀撑环境,⽐如解释器或虚拟机的⽀持,Java程序编译成bytecode,再由不同平台上的虚拟机执⾏就是很好的例⼦。所以,说⾼级语⾔不依赖于机器,是指在不同的机器或平台上⾼级语⾔的程序本⾝不变,⽽通过编译器编译得到的⽬标代码去适应不同的机器。从这个意义上来说,通过交叉汇编,⼀些汇编程序也可以获得不同机器之间的可移植性,但这种途径获得的移植性远远不如⾼级语⾔来的⽅便和实⽤性⼤。怎么打开任务管理器
⼆、编译与解释
编译是将源程序翻译成可执⾏的⽬标代码,翻译与执⾏是分开的;⽽解释是对源程序的翻译与执⾏⼀次性完成,不⽣成可存储的⽬标代码。这只是表象,⼆者背后的最⼤区别是:对解释执⾏⽽⾔,程序运⾏时的控制权在解释器⽽不在⽤户程序;对编译执⾏⽽⾔,运⾏时的控制权在⽤户程序。
解释具有良好的动态特性和可移植性,⽐如在解释执⾏时可以动态改变变量的类型、对程序进⾏修改
英语阅读理解技巧许姓女歌手以及在程序中插⼊良好的调试诊断信息等,⽽将解释器移植到不同的系统上,则程序不⽤改动就可以在移植了解释器的系统上运⾏。同时解释器也有很⼤的缺点,⽐如执⾏效率低,占⽤空间⼤,因为不仅要给⽤户程序分配空间,解释器本⾝也占⽤了宝贵的系统资源。
编译器是把源程序的每⼀条语句都编译成机器语⾔,并保存成⼆进制⽂件,这样运⾏时计算机可以直接以机器语⾔来运⾏此程序,速度很快;
⽽解释器则是只在执⾏程序时,才⼀条⼀条的解释成机器语⾔给计算机来执⾏,所以运⾏速度是不如编译后的程序运⾏的快的.
编译型和解释型:
我们先看看编译型,其实它和汇编语⾔是⼀样的:也是有⼀个负责翻译的程序来对我们的源代码进⾏转换,⽣成相对应的可执⾏代码。这个过程说得专业⼀点,就称为编译(Compile),⽽负责编译的程序⾃然就称为编译器(Compiler)。如果我们写的程序代码都包含在⼀个源⽂件中,那么通常编译之后就会直接⽣成⼀个可执⾏⽂件,我们就可以直接运⾏了。但对于⼀个⽐较复杂的项⽬,为了⽅便管理,我们通常把代码分散在各个源⽂件中,作为不同的模块来组织。这时编译各个⽂件时就会⽣成⽬标⽂件(Object  file)⽽不是前⾯说的可执⾏⽂件。⼀般⼀个源⽂件的编译都会对应⼀个⽬标⽂件。这些⽬标⽂件⾥的内容基本上已经是可执⾏代码了,但由于只是整个项⽬的⼀部分,所以我们还
不能直接运⾏。待所有的源⽂件的编译都⼤功告成,我们就可以最后把这些半成品的⽬标⽂件“打包”成⼀个可执⾏⽂件了,这个⼯作由另⼀个程序负责完成,由于此过程好像是把包含可执⾏代码的⽬标⽂件连接装配起来,所以⼜称为链接(Link),⽽负责链接的程序就叫……就叫链接程序(Linker)。链接程序除了链接⽬标⽂件外,可能还有各种资源,像图标⽂件啊、声⾳⽂件啊什么的,还要负责去除⽬标⽂件之间的冗余重复代码,等等,所以……也是挺累的。链接完成之后,⼀般就可以得到我们想要的可执⾏⽂件了。
上⾯我们⼤概地介绍了编译型语⾔的特点,现在再看看解释型。噢,从字⾯上看,“编译”和“解释”的确都有“翻译”的意思,它们的区别则在于翻译的时机安排不⼤⼀样。打个⽐⽅:假如你打算阅读⼀本外⽂书,⽽你不知道这门外语,那么你可以⼀名翻译,给他⾜够的时间让他从头到尾把整本书翻译好,然后把书的母语版交给你阅读;或者,你也⽴刻让这名翻译辅助你阅读,让他⼀句⼀句给你翻译,如果你想往回看某个章节,他也得重新给你翻译。
两种⽅式,前者就相当于我们刚才所说的编译型:⼀次把所有的代码转换成机器语⾔,然后写成可执⾏⽂件;⽽后者就相当于我们要说的解释型:在程序运⾏的前⼀刻,还只有源程序⽽没有可执⾏程序;⽽程序每执⾏到源程序的某⼀条指令,则会有⼀个称之为解释程序的外壳程序将源代码转换成⼆进制代码以供执⾏,总⾔之,就是不断地解释、执⾏、解释、执⾏……所以,解释型程序是离不开解释程序的。像早期的BASIC就是⼀门经典的解释型语⾔,要执⾏BASIC程序,就得进⼊BASIC环境,
然后才能加载程序源⽂件、运⾏。解释型程序中,由于
程序总是以源代码的形式出现,因此只要有相应的解释器,移植⼏乎不成问题。编译型程序虽然源代码也可以移植,但前提是必须针对不同的系统分别进⾏编译,对于复杂的⼯程来说,的确是⼀件不⼩的时间消耗,况且很可能⼀些细节的地⽅还是要修改源代码。⽽且,解释型程序省却了编译的步骤,修改调试也⾮常⽅便,编辑完毕之后即可⽴即运⾏,不必像编译型程序⼀样每次进⾏⼩⼩改动都要耐⼼等待漫长的Compiling…Linking…这样的编译链接过程。不过凡事有利有弊,由于解释型程序是将编译的过程放到执⾏过程中,这就决定了解释型程序注定要⽐编译型慢上⼀⼤截,像⼏百倍的速度差距也是不⾜为奇的。
编译型与解释型,两者各有利弊。前者由于程序执⾏速度快,同等条件下对系统要求较低,因此像开发操作系统、⼤型应⽤程序、数据库系统等时都采⽤它,像C/C++、Pascal/Object  Pascal(Delphi)、VB等基本都可视为编译语⾔,⽽⼀些⽹页脚本、服务器脚本及辅助开发接⼝这样的对速度要求不⾼、对不同系统平台间的兼容性有⼀定要求的程序则通常使⽤解释性语⾔,如Java、JavaScript、VBScript、Perl、Python等等。
但既然编译型与解释型各有优缺点⼜相互对⽴,所以⼀批新兴的语⾔都有把两者折衷起来的趋势,例如Java语⾔虽然⽐较接近解释型语⾔的特征,但在执⾏之前已经预先进⾏⼀次预编译,⽣成的代码是
介于机器码和Java源代码之间的中介代码,运⾏的时候则由JVM(Java的虚拟机平台,可视为解释器)解释执⾏。它既保留了源代码的⾼抽象、可移植的特点,⼜已经完成了对源代码的⼤部分预编译⼯作,所以执⾏起来⽐“纯解释型”程序要快许多。⽽像VB6(或者以前版本)、C#这样的语⾔,虽然表⾯上看⽣成的是.exe可执⾏程序⽂件,但VB6编译之后实际⽣成的也是⼀种中介码,只不过编译器在前⾯安插了⼀段⾃动调⽤某个外部解释器的代码(该解释程序独⽴于⽤户编写的程序,存放于系统的某个DLL⽂件中,所有以VB6编译⽣成的可执⾏程序都要⽤到它),以解释执⾏实际的程序体。C#(以及其它的语⾔编译器)则是⽣成⽬标代码,实际执⾏时则由解释系统(就像JVM⼀样,也是⼀个虚拟机平台)进⾏执⾏。当然⽬标代码已经相当“低级”,⽐较接近机器语⾔了,所以仍将其视为编译语⾔,⽽且其可移植程度也没有Java号称的这么强⼤,Java号称是“⼀次编译,到处执⾏”,⽽则是“⼀次编码,到处编译”。呵呵,当然这些都是题外话了。总之,随着设计技术与硬件的不断发展,编译型与解释型两种⽅式的界限正在不断变得模糊。
动态语⾔和静态语⾔:
通常我们所说的动态语⾔、静态语⾔是指动态类型语⾔和静态类型语⾔。
(1)动态类型语⾔:动态类型语⾔是指在运⾏期间才去做数据类型检查的语⾔,也就是说,在⽤动态类型的语⾔编程时,永远也不⽤给任何变量指定数据类型,该语⾔会在你第⼀次赋值给变量时,在
内部将数据类型记录下来。Python和Ruby就是⼀种典型的动态类型语⾔,其他的各种脚本语⾔如VBScript也多少属于动态类型语⾔。
20大时间
(2)静态类型语⾔:静态类型语⾔与动态类型语⾔刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语⾔的典型代表,其他的静态类型语⾔还有C#、JAVA等。
强类型定义语⾔和弱类型定义语⾔:
(1)强类型定义语⾔:强制数据类型定义的语⾔。也就是说,⼀旦⼀个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例⼦:如果你定义了⼀个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语⾔是类型安全的语⾔。
(2)弱类型定义语⾔:数据类型可以被忽略的语⾔。它与强类型定义语⾔相反, ⼀个变量可以赋不同数据类型的值。
强类型定义语⾔在速度上可能略逊⾊于弱类型定义语⾔,但是强类型定义语⾔带来的严谨性能够有效的避免许多错误。另外,“这门语⾔是不是动态语⾔”与“这门语⾔是否类型安全”之间是完全没有联系的!
例如:Python是动态语⾔,是强类型定义语⾔(类型安全的语⾔); VBScript是动态语⾔,是弱类型定义语⾔(类型不安全的语⾔); JAVA是静态语⾔,是强类型定义语⾔(类型安全的语⾔)。
通过上⾯这些介绍,我们可以得出,python是⼀门动态解释性的强类型定义语⾔。