冒号课堂§5.2:数据类型 - 编程入门网
需要更小心以避免破坏客户代码;另外它也可能造成滥用——将一个会叫会游的家伙放进池塘看起来不算坏主意,但如果一艘轮船趁机也轰隆隆地开了进来,事情恐怕就不那么美妙了。”
众皆莞尔。 冒号课堂§5.2:数据类型(4)时间:2011-06-27 BlogJava xyz98“再来看看静态类型语言的好处:由于在运行之前进行了类型检查,一方面代码的可靠性增强,符合发现错误要尽早的原则;另一方面编译器有可能藉此优化机器代码以提高运行效率,同时相比前者节省了运行期的耗费在类型检查上的时间和空间。此外,变量类型的声明彰显了编程者的意图,有辅助文档的功效。”冒号有条有理地解释着,“两种类型的体制可以用两种法律原则来类比:静态类型检查类似‘疑罪从有’的有罪推定制——在被证明合法之前是非法的,动态类型检查类似‘疑罪从无’的无罪推定制——在被证明非法之前是合法的。至于如何取舍,套用一句话:‘Static Typing Where Possible, Dynamic Typing When Needed’。不妨理解为:尽可能守规则,必要时求变通。” 句号俏皮地说:“规则如裤带,过于宽松和过于束缚都不好。” 问号提出新问题:“动态类型语言与弱类型语言有何不同?” 冒号喟言:“它们也常常被混为一谈,但类型的动静与强弱完全是正交的两个概念。静态类型语言中,有强类型的Java,也有弱类型的C;动态类型语言中,有强类型的Smalltalk,也有弱类型的JavaScript。前者以类型的绑定(binding)时间来划分,后者以类型的约束强度来划分。通常弱类型语言(weakly-typing language)允许一种类型的值隐性转化为另一种类型[5]。举个例子,1+"2"在VB中等于3——第二个字符串转化为整数;在JavaScript中等于"12"——第一个整数转化为字符串;在C中则等于一个不定的整数值——第二个字符串作为地址来运算。这样似乎很有趣很方便,但程序容易藏污纳垢,滋生臭虫(bug)。与此相对地,强类型语言(strongly-typed language)着意贯彻类型控制,为保障数据的完整性和代码的安全有效性,一般不允许隐性类型转换[6]。如果一定需要类型转换,必须是显性转换,一般通过我们熟知的铸型(cast)来完成。” 引号想起:“好像还有一种所谓的类型安全语言?” 逗号紧紧抱着头,仿佛害怕裂开。 “类型按安全性来划分,可分为类型安全语言(type-safe language)和类型不安全语言(type-unsafe language)。类型检查的目的就是为了避免类型错误(type error)[7],即杜绝因类型问题而产生的错误或不良代码。如果一个类型系统能完全做到这一点,它就被称为类型安全的。虽然尚存争议,但一般认为强类型语言对类型控制更严格,因而是类型安全的,弱类型语言是类型不安全的。类型安全固然对保障程序的合理性和可靠性十分重要,但若过于严苛,程序也就失去了活力,正所谓‘水至清则无鱼’啊。” 冒号有条不紊地解说着,“至此,我们已论及数据类型的三种划分方式。需要说明的是,这些划分并非泾渭分明的[8],更多的是定性而非定量的描述,甚至没有公认统一的定义。但了解它们,对我们理解编程语言和编程原则是大有裨益的。” ,插语 [1] Scala是动态语言,却是静态类型的。 [2] Visual Basic(不包括VB.NET) 支持动态类型,却是静态语言。 [3] 极少数语言没有类型检查(untyped或typeless),如大多数汇编语言、Forth语言等。 [4] C#4.0将支持duck typing。 [5] 隐式转换也称为强制转换(coercion)。有人将显式转换的铸型(cast)译为强制转换,并不准确。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |