• 2006-05-08

    比尔盖茨从中国小偷身上赚钱

    Views: 11494 | 1 Comment

    在news.com.com上的一篇文章告诉我们比尔盖茨是怎么从中国小偷(盖茨的说法)身上赚钱的。

    原文的一个段落翻译后大概是

    盖茨稍微透露了他精明的商业哲学。“尽管中国每年大约销售3百万台电脑,但是人们却不为软件买单。”他说,“不过,总有一天他们会的。只要他们想要偷软件,那么我们就让他们偷我们的。他们会对我们的软件上瘾,以后,我们就可以找些方法从他们身上收钱了。”

    这个段落的原文如下

    Gates shed some light on his own hard-nosed business philosophy. "Although about 3 million computers get sold every year in China, but people don't pay for the software," he said. "Someday they will, though. As long as they are going to steal it, we want them to steal ours. They'll get sort of addicted, and then we'll somehow figure out how to collect sometime in the next decade."

    前段时间国家主席胡锦涛访美,中国的企业不是就买了几十亿美元的Windows吗?这就是比尔说的“找些方法从他们身上收钱”吧。《无间道》里说,在道上混是要还的。不过,是国家主席代表所有的盖茨所说的“中国小偷”还的债,那么我们中国人应该为此感到自豪(拥有一个体贴人民的政府--即使是被人看作小偷的人民),还是应该有其他的想法?

    我曾经写过一篇文章《在中国怎么利用软件挣钱?》,想的与盖茨差不多。看了盖茨的话,我不禁想,是比尔盖茨太聪明了(他肯定在他说上面的话很久之前就已经有这种方法了),还是中国人太笨了(如果有人聪明了,总会有人相对来说是愚蠢的)?

    完整的文章在 http://news.com.com/2100-1023-212942.html?legacy=cnet,文章是1998年7月发表的,是旧了点,不过想到不少人从来没听过这个事情,就评了评。

    补充:

    不过大家也别因此产生自卑,因为李敖在《美国是盗版祖师爷》一文中说(http://blog.cathayan.org/item/1285):

    你动辄要我钱,我讲过,我以台湾为例子我讲过,美国的收入跟台湾是四比一,所以你收入四块钱的时候,你可能买到有钱买这个书,我收入一块钱的时候,这个书对我就太贵了,我就买不起了,那买不起我就不念吗?我就不研究吗?我就坐等我的文化退步吗?我也不肯啊!我希望能够力争上游,像你们美国人当年跟英国比赛一样。你们追到英国,你们用什么方法追到英国呢?用盗印的方法,用偷偷摸摸做小偷的方法来追到了英国。今天你向我们要钱,我们没有钱,或者钱不够,或者钱不甘心给你,我们也要用你们的方法去力争上游啊,去后来居上啊,去并驾齐驱啊。为什么我们要付钱?老子们就是不付钱,这就是我们的道德标准,我们的道德标准跟它的是不一样的。可是我们讲,我们也是持之有故,言之成理,不是吗?为什么你们当年在我们国家是强盗,今天我们做了民族主义的小偷,偷一点回来,你鬼叫什么东西啊!这就是我的李敖的这个标准。

    你应该有自己的想法。

    Posted by ideawu at 2006-05-08 16:02:23
  • 2006-04-26

    请不要制作幼稚的网页

    Views: 10429 | 1 Comment

    有些初学者做网页的时候,总是想在页面中放入满屏幕乱飞的广告图片。网页上漂动的图片就跟一只巨大的像牛屎的牛蝇,除了让访客厌恶之外没有任何别的作用。是的,有些中国的大门户网站是这么做的。但是,他们用客户的厌恶换来了广告费。他们有大量的访客,只要他们不表现的太令人厌恶,他们还能生存。

    有些人不知道这个世界除了中国人做的网页以外还有外国人做的网页。他们甚至不知道除了一种方法之外还有另一种方法。他们将身边的翻得陈旧的过期的书本再翻得更旧,美其名曰“打基础”或者其它的美好词汇。这无异于从垃圾堆中找出值几毛人民币的易拉罐,有什么值得称道的?而是应该受到嘲弄。

    我甚至经常看到有人将屏幕快照(有时仅仅是文本的快照或者其它少量色彩区域的快照)的BMP格式的图像发到网上。我说,你不知道这个世界上还有除了BMP之外的其它图像格式吗?只要你使用包括Windows的画图程序在内的几乎所有图像编辑程序打开图像就可以另存为JPG或者PNG格式,这样,图像一般可以减小80%的体积。

    幼稚的网页有什么危害?那要看你的网页是否发布。如果你的愚蠢的网页只是放在自己的硬盘里,并且保证永远不会被别人看到,那么随你的便,你有自由。不过,如果你想把网页发布到互联网上,请注意互联网是公共的。你往互联网上放了一个让大部分人生厌的网页,就相当于往路边放了一堆垃圾。你应该为维护互联网的整洁而不要往上面放垃圾。

    当你想在网页中加入某个效果的时候,请充分地考虑这个效果的收效是什么,它将可能惹烦哪些人。从而决定是否应该加入。还有,请关注各种知识。这个世界有很多“其他”的。

    Posted by ideawu at 2006-04-26 15:00:39
  • 2006-04-15

    学习,用C++语言手工编写编译器

    Views: 13636 | 2 Comments

    这篇文章只是我学习编译原理的日记。我不是要写一个生成机器代码的编译器,我想写一个生成其它语言的编译器。可能是生成html或者c语言代码?

    作为《编译原理》作业,我用C++语言(并不标准)手工编写的的编译器 -- 不完全功能。将代码和文档发上来,和大家一起学习,并希望有高手能够指点。

    程序已经实现了词法分析(Lexer.h/cpp),语法分析(Parser.h/cpp)并建立中序语法分析树,语法分析树数据结构(SyntaxTreeNode.h/cpp和 SyntaxTree.h/cpp)。

    程序和文档在 http://www.ideawu.net/person/compilersrc/

    词法分析器Lexer提供了nextToken()接口供语法分析器Parser使用。但是,词法分析器也可以单独使用,比如为了输出源文件的记号序列。调用Parser的parse()方法将返回一棵源文件对应的语法分析树的指针。之后可以调用display()方法输出格式化的语法分析树。目前 Parser只能建立语法分析树和判断源文件是否存在语法错误并指出错误的地方,无法生成可执行代码。

    2006-04-15

    Posted by ideawu at 2006-04-15 08:08:19
  • 2006-03-27

    应该写一个Debian Linux的详细教程了

    Views: 11488 | 6 Comments

    每当我在linuxsir论坛看到有新手提问一些初级的问题,我都忍不住要骂他们了。虽然我当初也是从对Linux一点不懂走来的,但是,这些初学者也太不会使用搜索引擎了!

    现在想想,也不能全怪他们。论坛里的文章大部分不是太老就是太难,一般初学者都用不到。其实这些所谓“老”的文章并不全是过时的,只是与现在的发行版本有有一点点不同,对初学者造成了迷惑。

    比如,Debian安装后,默认root不能登录GDM,这个问题搜索论坛也比较难以找到,更何况初学者还以为自己没有安装正确呢。还有中文问题。Debian默认安装没有中文字体,所以不能显示汉字。解决方法是复制字体到/usr/share/fonts/truetype目录下面,然后在桌面首选项里的字体设置里把反锯齿关闭。但是一些老的文章还是讲一大堆“汉化”和“美化”的东西。所以新手就跟着喊Linux不方便。纯粹是误会。

    我得回忆一下当初自己接触Linux的过程,然后把我所知道的写下来。

    应该是先从分区开始吧。然后到Windows下的VM里再安装截几个图。这回估计都写成一本书了!

    主要还是到linuxsir论坛收集看新手们都问哪些问题。如果你对我的这个计划有什么建议,请对本文发表评论。我将会在文章写成后附上一份鸣谢列表。谢谢!

    Posted by ideawu at 2006-03-27 16:26:38
  • 2006-03-17

    反汇编银河麒麟操作系统

    Views: 12128 | 2 Comments

    反汇编银河麒麟操作系统

    看到一些煽情的宣传颇为恼火所以反汇编了一下,工具就用的qemu+gdb,详细方法与调试FreeBSD或者Linux内核差不多,只是麒麟内核中的符号很少调试起来不太方便。

    本想详细的写一下反汇编的结果并臭骂一通,不过,也算了,我文笔不好OS又太大,少了文字写不清楚。仅仅说说我得到的结论吧。

    麒麟的内核就是FreeBSD5内核,并不是什么微内核,其中有轻微的修改,可能是为了优化,另外,编译的选项上加了很强的优化,从反汇编的代码可以看出来,这大概是为什么官方声称比 FreeBSD与Linux快了(配置的内核一般总比generic内核快)。

    证据有很多,大致讲,初始化代码与FreeBSD雷同;使用默认的引导选项时内核打印的信息与 FreeBSD打印的雷同,包括FreeBSD版权信息都没有去掉;内核的系统调用入口与FreeBSD雷同,随机找了几个系统调用的实现与 FreeBSD相同;内核使用了FreeBSD的KSE实现,内核的上下文切换算法与FreeBSD雷同;进程调度器与FreeBSD的4BSD调度器相同………………

    看来,我要是不把详细的步骤写出来,会被怀疑居心不良了。

    1。反汇编环境。

    下载麒麟第一张ISO到文件/mnt/data/kylin.iso,并将其挂载到/cdrom,使用一个已经装好FreeBSD的qemu硬盘~/FreeBSD。

    你需要有gdb。准备两个shell,shell1一个启动qemu,如果自己没有FreeBSD代码,可以到这里看 http://fxr.watson.org/ shell2启动gdb

    2.开始

    在shell2中,

    [prime@~] $ gdb /cdrom/boot/kernel/kernel_smp
    GNU gdb 6.1.1 [FreeBSD] Copyright 2004 Free Software Foundation, 
    Inc. GDB is free software, covered by the GNU General Public License, 
    and you are welcome to change it and/or distribute copies of it under certain conditions. 
    Type "show copying" to see the conditions. There is absolutely no warranty for GDB. 
    Type "show warranty" for details. This GDB was configured as "i386-marcel-freebsd"... 
    (no debugging symbols found)... 
    (gdb) target remote localhost:1234
    

    在shell1中,

    [prime@~] $ qemu -cdrom /mnt/data/kylin.iso -hda FreeBSD -boot d -s &
    [1] 660
    [prime@~] $ Waiting gdb connection on port 1234
    

    然后qemu启动了,在shell2中出现


    Remote debugging using localhost:1234 0x00008789 in ?? () warning: no shared library support for this OS / ABI (gdb)

    现在还没有加载内核,我们先设置断点在btext的开始,这是内核的入口,用ELF工具可以看到btext的地址是0xc0443a40,但是注意这时候内核没有启用页表,所以实际的断点位置应该是0xc0443a40 - 0xc0000000 = 0x443a40

    在shell2中

    (gdb) break *0x443a40 Breakpoint 1 at 0x443a40
    (gdb) c Continuing. Breakpoint 1, 0x00443a40 in ?? ()
    (gdb)
    

    这时候qemu已经停止,内核完全加载进入了内存,先看看btext开始的代码,1000是个随便的数字,只要足够大,以便看到足够多的指令。

    (gdb) x /1000i 0x443a40
    0x443a40: movw $0x1234,0x472
    0x443a49: push %ebp
    0x443a4a: mov %esp,%ebp
    0x443a4c: push $0x2
    0x443a4e: popf
    0x443a4f: mov %ds,%ax
    0x443a52: mov %eax,%fs
    0x443a54: mov %eax,%gs
    0x443a56: mov $0x9f45dc,%ecx
    0x443a5b: mov $0x99ed78,%edi
    0x443a60: sub %edi,%ecx
    0x443a62: xor %eax,%eax
    0x443a64: cld
    0x443a65: repz stos %al,%es:(%edi)
    0x443a67: call 0x443b38
    0x443a6c: mov $0x905e40,%esp
    0x443a71: call 0x443bcc
    0x443a76: call 0x443d0a
    0x443a7b: testl $0x2,0x997450
    0x443a85: je 0x443a90
    0x443a87: mov %cr4,%eax
    0x443a8a: or $0x1,%eax
    0x443a8d: mov %eax,%cr4
    ---Type to continue, or q to quit---
    0x443a90: mov 0x905eac,%eax
    0x443a95: mov %eax,%cr3
    0x443a98: mov %cr0,%eax
    0x443a9b: or $0x80000001,%eax
    0x443aa0: mov %eax,%cr0
    0x443aa3: push $0xc0443aa9
    0x443aa8: ret
    0x443aa9: mov 0xc0905eb8,%eax
    0x443aae: lea 0x1da0(%eax),%esp
    0x443ab4: xor %ebp,%ebp
    0x443ab6: mov 0xc0905eac,%esi
    0x443abc: mov %esi,0x1da0(%eax)
    0x443ac2: pushl 0xc0905e98
    0x443ac8: call 0x867847
    0x443acd: add $0x4,%esp
    0x443ad0: call 0x65c64b
    0x443ad5: add $0x0,%esp
    0x443ad8: call *0x10(%esp)
    0x443adc: lea 0x20(%esp),%eax
    0x443ae0: push %eax
    0x443ae1: testl $0x20000,0x54(%eax)
    0x443ae8: jne 0x443aed
    0x443aea: movl 0x14(%eax),%gs
    ---Type to continue, or q to quit---
    ......
    

    下面的我就不贴了,你现在可以打开FreeBSD5.3的源代码进行比较了。

    [prime@~] $ less /sys/i386/i386/locore.s
    

    下面省略了文件的版权与宏定义等部分,只列出实际的部分代码

    .text NON_GPROF_ENTRY(btext)
    movw $0x1234,0x472
    pushl %ebp
    movl %esp, %ebp
    pushl $PSL_KERNEL
    popfl mov %ds, %ax
    mov %ax, %fs
    mov %ax, %gs
    movl $R(end),%ecx
    movl $R(edata),%edi
    subl %edi,%ecx
    xorl %eax,%eax
    cld rep stosb
    call recover_bootinfo
    movl $R(tmpstk),%esp
    call identify_cpu
    call create_pagetables
    testl $CPUID_VME, R(cpu_feature)
    jz 1f
    movl %cr4, %eax
    orl $CR4_VME, %eax
    movl %eax, %cr4
    movl R(IdlePTD), %eax
    movl %eax,%cr3
    movl %cr0,%eax
    orl $CR0_PE|CR0_PG,%eax
    movl %eax,%cr0
    pushl $begin ret
    begin:
    movl proc0kstack,%eax
    leal (KSTACK_PAGES*PAGE_SIZE-PCB_SIZE)(%eax),%esp
    xorl %ebp,%ebp
    ......
    

    好先分析这些,我们看看create_pagetables,identify_cpu, recover_bootinfo的内核地址 0xc0443d0a 0xc0443bcc 0xc0443b38 那么在启动页表前的地址就是0x443d0a,0x443bcc,0x443b38 那么前面的call 0x443b38 就是call recover_bootinfo其他两个类推。

    其他的函数名与变量名都用这个方法,自己比较吧。看看差别多少。

    自己阅读/sys/i386/i386/locore.s,我省略了很多注释,宏定义,条件编译与数据定义,只贴了代码。

    现在我们进入保护模式启用页表,这样调试起来会方便一点。

    在shell2中,因为从begin这一点开始内核进入了保护模式并启用了页表,所以可以直接用begin这个符号。

    (gdb) break begin Breakpoint 2 at 0xc0443aa9
    (gdb) c Continuing. Breakpoint 2, 0xc0443aa9 in begin () (gdb)
    

    现在来反汇编btext会更清楚一点,另外create_pagetables等函数的比较我就不贴了,有兴趣的自己比较。

    (gdb) disassemble btext
    Dump of assembler code for function btext:
    0xc0443a40 : movw $0x1234,0x472
    0xc0443a49 : push %ebp
    0xc0443a4a : mov %esp,%ebp
    0xc0443a4c : push $0x2
    0xc0443a4e : popf
    0xc0443a4f : mov %ds,%ax
    0xc0443a52 : mov %eax,%fs
    0xc0443a54 : mov %eax,%gs
    0xc0443a56 : mov $0x9f45dc,%ecx
    0xc0443a5b : mov $0x99ed78,%edi
    0xc0443a60 : sub %edi,%ecx
    0xc0443a62 : xor %eax,%eax
    0xc0443a64 : cld
    0xc0443a65 : repz stos %al,%es:(%edi)
    0xc0443a67 : call 0xc0443b38
    0xc0443a6c : mov $0x905e40,%esp
    0xc0443a71 : call 0xc0443bcc
    0xc0443a76 : call 0xc0443d0a
    0xc0443a7b : testl $0x2,0x997450
    0xc0443a85 : je 0xc0443a90
    0xc0443a87 : mov %cr4,%eax
    0xc0443a8a : or $0x1,%eax
    ---Type to continue, or q to quit---
    

    我们要反汇编init386与mi_startup,当然你可以单步跟进到这两个函数,看看执行流程。不过这里直接进入了。

    在shell2中

    (gdb) break init386 Breakpoint 3 at 0xc086784d
    (gdb) break mi_startup Breakpoint 4 at 0xc065c651
    (gdb)c Continuing. Breakpoint 3, 0xc086784d in init386 () 
    (gdb)disass Dump of assembler code for function init386:
    
    0xc0867847 : push %ebp
    0xc0867848 : mov %esp,%ebp
    0xc086784a : push %edi
    0xc086784b : push %esi
    0xc086784c : push %ebx
    0xc086784d : sub $0x28,%esp
    0xc0867850 : mov 0xc0905eb4,%eax
    0xc0867855 : mov %eax,0xc09b7d84
    0xc086785a : mov 0xc0905eb8,%eax
    0xc086785f : mov %eax,0xc09b7ef4
    0xc0867864 : add $0x1da0,%eax
    0xc0867869 : mov %eax,0xc09b7ec4
    0xc086786e : movl $0xc09b7dc0,0x8(%esp)
    0xc0867876 : movl $0xc09b7f20,0x4(%esp)
    0xc086787e : movl $0xc09b7be0,(%esp)
    0xc0867885 : call 0xc0696e88
    0xc086788a : mov $0x0,%edi
    0xc086788f : cmpl $0x0,0xc0905e90
    0xc0867896 : je 0xc08678b5
    0xc0867898 : mov 0xc0905e90,%eax
    0xc086789d : sub $0x40000000,%eax
    0xc08678a2 : mov %eax,0xc09c00fc
    ---Type to continue, or q to quit---
    0xc08678a7 : movl $0xc0000000,(%esp)
    0xc08678ae : call 0xc06a7228
    0xc08678b3 : jmp 0xc08678ba
    0xc08678b5 : mov $0x1,%edi
    0xc08678ba : cmpl $0x1,0xc099dd38
    0xc08678c1 : jne 0xc08678cf
    0xc08678c3 : movl $0xc099dd3c,0xc09bb320
    0xc08678cd : jmp 0xc08678e7
    0xc08678cf : cmpl $0x0,0xc0905e8c
    0xc08678d6 : je 0xc08678e7
    0xc08678d8 : mov 0xc0905e8c,%eax
    0xc08678dd : sub $0x40000000,%eax
    0xc08678e2 : mov %eax,0xc09bb320
    0xc08678e7 : call 0xc06a764c
    0xc08678ec : movl $0xffffffff,0xc0997a30
    0xc08678f6 : movl $0xffffffff,0xc0997a3c
    0xc0867900 : mov $0xffc00000,%esi
    0xc0867905 : movl $0x2,0xc0997a48
    0xc086790f : mov %esi,0xc0997a44
    0xc0867915 : movl $0xffc00040,0xc0997a50
    0xc086791f : mov $0x0,%ebx
    0xc0867924 : lea 0xc09ee920(,%ebx,8),%eax
    0xc086792b : mov %eax,0x4(%esp)
    ---Type to continue, or q to quit---
    ............
    

    自己比较吧,FreeBSD的init386在/sys/i386/i386/machdep.c,mi_startup在 /sys/kern/init_main.c 在mi_startup中调用了内核的子系统初始化函数。单步执行,对各个调用的函数进行反汇编与FreeBSD比较。注意,这个函数调用的函数非常的多,最好有心理准备。比如要比较mi_switch函数,那么,

    在shell2中,

    (gdb) disassemble mi_switch
    Dump of assembler code for function mi_switch:
    
    0xc0692c6d : push %ebp
    0xc0692c6e : mov %esp,%ebp
    0xc0692c70 : push %edi
    0xc0692c71 : push %esi
    0xc0692c72 : push %ebx
    0xc0692c73 : sub $0x40,%esp
    0xc0692c76 : mov %fs:0x0,%eax
    0xc0692c7c : mov %eax,0xffffffcc(%ebp)
    0xc0692c7f : mov (%eax),%edi
    0xc0692c81 : testl $0x1,0x8(%ebp)
    0xc0692c88 : je 0xc0692c92
    0xc0692c8a : mov 0x2c(%edi),%eax
    0xc0692c8d : incl 0x40(%eax)
    0xc0692c90 : jmp 0xc0692c98
    0xc0692c92 : mov 0x2c(%edi),%eax
    0xc0692c95 : incl 0x44(%eax)
    0xc0692c98 : lea 0xffffffe4(%ebp),%ebx
    0xc0692c9b : mov %ebx,(%esp)
    0xc0692c9e : call 0xc0695040
    0xc0692ca3 : lea 0xac(%edi),%esi
    0xc0692ca9 : mov 0x4(%esi),%ecx
    0xc0692cac : mov 0x8(%esi),%ebx
    ---Type to continue, or q to quit---
    ......
    

    好了,先写这么多。

    创建于: 2006-02-16 22:36:14,修改于: 2006-02-20 12:16:56,已浏览3520次,有评论9条


    部分网友评论(并不是全部的网友评论,我只转载部分---ideawu.net注)

    网友:BSDlover 时间:2006-02-25 12:20:50 IP地址:159.226.21.★

    呵呵,基于BSD的系统多了去了,比如CISCO的IOS。没什么好奇怪的,关键是看他们自己做了多少工作。老实说,现在任何一个新的操作系统想要成功,都得站在巨人的肩膀上。当然现在只有两个肩膀站。

    网友:MingyanGuo 时间:2006-02-25 17:09:14 IP地址:211.87.218.★

    关键的是宣传的太煽情。以现有的OS为基础并没什么丢人的,大大方方的承认也就没什么了。
    重新发明轮子并不是什么值得赞赏的事情。

    网友:boimagine 时间:2006-02-26 23:03:31 IP地址:203.88.204.★

    请问可以转载吗? 想等更多的人知道.

    网友:MingyanGuo 时间:2006-02-27 07:20:36 IP地址:211.87.218.★
    呵呵,随便转载

    转载自:http://www.cublog.cn/u/10543/?u=http://www.cublog.cn/u/10543/showart.php?id=75549

    Posted by ideawu at 2006-03-17 18:30:58
  • 2006-02-10

    操作系统为什么运行缓慢

    Views: 11184 | 3 Comments

    昨天有时间翻了翻 Andrew S. Tanenbaum 的《现代操作系统》一书,先看最后一章“操作系统的设计”。发现有一节“12.4.1 操作系统为什么运行缓慢”很好,小节标题是“操作系统为什么运行缓慢”,但是我认为他讲的是所有的计算机软件为什么运行缓慢。我摘抄上来与大家分享,顺带我的一点看法,同大家一起讨论。

    在讨论优化技术之前,值得指出的是许多操作系统运行缓慢在很大程度上是自己造成的。例如,古老的操作系统MS-DOS和UNIX版本7在几秒钟内就可以启动。现代UNIX系统和Windows 2000尽管运行在快100倍的硬件上,可能要花费几分钟才能启动。原因是它们要做更多的事情,有用的或无用的。看一个相关的案例。即插即用使得安装一个新的硬件设备相当容易,但是付出的代价是在每次启动时,操作系统都必须要检查所有的硬件以了解是否存在新的设备。这一总线扫描是要花时间的。

    一种替代的(并且作者看来是更好的)方法是完全抛弃即插即用,并且在屏幕上包含一个图标标明“安装新硬件”。当安装一个新的硬件设备时,用户可以点击图标开始总线扫描,而不是在每次启动的时候做这件事情。当然,当今的系统设计人员是完全知道这一选择的。但是他们拒绝这一选择,主要是因为他们假设用户太过愚笨而不能正确地做这件事情(尽管他们使用了更加友好的措辞)。这只是一个例子,但是还存在更多的事例,期望让系统“用户友好”(或者“防傻瓜”,取决于你的看法)却使系统始终对所有用户是缓慢的。

    或许系统设计人员为改进性能可以做的最大一件事情,是对于添加新的功能特性更加具有选择性。要问题的问题不是“用户会喜欢吗?”而是“这一功能特性按照代码大小,速度,复杂性和可靠性值得不计代价码?” 只有当优点明显地超过缺点的时候,它才应该被包括。程序员倾向于假设代码大小和程序瑕疵计数为0并且速度为无穷大。经验表明这种观点有些过于乐观。

    另一个重要的是产品的市场销售。到某件产品的第4或第5版上市的时候,真正有用的所有功能特性或许已经全部包括了,并且需要该产品的大多数人已经拥有它了。为了保持销售,许多生产商仍然继续生产新的版本,具有更多的功能特性,正是这样才可以向现有的顾客出售升级版。只是为了添加新的功能特性而添加新的功能特性可能有助于销售,但是很少会有助于性能。

    作者的这种说法我是很认同的,所以当有位兄弟发贴问“FC5是不是运行快了很多了”的时候,我立即回贴表示这几乎不可能。

    经验告诉我们,升级软件往往伴随着升级硬件,否则新的软件无法使用或者速度无法接受。这是因为,软件的升级,速度并不是主要考虑的问题,新的功能和新的操作方式才是软件升级的原因。软件制作都当然不需要添加新的功能特性,只需要研究原来软件的算法,并试图改进来提高速度。一般情况下是可以提升速度的,但大多数情况是不明显的。硬件可以只通过改进物理特性而不增加或者删除某项功能来提升速度,而软件只能通过改进算法来提升速度,功能的删除是很少见的。

    但是,我们忽略了重要的一点。并不是因为更新和更好的算法是难以发明的,而是因为采用新的算法必须带来新的软件Bug。原来的软件肯定有Bug,这是必然的。但是,它的功能的性能想必已经满足了用户的需要。而且,一百个专家1个星期的测试结果并不比一万个用户一年的使用情况来得可靠。没有人愿意在软件中增加未知的Bug,或许是致命的,只有迫不得已的情况下才这么做。

    事实还告诉我们,我们可以通过将P3+128M内存的机器升级为P4+1024M内存从而使用我们的FC4操作系统产生速度上的明显提升。但是,我们不可能过将RH9操作系统升级为FC4而期望在我们的P3+128M内存的机器上产生任何的速度提升。所以,试图通过升级软件而硬件不升级来提升软件速度,这种想法往往是可笑的。

    Posted by ideawu at 2006-02-10 08:53:57
|<<<789101112131415>>>| 13/15 Pages, 86 Results.