首先解释一下生活背景,我是一个70后,初中毕业。接触电脑的时候早就过了学习知识的年龄,电脑基础都学不会,还指望能学会编程吗?虽然不会编程,但我现在开发的极语言已经有几千个成熟作品在使用了。强调一下,我是电脑小白,分享的经历正是不学编程,如何开发一种实用的编程语言。
估计很多人都会觉得我脑子不正常,说话这逻辑简直都不是人类。下面我把真实经历写出来,实在看不下去的就趁现在赶紧划走。
98年的时候第一次组装电脑,花了好几百,电脑的内存才16M,CPU是奔腾133,不带多媒体功能的处理器,也就是说别指望这电脑能播放音乐或者视频。安装WIN98系统勉强能用,但不如WIN95流畅。
当时没有网络,我去电脑城买网卡,问我干啥用,我说上网。他就笑话我说网卡可不是上网的。我还傻傻的问,网卡不是上网的那是干啥的?他说你回去多看看书吧。
拨号上网猫
九十年代电脑书籍也不便宜,能买得起书还用天天往电脑城跑。后来我才知道当时上网是用modem,跟今天的猫不一样,那时候是拨号上网,电话拨通之后,通过电话线传输数据,电话费一个月浪费了九十块,为了省钱后来我还买了201上网卡。
放到今天,网卡就是上网的,除了上网也没别的用了。这些故事对于当代年轻人来说,肯定会觉得不可思议。再说一个更加不可思议的事情,当时安装一个软件,需要复制文件进行破解,就这“复制”俩字,我整整学了半个月才弄懂,是不是难以置信?
软件光盘
条件是我不舍得花钱买书,光盘才五块钱一张,没有网络也没人可以交流。如果只是盲目的点击乱试,即使点到粘贴,但没有复制东西,点击了它也没任何反应。没有学过电脑知识,又怎么会想到粘贴两个字跟复制有关呢?总之是无论怎么点复制,都没把文件弄到指定目录。
1.44英寸软盘
终于知道小白到什么程度了吧,可以说任何一个上网的年轻人,都比我懂的电脑知识要多太多。其实我不是不愿意学习,而是到了一定年龄,很多东西记不住,准确来说是不擅于死记硬背。
很多科班出身的程序员,学的东西绝不是短时间就能记住的。给你半秒时间学编程,半秒后你能写出程序吗?那这不是废话吗,我说这话是让程序员计算一下,你们是花了多少个半秒,才记住所有知识的。程序员总说自己学的是编程理论,但是不花大量时间记忆的话,都很难学会编程。
98年我也是忍痛花巨资买了一本讲VB初级编程的书,学的真叫用功。吃饭睡觉都在电脑前,饿了啃方便面,有兴趣哪还睡得着。反正是好几天没睡觉,把教材里的习题全都做了,都编写过啥?至今毫无印象。
怎么可能忘的这么干净?我试图解释一下吧,就是因为书里都是教你咋做你咋做,知其然不知其所以然。其实程序员都是这么学的,只管教你如何编程就行了,何必要教你编译的原理。写代码到生成软件都经历了哪些过程,根本不需要程序员去了解。
年轮稍大点的人,都是理性思维为主,把原理过程理解了,自然也就懂了,然后举一反三,灵活运用。用的多了,自然就不会忘记。可问题是有几个程序员初学的时候就能弄懂编译原理和过程了?编程这些东西是老外发明的,老师都不一定懂编译原理。即使他懂,给你讲你也听不懂啊。
那么我开发极语言,也不会像英文编程那样的教学。我讲的都是思考方法,不需用去记忆,只要理解意思就行。扯远了,继续讲我的经历。
03年时候我换了电脑,学习组网。当时网吧盛行,要是不懂局域网组建,就感觉脱离了时代。局域网搭建网站,弄视频点播服务器。当时把电视节目通过局域网让大家都能看到,也是一门很先进的技术。
电视转接卡
04年研究网站开发,注意不是学。当时上论坛的人要比玩QQ的人多。论坛空间有限,上传图片是不被允许的。但是可以发网络图片,网页里在图片上右键属性就能看到地址,但是视频和FALSE却不行。有吧友说查看网页源代码,可以找到视频网址。当我看的网页源码多了,就明白原来这就是源代码。
正好我也架设过网站,记事本打开网页,英文看不懂,至少会改中文吧。改了之后刷新浏览器就看到效果,时间长了就会设计网页了。但是一个专业术语和词汇都不懂,反正就是会做,怎么做的不知道。
从html到js和css,然后又试懂了asp代码。那个年代百度公司刚成立吧,反正是没有上网上学习的意识,更不知道去搜索,天天就是泡论坛。网页代码全都是文本文件,随便改呗,电脑也改不坏。改的多了自然就会编程了。
会编程但不懂编程,那时候极少能遇到程序员。直到07年才遇到一个,人家说的啥我全听不懂。这时候才意识到我真的是啥都不懂。也正是这一年,热血江湖这个游戏出现私服了,当年我学组网时候,对私服很感兴趣的。只是找到的私服端就是魔兽、传奇这些我全都没玩过的。热血江湖是我玩的第一个网游,自然对架设江湖私服更感兴趣。
当时C#刚刚流行起来,有人用它编写了江湖服务端。我查到一个命令可以反编译C#,然后用VB编写了一个程序。很多人都拿去用,喜欢反编译程序的人还是很多的。
这也是我第一次编写程序,成就感满满!!等等,你不是98年就学过VB,04年都会写网站了吗?是的,这一年开始对VB感兴趣,用它写了很多工具。但总感觉对VB似曾相识。过了好几个月,终于想起来我以前真的学过VB。但是曾经学的东西,至今想不起来一点东西。
对网络游戏感兴趣的人应该很多吧,肯定也经历过各种研究漏洞。对电脑精通的人就搞外挂之类了。这个时候我还是电脑小白,虽然会用VB写点小工具,但是对内存和反汇编这些一窍不通。
这方面当时只能看到一些使用OD等工具的教程,是教你使用,不是教你如何反汇编,就凭我能学会才怪。
但是我真想学怎么办,又不认识会的人。好在我还是能看懂一些代码的,我就在想,反汇编看到的东西,也就是程序里的机器语言,翻译成汇编代码了。汇编我看了很多次,关键哪时候也没有汇编的教程。都是一些汇编指令的解释,没头没尾的。
反汇编学不会,那能不能正向走,意思是我写个代码,生成个程序。然后改个数值,看exe文件哪里产生变化,再改代码,看哪里产生了变化。
用VB试了很久,看不懂。网上说VB是伪代码,反汇编高手都看不懂。然后我就用VC6去试,我还不会C语言,学了几次,真心学不进去。大家应该理解学了VB的人,再学c语言就相当困难。
VC++6.0
但是我并不是专门为了学习C语言,在没有人引路的情况下,只是想找出一些规律,慢慢尝试入门。C代码虽然不懂,但是js代码略懂一些。它们还是很相似的,我只用测试一些最简单最基础的代码。
C++代码
有一种对比文件内容的工具,找出两个exe文件前后变化的内容很容易。其实VC本来就有调试功能,主要是我没打算学vc,也就没去往这方面研究。
我就这样用VC反复写代码,把对应的二进制数据变化记下来。这可是机器语言,能看懂才怪。网上不是有机器码跟指令集的对照表吗?照着学习就是了。
如果是懂汇编的人,就会说这根本不可能。懂汇编再去对照机器语言可以,机器语言如果不完整,或者截取的数据长度位置不对,转换成汇编也是错误的指令。
这确实是一个错误的做法,但是我认为对,在研究这些数据的时候,为了能跟汇编对应上,也是把这些数据研究了无数遍。在理解汇编之前,居然把机器语言的数据结构给烙印到脑子里了。
因为你不懂它,又天天去思考如何弄懂它,那肯定会形成烙印。就好比是易经八卦图,你没学过注解,但是反复看了好几年。然后看到了一些注解,是不是就突然懂这些图像的含义了。我15岁时候读易经,文字看不太明白,图更看不懂。但是文字没记住,图像记住了很多。
我记忆这些二进制数据就是图像,易经的阴阳爻不也是二进制吗?只能说当年看的易经八卦,对我后来做编程语言,提供了一定基础。开始我看二进制机器语言的时候,并没有联系到八卦符号。我是这么记录的,比如代码是a=b+5,然后改成a=b+10。对比二进制数据变化,那肯定是5和10的变化。继续深入,就知道什么代码就应该生成什么机器语言。
exe程序的二进制数据
就是说我本来是为了学汇编,结果汇编还没学会之前,知道了代码如何生成二进制数据。此时汇编还没学会,那我就想着用VB生成一样的二进制文件,这个程序应该能运行。只把一句代码,解析生成程序总可以吧。
这个过程并不是专门为了搞编程语言,只是为了学汇编。一直搞了几年,汇编还是一知半解。结果是研究测试的程序,可以解析编译很多代码了。这时候我才萌生了做编程语言的想法。
不过真正搞编程语言,这些是远远不够的。不是所有东西都是不用学习,就能摸索测试出来的。但是在你学不进去的时候,用最原始的办法,可以让你找到入门的途径。懂得基本原理之后,再去学习就容易得多。
看到这里是不是感觉我说了个寂寞,后悔没有早划走了吧。毕竟是文字内容,叙述起来难免有些空洞,我会录一个短视频,实例演示如何直接把代码编译生成exe程序。