2005-12-23
静态 vs 动态,编译 vs 解释,类型 vs 数据,定义 vs 操作
静态 vs 动态,编译 vs 解释,类型 vs 数据,定义 vs 操作
关于静态类型、动态类型、编译语言、解释语言等,有过不少讨论。其间的界限越来越不明显。
本文试图提出这样一种判断基准:在程序运行的时候,如果类型定义能够当作(元)数据来操作,那么就是动态的,解释的;反之就是静态的,编译的。
(注:这只是一种观察角度和判断标准,而不是定论!这个世界上总有一些打歪靶爱好者,迫使我加上这类的注明。不过这类人几乎从来不看文章的。估计这次也看不到这段注明。)
首先,我们来看一个动态扩展数据库表属性的例子。
假设user table有id, name, email等3个字段。我们需要动态添加某些属性。于是定义user_property table。有id, property_name, property_value等3个字段。
假设user table有两条记录。
id name email
101 jack jack@mail
102 tom tom@mail
jack想加入msn, qq, oicq等信息。于是在user_property中加入如下数据。
id property_name property_value
101 msn jack@msn
101 qq 142152165
101 oicq 20323256
tom想加入telephone, address等信息。于是在user_property中加入如下数据。
id property_name property_value
102 telephone 2525664
102 city newyork
102 street broadway 22A
这种手法,相当于把横向类型定义,转化为纵向数据操作。
user table只能包含id, name, email三个字段,可以看作是静态属性。
user_property table是数据字典,可以看作动态类型的metadata,能够针对每一行user数据(每一个user instance)进行动态属性扩展。
这两种情形可以看作 静态类型定义,和动态数据操作的区别。
动态类型语言,具有动态期间进行类型检查的特点。这就意味着编译(解释)结果中,一定要包含type metadata的信息,供程序运行的时候,进行类型检查。
Type metadata 包括 class name, member method name, parameter type, return type, member variable name等信息。
C, C++ 的编译结果中,并不包含这些Type metadata信息。
Java的编译结果中,包含这些Type metadata信息。但是,JVM的大多数指令的运行,并不需要使用这些Type metadata信息,只有在使用Reflection API的时候,才使用了这些Type metadata信息,而且这些Type metadata都是只读的,不可以操作的,还算不上真正的可以操作的data (数据)。
如果一个Java Bean需要有动态扩展属性,我们通常采用一个Map来实现。Key = property name; Value = property value。
仿造上面的例子。假设我们有一个user bean class.
public class User {
public String id;
public String name;
public String email;
public final Map properties = new HashMap();
}
现在有两个user bean instance
User {id=101; name=jack; email=jack@mail; Properties= {}}
User {id=102; name=tom; email=tom@mail; Properties= {}}
jack想加入msn, qq, oicq等信息。于是在properties中加入如下数据。
User {id=101; name=jack; email=jack@mail
Properties= {msn: jack@msn; qq: 142152165; oicq: 20323256}
}
tom想加入telephone, address等信息。于是在properties中加入如下数据。
User {id=101; name=jack; email=jack@mail
Properties= {telephone: 2525664; city: newyork; street: broadway 22A}
}
这种实现动态属性的方式,同样是把类型定义转化为数据操作。
综上,大致总结出来这么一条判断标准(个人的判断标准,仅供参考)。
类型定义本身就等于数据操作的语言,就是动态的,解释的;反之,就是静态的,编译的。
根据这样的判断标准,c, c++是静态的,编译的;java 基本上也是静态的,编译的,但是带有一点动态解释的特点(Reflection API);Ruby, Python是动态的,解释的。
关于静态类型、动态类型、编译语言、解释语言等,有过不少讨论。其间的界限越来越不明显。
本文试图提出这样一种判断基准:在程序运行的时候,如果类型定义能够当作(元)数据来操作,那么就是动态的,解释的;反之就是静态的,编译的。
(注:这只是一种观察角度和判断标准,而不是定论!这个世界上总有一些打歪靶爱好者,迫使我加上这类的注明。不过这类人几乎从来不看文章的。估计这次也看不到这段注明。)
首先,我们来看一个动态扩展数据库表属性的例子。
假设user table有id, name, email等3个字段。我们需要动态添加某些属性。于是定义user_property table。有id, property_name, property_value等3个字段。
假设user table有两条记录。
id name email
101 jack jack@mail
102 tom tom@mail
jack想加入msn, qq, oicq等信息。于是在user_property中加入如下数据。
id property_name property_value
101 msn jack@msn
101 qq 142152165
101 oicq 20323256
tom想加入telephone, address等信息。于是在user_property中加入如下数据。
id property_name property_value
102 telephone 2525664
102 city newyork
102 street broadway 22A
这种手法,相当于把横向类型定义,转化为纵向数据操作。
user table只能包含id, name, email三个字段,可以看作是静态属性。
user_property table是数据字典,可以看作动态类型的metadata,能够针对每一行user数据(每一个user instance)进行动态属性扩展。
这两种情形可以看作 静态类型定义,和动态数据操作的区别。
动态类型语言,具有动态期间进行类型检查的特点。这就意味着编译(解释)结果中,一定要包含type metadata的信息,供程序运行的时候,进行类型检查。
Type metadata 包括 class name, member method name, parameter type, return type, member variable name等信息。
C, C++ 的编译结果中,并不包含这些Type metadata信息。
Java的编译结果中,包含这些Type metadata信息。但是,JVM的大多数指令的运行,并不需要使用这些Type metadata信息,只有在使用Reflection API的时候,才使用了这些Type metadata信息,而且这些Type metadata都是只读的,不可以操作的,还算不上真正的可以操作的data (数据)。
如果一个Java Bean需要有动态扩展属性,我们通常采用一个Map来实现。Key = property name; Value = property value。
仿造上面的例子。假设我们有一个user bean class.
public class User {
public String id;
public String name;
public String email;
public final Map properties = new HashMap();
}
现在有两个user bean instance
User {id=101; name=jack; email=jack@mail; Properties= {}}
User {id=102; name=tom; email=tom@mail; Properties= {}}
jack想加入msn, qq, oicq等信息。于是在properties中加入如下数据。
User {id=101; name=jack; email=jack@mail
Properties= {msn: jack@msn; qq: 142152165; oicq: 20323256}
}
tom想加入telephone, address等信息。于是在properties中加入如下数据。
User {id=101; name=jack; email=jack@mail
Properties= {telephone: 2525664; city: newyork; street: broadway 22A}
}
这种实现动态属性的方式,同样是把类型定义转化为数据操作。
综上,大致总结出来这么一条判断标准(个人的判断标准,仅供参考)。
类型定义本身就等于数据操作的语言,就是动态的,解释的;反之,就是静态的,编译的。
根据这样的判断标准,c, c++是静态的,编译的;java 基本上也是静态的,编译的,但是带有一点动态解释的特点(Reflection API);Ruby, Python是动态的,解释的。
评论
buaawhl
2005-12-24
ajoo 写道
我理想中的语言,要动静结合。静态强类型要有,可以保证静态类型安全。但是,类型,不应该仅仅是一个静态概念,而应该也可以无缝地被用作一等公民的数据。
比如,我可以直接把int, char拿来作为动态数据。
还应该有type inference,没事总写"A a = new A()"这种东西烦死了。
于是,对应下面这个java代码:
[code:1]int[] my_array = new int[10];
char[] x = my_array;//编译错误!
[/code:1]
我可以变态地这样写:
[code:1]type = int;
my_array = type.array().new(10);
char[] x = my_array;//编译错误![/code:1]
编译器能静态检查的就静态检查,否则就动态。我程序员基本对动静之分不再关心。哎,四化都实现了,我的理想还看不见影儿。
比如,我可以直接把int, char拿来作为动态数据。
还应该有type inference,没事总写"A a = new A()"这种东西烦死了。
于是,对应下面这个java代码:
[code:1]int[] my_array = new int[10];
char[] x = my_array;//编译错误!
[/code:1]
我可以变态地这样写:
[code:1]type = int;
my_array = type.array().new(10);
char[] x = my_array;//编译错误![/code:1]
编译器能静态检查的就静态检查,否则就动态。我程序员基本对动静之分不再关心。哎,四化都实现了,我的理想还看不见影儿。
Good idea.
很有启发意义。
可以看作是 泛型 的进一步动态化,数据化。
ajoo 做出这样一门语言吧:类型,被用作一等公民的数据。
ajoo
2005-12-24
我理想中的语言,要动静结合。静态强类型要有,可以保证静态类型安全。但是,类型,不应该仅仅是一个静态概念,而应该也可以无缝地被用作一等公民的数据。
比如,我可以直接把int, char拿来作为动态数据。
还应该有type inference,没事总写"A a = new A()"这种东西烦死了。
于是,对应下面这个java代码:
[code:1]int[] my_array = new int[10];
char[] x = my_array;//编译错误!
[/code:1]
我可以变态地这样写:
[code:1]type = int;
my_array = type.array().new(10);
char[] x = my_array;//编译错误![/code:1]
编译器能静态检查的就静态检查,否则就动态。我程序员基本对动静之分不再关心。哎,四化都实现了,我的理想还看不见影儿。
比如,我可以直接把int, char拿来作为动态数据。
还应该有type inference,没事总写"A a = new A()"这种东西烦死了。
于是,对应下面这个java代码:
[code:1]int[] my_array = new int[10];
char[] x = my_array;//编译错误!
[/code:1]
我可以变态地这样写:
[code:1]type = int;
my_array = type.array().new(10);
char[] x = my_array;//编译错误![/code:1]
编译器能静态检查的就静态检查,否则就动态。我程序员基本对动静之分不再关心。哎,四化都实现了,我的理想还看不见影儿。
zkj_beyond
2005-12-23
看到这些想到的hibernate3中新加的Dynamic Model 数据库Table于HashMap的映射.
说这些的意思是,能用强类型就用强类型.能静就静吧.
说这些的意思是,能用强类型就用强类型.能静就静吧.
age0
2005-12-23
简单来说,大概就是静态系统使用struct结构,动态系统则使用hashtable。
- 浏览: 591955 次
- 性别:

- 来自: china

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
网上银行的安全操作设计探 ...
其实浦发的动态手机密码也是一种很好的解决方案!
-- by cdredfox -
线程同步
线程同步就是线程排队 ----------------------------- ...
-- by java9981 -
网上银行的安全操作设计探 ...
这方面经验不多, 对这方面比较感兴趣.
-- by grandboy -
网上银行的安全操作设计探 ...
lz关于动态口令(动态令牌)的理解有偏差,请参照ras.com。银行内部设计核心 ...
-- by foodoo -
2008 奥运会开幕式 色彩 ...
楼上,不是LCD,是LED
-- by swflora






评论排行榜