首页 > 代码库 > vb,我想对你说,垃圾
vb,我想对你说,垃圾
最近做一个项目是vb方面的,vb6.0写的程序,除了分析底层,也写了程序,觉得vb确实不靠谱。vb写小程序还是可能。计算量一大,就不行了。
vb解析型语言效率低,用了很多msvbvm函数,不停地穿越到vbvm虚拟机函数,效率很低,比如for循环,就用了__vbaVarForInit初始化for循环和__vbaVarForNext更新循环变量因子,不过这个没什么,就是效率低一点吧。我用vb写了一个循环计算,运行一两次没问题,运行了多次以后,循环因子已经走到结束了,可是没有更新,继续不断循环,结果导致程序卡死,这就是很多人用 vb写程序会卡死的原因,我深入分析调试,发现确实是__vbaVarForNext没有同步运行,循环因子没有增加从而退出循环。为什么会导致这样呢,难道是因为多核多线程导致__vbaVarForNext没有同步更新循环因子?最后代码加入循环结束不更新特别处理才避免无限循环。真正的编译型语言,循环只用一个临时变量记住,更新后跳回开始地方,而不是穿越到虚拟空间。
接着就是类型定义不靠谱。vb变量不需要定义类型,即使定义了也没用,只有在传递参数的时候才强制类型不通过,而定义了一个a=2,这个没有问题,但是定义一个c=&H88888,就会曝出溢出错误,可是我在前面一定定义了long类型,为何还溢出呢?深入底层发现,它会调用一个__vbaI2I4函数,就是把H88888从4字节整数转换成2字节整数,所以报出错误。如果两个大的整数相乘,远远大出4字节整数,这时候报出错误,没有办法了,还不知道怎么写代码,因为后面要处理比特位,需要整数,如果转换成浮点数,又不知道怎么转换回整数做位处理,vb浮点数不能位处理。在c语言溢出直接截掉超过的字节就可以了。我觉得这里的dim定义类型就是个摆设。
最后很多功能用vb实现简直太难了,甚至不可以做到。不说这个I2I4转换让人无法大整数赋值,就是浮点数转换成4字节整数,就很难了,我也没搞定。只有用c语言实现,其实是这样的
float Time =84729.06;
DWORD pEcx,*pDWord;
pDWord=(DWORD*)&Time;
pEcx=*pDWord;
pEcx就获得了84729.06浮点数4字节内存数据。vb可以用memcopy似乎也可以实现,不过总是太麻烦。就说前面溢出整数,用浮点实现没问题,再转回整数不知道怎么做。
VB搞了很久,没办法,只好用vc写,结果程序很简单就写完了。最重要的是,即使用vb写完了,如果计算量一大,就会出现程序卡死现象。
vb编辑器还经常是一行代码没改好就弹出语法报错,按确认都受累了。有点类似易语言。
通过这个项目,我想对vb说,你很垃圾。现在似乎没有vb了,而是vb.net,但是vb.net又引入200个关键字,人们还是对他有意见。
内存操作c/c++最强,类库强大语法清晰的是java/c#,文本处理可能是perl,网页和数据库处理最快捷是php,做界面最容易应该是delphi/c++builder。
但是vb什么都不是,只能做界面处理和简单计算,否则你会生不如死,早早放弃好。