您的位置:首页 > 运维架构 > Linux

GNU/Linux 开发环境 (1)

2010-05-24 08:03 204 查看
 

几周以前,无意中看了"我开发Linux服务程序的工作环境搭配"这篇文章,忍不住拍了砖,结果作者在回复中激我,要我写个看看。其实看不惯很多人围绕M$的习惯,早已有写点什么的想法,可是没什么时间,也担心不同的想法和自己退步了很多的中文会迷惑有Linux学习热情的同行,更不用说没准还会吓跑别人。为了表示我是从来不吃激将法的,我等了几周,觉得那篇文章差不多被人遗忘了,就开始了思考这个题目。

 

声明:写这些是为了和有学习Linux开发兴趣的同行们交流,坚决看不惯Linux或者不得不学点Linux的人就不要浪费时间看了。另外文中的中文翻译不准确的地方,我都尽量标注英语以防误解。

 

1)GNU + Linux

许多人特别是内核的开发者曾经反复强调Linux只是Linux操作系统的内核,这是我非常赞同的,因为GNU工具同样是Linux操作系统不可缺少的部分,GNU + Linux才是完整的操作系统。

 

理解GNU/Linux的第一步是理解内核模式和用户模式的区别。其实简单的讲,使用任何一种Linux发布版,我们直接用的都是用户模式下的应用程序,尽管操作都是在内核的帮助下完成的,这和Windows没有区别。

 

无论在用户模式还是内核模式,GNU工具是必不可少的,尽管它们远远没有内核出的风头大。这就是我坚持称之为GNU/Linux的原因。不过,区别是GNU工具是内核开发所必需的,而在用户模式下,它们是任何应用程序运行不可或缺的。

 

GNU工具:bash, GCC (GNU Compiler Collection, 不是GNU C compiler), ld, gdb, gprof, glibc, binutils, nm, objdump, ldd, 等等等等.

 

2)内核开发

GNU/Linux的内核开发环境非常简单,但也是对技能和知识要求很高的,命令行的工具如GCC, make, shell script 和 vi/Emacs/Nano 是必须会用的,因为大多数情况下,调试的时候只有bash,同时,必须有很强的代码阅读能力,因为许多细节都在内核代码中。

 

需要注意的是,虽然有kgdb的存在,内核代码的调试基本不用调试器,因此printk是首要工具,而且它是必须熟练掌握的,因为每个内核开发者都会不可避免的依赖它。不过另一个有趣的kgdb应用是它可以用来学习system call是如何实现的。

 

我虽然做了不少内核开发和调试,但是深知自己很肤浅,在此就不继续深谈了。需要说明的是,GNU/Linux开发不是只有内核开发,也不是做内核开发就高人一等,“术业有专攻”而已。

 

3) 用户模式应用程序的开发

在Linux和UNIX的世界,延续了内核开发习惯,C语言是最重要的编程语言,简单的讲,内核 +  GLIBC + shell等C应用程序 构造了GNU/Linux操作系统的基础。同时也是由于以C语言为基础,加上标准化的系统API(POSIX),很多GNU/Linux应用程序只需简单的重新编译就能跨平台使用,比如命令行应用程序可以轻易的运行在Windows(通过cygwin or MinGW), BSD, UNIX, OS X, etc. 跨平台的GUI应用程序则依赖于跨平台的GUI toolkit,

 

3.1)C/C++

开发用户模式C应用程序的环境很丰富,我按照对开发工具要求的高低作了如下分类:

a)命令行开发环境

GCC, GLIBC, GDB + 编辑器(VI, Nano,Emacs)

这种情况对开发系统的要求最低,但是对开发
者的要求最高,因为命令行的应用程序要求开发者必须记忆一些命令,快捷键来提高开发效率,但是熟悉一些命令行的工具有时候会带来意想不到的好处:

-- 管道(pipe)和重定向配合shell script能够简化需要记忆的命令,还能创造出适合自己习惯的命令。

-- 再配合sed之类的工具可以轻易的处理文本

需要注意的是如果能够认真学习使用正则表达式(regular expression),同时积累自己创造的script,在未来会起到事半功倍的效果。

 

