posts - 257, comments - 1336, trackbacks - 63, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

也说Type Inference

Posted on 2005-08-02 15:12 FantasySoft 阅读(1391) 评论(8)  编辑 收藏 所属分类: All About SoftSharp IronPython
        看了Cavingdeep兄的Post,还有idior老大的comment,我又忍不住想说上两句了,因为Boo总能让我想起可爱的Python,还有正在茁壮成长的小小IronPython。:) 
        说到Type Inference,有一个概念是不得不提的,就是Dynamic Type(动态类型)和Static Type(静态类型)。静态语言就不必多说了,C++、Java和C#都是静态语言,它们最大的特点就是变量在使用之前都必须进行类型声明。而 Python。VB则是一种动态类型语言,所谓动态,通俗点说就是变量的类型是由最后赋予它的值决定的。怎么决定呢? 就是靠着Type Inference。 例如:

>>> test = "This is string"
>>> type(test)
<type 'str'>


变 量str的值是"This is string",所以str的类型是string(就是'str')。虽然动态语言依靠Type Inference,但是并非使用了Type Inference就一定是动态语言。Cavingdeep兄的post中给出的例子不仅仅说明了Type Inference,更说明了Boo与Python之间一个不同的地方:Boo事实上是一种静态语言,虽然它不需要为变量进行变量类型的声明。正如Cavingdeep兄给出的例子:

str = "string"
str 
= 1   
 
在Boo中会抛出Exception,但是在Python中,这样是没有问题的。 
        Boo与Python最大的一个不同之处就在于此:Boo拥有静态类型检查。 引用Boo语言之父的一句话以说明之:There were some minor things I didn't like and I also had to account for the needs of a statically typed language such as exact method signature declarations and such.

PS:再次拜读了Boo语言之父Rodrigo所写的BooManifesto,又一次被他的个性所深深打动。真的忍不住大叫:Wow,太Cool了!

Feedback

#1楼    回复  引用  查看    

2005-08-02 15:32 by Ninputer      
str = "string"
str = 1

甚至
str = "String"
str.SubString(a, b)
str = New ArrayList
str.Add(xxx)

在VB里也都是没有问题。
而人们却要把VB当成Boo还要“静态”的语言将来使用,而且在家门口也不被人发觉,却要去看远处的“动态语言”们。

#2楼 [楼主]   回复  引用  查看    

2005-08-02 15:45 by FantasySoft      
To Ninputer: 呵呵,向您这位VB的布道者敬礼了! :) 只要是动态的,偶就喜欢,咔咔~~

#3楼    回复  引用  查看    

2005-08-02 16:44 by idior      

微软研究院有一篇论文提到了the cold war between static type and dynamic type, 他们正在静态和动态语言之间找平衡。等着看.net 3.0 4.0吧。

.net 3.0值得关注的地方 (可以发现不少和动态语言相关)
Extension methods
Lambda expressions
Type inference and implicit types
Anonymous types
Expression Trees


看来要赶紧学学python了,今天写得那篇closure随笔也和动态语言有关。

#4楼 [楼主]   回复  引用  查看    

2005-08-03 16:44 by FantasySoft      
强调一点:文中的静态语言是特指静态类型语言,动态语言特指动态类型语言。 谢谢Cavingdeep的指点。

#5楼    回复  引用    

2006-09-19 00:21 by huangyi_ [未注册用户]
在 python 里面一般把它叫做 名字-对象绑定 。
对象是真正内存中的对象,它是有类型的,变量都只是个名字,它可以绑定到任意对象。就这么简单! 另外还有一条:万物皆对象,包括简单的整数!

#6楼 [楼主]   回复  引用  查看    

2006-09-19 10:09 by FantasySoft      
@huangyi_
更准确的说法应该是introspection(自省)。

#7楼    回复  引用    

2006-12-05 15:10 by Plainsong [未注册用户]
如果VB是动态类型的话:

var
a: OleVariant;
begin
a = 'test string';
a = 1;
end;

只比VB多了个声明(如果VB设置了“变量必须声明”的选项就没什么区别了),Delphi也是动态类型语言吗?

这样的代码在BCB中也可以写出来,只是形式不同。那么C++语言……

#8楼    回复  引用    

2006-12-05 15:11 by Plainsong [未注册用户]
不好意思,写错了。
应该是:
var
a: OleVariant;
begin
a := 'test string';
a := 1;
end;

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-08-02 15:17 编辑过


相关链接:

历史上的今天:
2004-08-02 r-value(Rvalue) 和l-value(Lvalue)