程序语言的类型系统

程序语言的类型系统

分为静态类型和动态类型:

    静态类型语言和动态类型语言的最重要区别是何时确定变量和对象的类型。

    静态类型语言要求程序员在编程时必须为变量指定类型integer,string,character,定义函数时为函数参数、返回值指定类型等等。这样在编译阶段就可以进行类型检查。例如两变量相加“+”操作,一个变量是int型,另一变量是string型,编译时报错。因为“+”操作要求两个参数必须为整型或浮点型(Java语言对两个字符串可以进行“+”操作,实现字符串的拼接)。动态类型语言则不同,在运行时解释器通过类型推导系统,推导出表达式(或者函数参数、返回值等)的数据类型,通过事先的“类型—操作”绑定和类型检查,保证操作的安全。

静态类型和动态类型又可分弱类型和强类型:

以C语言为例:

    C语言定义变量时需指定类型,int,char,string等。但是对C语言变量而言,类型的作用是有限的。当要打印变量值时还需要制定输入类型,否则可能得到不是预期的结果。这种特性被称为弱静态类型语言。

int a = 1;
printf("The number is %in", a);
char z = 'z';
printf("The character is %cn",z);
//运行时,得到的结果:
The number is 1 The character is z
//Printf函数需要程序员指定显示的格式否则可能得到非预期的效果:
char z = 'z';
printf("The character is %in",z);
//得到:
The character is 122
//不同的编译器可能给出warning

    C语言并不保存变量的类型信息,而只是在类型检查时要求变量类型一致。并且包含很多隐式类型转换规则。C是弱类型静态语言。

    与弱类型语言不同,强类型语言的变量和对象的类型是固定的。也就是语言的内置类型的界限比较清楚,一般动态类型语言是强类型的。

    除了何时以及如何确定表达式和型态的联系,另外一个重要的问题就是语言到底定义了哪些型态,以及允许哪些型态作为表达式的值。

 类型推论

    类型推论或隐含类型,是指编程语言中能够自动推导出值的类型的能力,它是一些强静态类型语言中出现的特性。一般而言,类型推论常常是函数式编程语言(不限于此)的特征。具有类型推论的语言有: Haskell, Cayenne, Clean, ML, OCaml,Epigram, Scala, Nemerle, D, Chrome,VisualBasic 2008和 Boo。计划支持类型推论的有 Fortress, Vala, C# 3.0, C++11[1]和Perl 6。自动推断类型的能力让很多编程任务变得容易,让程序员可以忽略类型标注的同时仍然允许类型检查。明确的转换到另一种数据类型叫做“强制”。

非技术性解说

    在大多数的编程语言中,所有值都有一个类型,它描述特定值的数据种类。在一些语言中,表达式的类型只在运行时才知道;这些语言被称作动态类型语言。而另一些语言中,表达式的类型在编译时就知道,这些语言叫做静态类型语言。在静态类型语言中,函数的输入和输出与局部变量的类型一般必须用类型标注明确的提供。例如,在 C 语言中:

 int addone (int x)
 {
    int result; /*声明整数 result (C 语言)*/
    result = x+1;
    return result;
 }

这个函数定义开始处,int addone(int x)声明了addone是函数,接受一个整数类型的参数,并返回一个整数。int result;声明了局部变量result是个整数。在支持类型推论的建议的语言中,代码可写为如下:

addone(x) {
   var result;  /*推论类型 result (在建议的语言中)*/
   var result2; /*推论类型 result #2 */
   result = x+1;
   result2 = x+1.;  /* 此行不工作 */
   return result;
}

这看起来非常像在动态类型语言中写出的代码,但是提供了一些额外的约束(见下)使得能够在编译时推断出所有变量的类型。在上面的例子中,因为“+”总是接受两个整数并返回一个整数。编译器可以推论出x+1的值是个整数,因此result是个整数,addone的返回值是个整数。类似的,因为“+”要求它的两个实际参数都是整数,x必须是整数,因此addone接受一个整数实际参数。但是在随后一行中result2加上了一个浮点数"1.",导致了x同时用于整数和浮点数的冲突。这种情况将生成编译时间错误消息。在旧语言中,result2可以被隐含的声明为浮点变量,通过隐含的转换表达式中的整数x,简单的因为小数点意外的被放到了整数1的后面。这种情况说明了二者之间的区别,“类型推论”不涉及类型转换,而“隐含类型转换”经常没有限制的把数据强制成高精度的数据类型。

技术描述

    类型推论指的是要么部分要么完全自动演绎的能力,把值的类型从表达式的最终计算中推导出来。因为这个过程在编译时间系统性的进行,编译器经常能推出变量的类型或函数的类型标署,而不用给出明确的类型标注。在很多情况下,如果推论系统足够强壮或程序足够简单,有可能完全从程序中省略类型标注。

    要获得正确推导出缺乏类型标注的一个表达式的类型所必要的信息,编译器要么随着给它的子表达式(它们自身可以是变量或函数)的类型标注的聚集(aggregate)和后续简约来收集这种信息,要么通过各种原子值的类型的隐含理解(比如():单位;true:布尔;42:整数;3.14159:实数;等等)。通过表达式的最终简约到隐含类型原子值的识别,类型推论语言的编译器有能力编译完全没有类型标注的程序。在高阶编程和多态性的高度复杂的情况下,编译器不能总是如此推论,偶尔需要类型标注来去除歧义。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值