首页
学习
活动
专区
工具
TVP
发布

聊聊编程语言中的类型系统

有人可能有这样的疑问, 我只听说过弱类型也叫动态语言 和 强类型语言也叫静态语言。弱类型语言如 Python、JavaScript 等;强类型语言如 C/C++、Java等。

而强类型语言又包括:

基础数据类型(有人也叫内建类型),如 int、 long 等

抽象类型(有人也叫对象类型),如 struct、class 和 function 等

那类型系统有是怎样形成的呢?作用是什么?优缺点是什么?如果你有类似问的, 希望今天的文章能帮到你。

在计算机科学中,类型系统用于定义如何将编程语言中的数值和表达式归类为许多不同的类型,以及如何操作这些类型,还有这些类型如何互相作用。类型可以确认一个值或者一组值具有特定的意义和目的。

类型系统的作用

程序语言的安全性。使用类型可以让编译器侦测一些代码的错误。例如:可以识别出一个错误无效的表达式。如:“Hello, World” + 66这样的不同数据类型间操作的问题。强类型语言提供更多的安全性,但是并不能保证绝对的安全。

利于编译器的优化。 静态类型语言的类型声明,可以让编译器明确地知道程序员的意图。因些,编译器就可以利用这一信息做很多代码优化工作。例如:如果我们指定一个类型是 int ,那么编译就知道,这个类型会以 4 个字节的倍数进行对齐,编译器就可以非常有效地利用更有效率的机器指令。

代码的可读性。有类型的编程语言,可以让代码更易读和更易维护。代码的语义也更清楚,代码模块的接口(如函数)也更丰富和更清楚。

抽象化。类型允许程序设计者对程序以较高层次的方式思考,而不是烦人的低层次实现。例如,我们使用整型或是浮点型来取代底层的字节实现,我们可以将字符串设计成一个值,而不是底层的字节的数组。从高层上来说,类型可以用来定义不同模块间的交互协议,比如函数的入参类型和返回类型,从而可以让接口更有语义,而且不同的模块数据交换更为直观和易懂。

每个语言都需要一个类型检查系统。无论哪种程序语言,都逃避免不了一个特定的类型系统。哪怕是可随意改变变量类型的弱类型的语言,我们在读代码的过程中也需要脑补某个变量在运行时的类型。

静态类型检查是在编译器进行语义分析时进行的。如果一个语言强制实行类型规则(即通常只允许以不丢失信息为前提的自动类型转换),那么称此处理为强类型,反之称为弱类型。

动态类型检查系统更多的是在运行时期做动态类型标记和相关检查。所以,动态类型的语言必然要给出一堆诸如: typeof() 这样的运行时类型检查函数。

对于 JavaScript 这样的动态语言来说可以定义出下面这样的数据结构(一个数组的元素可以是各式各样的类型),这在强类型的语言中是很难做到的。

我也看到这样的总结:

类型是对底层内存布局的一个抽象,会让我们的代码要关注于这些非业务逻辑上的东西。

强类型语言的支持者和弱类型的支持者,经常发生争执。前者主张,在编译的时候就可以较早发现错误,而且还可增进运行时期的性能。后者主张,使用更加动态的类型系统,分析代码更为简单,减少出错机会,才能更加轻松快速地编写程序。与此相关的是,后者还主张,考虑到在类型推断的编程语言中,通常不需要手动申明类型,这部分的额外开销也就自动降低了。

其实我个人也很矛盾, 当我很潇洒的通过机械键盘敲出自认为很满意的时候, 看似没问题的代码, 让运行发现出错, 最后发现变量的单词敲错了。这个时候我就想起来强类型语言的好了。似乎动态类型语言能够比较好地规避掉类型导致需要出现多个版本代码的问题。这样可以让我们更好地关注于业务。

但是,我们需要清楚地明白,任何语言都有类型系统,只是弱类型语言在运行时做类型检查。弱语言的代码复杂度比较低,并可以更容易地关注业务,在某些场景下是对的,但有些情况下却并不见得。

如果你用过一段时间的弱类型语言,一旦代码量比较大了,我们就会发现,代码中出现“类型问题”而引发整个程序出错的情况实在是太多太多了。这个时候,我们就很希望提前发现这些类型的问题。

强类型语言的支持者会说编译器会帮我们找到这些问题,而弱类型语言的支持者则认为,强类型语言的编译器也无法找到所有的问题,想真正提前找到问题只能通过测试来解决。其实他们都对。

我们最终看到一种现象就是,不同的语言在设计上都会做相应的取舍。比如:C 语言偏向于让程序员可以控制更多的底层细节,而 Java 和 Python 则让程序员更多地关注业务功能的实现。而 C++ 则是两者都想要,导致语言在设计上非常复杂。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180207G08SJG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券