在 Linux 下编程更 好:有很多工具可以使编程更轻松快捷。 例如,通过使用编辑器,可以缩短编辑-保存-退出-编译-重新编辑的繁琐过程,例如emacs或jed,如上所示。
此处没有实质性的区别,但请注意,在编写本文时,可用的(免费)编译器与 VMS 的编译器并非 100% 兼容; 预计会出现一些小问题。(实际上是 VMS 编译器具有非标准扩展。)请参阅/usr/doc/g77/DOC或/usr/doc/f2c/f2c.ps了解详情。
您的系统管理员已安装了一个名为g77的本地编译器(不错,但截至 0.5.21 版本,仍然与 DEC Fortran 不完全兼容)或者可能是 Fortran 到 C 的转换器,f2c,以及使其模仿本地编译器的前端之一。 以我的经验来看,软件包yaf77是提供最佳结果的软件包。
要使用以下命令编译 Fortran 程序g77,编辑源文件,并使用扩展名保存.f,然后执行
$ g77 myprog.f |
,默认情况下会创建一个名为a.out的可执行文件(您无需链接任何内容)。 要为可执行文件指定不同的名称并进行一些优化
$ g77 -O2 -o myprog myprog.f |
注意优化! 请让您的系统管理员阅读编译器随附的文档,并告知您是否存在任何问题。
要编译子例程
$ g77 -c mysub.f |
这将创建一个文件mysub.o。 要将此子例程链接到程序,您需要执行
$ g77 -o myprog myprog.f mysub.o |
如果您有许多外部子例程并且想要创建一个库,请执行以下操作
$ cd subroutines/ $ cat *f >mylib.f ; g77 -c mylib.f |
这将创建mylib.o您可以将其链接到您的程序。
最后,要链接一个名为(例如)libdummy.so:
$ g77 -o myprog myprog.f -ldummy |
的外部库,如果您有f2c,您只需使用f77或fort77而不是g77.
另一个有用的编程工具是make,如下所述。
实用程序make是用于处理编译拆分为多个源文件的程序的工具。 VMS 的对应工具是MMS和MMK,它们的语法不同。
假设您有包含您的例程的源文件,file_1.f, file_2.f, file_3.f,以及使用这些例程的主程序的源文件,myprog.f。 如果您手动编译程序,则每当您修改其中一个源文件时,都必须弄清楚哪个文件依赖于哪个文件,首先重新编译哪个文件等等。
您可以编写一个“makefile”来避免抓狂。 这是一个文本文件,其中包含源文件之间的依赖关系:当一个源文件被修改时,只会重新编译依赖于修改文件的那些文件。
在我们的示例中,您将编写如下的 makefile
# This is makefile # Press the <TAB> key where you see <TAB>! # It's important: don't use spaces instead. 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。
Shell 脚本相当于 VMS 的命令文件,并允许非常强大的构造。
要编写脚本,您只需编写一个包含命令的标准 ASCII 文件,保存它,然后使用以下命令使其可执行chmod +x <scriptfile>。 要执行它,请键入其名称。
在以下环境下编写脚本bash是一个非常广泛的主题,它本身就需要一本书,我不会再深入探讨这个主题。 我将只给您一个或多或少全面的且(希望)有用的示例,您可以从中提取一些基本规则。
示例:sample.sh
#!/bin/sh # sample.sh # I am a comment # don't change the first line, it must be there 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编译器,它是 Linux 的一部分,并且具有与g77:
$ gcc -O2 -o hello hello.c |
相同的语法。要将库链接到程序,请添加开关-l<libname>。 例如,要链接数学库并进行优化,请执行
$ gcc -O2 -o mathprog mathprog.c -lm |
(-l<libname>开关强制gcc链接库/usr/lib/lib<libname>.a; 因此-lm链接/usr/lib/libm.a).
当您的程序由多个源文件组成时,您需要使用实用程序make如上所述。 只需使用gcc以及 makefile 中的 C 源文件。
您可以调用有关 C 函数的一些帮助,这些函数在手册页第 3 节中介绍; 例如,
$ man 3 printf |
那里有很多可用的库; 您首先要使用的库包括ncurses,用于处理文本模式效果,以及svgalib,用于进行图形处理。