由于需要的工具最少,这对Linux发布版的需求和依赖也最小,因此这也是适应性最好的方式,也就是说,基本上任何Linux平台都能满足要求,特别是嵌入式Linux开发环境往往只有这些工具。

 

b)命令行开发环境 + GUI调试器

其实这和第一类没有太大区别,不过是我主要的开发环境,就谈一谈不同的地方。

在GNU/Llinx下,有许多IDE和GUI 调试器,但是它们都是在后端(backend)使用GDB的。毫无疑问,图形化的调试界面能够有效的降低调试的复杂度,尽管它并不是必不可缺的,但是人们适应了之后,就容易依赖它,比如用惯Visual Studio的。当然更没有必要在现在GUI桌面环境很普及的情况下非要排斥GUI调试器,但是如果只会用它就难免限制了自己的开发环境,当在一个受限制的环境工作时会有意想不到的麻烦。

 

这其中最常见的是DDD,功能很全只是UI设计一般,显得很过时:-) 我也用过kdbg(因为Qt),但是远程调试很麻烦。

 

我则是把eclipse+CDT用成调试器:P,主要是因为它对远程调试支持的很好,还可以很容易的调试“外部“程序,就是不需要创建工程和无须在eclipse中编译也能调试,这特别适合有专门的编译环境的软件,比如嵌入式的软件。

 

其它的IDE也可以这么用,常见的有Netbeans, kdevelop, QtCreator ... GNOME下也有一些不错的IDE,只是由于我自己对Qt的偏好,很少去尝试。建议选择可以在多个平台上使用的IDE,例如Eclipse, Netbeans, QtCreator等等。

 

c) IDE

IDE的选择和GNU/Linux发布版的关系就密切多了,有时相同的IDE在不同的发布版也不完全一样。举个例子,Fedora总是包括最新的Eclipse,而Ubuntu却只有一个相对较老的版本。虽然大多数IDE都可以单独安装,如果只需要“apt-get install"或“yum install"就能安装还是很吸引象我一样爱偷懒的人的:-)

 

感觉现在很多人都是从IDE起步学习C/C++的。毫无疑问,这大大减低了初学者的学习难度,但是也有一些副作用,比如,让人学习了很多IDE的细节却忽视了标准C/C++的学习,忽视了Makefile的学习,只能拖拖拽拽去设计UI,等等。尽管如此,我却不赞成贬低IDE的作用,毕竟它可以提高写代码的效率。

 

选择IDE,我会考虑下面几个方面:

-- 编辑器:其实绝大多数IDE的编辑器都是相当不错的,也都支持语法加亮,自动完成(auto-completion)等等功能,但是块选择(block selection, column selection),块隐藏(folding),甚至自动将被条件编译排除的代码背景加灰(Code being excluded by conditional compilation is marked with grey background)就不是很常见的了。有意思的是Eclipse不支持显示自动换行,不过考虑到一般代码都不应当很长,这也不是大问题。

 

-- 代码索引(code indexing):这是指建立代码内名称的索引,可以方便查找,包括类浏览器。有的IDE使用工程的设置和编译器去实现索引,这故然实现很简单,却增加了隐含的依赖条件。我更偏向使用内置这个功能的IDE,只需要打开文件,索引就能自动生成而不需要创建工程。

 

-- 支持的编译器:这对开源的IDE都不是问题,因为都会支持GCC。

 

-- 调试器:前面已经谈到,不再废话了。

 

-- 对版本控制工具的支持:现在需要至少对Subversion,git的支持,如果支持Mecurial和Bazaar就更好了。

 

-- 普及率:使用的IDE越普及,学习的时间就越少,因为换个工作或者换个项目就有可能用相同的工具。顺便提一下,全球IDE市场份额最大的是Eclipse。

 

综上所述,我最常用的是Eclipse,不过最近密切关注Qt Creator :-)

 

 

需要说明的是,现在IDE的区别已经越来越小了,所以常常可以互相融会贯通,因此选择也不是很绝对的。

 

注:为了让更多的人看到这篇文章,我曾经想参加征文活动,却发现需要授予微软免费的使用权,虽然微软对这篇文章不会有什么兴趣,但是对这种倾向性实在不敢苟同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息