一.编译型语言与解释型语言( 四 )


原文链接:
动态类型语言( Typed ):
动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来 。和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如也多少属于动态类型语言 。
静态类型语言( Typed ):
静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等 。
二者区别
1.静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型;比如C/C++ 是静态类型语言的典型代表,其他的静态类型语言还有 C#、JAVA 等 。动态语言是在运行时确定数据类型的语言 。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型;像是 和 Ruby 就是一种典型的动态类型语言,其他的各种脚本语言如也属于动态类型语言 。
2.静态类型语言编译时会进行类型匹配检查,所以不能给变量赋予不同类型的值 。为了解决这一问题,静态类型的面向对象语言通常通过向上转型的技术来取得多态的效果 。动态类型语言的变量类型在运行期是可变的,这意味着对象的多态性是与生俱来的 。一个对象能否执行某个操作,只取决于有没有对应的方法,而不取决于它是否是某种类型的对象 。
3.静态语言的优势:由于类型的强制声明,使得IDE有很强的代码感知能力,故在实现复杂的业务逻辑、开发大型商业系统、以及那些生命周期很长的应用中,依托IDE对系统的开发很有保障;由于静态语言相对比较封闭,使得第三方开发包对代码的侵害性可以降到最低;动态语言的优势:编写的代码数量更少,看起来更加简洁,可以把精力更多地放在业务逻辑上 。虽然不区分类型在某些情况下会让程序变得难以理解,但整体而言,代码量越少,越专注于逻辑表达,对阅读程序越有帮助 。
4.静态语言由于强制声明数据类型,让开发工具(IDE)对代码有很强的判断能力,在实现复杂的业务逻辑和开发大型商业系统、以及那些声明周期很长的应用中,开发者可以依托强大的IDE来更高效、更安全地开发 。
5.动态语言思维不受约束,可以任意发挥,把更多的精力放在产品本身上;集中思考业务逻辑实现,思考过程就是实现过程 。
部分内容出处:
具体来说:
理解静态与动态之别,我们要从变量赋值这个操作为切入点 。静态类型语言中,变量的类型必须先声明,即在创建的那一刻就已经确定好变量的类型,而后的使用中,你只能将这一指定类型的数据赋值给变量 。如果强行将其他不相干类型的数据赋值给它,就会引发错误 。
在静态语言中,一旦声明一个变量是int类型,之后就只能将int类型的数据赋值给它,否则就会引发错误,而动态类型则没有这样的限制,你将什么类型的数据赋值给变量,这个变量就是什么类型
更形象的说明:
在知乎上看到一个作者对二者进行了有趣的说明,摘抄如下:
原文链接:
动态语言和静态语言最大的区别,在于可读性、可维护性的不同 。小学生刚刚学习写作文的时候,总有很多字不会写 。有的老师会让学生,把不会写的字,画成一个圈儿,即O 。一个句子,原本应该写成写成“今天下雨了” 。而有些小学生不会写“雨”字 。就可以写成“今天下O了” 。这个“O”可以代表任何东西,当然也可以代表雨 。对于判作业的老师来说,这个“O”就是动态的 。直到老师猜出这个“O”是雨之后,才能确定这个句子是不是病句 。这种画圈儿的规则,是一把双刃剑,整体讲是弊大于利的 。好处是可以让学生只掌握很少的汉字,就能开始学习写作文 。但缺点是圈儿一旦变多,就会失控 。常常连作者自己都分不清,每个圈儿分别代表啥?写的时候很容易,可第二天连自己都看不懂 。而对于高年级的学生,就不允许使用“O”了 。遇到不会写的字,就要去查字典,只有写出所有的字,才能把作文写完 。对于判作业的老师来说,这就是静态的,有没有病句,一眼便知 。虽然写出作文的门槛提高了,但表述更加清晰,无论任何时间翻出来,都能一目了然 。编程语言比我们的例子要复杂,但道理是一样的,区别就是它不能只画“O”,而是不同的东西,需要用不同的“名字”表示,为了便于说明,下面的“名字”都使用一个字母来命名 。