晒一下自学编程的经历:《从asm到perl,我的编程之路》 By zhasm(于2010-9-1发表)

原文发表在自己博客上:http://zhasm.com/blog/y2008/m01/d17/my-experience-from-asm-to-perl.html。

;;;;####################################################################################

从asm到perl,我的编程之路

rex, 01月 17, 2008 @ 1:35 pm  Filed under asm, perl

我首先知趣地声明:本人对编程只是有着叶公之好的门外汉,此处只表达本人粗浅认识和想法,充满着大惊小怪的大呼小叫;见怪不怪的业内大牛请绕行。

asm篇:暗黑破坏神

余生也早,接触计算机却晚,是在01年4月份与计算机喜结良缘。大约是02年,刚喜新厌旧地把basic扔到一边,在自学C语言。听人吹嘘asm的强大(硬件级控制),心痒难耐。那时觉得,只要学习了asm,基本上直接就进入黑客大牛级别了,就仿佛刚上学前班的一个牙牙学语的儿童,忽然得知了一条保送清华博士后的捷径。

那时引以为自豪的是当时用turbo C编写了一个黑白棋程序。我的梦想是把它转换成asm语言版本和vc版本。使用asm是为了锻炼自己功力,使用vc是为了把编出来的程序让别人使用。毕竟,在dos界面下编写和运行程序,总觉得寒碜得掉渣。

买了本清华的汇编教程自己啃。一上来就是胡天胡地的寻址和林林总总的中断。太抽象了。后来在西单买了本影印版的《IBM PC汇编语言程序设计》。两相比较,感觉清华的书像是写给业内人士的,适合当作reference;而IBM这本书,读起来才是写给初学者的 tutorial,引导你一步步入门。虽然是影印版,但是用到的生词也就那几个,记住之后一劳永逸,比起清华的佶屈聱牙不知所云还是好懂多了。这一阶段的猛攻为计算机英语阅读打下基础。以后我接触的其它编程资料,都是直接阅读原版,资料比翻译过的更齐全,更权威。

把这本书啃完,觉得8086的历史已经一去不复返了,32位平台下的编程才是正途。

于是也搜索到了Iczelion’s Win32 Assembly教程。逐一细读,测试,天天泡罗云彬的汇编乐园,aogosoft的bbs,老罗的缤纷天地。masm32 gui 的问题也解决了,写出了几个自娱自乐、自给自足的小程序。对masm32+数据库(ODBC)的编程上,也有了自己的一点心得。

当时学asm,还有一个很XX很XX的念头在里面:破译注册码。这是最令初学者心动念头,在人前摆酷也是立杆见影。有一点点汇编的底子,入门还是不费多大力气的。最简单的是爆破,就是找到类似 if(测试码正确) 的地方,改为if (测试码不正确)。不过,最有成就感的,还是调试,跟踪,找出算法,写出注册机。我当时最高成是,为豪杰解霸家族的一系列产品作出一个N合1的注册机。当然是只限于测试使用,没有傻到把它发布到网上去。时间应该是2003年,托非*典的福,我有足够的时间来潜心跟踪算法。再往后,就对破解这个领域失去兴趣,就跟孙悟空跳到了如来的掌边,画个到此一游的记号,撒泡尿就回来了,没再往前跨出一步。

Perl篇:仙剑奇侠传

我一直纳闷(和庆幸),在原来我们的大学里,这所纯文科的学校图书馆,怎么会有perl的骆驼书。我只是好奇地翻开看了几眼,却与perl结下不解之缘。由于知道了一点点perl的语法和正则表达式的皮毛,我才拥有了文本解析的强大武器。正如Jeffrey Friedl在他的《Mastering Regular Expressions》里面说的,“一旦你拥有了它,就会不由自主地想,在没有它的日子,我可该怎么过”。在此之前,我曾幼稚地以为,哪里需要什么与正则表达式,notepad和m$word里的搜索替换功能不是挺强大的么?

