Next Previous Contents

5. 程序

在 Linux 上写程序更是舒服:有许多好用得工具可以让写程序更加快速更加简单。 例如:写程序无非是单调沈闷的工作:编辑--存档--离开--编译--重新编辑 一直反覆的执行同样的动作。 但是﹐如果使用像 emacs 或是 jed 等工具﹐上述哪些动作﹐将统一整合在编辑器里﹐一次完成。

5.1 Fortran

大体上﹐没有多大的差别﹐但是请注意﹐这个免费的编译器可不是百分之百的和 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, 详述如下:

5.2 如何使用 make

make 可以用来编辑很多分散于个文档的原始码。在 VMS 上我们称为 MMSMMK, 但是她们和 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 吧!)

5.3 Shell Scripts

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."

5.4 C 语言

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, 这可以用来处理图形模式。


Next Previous Contents