为vb写编译器的想法其实早就产生过,13年底就在阿珊的VB群里提过,马上被人带偏话题。在其他两三个群里也不了了之。
今年6月1日终于决定自己写编译器。凌晨就在嘿嘿菌的群里讨论,看看有没有同好者。几个爱讨论的讨论起来还是挺热闹的。6月2日下午有人看到聊天记录又问起我要做编译器的事,乘机又顺便传销了一下,本想拉拢一些苦力过来帮忙。可惜大多数朋友都不看好。特别我说要用vb6写vb编译器,说VB不支持这不支持那云云。
世界上c系列的编译器太多了,没必要做。做也无法超越别人。而vb是一个被微软遗弃的孩子。
我的核心思想是,我要做一个能编译vb工程的编译器。他有vb6原有的语法支持和特点(如:开发简单,容错性高),又能解决vb6最蛋疼的问题(如多线程、标准dll、内联汇编、提高执行效率、unicode支持等)。而我开发目标是能编译原有VB6工程创建的工程。所以最终目的还有一个,就是写完后,能编译自身。
我想等我做出一定功能了,也估计有人愿意进坑的。
然后就开始漫长的长征之旅。计划一年左右写出来。
第四天,又去阿珊的VB群里找人,大家都在精神上支持我。有了这股力量,我觉得我没必要再去其他群找人了。
之后一段日子里,晚上就在嘿嘿菌的群直播写编译器。群友参与进来一边分析一边写一边讲解和讨论。司仪菌最热心,经常深夜单独陪我。
前期虽然已经很注意向后兼容,代码还是重构了好几次。有点慢,进度还不错。
为写PE文件。实现了PE头的编写,添加了代码区、数据区、导入表、RVA与RAW地址转换、导出表。
资源区是个比较复杂的逻辑,加上又要工作,一停就停了快半年。没办法,要糊口。(因为没去外地工作,收入不稳定)
12月1日晚,被司仪菌催,开始继续编写vb编译器。先复习了之前的代码。因为也没先看PE资源方面,就准备实现一个窗体和消息循环。在写的时候发现用汇编写。一些结构体变量之类的,用汇编写(我用vb封装过一个汇编类)很累人,最后用处也不大。就准备先解析编译 只有API调用和 一个mian函数的工程(其实就一个模块)。
开始有几天在群聊,慢慢都去睡觉了,最后就剩下我和司仪。2日凌晨四点左右司仪从麦克风那边传来呼噜声——告诉我他是真爱。九点我编译第一个exe成功了。
Attribute VB_Name = "Module1" Option Explicit Private Declare Function GetForegroundWindow Lib "user32" () As Long Private Declare Function CloseWindow Lib "user32" (ByVal hwnd As Long) As Long Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long,ByVal dx As Long,ByVal dy As Long,ByVal cButtons As Long,ByVal dwExtraInfo As Long) Private Declare Function CopyFile Lib "kernel32" Alias "CopyFileW" (ByVal lpExistingFileName As String,ByVal lpNewFileName As String,ByVal bFailIfExists As Long) As Long Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long,ByVal dwDuration As Long) As Long Private Declare Function MessageBox Lib "user32" Alias "MessageBoxW" (ByVal hwnd As Long,ByVal lpText As String,ByVal lpCaption As String,ByVal wType As Long) As Long '第一个编译器 '只能识别一个变量,且是long ' 大小写都敏感,改了就不行 Sub Main() Dim k& k = GetForegroundWindow() CloseWindow k mouse_event &H8001,65535,0 CopyFile "I:\asp空间.txt","I:\xx22.txt",0 Beep 2000,500 MessageBox 0,"Hello World","我的VB编译器",0 End Sub
之前都是手动DIY可执行程序,这个是第一个编译,虽然有无数的问题。他是一个里程碑。
3日,实现了第一个可导出的标准dll,虽然还是烂得可以,但很高兴。
4日,群里遇到了编程王者,通过举例对比等修辞手法谈vb过时,vb烂。(其中还介绍个vb编译器visia compiler,让我代码从这里抄好了)我被说得无言以对。要我没进度,或要他早说几个月,我就放弃了。司仪菌眼尖,看出visia compiler是个c语法的。讨论吸引了YY菌的注意,他提了很多意见。我表示对COM不熟,他就主动承担的给我讲解COM的任务。
9日,10日YY菌讲解标准dll实现vb里的COM。两次讲到快天明。发现真如嘿嘿菌所说,YY是个大宝库。虽然我消化,但对COM认识很多,消化完代码就差不多了。然并没时间,估计得等个很多天。
剩下大块都很费时间了。
PE头解析: 资源,异常处理;
解释部分有:代码的整体解析分块
基础编译部分:基本语句汇编化,异常处理,
高级封装:高级函数
15日做代码整体解析,支持新功能前,发现需要预先把新语法规则设定好。
于是写了篇征集贴 http://tieba.baidu.com/p/4214619038 ,看看大家需要些什么,语法怎么定。
帮人做项目,超时别人不用了,快完成,别人不要了,亏死了。
再看看讨论帖,觉得题目有问题,一定是题目的问题。
停了两天电,21日,初步实现EXE图标和资源。
休息了几天。30日,已修补了资源和图标的bug,发现还有未知问题...异常处理的实现真不懂诶。先去找找异常处理的基础文章,看看能不能手工DIY实现一个异常处理了。
原文链接:https://www.f2er.com/vb/257209.html