runoob.com,变量类型

【runoob.com,变量类型】编程语言为什么有变量类型这个概念?

runoob.com,变量类型


▇ 首先 , 我们需要搞清楚类型的由来 。编程语言中所谓的类型 , 具体指的是数据(包括对象)的类型 。数据类型的产生有概念和物理两个方面因素:概念因素:数据因其本身内容在中我们脑子里对应的数学概念不同而进行的分类 , 常见类型有:数字(正整数、整数、小数、复数)、布尔、字符、符号、空、以及各种数据结构(字符串、数组、向量、列表、字典、集合、函数、... ) , 这些类型是在我们长期的数学应用中就形成的 , 是对外部概念的抽象;物理因素:我们在计算机语言中所定义的数据 , 最终需要实现在物理机器上 , 而非仅仅是大脑中的数学概念 , 这就要求 , 知道数据的大小、编码格式、等 这样的物理信息 , 根据这些信息就可以将数据分类 , 例如:C语言中 , 同样是整数却因大小不同而分为: char , short, long , long long , 这些类型是因为物理实现而产生的;若 , 将所有计算机语言 , 按照接近程度 , 从机器到数学排成一列 , 则越靠近机器这边的语言 , 其数据类型越受物理因素影响 , 例如:汇编、C/C , 反之 , 越接近数学的语言的数据类型越会围绕数学概念进行设计 , 例如:Lisp、R、JavaScript 。
▇ 接着 , 我们来看变量与数据类型的关系 。在所有计算机语言中 , 大体有两种看待变量的方式:变量是保存数据的容器;变量是访问数据的入口;● 采用第一种方式的计算机语言:因为变量需要保存数据 , 所以变量受其保存的数据的类型制约 。将数据保存到同类型变量的过程 , 称为赋值 。在我们声明变量时 , 计算机要给这个变量分配内存 , 这时 , 计算机至少需要知道这个变量将来的赋值数据的物理大小 , 于是 , 计算机语言 , 不得不要求 , 声明变量时 , 必须指出其赋值数据的类型(包含物理大小信息) 。
另一方面 , 根据数据类型对变量被分配的内存将伴随它的整个生命周期 , 同时 , 在访问变量中数据时还会使用数据类型 , 这就意味着 , 声明时指定的那个本意是赋值数据的类型变成了该变量的类型 , 这就是所谓的变量类型 。这种 , 变量有类型的语言 , 称为强类型语言 。● 采用第二种方式的计算机语言:其变量仅仅保存 , 数据在对象池中的 , 入口地址 , 而不保存数据 。
将数据入口地址保存到变量的过程 , 称为绑定 。我们在声明变量时 , 计算机只需要分配一个保存绑定地址的内存块就可以了 , 无需知道将要绑定的什么数据 , 于是变量也就没有了类型 。这种 , 变量没有类型的语言 , 称为弱类型语言 。▇ 最后 , 我们来比较一下强弱两种类型的语言 。早期 , 强类型语言 , 都是编译(静态)语言 , 例如:C/C , Fortran , Pascal 等 , 这类语言 , 没有强大的运行时来支持对象池 , 因此只能采用第一种方式 。
而早期 , 弱类型语言 , 都是解释(动态)语言 , 例如:Lisp , Scheme 等 , 它们有强大的解释器 , 其中包括对象池 , 因此可以采用第二种方式 。强类型语言 , 有一个非常大的优势 , 那就是:编译器知道变量的类型 , 可以提前检查赋值错误 , 再加上 , 编译语言的运行性能优势 , 这使得 , 强类型语言 , 在上世纪中叶很快成了主流 。但是 , 强类型的优势也是缺陷 , 这就是:由于变量带有类型 , 所以代码和类型强关联 , 很难写出同时适用于多种类型的代码 , 为了修补这个缺陷 , 几乎同时出现了两种解决方案:从宏(模板)发展出来的泛型;面向对象(OOP);泛型使得 , 类型可以成为某个代码块的参数 , 在使用该代码块时被具体制定 。

推荐阅读