当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

静态 vs 动态,编译 vs 解释,类型 vs 数据,定义 vs 操作

发表于: 2005-12-23   作者:buaawhl   来源:转载   浏览次数:
摘要: 静态 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是动态的,解释的。

静态 vs 动态,编译 vs 解释,类型 vs 数据,定义 vs 操作

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
代理Proxy: Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题
转自http://www.cnblogs.com/NickYao/archive/2007/04/25/727020.html 使用VS 2005开发的朋友应该都
先监视DataSet,打开dataset,dataset下面有一个tables Tables打开有一个非公共成员,然后下面有一个
指令码的执行方式,大致有两种:解释和编译。两者都是以二进制目标机器码为输入,所采取的执行策略
0、前提 Boost库版本 1.57.0 下载地址 http://www.boost.org/users/history/version_1_57_0.html,
开始写了个HelloVS2008,在本机正常运行,但在我的虚拟机中就运行不了, 如图一: 意料之中,因为前
前面写过一边编译speex的文章,见链接http://www.cnblogs.com/chef/archive/2012/07/19/2599067.htm
这是自己在工作中刚开始接触编译webkit的工作总结,希望对大家有用! 这边刚开始研究webkit,还请大
工程文件为AirCode,批处理文件为bulit.bat(与*.sln文件在同级目录)。 以下是批处理的代码: echo
“Windows游戏编程大师技巧"第二版 是一本很经典的书,里面虽然没有涉及到3D,但是游戏编程的很多基
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号