动态类型

作者:rainoftime
链接:http://www.zhihu.com/question/19918532/answer/21647195
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

类型系统的一些概念,众说纷纭,使用上也比较乱。有些东西,甚至不好严格定义。以下算学术界的一种相对“严格”的说法。

1. 先定义一些基础概念

Program Errors

  • trapped errors。导致程序终止执行,如除0,Java中数组越界访问
  • untrapped errors。 出错后继续执行,但可能出现任意行为。如C里的缓冲区溢出、Jump到错误地址

Forbidden Behaviours

语言设计时,可以定义一组forbidden behaviors. 它必须包括所有untrapped errors, 但可能包含trapped errors.

Well behaved、ill behaved

  • well behaved: 如果程序执行不可能出现forbidden behaviors, 则为well behaved
  • ill behaved: 否则为ill behaved...

2. 有了上面的概念,再讨论强、弱类型,静态、动态类型

强、弱类型

  • 强类型strongly typed: 如果一种语言的所有程序都是well behaved——即不可能出现forbidden behaviors,则该语言为strongly typed。
  • 弱类型weakly typed: 否则为weakly typed。比如C语言的缓冲区溢出,属于trapped errors,即属于forbidden behaviors..故C是弱类型

前面的人也说了,弱类型语言,类型检查更不严格,如偏向于容忍隐式类型转换。譬如说C语言的int可以变成double。 这样的结果是:容易产生forbidden behaviours,所以是弱类型的

动态、静态类型

  • 静态类型 statically: 如果在编译时拒绝ill behaved程序,则是statically typed;
  • 动态类型dynamiclly: 如果在运行时拒绝ill behaviors, 则是dynamiclly typed。

3. 误区
大家觉得C语言要写int a, int b之类的,Python不用写(可以直接写a, b),所以C是静态,Python是动态。这么理解是不够准确的。譬如Ocaml是静态类型的,但是也可以不用明确地写出来。。
Ocaml是静态隐式类型

静态类型可以分为两种:

  • 如果类型是语言语法的一部分,在是explicitly typed显式类型;
  • 如果类型通过编译时推导,是implicity typed隐式类型, 比如ML和Haskell

4.下面是些例子
无类型: 汇编
弱类型、静态类型 : C/C++
弱类型、动态类型检查: Perl/PHP
强类型、静态类型检查 :Java/C#
强类型、动态类型检查 :Python, Scheme
静态显式类型 :Java/C
静态隐式类型 :Ocaml, Haskell

时间: 2024-12-15 09:54:36

动态类型的相关文章

Python的动态类型

动态类型:                                                      在python中,类型是在运行过程中自动决定的,而不是通过代码声明的. 变量:                                                                                     变量是一个系统表的元素,拥有指向对象的连接的空间 python中,类型的概念是存在于对象中的,而不是变量中,变量是通用的. 变量的使用

OC多态,动态类型绑定

// //  main.m //  OC7类 // //  Created by Zoujie on 15/8/23. //  Copyright (c) 2015年 Zoujie. All rights reserved. // #import <Foundation/Foundation.h> #import "Fraction.h"//导入头文件 #import "Complex.h" #define Choose  0 int main(int 

.net 3.5 c#构建动态类型最佳实践

为什么要在.net3.5下面构建,有几个原因: win7自带.net 3.5 ,用户无须安装 我用的是vs2008,不想升级 .net 4.0引入了关键字,但是我想.net 3.5下面也有类似功能 这是构建orm的基础,一言以蔽之,市面上的orm都不好用,我想重新造轮子 暂时没想到 最终结果是这样的 属性名是字符串,属性值随便什么类型. 下图是我写了两个晚上的orm,多表查询生成的是动态类型List,同时映射到多个实体类,在展现层的代码量极少,便于工具生成. 我对orm的设想如下: 基础的增删改

python学习笔记17(动态类型)

动态类型 在我们接触的对象中,有一类特殊的对象,是用于存储数据的,常见的该类对象包括各种数字,字符串,表,词典.在C语言中,我们称这样一些数据结构为变量,而在Python中,这些是对象. 对象是储存在内存中的实体.但我们并不能直接接触到该对象.我们在程序中写的对象名,只是指向这一对象的引用(reference). 引用和对象分离,是动态类型的核心.引用可以随时指向一个新的对象: a = 3 a = 'python' 第一个语句中,3是储存在内存中的一个整数对象,通过赋值,引用a指向对象3. 第二

Python 动态类型

Python 动态类型 1.Python中,类型是在运行过程中自动决定的,并不需要提前在代码中声明. 2.所有变量必须在使用前明确的赋值,否则将会产生错误.#例:NameError: name 'a' is not defined 3.赋值语句 a=3 代表了:创建一个对象代表3:创建一个变量a:将变量与新的对象3相连.实际上是到对象内存空间的一个指针! 4.上面的第3条可翻译为:变量是一个系统表的元素,拥有指向对象的链接的空间:对象是分配的一块内存,有足够空间来表示他们所代表的值:引用是自动形

c++知识点总结--静态与动态类型

对象的静态类型(static type),就是它在程序中被声明时所采用的类型 对象的动态类型(dynamic type)是指“目前所指对象的类型” vitual 函数是动态绑定而来,调用一个virtual函数时,究竟调用哪一个函数实现,取决于发出调用的那个对象的动态类型 class Shape{ public: enum ShapeColor{ Red, Green, Blue = 1, Org }; void printColor(){ cout << Red << Green

Json.net实现方便的Json转C#(dynamic动态类型)对象

以前需要将一段json字符串转换为C#对象时,一般都是定义一个与之对应的实体类来接收.这样做有一个很大的缺点,就是当字符串特别长,属性特别多,又有嵌套时,手敲这个实体类就非常痛苦. 比如之前做的一个接收百度七天天气预报的API,层层嵌套,很痛苦. C# 4.0 之后有了动态类型dynamic.用这个东西配合Json.net可以实现不用定义实体类的json转dynamic类型对象. 以下示例需要先引用Newtonsoft.Json.dll public class Person { public

Objective-C中的多态、点语法和动态类型总结

一. 多态 1. 多态概念,定义 什么是多态:多态就是某一类事物的多种形态: 表现形式:  Animal *ani = [Dog new]; 多态条件:1.有继承关系     2.有方法的重写 2.多态代码实现: //实例化猫的对象 Animal *animal  = [Cat new]; //父类的指针指向子类对象: [animal eat]; //实例化狗的对象 animal = [Dog new]; //父类的指针指向子类对象. [animal eat]; 3.多态注意点: 1) 如果存在

动态类型 动态绑定 动态加载

1.动态类型运行时才知道,对象的类型,动态类型在编程中非常常见,简单的说就是id类型 比如代理在自定的时候就是,id类型.当前我们有时候自己定的方法,不确定,传进来的是什么类型的对象,我们也id类型,然后在方法内部去确定类型 2.动态绑定 对象被实例化后,就确定的对象类型,也确定了对象的属性和响应方法.这就是动态绑定. 说白也就是对象的确定了后,会绑定对应的属性和方法.那么我们也就可以动态的去给对象添加和实现方法.Class_addMethod 和 Method_setImplementatio

编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别

最近在研究Python和Erlang.反复提到动态类型语言.动态语言.解释型语言这些概念.这些概念很生涩,在这里做一个总结. 编译型语言和解释型语言 1.编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言.一般需经过编译(compile).链接(linker)这两个步骤.编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件. 优点:编译器一般会有预编译的过程对代码进行优化.因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行