自然、人类、机器
Home › Forums › 《冒号课堂》讨论区 › 对象的消息模型
Tagged: dynamic language, dynamic-typing, OOP
以前我主要接触的静态类型语言,现在接触了动态语言之后对于对象的消息模型又有了一些新的理解。今天把理解写出了出来,请郑老师看看,谢谢!http://www.cnblogs.com/weidagang2046/archive/2011/08/14/2138059.html
文章写得挺好的,抓住了消息模型的特征。有一个小问题,你在文章和此处一再提到“静态类型语言”与“动态类型语言”的差别,但其实这更多的是“静态语言”与“动态语言”的差别。正是因为动态语言有可能在运行时改变对象的方法,才使得诸如“Method Missing”的特征熠熠生辉。
其实,我对“静/动态语言”和“静/动态类型语言”的区别不是很清楚。郑老师认为二者的区别是什么呢?
看来是《冒号课堂》中的叙述还不够清晰?动/静态类型语言的区别在于类型检查的时间:前者在编译期(或运行之前),后者在运行期。动/静态语言的区别是:前者的代码行为可能在运行时改变(比如类的方法、属性的增减或修改),后者则不可能。
应该是书上介绍过,但我没有留下什么印象,一直没有加以区别。
关于动态语言与动态类型语言的区别,今天看了这篇文章才稍微明白一点:Dynamic Typing vs Dynamic Language Explained。我理解动态类型语言是指同一个名称可以动态绑定到不同类型的对象上,比如:
a = 1;
a = ‘test’;
而动态语言可能是非动态类型的,比如a只能绑定到一种对象类型,但是可以动态添加删除修改方法和属性,方法的调用是动态分派的:
A a = new A();
a.f = function() { … }
a.f()
不知道理解是否正确?
嗯,这个解释应当是比较直观和容易理解的。动态类型语言之“动态”所在,是类型之动态,因此在运行前检查类型毫无意义;动态语言之“动态”,是语言之动态,因此对象/类的方法、属性等是可能在运行期间改变的。你提到的这篇文章解释了一件事情:对于一个静态类型的动态语言(如scala、groovy),虽然在运行前应当检查类型但有时并非如此,原因是:其动态语言的特征决定了有些method call的dispatch在运行前并不确定,因此无法检查参数类型。