学习计算机知识以来,给我震撼最大的两样东西,一是二叉树,另一就是正则表达式了。前者为我解释了在海量数据中如何快速精准定位的理论实现,后者为我展示了高级搜索替换的不二法门。1024个数据,如果按照二叉树作好排序,可以最多只比较10次,就能找到所需数据。大量文本,只需要一条 s/patterns/newvalues/g;就能把内容全部替换为目标值。(虽然它对ASCII码类的支持,比UNICODE的支持,更自然一些。谁让这是洋鬼子发明的呢?)我像菩提门下那只手舞足蹈的猴子一样,满心喜悦,溢于言表。

以我迄今所知,只有perl这种语言,能与正则式无缝链接。其它的语言跟正则表达式之间,都有着隔靴难搔之痒。从asm的角度来仰望perl,简直不可思议。比如正则匹配的if ($var =~ /regexstring/),比如散列赋值的$hash{key}=value…这种感觉,仿佛是瑞士手工作坊里的老钟表匠,到日本参观了现代化的电子表生产线:自己一点点地实现,并非不可能,或许还能细心、从容、优雅地打磨得更精致;但是如果想提高效率,则非生产线莫属了。你知道每一个细节的原理流程,你知道每个齿轮精确到微米的直径,你的手感比灵游标卡尺还要灵。可是,你做得慢腾腾。

我是如此地醉心于perl的语法,时常编写几行程序满足自己对文本解析的需求,在windows/linux中都不在话下。但是,如果不只是自娱,还要“愚他”的话,就该考虑gui了。asm的gui我熟,因为它走的是c语言的sdk+api的路子,教程多多,而且有庞大的MSDN作后盾,不愁找不到资料。这是一条根正苗红的贫农路线。但是对于perl,想实现gui,该何去何从呢?

我曾经退回到asm阵营来,尝试让masm32+gui支持regex,自己写过引擎,以失败告终。但是即使支持了regex,能高效地实现散列么?perl高效的语法让我的asm自惭形秽。是呀,perl曾经放过豪言:perl一句,顶其它语言数十数百句(这是从语法简洁度上来说的,跟执行效率不成正比,跟政*治更不搭边,不许联想)。

于是,我尝试了tk,但是感觉不爽。之后热情冷却下来,在perl和asm之间游离。终于,又发现了wxWidget。在语言上,它支持c++, c#,Python,Perl;在平台上,它支持Windows,*nix,Mac。不错,很不错。我就是需要这种两栖乃至多栖的东东。

书从疑处翻成悟

正如书中交待,wxPerl的特点是:It is less Perlish – but it’s more OO。对于怪异的语法,我有独到的武器:手抄代码。这仿佛是“理解的要执行,不理解的也要执行。在执行中加深理解。”

这一武器,我在c中用过,在c++中用过,在数据结构中用过,在asm中用过……结论是屡试不爽。我一遍一遍地读代码,抄代码,思考代码,改变一点点,加入一点点,自然就理解了。渐悟和顿悟的感觉都很爽。就像多年前有次做完家教返校途中,公交车上,我突然理解了MFC,哦,原来就是封装呀。假我以时日,我也能把masm32封装成面向对象的,高度集成的MF·MASM32。那一刻,我有着与阿基米德从浴缸中跳出相类似的喜悦和冲动。虽然自己编写 MFMASM32,就跟“给我一个支点,我就能撬动地球”一样,是以把自己的能力夸大无数倍的前提下发出的豪言壮语,但是侧重点在于“寡人悟到了!”这个悟的过程以及所悟到的内容的理论可行性,带着难以言表的快乐,与微微的自豪感。

屠龙之技

我一直把编程及其相关的学习当作业余爱好来对待的。有时也在反思,是不是为了不必要的富兰克林的哨子,花费了太多的代价。业余时间,有人爱看球赛,有人演算哥德巴赫猜想,有人背诵圆周率,诸如此类,热衷于各类不损人不利人的活动,并能从中找到让自己满足的小快乐。以前读过毛姆的一本书《刀锋》,不明白那个经历过生死,周游过世界,读过了吠陀经,最终领悟了人生真谛的拉里,为什么想去做一名的哥来了却残生。现在想来,也不错。

;;;;####################################################################################

并不是所有的贴子都是原创,此时作者均指发表的人而不是文章的作者,作者会说明是否是转贴