{非技术}有关那个什么《JavaScript征途》我写了点小 东西,大家看看,着重呼唤老赵(Jeffrey Zhao)。

17 views
Skip to first unread message

OwnWaterloo

unread,
Sep 25, 2009, 2:01:33 AM9/25/09
to pon...@googlegroups.com
On 9月25日, 上午6时36分, LeeoNix <leeoni...@gmail.com> wrote:
计算需要效率,于是就产生了类型。

这没说错, 类型系统确实会对效率有一些帮助。 不过我觉得, 还是如下解释更符合作者装逼的意图:
程序员笑话,不懂得人或者称 之为“初学者”的人看到这个,高深莫测,原来“大师”解释的是这样啊。在懂的人看来,只不过是一句笑话。
 

trydofor

unread,
Sep 25, 2009, 4:54:54 AM9/25/09
to pon...@googlegroups.com
OwnWaterloo wrote:
> On 9月25日, 上午6时36分, LeeoNix <leeoni...@gmail.com
> <mailto:leeoni...@gmail.com>> wrote:
>
> 计算需要效率,于是就产生了类型。
历史是这样的,因为存储器位数有限,
于有了 byte,int,long,float。

至于 Date,Number,Object,是因为需要,而不是效率。
>
>
> 这没说错, 类型系统确实会对效率有一些帮助。不过我觉得, 还是如下解释更符
> 合作者装逼的意图:


>
> 程序员笑话,不懂得人或者称 之为“初学者”的人看到这个,高深莫测,原来
> “大师”解释的是这样啊。在懂的人看来,只不过是一句笑话。
>
>


--
http://trydofor.com - Simplicity is everything.

SevenCat

unread,
Sep 25, 2009, 7:13:03 PM9/25/09
to TopLanguage
我觉得只是作者的理解,他写出来了,这些小事无可厚非,没必要大说特说。

OwnWaterloo

unread,
Sep 25, 2009, 10:24:38 AM9/25/09
to TopLanguage
类型系统确实可以在一些方面提高效率。

举个具体的例子, 在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, 通常会比较亏...


类型系统会提升效率还有其他很多例子。

Dong Feng

unread,
Sep 25, 2009, 10:57:04 PM9/25/09
to pon...@googlegroups.com

你混淆了两个概念,一是类型检查的方式——静态类型检查(关键词是『检查』)和动态类型,二是从语言角度说有没有对类型的支持。

一个语言没有类型支持还是提供静态类型检查,它的运行效率是一样的。静态类型检查仅仅是提高了开发查错的效率。Lua采用的是动态类型,所以有运行时的动态类型检查,导致一些性能开销。无论是静态类型检查还是动态类型,这些语言都是有『类型』的。


2009/9/25 OwnWaterloo <ownwa...@gmail.com>

up duan

unread,
Sep 26, 2009, 9:23:42 PM9/26/09
to pon...@googlegroups.com


2009/9/26 Dong Feng <middle....@gmail.com>


你混淆了两个概念,一是类型检查的方式——静态类型检查(关键词是『检查』)和动态类型,二是从语言角度说有没有对类型的支持。

一个语言没有类型支持还是提供静态类型检查,它的运行效率是一样的。静态类型检查仅仅是提高了开发查错的效率。Lua采用的是动态类型,所以有运行时的动态类型检查,导致一些性能开销。无论是静态类型检查还是动态类型,这些语言都是有『类型』的。


静态类型最初的出现确实是为了效率。Fortran区分Integer和Real就是为了对不同的对象操作翻译为不同的CPU指令。这确实提高了效率。后来静态类型的主要作用才变成了抽象工具和检查机制的。
动态类型的功能是检查和执行。 

Tinyfool

unread,
Sep 26, 2009, 9:26:31 PM9/26/09
to pon...@googlegroups.com
这么说有点本末倒置吧?写汇编就没有类型么?类型首先是为了方便吧?然后,才是效率吧?

2009/9/27 up duan <fix...@gmail.com>



--
Tinyfool的开发日记 http://www.tinydust.net/dev/
myTwitter: http://twitter.com/tinyfool

up duan

unread,
Sep 26, 2009, 9:35:38 PM9/26/09
to pon...@googlegroups.com


2009/9/27 Tinyfool <tiny...@gmail.com>

这么说有点本末倒置吧?写汇编就没有类型么?类型首先是为了方便吧?然后,才是效率吧?

一般我倾向于认为汇编没有类型。如果认为有,那么确实是为了方便。 

Tinyfool

unread,
Sep 26, 2009, 9:39:08 PM9/26/09
to pon...@googlegroups.com
我觉得类型的出现首先是为了解决底层计算模型和问题领域的差异而出现的。如果你强要追求效率,所有类型变量能做的事情,其实你都可以用汇编里面的一个内存地址来实现。出现了类型以后,如果说,我们要效率,我们才去考虑如何把类型给高效了。我是这么理解的,历史上是怎么回事,我倒是还没来得及研究下。

