在 Linux 上写程式更是舒服:有许多好用得工具可以让写程式更加快速更加简单。
例如:写程式无非是单调沈闷的工作:编辑--存档--离开--编译--重新编辑 一直反覆的执行同样的动作。
但是,如果使用像 emacs 或是 jed 等工具,上述那些动作,将统一整合在编辑器里,一次完成。
大体上,没有多大的差别,但是请注意,这个免费的编译器可不是百分之百的和 VMS 相容的。
可能会有些奇怪的结果发生。(实际上,VMS 的 Fortran 编译器并不是一个可以标准延伸的(non-standard))。
详细情形请看 /usr/doc/g77/DOC or /usr/doc/f2c/f2c.ps
。
您的系统管理员已经安装了一个叫做 g77 的 compiler (不错但是, 在
0.5.21 版, 还是没有完全和 DEC 的 Fortran 百分百地相容) ,或是一个把 Fortran 转成 C 语言的转换器,叫做 f2c。
加上她的一个前端(front-ends)装置,模拟就像是一个 Fortran 编译器。
依我的经验,yaf77 套件提供最好的解决方案。
欲使用 g77 来 compile 您的 Fortran 程式, 先用任意编辑记编辑程式码,以副档名 .f 存档,
然後执行如下:
$ g77 myprog.f
她会自动帮您产称 a.out 的执行档。(您不需要作任何 link 的动作)
如果想要产生不同的执行档档名,可以下参数:
$ g77 -O2 -o myprog myprog.f
请注意最佳化!要求您的系统管理员细读编译器的说明文件,并且告知您是否还有任何的存在问题。
编译中间码(subroutine):
$ g77 -c mysub.f
这会产生 mysub.o 这个档案。 然後您需要作连结(link)的动作。
$ g77 -o myprog myprog.f mysub.o
如果您想作成函数库(library),您可以这样作:
$ cd subroutines/
$ cat *f >mylib.f ; g77 -c mylib.f
这会产生出 mylib.o ,您可以使用她来连结您的程式。
最後,如果要 link 其他的函数库(library),我们假设 libdummy.so:
$ g77 -o myprog myprog.f -ldummy
如果您使用 f2c, 您只能使用 f77 或是 fort77 ,而不能使用 g77。
另一个有用的工具是 make, 详述如下:
make
make 可以用来编辑很多分散於个档案的原始码。在 VMS 上我们称为 MMS
和 MMK, 但是她们和 Linux 有不同的语法。
假设您有一些原始程式,需要作些例行程序。程式分别为 file_1.f,
file_2.f, file_3.f, 主程式为 myprog.f。 如果您是手动编译您的程式,每当您修改您的程式码後,
您必须知道哪个档案和哪个档案有关连,哪个档案必须先编译,等等。
与其发疯,不如您可以写个 `makefile'。 这是一个文字档,里面记录著您程式码与程式码之间的关连性。 当其中一个档案被修改後,只有与这个被修改的档案有相关的档案需要被重新编译。
例如,您写了一个 makefile 如下:
# 这是一个 makefile # 使用 <TAB> 键,当您见到 <TAB> 标签时! # 这非常的重要,请不要使用空白键代替。 myprog: myprog.o file_1.o file_2.o file_3.o <TAB>g77 -o myprog myprog.o file_1.o file_2.o file_3.o # myprog depends on four object files myprog.o: myprog.f <TAB>g77 -c myprog.f # myprog.o depends on its source file file_1.o: file_1.f <TAB>g77 -c file_1.f # file_1.o depends on its source file file_2.o: file_2.f file_1.o <TAB>g77 -c file_2.f file_1.o # file_2.o depends on its source file and an object file file_3.o: file_3.f file_2.o <TAB>g77 -c file_3.f file_2.o # file_3.o depends on its source file and an object file # end of makefile.
储存这个档案,命名为 Makefile 且在命令列输入 make 来编译您的程式;
或是您也可以将她存成 myprog.mak 然後使用 make -f myprog.mak 来编译.
接下来的後续动作, RMP.(还记得什麽是 RMP 吧!)
Shell scripts 就像 VMS 上的 command files。, 这可以建构出非常有用的功能。
要写一个 script, 您所要作的就只是写一个包含一些指令的文字档,然後存档,改变成可执行的模式
(使用 chmod +x <scriptfile>)。 只要输入该 Script 的名字就可以执行了。
写一个 Script 是一个非常重大的工程,这需要一本书。这里我就不再多做说明了。
我只给您一个或多或少的综合的(希望)有用的例子,您或许可以从这个例子中得到一些基本的规则。
EXAMPLE: sample.sh
#!/bin/sh
# sample.sh
# I am a comment
# 不要修改第一行,她必须以这种形式存在在第一行!!!
echo "This system is: `uname -a`" # use the output of the command
echo "My name is $0" # built-in variables
echo "You gave me the following $# parameters: "$*
echo "First parameter is: "$1
echo -n "What's your name? " ; read your_name
echo notice the difference: "hi $your_name" # quoting with "
echo notice the difference: 'hi $your_name' # quoting with '
DIRS=0 ; FILES=0
for file in `ls .` ; do
if [ -d ${file} ] ; then # if file is a directory
DIRS=`expr $DIRS + 1` # this means DIRS = DIRS + 1
elif [ -f ${file} ] ; then
FILES=`expr $FILES + 1`
fi
case ${file} in
*.gif|*jpg) echo "${file}: graphic file" ;;
*.txt|*.tex) echo "${file}: text file" ;;
*.c|*.f|*.for) echo "${file}: source file" ;;
*) echo "${file}: generic file" ;;
esac
done
echo "there are ${DIRS} directories and ${FILES} files"
ls | grep "ZxY--!!!WKW"
if [ $? != 0 ] ; then # exit code of last command
echo "ZxY--!!!WKW not found"
fi
echo "enough... type 'man bash' if you want more info."
Linux 是一个写 C语言的好地方。就假设您会C语言吧!这里也几个指导方针。
编译您的程式hello.c ,您会使用到 gcc compiler, 这已是 Linux 的一部份了。
而且和 g77 有相同的使用方法:
$ gcc -O2 -o hello hello.c
连结(link)函数库(library),加入参数 -l<libname>。
例如,要 link 数学函数库和最佳化,可以下如下指令:
$ gcc -O2 -o mathprog mathprog.c -lm
( -l<libname> 参数强迫 gcc 连结(link)函数库(library)
/usr/lib/lib<libname>.a; 所以 -lm 就连结了
/usr/lib/libm.a).
如果您的程式是由许多档案组成的,您可能也需要使用前面所提到的 make 这个工具。
在 makefile 使用 gcc 和 C语言的原始码档案就可以了。
您也可以获得有关 C 语言的函数的说明。这些说明文件都已经被编成 man pages,第三节(section 3) 了。 例如:
$ man 3 printf
同时,有许许多多的函数库可供使用。其中您第一想要使用的是 ncurses,
这可以用来处理文字模式下的特效。或是 svgalib, 这可以用来处理图形模式。