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