2009/9/27 up duan <fix...@gmail.com>



2009/9/27 Tinyfool <tiny...@gmail.com>

这么说有点本末倒置吧?写汇编就没有类型么?类型首先是为了方便吧?然后,才是效率吧?

一般我倾向于认为汇编没有类型。如果认为有,那么确实是为了方便。 

up duan

unread,
Sep 26, 2009, 10:19:18 PM9/26/09
to pon...@googlegroups.com


2009/9/27 Tinyfool <tiny...@gmail.com>

我觉得类型的出现首先是为了解决底层计算模型和问题领域的差异而出现的。如果你强要追求效率,所有类型变量能做的事情,其实你都可以用汇编里面的一个内存地址来实现。出现了类型以后,如果说,我们要效率,我们才去考虑如何把类型给高效了。我是这么理解的,历史上是怎么回事,我倒是还没来得及研究下。

现在的类型系统确实是一个抽象机制和内嵌的检查系统。确实是对问题空间的基本抽象,确实有一套方式映射到解空间或者叫做计算模型中去。

但是fortran最初区分整数和实数确实是无心之作,确实只是为了编译器的高效和方便的实现,确实是为了编译结果的运行效率。 

Zhiming G

unread,
Sep 26, 2009, 10:51:47 PM9/26/09
to pon...@googlegroups.com
位宽算是汇编的类型吧?

2009/9/27 Tinyfool <tiny...@gmail.com>

Zane Zheng

unread,
Sep 27, 2009, 3:43:19 AM9/27/09
to pon...@googlegroups.com
作为个人的归纳是无可厚非的,但作为书中的文字,读者有自己的演绎,有自己的理解;
从这个角度看,单纯的总结,是不严谨的,是不合适的,此书作者是不适合出书的;
单纯从文字上看,他们的理论深度有待提高。



Zane


2009/9/27 Zhiming G <gao...@gmail.com>

OwnWaterloo

unread,
Sep 26, 2009, 8:59:45 AM9/26/09
to TopLanguage
我帖子中的重点"不在lua有没有类型上"。

重点在对比:
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>

Dong Feng

unread,
Sep 27, 2009, 4:03:02 AM9/27/09
to pon...@googlegroups.com
2009/9/27 up duan <fix...@gmail.com>:

这才是本末倒置了。试问你写汇编,甚至写机器代码的时候,针对整数和符点数能用相同的CPU指令吗?Fortran只不过是把你不得不手工做的东西自动化了而已。高级语言引入类型的概念是为了自动处理,低级语言没有语言级别的类型,但是处理的时候一样要手工在逻辑层面上进行不同类型的解释。

Jeffrey Zhao

unread,
Sep 27, 2009, 4:23:38 AM9/27/09
to pon...@googlegroups.com
新消息,瞅瞅有多混乱:http://aimingoo.spaces.live.com/blog/cns!F9303C43D5CEAFB3!935.entry

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)。

trydofor

unread,
Sep 27, 2009, 6:45:07 AM9/27/09
to pon...@googlegroups.com
Jeffrey Zhao wrote:
>
> 新消息,瞅瞅有多混乱:http://aimingoo.spaces.live.com/blog/cns!
> F9303C43D5CEAFB3!935.entry

标题党,拖拖党,口号党,哈哈。
是该批批了,要不下一代怎么做技术。

sagasw

unread,
Sep 27, 2009, 7:55:27 AM9/27/09
to pon...@googlegroups.com
lua本身没有内置OO系统(甚至都没有常见的continue支持),除了有时候有些不方便,我觉得这种手掌上跳舞的设计理念算是lua最大的特点和优点,如果想求得强大那么使用别的语言好了,比如python或者ruby。
 
另外lua是有类型的,manual2.2里面说的很清楚,变量没有类型,而value是有类型的,所以可以用type(var) == "number"这样的语句。
 
我是lua爱好者,也许了解的不深,不过上面说的是没错的。
2009/9/26 OwnWaterloo <ownwa...@gmail.com>

Dong Feng

unread,
Sep 27, 2009, 5:16:06 AM9/27/09
to pon...@googlegroups.com
有那么点道理。严格的说这种差异不是语言是否具有类型造成的,而是语言是否有创建自定义静态类型的能力。

Lua和C++都有类型,不同的是前者不能创建自定义静态类型,而后者可以。所以你说的节省了空间是因为后者能创建自定义静态类型造成的。如果你一开始说的『类型系统』指的是创建静态自定义类型的能力,那么也还有道理。

不过原文那本书只是提到了『类型』,没提到『类型系统』,更没有像你这样解释了类型系统的意思就是自己创建自定义类型。怎么说『类型』都是为了设计清晰而不是为了效率才出现的,只不过早期考虑效率使用静态类型系统。无法说为了效率产生类型这种话。


2009/9/26 OwnWaterloo <ownwa...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages