计算需要效率,于是就产生了类型。
程序员笑话,不懂得人或者称 之为“初学者”的人看到这个,高深莫测,原来“大师”解释的是这样啊。在懂的人看来,只不过是一句笑话。
至于 Date,Number,Object,是因为需要,而不是效率。
>
>
> 这没说错, 类型系统确实会对效率有一些帮助。不过我觉得, 还是如下解释更符
> 合作者装逼的意图:
>
> 程序员笑话,不懂得人或者称 之为“初学者”的人看到这个,高深莫测,原来
> “大师”解释的是这样啊。在懂的人看来,只不过是一句笑话。
>
>
--
http://trydofor.com - Simplicity is everything.
举个具体的例子, 在lua中:
o1:f1( ... );
o1:f2( ... );
o1:f3( ... );
o2:f1( ... );
o2:f2( ... );
o2:f3( ... );
这样的语法能生效, 是因为o1, o2 ---- 两个table ---- 上存有"f1","f2","f3"的项, 并且都是function。
也就是说, 仅仅o1和o2用来保存函数的内存, 就要占6个单位。
这样会带来一些灵活性 : 这6个项并不需要保存相同的function。
当需要o1和o2的行为不同时, 灵活性得到体现。
但是, 如果o1, o2确实就应该是两个行为相同, 并且还需要更多的这种行为相同的对象, 这种灵活性就付出了代价。
例如,在C++中, o1和o2可以是同一类型的不同实例。
如果f1,f2,f3都是虚函数, 按虚函数的典型实现方式, 共需要 1*2 + 3 =5个单位的内存。
具有相同行为的对象越多, 这一优势更加明显。
lua中, 内存单位 = o1的方法个数 + o2的方法个数 + o3的方法个数 + ...
C++中, 内存单位 = 实例数目 + 方法总数 ---- one object one vptr, one class one vtbl。
btw: lua中的值会是C++中函数指针以及虚指针大小的2-3倍。
但这和类型系统带来的效率提升无关。
由这个例子可以看出, 类型系统带来的(空间)效率提升是因为:
"具有相同行为的object,现在都归于同一个class,它们之间可以共享一些信息,比如vtbl"。
如果在C++中, f1,f2,f3不是虚函数,那更是不用额外占用一丁点内存。
劣势就是,创建object必须创建class。 如果class 只有这么一个object, 通常会比较亏...
类型系统会提升效率还有其他很多例子。
你混淆了两个概念,一是类型检查的方式——静态类型检查(关键词是『检查』)和动态类型,二是从语言角度说有没有对类型的支持。一个语言没有类型支持还是提供静态类型检查,它的运行效率是一样的。静态类型检查仅仅是提高了开发查错的效率。Lua采用的是动态类型,所以有运行时的动态类型检查,导致一些性能开销。无论是静态类型检查还是动态类型,这些语言都是有『类型』的。
这么说有点本末倒置吧?写汇编就没有类型么?类型首先是为了方便吧?然后,才是效率吧?
2009/9/27 Tinyfool <tiny...@gmail.com>这么说有点本末倒置吧?写汇编就没有类型么?类型首先是为了方便吧?然后,才是效率吧?一般我倾向于认为汇编没有类型。如果认为有,那么确实是为了方便。
我觉得类型的出现首先是为了解决底层计算模型和问题领域的差异而出现的。如果你强要追求效率,所有类型变量能做的事情,其实你都可以用汇编里面的一个内存地址来实现。出现了类型以后,如果说,我们要效率,我们才去考虑如何把类型给高效了。我是这么理解的,历史上是怎么回事,我倒是还没来得及研究下。
重点在对比:
1. lua中通过table 模拟出的OO, 但即使两个对象拥有相同的行为,它们也不会具有相同的类型。
2. C++中,为拥有"相同行为的对象",创建一个类型。
后者因为有了类型, 相同行为对象之间能共享一部分内存。
如果相同行为对象确实很多, 就会节省很大一部分内存。
这是类型提升效率的一个具体例子。 效率 = 时间效率 + 空间效率。
看明白了吗?
On 9月26日, 上午10时57分, Dong Feng <middle.fengd...@gmail.com> wrote:
> 你混淆了两个概念,一是类型检查的方式----静态类型检查(关键词是『检查』)和动态类型,二是从语言角度说有没有对类型的支持。
>
> 一个语言没有类型支持还是提供静态类型检查,它的运行效率是一样的。静态类型检查仅仅是提高了开发查错的效率。Lua采用的是动态类型,所以有运行时的动态类型 检查,导致一些性能开销。无论是静态类型检查还是动态类型,这些语言都是有『类型』的。
>
> 2009/9/25 OwnWaterloo <ownwater...@gmail.com>
这才是本末倒置了。试问你写汇编,甚至写机器代码的时候,针对整数和符点数能用相同的CPU指令吗?Fortran只不过是把你不得不手工做的东西自动化了而已。高级语言引入类型的概念是为了自动处理,低级语言没有语言级别的类型,但是处理的时候一样要手工在逻辑层面上进行不同类型的解释。
Jeffrey Zhao
Blog: http://www.cnblogs.com/JeffreyZhao
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "OwnWaterloo" <ownwa...@gmail.com>
Sent: Saturday, September 26, 2009 8:59 PM
To: "TopLanguage" <pon...@googlegroups.com>
Subject: [TL] Re: {非技术}有关那个什么《JavaScript征途》我写了点小 东西,大家看看,着重呼唤老赵(Jeffrey Zhao)。
标题党,拖拖党,口号党,哈哈。
是该批批了,要不下一代怎么做技术。
Lua和C++都有类型,不同的是前者不能创建自定义静态类型,而后者可以。所以你说的节省了空间是因为后者能创建自定义静态类型造成的。如果你一开始说的『类型系统』指的是创建静态自定义类型的能力,那么也还有道理。
不过原文那本书只是提到了『类型』,没提到『类型系统』,更没有像你这样解释了类型系统的意思就是自己创建自定义类型。怎么说『类型』都是为了设计清晰而不是为了效率才出现的,只不过早期考虑效率使用静态类型系统。无法说为了效率产生类型这种话。
2009/9/26 OwnWaterloo <ownwa...@gmail.com>: