概念 | 描述 |
---|---|
静态 | 全部或者几乎全部的类型检查是在编译期进行的 |
动态 | 类型的检查是在运行期进行的 |
强类型 | 类型一旦声明就不能改变 |
弱类型 | 变量在运行期时可以改变 |
编译型 | 必需编译成 CPU 能识别的二进制代码 |
解释型 | 语言层面上不需要直接运行在 CPU 上,但最终的语言运行环境还是跑在 CPU 上 |
在机器代码这个层面,其实是分不出什么数据类型的。在机器指令眼里,那就是0101,它并不对类型做任何要求,不需要知道哪儿是一个整数,哪儿代表着一个字符,哪儿又是内存地址。你让它做什么操作都可以,即使这个操作没有意义,比如把一个指针值跟一个字符相加。类型是针对一组数值,以及在这组数值之上的一组操作。类型是高级语言赋予的一种语义,有了类型这种机制,就相当于定了规矩,可以检查施加在数据上的操作是否合法。
强类型和弱类型。强类型语言中,变量的类型一旦声明就不能改变,弱类型语言中,变量类型在运行期时可以改变。强类型语言不允许违法操作,因为能够被检查出来。弱类型语言则从机制上就无法禁止违法操作,所以是不安全的。比如你写了一个表达式 a*b。如果 a 和 b 这两个变量是数值,这个操作就没有问题,但如果 a 或 b 不是数值,不同的语言可能做出不同的动作,弱类型语言隐式的帮你做出选择。
强类型语言的典型特征,它们不会处理与类型定义明显矛盾的运算,而是把它标记为一个问题,并作为错误抛出。和强类型语言不一样,当我们执行一些与类型定义不匹配的运算时,弱类型语言尝试提供帮助,它可能会临时转换值的类型,让它符合当前运算不报错。
例如一个数值变量和一个字符串变量做加法,强类型可能直接报出错误。而弱类型可能将两个转化成字符串然后进行拼接,也可能将其转换成两个数值类型然后做加法运算。【不同的语言和编译器对不同的类型转化会进行不同的约定。】
类型系统的“强/弱”指的是当编程语言遇到与类型定义不匹配的运算时,尝试猜测或者转换的力度/程序。它不是一条明确的界限,而是一个范围。
-
强类型语言在遇到与类型定义明显矛盾的运算时,一般会当做一种语法错误,而不会尝试对值的类型进行转换。
-
弱类型语言恰好相反,会猜测程序员的意图,并对其中一些值的类型进行转换,以让程序继续执行。
【强语言,让你必须明确自己的语义,不带来歧义,而弱语言会尽可能的保证你编程的连贯性,如果有歧义,会帮你做选择,所以排查时很不方便,会出现意想不到的结果】
目前的趋势是,某些动态类型语言在想办法增加一些机制,在编译期就能做类型检查,比如用 TypeScript 代替 JavaScript 编写程序,做完检查后再输出成 JavaScript。而某些静态语言呢,却又发明出一些办法,部分地绕过类型检查,从而提供动态类型语言的灵活性。
1、不管是强类型还是弱类型,变量都有两个属性:类型和值;即弱类型的变量同样有类型。不管是哪一种编程语言,其中使用的变量,都既有类型,又有值。强类型的变量类型,必须在源代码中明确定义,称之为“变量声明”,弱类型的变量类型则是无需声明的,由解释器解释。但是,这并不意味着,弱类型的变量就没有类型这一概念了。
2、强类型的变量类型是不能改变的,弱类型变量是随需改变的,这是强弱的真正含义。强类型的变量一经声明,就只能存储这种类型的值,其他的值则必须通过转换之后才能赋给该变量,有编译器自动理解的转换,也有由程序员明确指定的强制转换。但是,弱类型的变量类型则是随着需要不断转换。
3、强制转换并没有改变变量类型。强类型语言有个“强制转换”,这改变的是变量的值的类型,以便进行赋值,而没有改变变量的类型。变量的类型是不允许改变的。
参考