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