5. 编程

在 Linux 下编程 好:有很多工具可以使编程更轻松快捷。 例如,通过使用编辑器,可以缩短编辑-保存-退出-编译-重新编辑的繁琐过程,例如emacsjed,如上所示。

5.1. Fortran

此处没有实质性的区别,但请注意,在编写本文时,可用的(免费)编译器与 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,您只需使用f77fort77而不是g77.

另一个有用的编程工具是make,如下所述。

5.2. 使用make

实用程序make是用于处理编译拆分为多个源文件的程序的工具。 VMS 的对应工具是MMSMMK,它们的语法不同。

假设您有包含您的例程的源文件,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。

5.3. Shell 脚本

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

5.4. C

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,用于进行图形处理。