在 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 是一个写 ?语言的好地方。就假设您会?语言吧!这里也几个指导方针。
编译您的程序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 语言的函数的说明。这些说明文件都已经被编成 man pages﹐第三节(section 3) 了。 例如:
$ man 3 printf
同时﹐有许许多多的函数库可供使用。其中您第一想要使用的是 ncurses,
这可以用来处理文字模式下的特效。或是 svgalib, 这可以用来处理图形模式。