介绍
使用了Linux一段时间后,很多朋友都希望能为这个开放辕马世界做自己的贡献,更多的参加到这个open source的社团里。面对无数的自由软件,对于一个稍微不太普通的用户来说去解开一个tar文件,然后修改makefile去编译辕马都是很常有的。我们不满足简单的编译和使用别人的程序,我们应该亲自参加到这个开发辕马的创作之中。对于一个初学者来说,面对五花八门的开发工具,如何选择呢?
使用什么开发工具去开发Linux程序呢?我们这里做个简单的介绍。这里是你成为Linux hacker征途上的第一步。
编程模式
让我们开始第一步。作为一个初学者应该首先使用什么样的编程风格或者说编程模式呢?有很多的选择,例如基于函数的、基于过程的开发,还有面向对象的开发等等。要成为一个好的programmer,对于初学者,最好使用某种语言对各种编程模式都尝试一遍。
Comp.lang.functional讨论组里面的FAQ中定义了面向函数的语言,说“"a style of programming that emphasizes the evaluation of expressions, rather than execution of commands. The expressions in these language are formed by using functions to combine basic values. A functional language is a language that supports and encourages programming in a functional style."
在Linux平台下面,比较常见的面向函数的开发语言有:ML、Haskell、Scheme等。
面向过程的语言是一种把程序要完成的动作分割成一个一个“过程(procedures)”的语言。一个典型的面向过程的开发语言的组织结构,我们可以看看流程图,就可以感觉出来。最常见的面向过程的开发语言就是Pascal和C语言了。
面向对象的开发语言的核心就是用对象来表征所要执行的主体。例如要开发一个高速公路的模拟系统,他首先定义一个交通工具的类,包括所有交通工具的公共属性;然后继承这个类,可以派生出汽车类、自行车类等等。Linux平台下最常见的面向对象的语言是C++、Java、Python、Smalltalk和Eiffel等。
还有混合的语言,你可以用多种编程模式去写自己代码,例如PHP和Perl。
如何选择?一般来说最好每种模式都有一个了解。最好这样开始你的编程旅程,首先给自己定一个小project。有了一个清晰的目标后,选择编程语言和编程模式就容易了。如果使用某种语言开发起来容易,那么你就先学习使用这种语言。
例如,我开始想学习更多的关于数据库和web编程的时候,我决定建一个书籍数据库,包括我拥有的书的信息还有我要计划购买的书籍信息。经过我的查找比较,我认为我的想法可以用PHP和MySQL来实现更方便。然后我就学习了PHP和MySQL的一些知识,完成了这个小的系统。
我个人的编程体会,我至少使用了4种语言,包括:C、PHP、SQL和Perl。
C语言是最灵活和方便的开发语言,在Linux下使用最多的开发语言就是它了。一旦学会了C语言,我们就可以非常容易的学习和使用其他的语言了。所以我建议你学习C语言编程。C语言是一种高级语言,它编写内核级的代码和驱动程序都非常方便。Linux下面有很多开发C语言的函数库和开发工具,我们都可以方便的使用它们,这也是使用C语言开发代码的好处。
PHP是Hyper-text Processor的缩写,是一种解释执行的语言,一般来说运行在web服务器端。如果你会C语言,那么最多花一天的时间就可以学会PHP。PHP给你在web编程方面很大的方便。
SQL是Standard Query Language的缩写,就是标准的访问数据的查询语言。很多PHP程序中都包含了使用SQL语言去访问数据库的代码。SQL基本上使用有点类似英文的语法,所以学起来非常容易。如果你学习PHP和C,那么SQL可以简单的顺便学习。
Perl是一种使用比较广的教本语言。很多语法来自C和UNIX的SHELL工具。Perl拥有很多的可以添加的模块,在CPAN计划中。使用这些模块,开发程序编得非常容易了。
下面是一个perl程序例子:
#!/usr/bin/perl
# NMSU Job grabber
# Matt Michie (mmichie@linux.com)
#----------------------------------------------------------------------
#Copyright (c) 2000, Matt Michie (mmichie@linux.com) (All rights reserved.)
#
#Redistribution and use in source and binary forms, with or without
#modification, are permitted provided that the following conditions are met:
#
#Redistributions of source code must retain the above copyright notice,
#this list of conditions and the following disclaimer.
#
#Redistributions in binary form must reproduce the above copyright notice,
#this list of conditions and the following disclaimer in the documentation
#and/or other materials provided with the distribution.
#
#The names of this programs contributors may not be used to endorse or
#promote products derived from this software without specific prior
#written permission.
#
#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
#``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
#LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
#A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
#CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
#EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#----------------------------------------------------------------------
#Instructions for use:
#
#You must have LWP installed to fetch the jobs. If you wish to use the
#e-mail notification you also must have sendmail installed.
#
#The script has the following command line flags:
#
#-v : Print the version
#
#-t : Max threshold to include the salary in statistics calculations
#
#-b (number) : Boundary of salary after which program will shoot off an
#
#-m (email address) : Tell the program to notify you with email. The arguement
# is a valid e-mail address.
#
#-q : Quiet mode, don't print statistics, automatically used in email mode.
#Example use:
#
#fetch.pl -b 7.50 -m mmichie@linux.com
#
#This tells the program to fetch the jobs list and only send e-mail
#notification if there are any jobs with higher pay than $7.50.
#----------------------------------------------------------------------
use LWP::Simple;
use Getopt::Std;
$version = 'Job Grabber 0.01';
getopts('vqt:m:b:') || die "Check your command line args! ";
if ($opt_t != 0) {
$max = $opt_t;
}
else {
$max = 20; # Max threshold to include salary in count
}
$min = 0; # Min threshold to include salary in count
$highest = 0; # Highest salary
$total = 0; # Total jobs counted
$count = 0; # Total jobs which fall inside min/max thresholds
$oncampus = "http://www.nmsu.edu/~pment/oncampu.htm";
#$offcampus = "http://www.nmsu.edu/~pment/offcampu.htm";
$URL = $oncampus;
if ($opt_v) {
print "$version ";
exit(0);
}
if ($opt_m && !$opt_q) {
$opt_q = true;
}
&fetch_page;
&stats;
if ($opt_m && ($highest > $opt_b)) {
&email;
}
elsif (!$opt_b && $opt_m) {
$opt_q = 1;
}
sub fetch_page {
unless (defined ($page = get($URL))) {
die "There was an error getting URL: $URL ";
}
@page = split(/ /, $page);
foreach $line (@page) {
$line =~ s/<[^>]*>//g; # strip HTML codes
if (!$opt_q && $line =~ /On campus job postings as of:/) {
print "$line ";
}
elsif ($line =~ /SALARY:/) {
push @pay, (split (/:/, $line))[1];
}
}
}
sub stats {
foreach $elm (@pay) {
$total++;
next if ($elm <= $min || $elm >= $max);
if ($elm > $highest) {
$highest = $elm;
}
$count++;
$accum += $elm;
}
if ($count == 0) {
die "Eiiiiiiiiiieeeeeeeeeeeeeeeeeeee divide by zero :( ";
}
else {
$avg = $accum / $count;
}
if (!$opt_q) {
print "Total jobs listed: $total ";
print "Number of jobs counted for pay: $count ";
print "Highest hourly pay: $$highest ";
printf "Average hourly pay: $%.2f ", $avg;
}
}
sub email {
open(SENDMAIL, "|/usr/lib/sendmail -oi -t -odq")
or die "Can't fork for sendmail: $! ";
print SENDMAIL <<"EOF";
From: Job Grabber <$opt_m>
To: $opt_m <$opt_m>
Subject: Jobby
Total jobs listed: $total
Number of jobs counted for pay: $count
Highest hourly pay: $$highest Average hourly pay: $$avg
EOF
close(SENDMAIL) or warn "sendmail didn't close nicely";
}
从上面的代码中你可以看到,大部分的代码都是“过程”,使用与C类似的语法风格。这对于熟悉C语言的开发者来说,可以大大提高开发速度。例如使用了printf函数,这个函数就和C的pritnf语法一样。其实在perl中还有其他的与printf语法一样的函数,我们可以自由选择。
开发工具
在Linux开发程序一般来说有两个主要的编辑器,vi或者vim,还有Emacs。这些文本编辑器如何选择?你可以都试试看,然后选择自己喜欢的。反正它们都可以让你输入文本,都可以让你生成源代码。我个人来说,喜欢vim,简洁而好用。
GCC是GNU C Compiler的缩写,是GNU/Linux下最好的编译器之一。这个编译器稳定,而且文档齐全,大部分的自由软件都是用他编译的。如果你使用C,那么就可以选择gcc。
GNU的debugger工具是gdb,有非常好的调试特性。不过对于初学者来说也许使用起来有点麻烦,你可以先试试ddd来调试你的代码。
还有其他的有自己IDE的开发语言,但是我还是建议你用vim或者emacs来开始你的编写代码的过程。
总结
Linux是开发者的天堂。开发者可以控制特定的硬件环境,还可以创建自己的工具使得自己的生活更加轻松。通常来说,学习编程的最好的方法就是读别人的代码,然后看它们是怎么做的。Linux和开发辕马使得你有机会看到别人的辕马,好好去学习吧。
一些资源
http://perl.com
http://python.org
http://www.ruby-lang.org/en/
http://www.cpan.org/
http://www.php.org