首先你需要了解几个概念,有损压缩,量化,行程编码。
对一副图片来说,bitmap就是原始格式,没经过任何压缩的。
量化就是把所有0-255的像素值进行归类,然后分成尽量少的积累,这要存储量就小很多了,对于JEPG来说量化是有损压缩的起源。
最后就是对所有的已经归类过的点进行行程编码,然后就压缩完了
‘贰’ 压缩算法原理
哈夫曼
哈夫曼编码是无损压缩当中最好的方法。它使用预先二进制描述来替换每个符号,长度由特殊符号出现的频率决定。常见的符号需要很少的位来表示,而不常见的符号需要很多为来表示。
哈夫曼算法在改变任何符号二进制编码引起少量密集表现方面是最佳的。然而,它并不处理符号的顺序和重复或序号的序列。
2.1 原理
我不打算探究哈夫曼编码的所有实际的细节,但基本的原理是为每个符号找到新的二进制表示,从而通常符号使用很少的位,不常见的符号使用较多的位。
简短的说,这个问题的解决方案是为了查找每个符号的通用程度,我们建立一个未压缩数据的柱状图;通过递归拆分这个柱状图为两部分来创建一个二叉树,每个递归的一半应该和另一半具有同样的权(权是 ∑ N K =1 符号数 k , N 是分之中符号的数量,符号数 k 是符号 k出现的次数 )
这棵树有两个目的:
1. 编码器使用这棵树来找到每个符号最优的表示方法
2. 解码器使用这棵树唯一的标识在压缩流中每个编码的开始和结束,其通过在读压缩数据位的时候自顶向底的遍历树,选择基于数据流中的每个独立位的分支,一旦一个到达叶子节点,解码器知道一个完整的编码已经读出来了。
压缩后的数据流是 24 位(三个字节),原来是 80 位( 10 个字节)。当然,我应该存储哈夫曼树,这样解码器就能够解码出对应的压缩流了,这就使得该例子中的真正数据流比输入的流数据量大。这是相对较短的数据上的副作用。对于大数据量来说,上面的哈夫曼树就不占太多比例了。
解码的时候,从上到下遍历树,为压缩的流选择从左 / 右分支,每次碰到一个叶子节点的时候,就可以将对应的字节写到解压输出流中,然后再从根开始遍历。
2.2 实现
哈夫曼编码器可以在基本压缩库中找到,其是非常直接的实现。
这个实现的基本缺陷是:
1. 慢位流实现
2. 相当慢的解码(比编码慢)
3. 最大的树深度是 32 (编码器在任何超过 32 位大小的时候退出)。如果我不是搞错的话,这是不可能的,除非输出的数据大于 2 32字节。
另一方面,这个实现有几个优点:
1. 哈夫曼树以一个紧密的形式每个符号要求 12 位(对于 8 位的符号)的方式存储,这意味着最大的头为 384 。
2. 编码相当容易理解
哈夫曼编码在数据有噪音的情况(不是有规律的,例如 RLE )下非常好,这中情况下大多数基于字典方式的编码器都有问题。
‘叁’ 压缩的算法都有哪些
只有最常见的zip的,估计你都要研究上n久了。。。
文本文件一般有zip,rar,
网页文件有htz
视频文件有rm,avi
语音文件有mp3,
图片文件有png,gif,jpg
这些都是文件压缩的。。。。
------------------------------------
ZIP文件的总体格式
分文件头信息+文件压缩数据
中心目录+中心目录记录结束符
1.分文件头信息:
字节数 描述
4 分文件头信息标志(0x04034b50)
2 解压缩所需版本
2 通用比特标志位(置比特0位=加密;置比特1位=使用压
缩方式6,并使用8k变化目录,否则使用4k变化目录;置比特2位=使用压
缩方式6,并使用3个ShannonFano树对变化目录输出编码,否则使用2个
ShannonFano树对变化目录输出编码,其它比特位未用)
2 压缩方式(0=不压缩,1=缩小,2=以压缩因素1缩小,3=以
压缩因素2缩小,4=以压缩因素3缩小,5=以压缩因素4缩小,6=自展)
2 文件最后修改时间
2 文件最后修改日期
4 32位校验码
4 压缩文件大小
4 未压缩文件大小
2 文件名长
2 扩展段长
? 文件名(不定长)
? 扩展段(不定长)
2.中心目录结构
文件头信息...中心目录记录结束符
文件头:
字节数 描述
4 中心文件头信息标志(0x02014b50)
2 主机操作系统(高位字节表示主机操作系统,低位字
节表示ZIP压缩软件版本号,其值除以10表示主版本号,其值模10表示
次版本号。0=MS-DOS,OS/2 FAT文件系统,1=Ami ga,2=VMS,3=Unix及
变种,4=VM/CMS,5=AtariST,6=OS/2 HPFS,7=Macintosh,8=Z-System,9
=C P/M,10-255未用)
2 解压缩所需版本
2 通用比特标志
2 压缩方式
2 文件最后修改时间(用标准的MS-DOS时间日 期格式
编码)
2 文件最后修改日期
4 32位校验码(使用David Schwaderer的CRC-32算法产
生)
4 压缩文件大小
4 未压缩文件大小
2 文件名长
2 扩展段长
2 文件注释长(分别为文件名长,扩展段,注释 段,小于
64K)
2 磁盘起始号(本文件在磁盘中的起始号)
2 内部文件属性(最低位若置1,表示为ASC文本,否则为
二进制数据,其它位未用)
4 外部文件属性(依赖于主机操作系统)
4 分文件头相对位移
? 文件名(不定长)
? 扩展段(不定长,用于未来扩展,低版本为0长)
? 文件注释(不定长)
3.中心目录记录结束符
字节数 描述
4 中心目录标记结束符(0x06054b50)
2 磁盘号(其中包括中心目录结束记录)
2 磁盘中心目录起始号
2 磁盘中心目录入口总数
2 中心目录入口总数(ZIP文件中的文件总数)
2 整个中心目录大小
4 关于起始磁盘号的中心目录初始偏移
2 ZIP文件注释长度
? ZIP文件注释(不定长)
加密方法
PKZIP中使用的加密方法由Roger Schlafly提供。ZIP文件在解压
缩前必须先解密。每个加密文件具有一个12字节的加密文件头扩展信
息,存储于数据区的起始位置,加密前先设置一个起始值,然后被三个3
2位的密钥加密。密钥被使用者提供的口令初始化。12个字节加密之
后,由PKZIP的伪随机数产生方法,结合PKZIP中使用CRC-32算法对密钥
进行更新。
具体实施分为三步:
1.用口令对三个32位密钥初始化。
K(0)=305419896,K(1)=591751049,K(2)=878082192
循环 for i=0 to length(password)-1
调用更新密钥函数 update_keys(password(i))
结束循环(循环口令长度次)
其中更新密钥函数为:
update_keys(char):
Key(0)=crc32(key(0),char)
Key(1)=Key(1)+(Key(0)& 000000ffH)
Key(1)=Key(1)*134775813+1
Key(2)=crc32(Key(2),Key(1)〉〉24)
end update_keys
CRC32函数中,给定一个4字节的CRC值和一个字符,返回一个由CRC
-32算法更新的CRC。具体为:
crc32(c,b)=crc32tab[(c^b)&0xff]^(c>>8),crc32tab[256]的值
为固定的256个4字节数。
2.读取并加密12字节的加密头,再次对密钥进行初始化。
将12个字节的加密头读入缓冲区buffer(0)至buffer(11),循环fo
r i=0 to 11
C=buffer(i)^decrypt_byte()
update_keys(C)
buffer(i)=C
结束循环(循环12次)
其中的decrypt_byte()函数为:
unsigned char decrypt_byte()
local unsigned short temp
temp=Key(2)¦2
decrypt_byte=((temp*(temp^1))>>8)&0xff
end decrypt_byte
该步结束后,缓冲区中最后的二个字节buffer(10)和buffer(11)
将成为加密文件校验码的二个最高位(按低至高顺序存放)。对ZIP加
密文件进行解压缩前,PKUNZIP软件将使用者提供的口令按上述二个步
骤进行处理,得到的结果与校验码的二个高位字节进行比较,只有当提
供了正确的口令时,结果一致,才能进行后续的解压缩过程,否则,PKZI
P报告错误信息,程序自动结束。
3.读取压缩的数据流并以加密密钥对其进行加密。
压缩数据流按下述过程加密:
循环 直至数据流结束
C=数据流的一个字节
temp=C^decrypt_byte()
update_keys(temp)
输出temp
结束循环
‘肆’ 压缩器的工作原理
压缩器(Compressor)的主要功能是衰减强度超过了给定门限的强信号,减小了信号的动态范同;而扩展器(Expander)则是衰减强度小于给定门限的弱信号,增加了信号的动态范围。显然这里压缩、扩展是对应信号的动态范围改变而言的,因此它们有时被称为“动态范围处理器”。 [2]
从本质上讲,压缩器(Compressor)是一种自动音量控制设备,能够减小声音的动态范围。在现有的录音棚中,压缩器几乎是必要没备。压缩器的面板上有几个重要的控制参数,其中之一是阀值。简单地说,阀值是允许用户自由指定的一个临界电平值,当输入电平高于这个值的时候,压缩器才开始工作。如果输入信号的电平低于阀值,那么压缩器就会自动停止。因此,这里传达出的一个重要信息就是压缩器并不是一直都处于工作状态的(特殊情况除外)。如果输入信号电平过低,将永远不会达到压缩阈值;如果输入信号电平过高,压缩器将严重制约信号的动态范围,影响声音在动态上的表现。压缩比决定压缩器的压缩强度,换句话说它代表的是压缩器将压低多少超过阀值的音频信号。例如,5:1的压缩比意味着,如果输人信号在当前的基础上增加到10倍.那么输出信号的电平相应地只增加到两倍。
另外两个重要的参数分别是建立时问和释放时问。建立时间指的是,当输人信号超过阈值后压缩器由启动到正常压缩状态所用的时间;释放时间指的是,当输人信号下降到阈值之下后压缩器由压缩状态恢复到不工作状态所需要的时间。释放时间是一个至关重要的参数,因为如果将释放时间设置得过大,就会产生泵音效应,尤其当前一个音较响而后一个音较弱时,这种现象尤为明显。
‘伍’ 压缩器是
动态范围压缩器(dynamic range compressor)
指在有些装设有杜比数字(DD)解码功能的功放接收机和前置放大器中采用的一种电路。系用来减少音量的峰值和增加低电平声音的音量。深夜为了不影响邻居或家人的休息,便可以使用动态范围压缩器来聆听音乐和观看影院节目。此时对于那些低电平的声音,将仍能清晰可闻。
在目前数字音频处理方面,多数音频处理器,数字功放芯片等也都包含这种算法,并可以控制动态范围压缩的比率,将系统输出的最大功率限制在一个固定范围。这样可有效避免大动态信号造成的过载以及烧坏扬声器。
‘陆’ 有谁知道,JPEG压缩编码算法的主要步骤
JPEG压缩编码算法的主要计算步骤如下:
1.正向离散余弦变换(FDCT)。
2.量化(quantization)。
3.Z字形编码(zigzag scan)。
4.使用差分脉冲编码调制(differential pulse code molation,DPCM)对直流系数(DC)进行编码。
5.使用行程长度编码(run-length encoding,RLE)对交流系数(AC)进行编码。
6.熵编码(entropy coding)。
2. 量化
量化是对经过FDCT变换后的频率系数进行量化。量化的目的是减小非“0”系数的幅度以及增加“0”值系数的数目。量化是图像质量下降的最主要原因。
对于有损压缩算法,JPEG算法使用均匀量化器进行量化,量化步距是按照系数所在的位置和每种颜色分量的色调值来确定。因为人眼对亮度信号比对色差信号更敏感,因此使用了两种量化表:亮度量化值和色差量化值。此外,由于人眼对低频分量的图像比对高频分量的图像更敏感,因此图中的左上角的量化步距要比右下角的量化步距小。
3. Z字形编排
量化后的系数要重新编排,目的是为了增加连续的“0”系数的个数,就是“0”的游程长度,方法是按照Z字形的式样编排,如图5-17所示。这样就把一个8 ? 8的矩阵变成一个1 ? 64的矢量,频率较低的系数放在矢量的顶部。
4. 直流系数的编码
8 ? 8图像块经过DCT变换之后得到的DC直流系数有两个特点,一是系数的数值比较大,二是相邻8 ? 8图像块的DC系数值变化不大。根据这个特点,JPEG算法使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化DC系数的差值(Delta)进行编码,
Delta=DC(0, 0)k-DC(0, 0)k-1 ........ (5-5)
5. 交流系数的编码
量化AC系数的特点是1 ? 64矢量中包含有许多“0”系数,并且许多“0”是连续的,因此使用非常简单和直观的游程长度编码(RLE)对它们进行编码。
JPEG使用了1个字节的高4位来表示连续“0”的个数,而使用它的低4位来表示编码下一个非“0”系数所需要的位数,跟在它后面的是量化AC系数的数值。
6. 熵编码
使用熵编码还可以对DPCM编码后的直流DC系数和RLE编码后的交流AC系数作进一步的压缩。
在JPEG有损压缩算法中,使用霍夫曼编码器来减少熵。使用霍夫曼编码器的理由是可以使用很简单的查表(lookup table)方法进行编码。压缩数据符号时,霍夫曼编码器对出现频度比较高的符号分配比较短的代码,而对出现频度较低的符号分配比较长的代码。这种可变长度的霍夫曼码表可以事先进行定义。
‘柒’ 压缩器有哪几个主要参数
一、阀值电平
阀值电平指压限器控制作用的信号电平,这个电平的确是非常重要的,选择太低,则信号的大 部分时间都处于压缩状态,会使信号失真,选得太高则达不到防止削波的目的。
二、压缩比
压缩比是指在阀值电平以上压缩器开始压缩工作后,其输入信号变化的分贝数和输出信号变化 的分贝数之比,如2:1,3:1,压缩比越大。
则在发着以上的输入信号变化时,输出信号变化越小,压缩比一般应从小压缩比开始选,因为压缩比越大,引起的失真越大,一般可选2:1或 3:1,只有在信号峰值因数很大时才选较大压缩比。
三、压缩启动时间
压缩器启动时间是指当信号达到阀值电平压缩器进入工作状态的63%所需时间,此时间一般 是在100us-10ms之间,时间过短则会导致节目过分被压缩,影响动态效果,过长则会产生可 感觉到的起始触感,产生不自然的“音头加重”现象。
四、压缩恢复时间
压缩恢复时间是指当信号退出阀值电平,压缩器开始退出压缩工作,其退到正常状态的37% 所需时间,恢复时间一般为0.1s至几秒,时间过短会产生可感觉到的电平变化,造成喘息效 应,时间过长,则将破坏音源的实际动态变化状况。
工作原理:
压缩器(Compressor)的主要功能是衰减强度超过了给定门限的强信号,减小了信号的动态范同;而扩展器(Expander)则是衰减强度小于给定门限的弱信号,增加了信号的动态范围。显然这里压缩、扩展是对应信号的动态范围改变而言的,因此它们有时被称为“动态范围处理器”。
‘捌’ window zip和rar两种压缩方式的区别等详细情况
4月14日,年仅37岁的菲利普·卡兹(Philip Katz)被人发现倒毙在美国威斯康星州密尔沃基的一家汽车旅馆里,据说死因是慢性酒精中毒引起的并发症。被人发现时,卡兹的手中仍握着一个烈性酒的酒瓶,在同一个房间里还发现了另外5个空酒瓶。这个噩耗很快就通过Internet传遍了世界,很多认识和了解卡兹的人们以不同的方式对这个不幸的消息发表评论,寄托哀思。你一定会好奇地问,这个菲利普·卡兹究竟是何方神圣?
说起菲利普·卡兹这个名字,很多人可能都茫然不知;但是相信一提到电脑里、Internet上那比比皆是的ZIP压缩文档,不知道的人就很少了。菲利普·卡兹正是ZIP这个大名鼎鼎的压缩文档格式的发明人,他开发的ZIP压缩软件PKZip在DOS时代已风行世界,成为人们使用最频繁的工具软件之一。今天,人们从Internet下载的文件几乎百分之百是用卡兹发明的ZIP压缩算法压缩过的。卡兹的这个发明和贡献,在使电脑之间交换信息的方式变得更加方便的同时,也大大降低了成本。特别是在今天这个Internet大行其道而通讯速度和带宽又很难令人满意的情况下,ZIP压缩软件得到世界各地的电脑爱好者的欢迎和喜爱就是极其自然的事情。看看身边有多少人在使用PKZip和Winzip,你就能真切地体会到菲利普·卡兹对于我们今天使用计算机的方式带来的巨大影响。
压缩软件的争斗
现在回忆起来,ZIP压缩文档标准和PKZip压缩软件的问世颇有几分戏剧性的传奇色彩。
时光要回溯到1988年,那时候的Internet还处在蒙昧的“原始时代”的后期,当时网上的信息远远没有今天丰富,只是极少数大学、研究机构和美国军方才能够享用的“特权”,一般电脑爱好者很难有机会接触。那个时代,风靡北美大地的是通过电话线接入的老式“电子公告牌”(BBS)系统。热衷于电脑的“发烧友”们就通过这些现在几乎已经绝迹的方式来交换信息、交流思想和共享软件。由于电话线的数据通讯带宽很低、干扰大、稳定性很差,再加上当时流行的调制解调器(Modem)的速率也只有14.4Kbps,通过BBS传输体积较大的软件一直是让人头疼的难题。正是基于这种原因,文档压缩技术就变得极为有用。压缩后的文档一般只有原来体积的几分之一,可以大大减少传输的时间,也提高了可靠性。
当时流行的文档压缩技术有好几种,比较流行的一种是新泽西州的SEA((Systems Enhanced Associates)公司开发的ARC压缩技术,压缩生成的文档的后缀是.ARC。ARC能很好地工作,但是你必须花钱去向SEA公司购买。1988年的时候,20岁出头的菲利普·卡兹和很多同时代的年轻人一样,穿梭于BBS的自由空间,沉迷于狂热的编程体验里。由于深受断线的困扰,经常出没于BBS的卡兹索性自己开发了一个与SEA的ARC完全兼容的共享压缩软件,取名PKARC。PKARC推出以后,很快就在BBS上广为流传,深受电脑爱好者们的喜爱。它和SEA ARC一样工作得很不错,最要命的是,由于是以共享软件形式发布,人们可以随意地使用,如果觉得满意的话,才给作者付上很小的一笔注册费用。有了近乎免费的PKARC,人们当然不会再为SEA的ARC付出不菲的代价。直接的后果是,很多人都转向了PKARC——这个菲利普·卡兹的“业余作品”,SEA的ARC则销量巨减。这无异于放倒了SEA的“摇钱树”。恼羞成怒的SEA把卡兹告上了法庭,声称ARC压缩标准是它的***,要求法庭禁止卡兹继续传播与其竞争的PKARC。虽然大多数的电脑爱好者都站在卡兹这边,但法庭最终还是作出了不利于卡兹的判决。这个结果对卡兹是一个不小的打击,他被迫放弃了PKARC这个心爱的软件项目。最让卡兹气愤的是,他感觉自由创新的权利被人剥夺了。在朋友和同好们的鼓励之下,憋足了一口气的卡兹发誓要写出一个更好的压缩软件,堂堂正正地击败SEA,而且要让它输得心服口服。这一次,卡兹的编程天才再次展露无遗。在短短的几周以后,卡兹就拿出了后来统治整个BBS世界乃至Internet的ZIP。这个全新的PKZIP,使用卡兹发明的ZIP压缩算法,比SEA的ARC速度快了将近一倍,压缩率也有一定的提高。卡兹继承了PKARC的做法,将PKZIP免费发放,使其很快成为人见人爱的“杀手应用”(Killer Appliction)。没有任何号召,遍及美国的各大BBS的管理员们都先后自发地将原有的.Arc压缩文档转换成卡兹的.ZIP格式。经过不到半年时间,原来风光无限的SEA的ARC就几乎绝迹了!取而代之的就是免费而且性能更加出众的PKZIP。在失去众多的用户的支持以后,SEA迅速沉沦,最终销声匿迹。有人在后来对此事的评论中说道,“菲利普·卡兹无疑扮演了ARC掘墓人的角色,他为ARC的棺材钉上了最后一颗钉子!”
有关ZIP打败强大的ARC和SEA的事迹成为了电脑爱好者们津津乐道的传奇故事,疾恶如仇而又身手不凡的菲利普·卡兹也成为那些热衷于编写非凡程序的青年人的偶像。此后,卡兹一直继续着对PKZIP的开发和维护工作。
PKZIP及其“克隆”作品Winzip成为Internet历史上最有名的共享软件之一,ZIP压缩格式也成为压缩文档的事实标准,建立起一个统治Internet的“ZIP王朝”。菲利普·卡兹为世界贡献了一个伟大的共享软件,而他自己却几乎没有从中获得任何好处!
意外的结局
菲利普·卡兹的突然去世,对于他本人,对于他的家庭,乃至整个计算机界都是一个令人扼腕的悲剧。人们从此失去了一个才华横溢的程序员,失去了一个传奇英雄。噩耗传出以后,在着名的IT网站ZDNET的新闻反馈页面上,许许多多的网友留言体现了人们对卡兹早逝的惋惜和他生前成就的褒扬。正像来自南美洲巴拉圭的一位系统分析员在留言中写到的那样:“菲利普·卡兹和他的.ZIP压缩格式必将得到永生。每一个.ZIP文件都将永远记住菲利普·卡兹,因为每个ZIP文件的开头都嵌有他姓名的字头缩写字母‘PK’……”
也有报道指出,菲利普·卡兹的英年早逝除了与长年编写软件的巨大压力有关外,也与其不良的个人生活方式关系密切。卡兹的直接死因,无疑是其长期酗酒恶习的悲剧结局。作为一名程序员,菲利普·卡兹获得了巨大成功。但于之形成鲜明对比的是,在个人生活方面,卡兹却一直很不顺利。郁闷的结果让卡兹觉得只能求助于酒精才能获得解脱,而这最终让他付出了生命的代价!数据压缩和程序设计占据了卡兹短暂的生命历程的绝大部分。他的杰作让世界各地的人们从“压缩”中获益匪浅,然而,不幸的是,菲利普·卡兹的生命似乎也被令他得意非凡的压缩软件压缩得那样短暂。不知道这是不是造物弄人?
他们是程序员
人生如戏,戏如人生。对生活在无比精彩的计算机时代乃至互联网时代的一代又一代和菲利普·卡兹一样的天才程序员们来讲,这句话如果改成“人生如程序,程序如人生”可能会更加贴切一些。这些在常人眼中聪明绝顶、特立独行的古怪“家伙”简直就将程序看作了自己的生命,写不出好用的软件,对他们无疑是一场灾难。在很大程度上,程序已经成为他们生命中不可割舍的一个最重要的组成部分了。这些充满灵性的程序不再仅仅是玄妙无匹的0和1的排列组合体,它们根本就是呕心沥血的程序员们的人生哲学甚至整个人生的写照。菲利普·卡兹或许只是一个极端的例子而已。
在这个剧烈变革的大时代中,我们并不缺乏伟大的程序员。他们中的绝大部分睿智、热情、乐观、无私,由于他们的天才与杰作,我们的生活和工作变得从未有过的精彩、丰富、刺激、舒适。被誉为“自由之神”的自由软件阵营的精神领袖理乍得·斯托曼(Richard Stallman)极力倡导的GNU计划,吹响了计算机软件进军“共产主义社会”的号角;永远拥有一张“娃娃脸”的比尔·盖茨经过20多年的奋斗,成了不可企及的“微软帝王”,每个人的桌上摆上一台PC的梦想很快就将成为现实;发明免费操作系统Linux的莱纳斯·托沃兹(Linus Torvalds)让人们看到了打破微软霸权的希望曙光;被美誉为Internet上的“孤独骑士”的拉里·沃(Larry Wall)因为偷懒而发明的Perl语言,成为目前Internet上使用最广的编程语言……这些出色的程序员的故事,写下来都是一段让人不忍释卷的传奇。然而,使我们这个对信息的依赖日甚一日的世界良好运转的是更多默默无闻地分布在世界各地的辛勤的程序员们。没有这些忘我工作的人们,数字化社会就只能永远是美好而遥远的幻梦!有人将编程看成是一种艺术而并非技术,这在一定程度上不无道理。那是一种艺术家一般的灵感和激情的产物,美妙的程序是要用心、用血去书写的。现在虽然时时听到身边的程序员悲叹“我们吃的可是时光短暂的青春饭”,但真正因此“金盆洗手”而罢手不干的还是少之又少。挑战困难、勇于创新已经成为融入了每一个真正的程序员血液的特质,成为他们生命中不可分割的部分。他们也因为这些而赢得人们的尊敬。
在可敬、可爱有时甚至是可恨的程序员们的身上或许还存在这样、那样的问题,或许还远远谈不上完美,但是我们不能对他们苛求太多。毕竟,他们和我们一样,也是普普通通有血有肉的人。我们为他们创造的杰作和奇迹欢呼,为他们面对的失败和失意惋惜,为他们遭遇的不幸和悲惨流泪,就因为他们是程序员!在这里,我们没有任何夸耀或是贬低的潜台词,因为那是世界上一部分真实人群的真实的生存状态和生活方式,我们很难给其贴上对与错或是好与坏的“标签”,况且,我们也许根本就没有这样的权力。是非功过的评说,最有说服力的是时间……