什么是编程语言的强类型,弱类型

给你来个例子把 弱类型语言vbs: a=1 b=a+"1"+"a" //结果是11a,这里 a 成了字符串 c=a+1 //结果是2 ,这里a则是数字型 强类型语言:c# int a=2 string b=a.ToString()+"1"+"a" int c=a+1 看到了吗?区分大小写,须要实现申明类型外,一个重要的区别是,弱类型的语言的东西没有明显的类型,他能随着环境的不一样,自动变换类型 而强类型则没这样的规定,不一样类型间的操做有严格定义,只有相同类型的变量才能操做,虽然系统也有必定的默认转换,当绝没有弱类型那么随便 ps:弱类型代码简单,但由于变量没有肯定的类型,因此容易出错!强类型代码复杂(好比:转换日期显示格式 (convert.toDatetime("2007-1-1 08:08:08")).ToString("yyyy-MM-dd"),呵呵你能够看到这种写法至关麻烦),但由于有严格定义因此不容易出错python

 

编译型和解释型c++


咱们先看看编译型,其实它和汇编语言是同样的:也是有一个负责翻译的程序来对咱们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(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#(以及其它.net的语言编译器)则是生成.net目标代码,实际执行时则由.net解释系统(就像JVM同样,也是一个虚拟机平台)进行执行。固然.net目标代码已经至关“低级”,比较接近机器语言了,因此仍将其视为编译语言,并且其可移植程度也没有Java号称的这么强大,Java号称是“一次编译,处处执行”,而.net则是“一次编码,处处编译”。呵呵,固然这些都是题外话了。总之,随着设计技术与硬件的不断发展,编译型与解释型两种方式的界限正在不断变得模糊。数据库

动态语言和静态语言
  一般咱们所说的动态语言、静态语言是指动态类型语言和静态类型语言。编程

(1)动态类型语言:动态类型语言是指在运行期间才去作数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其余的各类脚本语言如VBScript也多少属于动态类型语言。c#

(2)静态类型语言:静态类型语言与动态类型语言恰好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明全部变量的数据类型,C/C++是静态类型语言的典型表明,其余的静态类型语言还有C#、JAVA等。安全

对于动态语言与静态语言的区分,套用一句流行的话就是:Static typing when possible, dynamic typing when needed。ruby

强类型定义语言和弱类型定义语言服务器

(1)强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,若是不通过强制转换,那么它就永远是这个数据类型了。举个例子:若是你定义了一个整型变量a,那么程序根本不可能将a看成字符串类型处理。强类型定义语言是类型安全的语言。函数

(2)弱类型定义语言:数据类型能够被忽略的语言。它与强类型定义语言相反, 一个变量能够赋不一样数据类型的值。性能

强类型定义语言在速度上可能略逊色于弱类型定义语言,可是强类型定义语言带来的严谨性可以有效的避免许多错误。另外,“这门语言是否是动态语言”与“这门语言是否类型安全”之间是彻底没有联系的!
例如:Python是动态语言,是强类型定义语言(类型安全的语言); VBScript是动态语言,是弱类型定义语言(类型不安全的语言); JAVA是静态语言,是强类型定义语言(类型安全的语言)。

 

静态类型定义语言

一种在编译时,数据类型是固定的语言。大多数静态类型定义语言强制这一点,它要求你在使用全部变量以前要声明它们的数据类型。Java和C是静态类型定义语言。

动态类型定义语言

一种在执行期间才去发现数据类型的语言,与静态类型定义相反。VBScript和Python是动态类型定义的,由于它们是在第一次给一个变量赋值的时候找出它的类型的。

强类型定义语言

一种老是强制类型定义的语言。Java和Python是强制类型定义的。若是你有一个整数,若是不显示地进行转换,你不能将其视为一个字符串。

弱类型定义语言

一种类型能够被忽略的语言,与强类型定义相反。VBScript是弱类型定义的。在VBScript中,能够将字符串'12'和整数3进行链接获得字符串'123',而后能够把它当作整数123,而不须要显示转换。但其实它们的类型没有改变,VB只是在判断出一个表达式含有不一样类型的变量以后,自动在这些变量前加了一个clong()或(int)()这样的转换函数而已.能作到这一点实际上是归功于VB的编译器的智能化而已,这并不是是VB语言自己的长处或短处.

结论:

静态是类型编译时判断;动态是类型运行时判断;强类型是类型独立,不轻易转化;弱类型是类型不严格区分,通常是只要大小放得下,就能够转化。这种是汇编级的观点。面向对象的观点并不是这样的,对象并非大小差很少就是类型兼容,而是关键的接口要相同才叫类型兼容。

动态语言并不是是弱类型,这是不等价的。刚好的,通常动态语言都是强类型语言,由于都是遵守面向对象的观点来设计对象的。

动态语言的劣势很明显,就是缺乏开发环境,运行效率差,固然语言设计上也不完美(静态语言何止千万,但c++也就一个)。

优点也很明显,就是编写容易,层次高,接近天然语义。动态类型语言效率低下的缘由,不在于变量的类型是动态的,而在于对象的方法是动态联编的,在这一点上动态类型语言和Java没什么不一样。

静态类型语言的优点到底是什么?

观点一:静态类型语言由于类型强制声明,因此IDE能够作到很好的代码感知能力,由于有IDE的撑腰,因此开发大型系统,复杂系统比较有保障。

对于像Java来讲,IDEA/Eclipse确实在代码感知能力上面已经很是强了,这无疑可以增长对大型系统复杂系统的掌控能力。可是除了Java拥有这么强的IDE武器以外,彷佛其余语言历来没有这么强的IDE。C#的Visual Studio在GUI开发方面和Wizard方面很强,可是代码感知能力上和Eclipse差的不是一点半点。至于Visual C++根本就是一个编译器而已,羞于说起Visual这个字眼。更不要说那么多C/C++开发人员都是操起vi吭哧吭哧写了几十万行代码呢。特别是像Linux Kernel这种几百万行代码,也就是用vi写出来的阿,够复杂,够大型,够长生命周期的吧。

观点二:静态语言相对比较封闭的特色,使得第三方开发包对代码的侵害性能够降到很低。动态语言在这点上表现的就比较差,我想你们都有过从网上下载某个JS包,而后放到项目代码里发生冲突的经历

也就是说静态类型语言能够保障package的命名空间分割,从而避免命名冲突,代码的良好隔离性。可是这个观点也缺少说服力。

静态类型语言中C,VB都缺少良好的命名空间分割,容易产生冲突,可是并无影响他们作出来的系统就不够大,不够复杂。

而Visual C++开发的DLL版本冲突也是臭名昭著的,彷佛C++的命名空间没有给它带来很大的帮助。

而动态类型语言中Ruby/Python/Perl都有比较好的命名空间,特别是Python和Perl,例如CPAN上面的第三方库成吨成吨的,也历来没有据说什么冲突的问题。

诚然像PHP,JavaScript这样缺少命名空间的动态语言很容易出现问题,可是这彷佛是由于他们缺少OO机制致使的,而不是由于他们动态类型致使的吧?

说到大型系统,复杂业务逻辑系统,Google公司不少东西都是用python开发的,这也证实了动态类型语言并不是不能作大型的复杂的系统。其实我我的认为:

动态类型语言,特别是高级动态类型语言,反而可以让人们不须要分心去考虑程序编程问题,而集中精力思考业务逻辑实现,即思考过程即实现过程,用DSL描述问题的过程就是编程的过程,这方面像Unix Shell,ruby,SQL,甚至PHP都是相应领域当之无愧的DSL语言。而显然静态类型语言基本都不知足这个要求。

那静态类型语言的优点到底是什么呢?我认为就是执行效率很是高。因此但凡须要关注执行性能的地方就得用静态类型语言。其余方面彷佛没有什么特别的优点。

 

给你来个例子把

弱类型语言vbs:
 a=1
 b=a+"1"+"a" //结果是11a,这里 a 成了字符串
 c=a+1 //结果是2 ,这里a则是数字型

强类型语言:c#
int a=2
string b=a.ToString()+"1"+"a"
int c=a+1

看到了吗?区分大小写,须要实现申明类型外,一个重要的区别是,弱类型的语言的东西没有明显的类型,他能随着环境的不一样,自动变换类型
而强类型则没这样的规定,不一样类型间的操做有严格定义,只有相同类型的变量才能操做,虽然系统也有必定的默认转换,当绝没有弱类型那么随便

ps:弱类型代码简单,但由于变量没有肯定的类型,因此容易出错!强类型代码复杂(好比:转换日期显示格式 (convert.toDatetime("2007-1-1 08:08:08")).ToString("yyyy-MM-dd"),呵呵你能够看到这种写法至关麻烦),但由于有严格定义因此不容易出错