别碰我,VIM
感谢匿名人士的投递
新闻来源:原创
大家都说用VIM的是高手,我说不对,随便看一下程序图片,简直就是绝世高手用的编辑器。我折腾了半夜,反而被它给折腾了,因此为了朋友们的幸福着想,我不再一一列举它的用法。其实最大的原因是:不好意思,我也没能学会传说中的绝世武功。
据说,VIM(编辑器)+GCC(编译器)+GDB(调试器)是Linux下最常用的开发工具链。自小被VS2005浸染的我,不习惯VIM,不习 惯GCC,不习惯GDB,叫我怎么敢跑到Linux下写程序。高手们似乎很喜欢用VIM加上一大堆插件来写程序,根据我看到的做法,要想有VS那样的智能 补全功能,VIM首先要Ctags(这是要输入一长串命令的),接着输入几个字母再按一下Tab键(需要SuperTab插件),才能出现智能提示。
这还不是最紧要的,在VIM里面,删除一行字,请按d两下,删除一个字,请按一下x。以及一长串的需要记忆的命令列表,例如gg是跑到文章的最前 面,shift+4是跑到行首,等等。我不自觉地想起了小学五年级那个暑假学的WPS,要输入一大堆的指令才能输出一篇格式整齐的文档,在别人眼里看起来 绝对是很牛的事情。现在会用Office2007的,也不止你我他吧?至于那个时候所学的一大堆WPS控制指令,还有五笔字型,到现在全忘了。
我肯定不是个记忆强的人才。帅哥拿起个Ubuntu,手中熟练地敲打着一堆我看不懂的指令,看得我眼花缭乱。用Linux,我最头疼的事情是干什么 事情我都要先敲入一个命令,然后–help找帮助来看,否则绝不会记得那个命令是怎样用的。一开始还说这是学习阶段要好好熬,尝试多了以后就会觉得这事真 的很折腾。
你说,好好一个软件为何就不写个gui界面,非得让我敲命令去记忆每个参数什么意思,好好一个配置为何就不写个gui界面,非得让我把整个配置文件研究完才知道我该去哪里修改配置参数。
他们说:Unix哲学是:一个程序只做一件事,并做好。但是不知道为什么,Linux下的软件作者似乎就是懒得写个gui,或者他们认为他们只需把 软件的逻辑做好就可以了,至于gui方面,根据简单原则,应该由其他有兴趣的人去做。其实我觉得原因有二,一则是没有强大的开发工具(要像C#那样拖个控 件就可以写gui),二则程序员也懒。
为什么没有强大的开发工具呢,为什么Linux下没有VS这样的重磅武器?我再从VIM+GCC+GDB说起吧。VIM的难刚才说过了,GCC的 话,要是有几个文件你非得自己手动写一个makefile不可,GDB我基本没试过,据说也有些图形界面的调试工具,可以像VS那样按一下快捷键就能调试 (这个肯定也是要配置N久的),我看过一份GDB的使用手册,又要记忆很多调试指令,我觉得我快要崩溃了。
上面所说的“一个程序只做一件事,并做好”现在已经造成了许多弊端,最可见的是依赖性。
相信在Linux下稍微深入过进行开发的知道,GCC的版本号是件很痛苦的事情,有些程序要A版本的GCC编译,有些程序要B版本的GCC编译,高 点低点版本号都不行。再加上相应的头文件库文件版本号,你是不是有种抓狂的感觉。悄悄地,我再告诉你,Linux现在发展很快,版本号一直在不停地变,你 可以去发疯了。
譬如,A作者维护一份A程序,B作者维护一份B程序,两个程序之间是有依赖的(可能的情况是B程序是A程序的gui),突然B作者想去周游世界不继 续开发B程序了,A作者继续开发下去,接口变了,那B程序基本就没用了。作为使用者的你,要么只能怨天尤人,要么改行帮B继续开发。
开源模式无疑是有很多长处的,但是其短处一直没有被正视。开源意味着源代码开放,人人都可以修改提交,可是就实际情况而言,更多的是做横向的,而不 是做纵向的。我所说的横向是指开发配套软件,纵向是指对软件进行更深入的开发。因为横向的容易,只需要知道要配套的接口就可以了,而做纵向则需要将源码读 懂。
继续说为什么Linux下不可能出现VS这样的重量级应用。VIM+GCC+GDB一样可以实现VS的功能,可以进行编码,编译以及调试,但为什么它们合起来就不是VS?因为没有架构。
现在开源的开发模式说到底还是陈旧的开发模式。软件工程的概念已经提出来好几十年了,可是当你想深入了解某个开源软件,接着去下载其源代码的时候,会很悲哀地发现:你找不到任何对应的开发文档。所有能帮助你理解源代码的只是程序源代码中的注释。
假如你很牛,想要做一个Linux下比VS还强的IDE,要用到VIM、GCC和GDB,你要做哪方面的工作呢?以进行一次小小的开发为例吧。先不 管VIM中代码智能提示是怎么来的(至今我还不知道如何写好函数名后提示我参数列表),辛辛苦苦写好代码后,要编译是吧?假设编译出错了,GCC会提示你 哪里错了,还显示出一个行号提示是哪里的错误,错误是什么。想快速定位到错误的地方吗?不好意思,GCC说我是编译器这事不归我管,VIM是个编辑器,这 事归它管。可我总得知道是哪里错吧?谁给我这个定位的参数?GCC只能输出信息,它意识不到VIM的存在。这时候你得写个适配接口,将GCC的输出信息转 换一下,然后提交给VIM,VIM再跳转到出错的地方。当然这个VIM插件是有的,叫做quickfix。
诸如此类的问题很多,VIM、GCC和GDB是基本没什么关系的软件,要想使它们可以通信,你必须写一大堆的适配程序,写适配程序还得考虑VIM的 接口是怎样的,GCC的接口是怎样的,GDB的接口又是怎样的,这些你又得去学习。而在VS中,这是一个设计好了的架构,不同模块之间的接口是已经定义好 了的,它们之间传输的数据也是定义好了的,想要通信是吧?简简单单在内存传送一个变量过来就可以了。而在VIM+GCC+GDB的通信中,数据的传送是很麻烦的事情,有时候还要通过写入读出硬盘,很神奇吧?
由于没有架构,所以要写一大堆的适配器才能将它们集成起来,还有些是适配器做不了或者做得不够好的功能,譬如刚才所说的代码智能提示,的确是有 VIM插件可以做,但是如果你看过写C#时候VS的行云流水,就知道那些插件做得远远不够。这不是插件的问题,而是VIM+GCC+GDB们在该内聚的时 候没有内聚。当然这也不是它们的分内事,它们本来就不是打算做IDE的。这时候你还会觉得“一个程序只做一件事,并做好”是绝对好事吗?
知道了没有架构之后,你可能会想,要是有了架构,是不是就可以做出VS那样的IDE了?这还得考虑开源开发者的软件工程水平。就我看来,还是有许许 多多的开源开发者基本是没有软件工程概念的。在现实中,你可以要求一个开发者按照你的思路你的文档去开发,因为你掌握着他的薪酬。而在网络中,一则没有软 件工程开发观念,二则他们也不会去学习新的一门学科,各种各样的软件工程开发模式,咱做开源只是兴趣而已,此处不留爷,自有留爷处。你拿什么来管理这些不 想被束缚的开发者们呢?
除非,有架构,而且VIM和GCC和GDB按照架构去做,否则绝不会做出VS那样的IDE。可是几乎在一盘散沙各自为政的开源界,有可能吗?所以我断言,开源界不可能出现VS那样的重量级应用。

Linux消息排行Top 5
Linux Deepin 11.12 试用高清...
Get Linux 0.1发布 帮助Windo...
Linux 3.2内核正式版发布
西班牙Extremadura州终止其Linux...
Gix嵌入式桌面系统2012.1发布
Linux Deepin 11.12 发行注记
Linux Deepin 11.12 RC版本...
Linux kernel 3.2 元旦左右发布
Android内核变化将合并到Linux主支
Linux Mint开发者创建Gnome 3分...
CentOS 6.2发布
Deepin GNOME Shell
Linux Deepin 11.12 Beta...



资讯






