mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-23 21:20:42 +08:00
188 lines
9.7 KiB
Markdown
188 lines
9.7 KiB
Markdown
|
[#]: subject: "BASIC vs. FORTRAN 77: Comparing programming blasts from the past"
|
|||
|
[#]: via: "https://opensource.com/article/23/4/basic-vs-fortran-77"
|
|||
|
[#]: author: "Jim Hall https://opensource.com/users/jim-hall"
|
|||
|
[#]: collector: "lkxed"
|
|||
|
[#]: translator: "ChatGPT"
|
|||
|
[#]: reviewer: "wxy"
|
|||
|
[#]: publisher: "wxy"
|
|||
|
[#]: url: "https://linux.cn/article-15897-1.html"
|
|||
|
|
|||
|
BASIC 与 FORTRAN 77:比较过去的编程语言
|
|||
|
======
|
|||
|
|
|||
|
![][0]
|
|||
|
|
|||
|
> 我通过编写一个示例程序来探索 BASIC 和 FORTRAN 77 中的 FOR 循环,以将数字列表从 1 加到 10。
|
|||
|
|
|||
|
如果你和我一样,在 20 世纪七八十年代使用计算机长大,你可能学过一种常见的个人计算机编程语言,名为 BASIC(全称是 “<ruby>初学者的通用符号指令代码<rt>Beginner's All-purpose Symbolic Instruction Code</rt></ruby>”)。那个时期,包括 TRS-80、Apple II 和 IBM PC 在内的每台个人计算机都可以找到 BASIC 实现。当时,我是一个自学的 BASIC 程序员,在尝试了 Apple II 上的 AppleSoft BASIC 后,转向 IBM PC 上的 GW-BASIC,后来在 DOS 上学习了 QuickBASIC。
|
|||
|
|
|||
|
但是曾经,一种在科学编程领域受欢迎的语言是 FORTRAN(即 “<ruby>公式翻译<rt>FORmula TRANslation</rt></ruby>”)。尽管在 1990 年对该语言进行的规范以后,该名称更常见的风格是 “Fortran”。
|
|||
|
|
|||
|
当我在 1990 年代初作为大学本科物理学生学习物理学时,我利用自己在 BASIC 上的经验学习了 FORTRAN 77。那时我意识到 BASIC 许多概念都来源于 FORTRAN。当然,FORTRAN 和 BASIC 在很多其他方面也存在差异,但我发现了解一点 BASIC 可以帮助我快速学习 FORTRAN 编程。
|
|||
|
|
|||
|
我想通过使用两种语言编写相同的程序,展示它们之间的一些相似之处。通过编写一个示例程序来探索 BASIC 和 FORTRAN 77 中的 `FOR` 循环,这个程序将把 1 到 10 之间的数字相加。
|
|||
|
|
|||
|
### Bywater BASIC
|
|||
|
|
|||
|
BASIC 存在许多种不同的版本,这取决于你的计算机,但该语言总体保持不变。我喜欢的一种 BASIC 版本是 [Bywater BASIC][1],这是一种开源的 BASIC 实现,适用于包括 Linux 和 DOS 在内的不同平台。
|
|||
|
|
|||
|
要在 FreeDOS 上使用 Bywater BASIC,你必须首先从 FreeDOS 1.3 Bonus CD 中 [安装该软件包][2]。然后进入 `C:` 目录并输入 `bwbasic` 命令,这将启动 BASIC 解释器。你可以在这个提示符下输入程序:
|
|||
|
|
|||
|
```
|
|||
|
bwBASIC:
|
|||
|
```
|
|||
|
|
|||
|
Bywater BASIC 使用较早的 BASIC 编程标准,需要你在每个程序指令上编写一个行号。将行号视为索引。你可以使用行号轻松地引用程序中的任何指令。当你将程序键入 Bywater BASIC 解释器时,请在每个指令前添加行号:
|
|||
|
|
|||
|
```
|
|||
|
bwBASIC: 10 print "Add the numbers from 1 to 10 ..."
|
|||
|
bwBASIC: 20 sum = 0
|
|||
|
bwBASIC: 30 for i = 1 to 10
|
|||
|
bwBASIC: 40 sum = sum + i
|
|||
|
bwBASIC: 50 next i
|
|||
|
bwBASIC: 60 print sum
|
|||
|
bwBASIC: 70 end
|
|||
|
```
|
|||
|
|
|||
|
可以使用 `list` 命令查看你已经输入到解释器中的程序:
|
|||
|
|
|||
|
```
|
|||
|
bwBASIC: list
|
|||
|
10 print "Add the numbers from 1 to 10 ..."
|
|||
|
20 sum = 0
|
|||
|
30 for i = 1 to 10
|
|||
|
40 sum = sum + i
|
|||
|
50 next i
|
|||
|
60 print sum
|
|||
|
70 end
|
|||
|
```
|
|||
|
|
|||
|
这个简短的程序演示了 BASIC 中的 `FOR` 循环。 `FOR` 是任何编程语言中最基本的循环构造,允许你迭代一组值。在 Bywater BASIC 中,`FOR` 循环的一般语法看起来像这样:
|
|||
|
|
|||
|
```
|
|||
|
FOR 变量 = 起始值 TO 终止值
|
|||
|
```
|
|||
|
|
|||
|
在这个示例程序中,指令 `for i = 1 to 10` 开始一个循环,迭代值为 1 到 10。在每个循环中,变量 `i` 被设置为新值。
|
|||
|
|
|||
|
在 BASIC 中,所有到 `next` 指令前的指令都将作为 `FOR` 循环的一部分执行。因为你可以将一个 `FOR` 循环放入另一个 `FOR` 循环中,Bywater BASIC 使用语法 `NEXT 变量` 来指定要迭代的循环变量。
|
|||
|
|
|||
|
在提示符下键入 `run` 来执行程序:
|
|||
|
|
|||
|
```
|
|||
|
bwBASIC: run
|
|||
|
Add the numbers from 1 to 10 ...
|
|||
|
55
|
|||
|
```
|
|||
|
|
|||
|
Bywater BASIC 被称为 BASIC 解释器,因为只能从 Bywater BASIC 环境中运行程序。这意味着解释器会处理与操作系统的交互的所有繁重工作,因此你的程序不需要自己完成这个工作。 这样做的代价是,程序在解释环境中运行会比它作为编译程序运行慢一些。
|
|||
|
|
|||
|
### FreeBASIC
|
|||
|
|
|||
|
另一个流行的 BASIC 实现是 [FreeBASIC][3],这是一个开源的 BASIC 编译器,适用于多个平台,包括 Linux 和 DOS。要使用 FreeBASIC,你需要从 FreeDOS 1.3 Bonus CD 安装 FreeBASIC 包,然后进入 `C:` 目录,你会在这里找到 FreeBASIC 程序。
|
|||
|
|
|||
|
FreeBASIC 是一个编译器,因此你首先需要创建一个包含程序指令的源文件,然后使用源代码运行编译器以创建一个可运行的程序。我编写了一个类似于“将 1 到 10 的数字相加”的程序版本,将其保存为 BASIC 文件,并命名为 `sum.bas`:
|
|||
|
|
|||
|
```
|
|||
|
dim sum as integer
|
|||
|
dim i as integer
|
|||
|
print "Add the numbers from 1 to 10 ..."
|
|||
|
sum = 0
|
|||
|
for i = 1 to 10
|
|||
|
sum = sum + i
|
|||
|
next
|
|||
|
print sum
|
|||
|
end
|
|||
|
```
|
|||
|
|
|||
|
如果你将这段代码与 Bywater BASIC 版本的程序进行比较,你可能会注意到 FreeBASIC 不需要行号。FreeBASIC 实现了一种更现代的 BASIC 版本,使得编写程序时不需要跟踪行号更容易。
|
|||
|
|
|||
|
另一个主要的区别是你必须在源代码中定义或声明变量。使用 `DIM` 指令在 FreeBASIC 中声明变量,例如 `dim sum as integer`,以定义一个名为 `sum` 的整数变量。
|
|||
|
|
|||
|
现在可以在命令行上使用 `fbc` 编译 BASIC 程序:
|
|||
|
|
|||
|
```
|
|||
|
C:\DEVEL\FBC> fbc sum.bas
|
|||
|
```
|
|||
|
|
|||
|
如果你的代码没有任何错误,编译器将生成一个可以运行的程序。例如,我的程序现在称为 `sum`。运行我的程序将从 1 加到 10:
|
|||
|
|
|||
|
```
|
|||
|
C:\DEVEL\FBC> sum
|
|||
|
Add the numbers from 1 to 10 ...
|
|||
|
55
|
|||
|
```
|
|||
|
|
|||
|
### FORTRAN 77
|
|||
|
|
|||
|
FORTRAN 编程语言类似于旧式和现代 BASIC 之间的混合体。FORTRAN 比 BASIC 更早出现,而 BASIC 显然从 FORTRAN 中汲取灵感,就像后来的 FORTRAN 版本从 BASIC 中获得启示一样。你可以将 FORTRAN 程序以源代码的形式写成文件,但并不需要在每个地方使用行号。但是,FORTRAN 77 在某些指令中使用行号(称为标签),包括 `FOR` 循环。在 FORTRAN 77 中,`FOR` 实际上被称为 `DO` 循环,它执行相同的功能并具有几乎相同的用法。
|
|||
|
|
|||
|
在 FORTRAN 77 中,`DO` 循环的语法如下:
|
|||
|
|
|||
|
```
|
|||
|
DO 行号 变量 = 起始值, 终止值
|
|||
|
```
|
|||
|
|
|||
|
这种情况是需要行号来指示 `DO` 循环结束位置的一种情况。你在 BASIC 中使用了 `NEXT` 指令,但 FORTRAN 需要一个行标签。通常,该行是一个 `CONTINUE` 指令。
|
|||
|
|
|||
|
查看这个示例 FORTRAN 程序,了解如何使用 `DO` 循环来循环一组数字。我将此源文件保存为 `sum.f`:
|
|||
|
|
|||
|
```
|
|||
|
PROGRAM MAIN
|
|||
|
INTEGER SUM,I
|
|||
|
PRINT *, 'ADD THE NUMBERS FROM 1 TO 10 ...'
|
|||
|
SUM = 0
|
|||
|
DO 10 I = 1, 10
|
|||
|
SUM = SUM + I
|
|||
|
10 CONTINUE
|
|||
|
PRINT *, SUM
|
|||
|
END
|
|||
|
```
|
|||
|
|
|||
|
在 FORTRAN 中,每个程序都需要以 `PROGRAM` 指令开始,并指定程序名称。你可能会将此程序命名为 `SUM`,但随后在程序中不能使用变量 `SUM`。当我学习 FORTRAN 时,我从 C 编程中借鉴了一些东西,并以 `PROGRAM MAIN` 开始了我的所有 FORTRAN 程序,做法类似于 C 程序中的 `main()` 函数,因为我不太可能使用名为 `MAIN` 的变量。
|
|||
|
|
|||
|
FORTRAN 中的 `DO` 循环类似于 BASIC 中的 `FOR` 循环。它迭代从 1 到 10 的值。变量 `I` 在每次循环中获取新值。这样可以将 1 到 10 的每个数字相加,并在完成时打印总和。
|
|||
|
|
|||
|
你可以在每个平台上找到适合的 FORTRAN 编译器,包括 Linux 和 DOS。FreeDOS 1.3 的 Bonus CD 中包括 OpenWatcom FORTRAN 编译器。在 Linux 上,你可能需要安装一个包来安装 GNU Fortran 支持(在 GNU 编译器集合(GCC)中)。在 Fedora Linux 上,你可以使用以下命令添加 GNU Fortran 支持:
|
|||
|
|
|||
|
```
|
|||
|
$ sudo dnf install gcc-gfortran
|
|||
|
```
|
|||
|
|
|||
|
然后你可以使用以下命令编译 `sum.f` 并运行程序:
|
|||
|
|
|||
|
```
|
|||
|
$ gfortran -o sum sum.f
|
|||
|
$ ./sum
|
|||
|
ADD THE NUMBERS FROM 1 TO 10 ...
|
|||
|
55
|
|||
|
```
|
|||
|
### 一点不同之处
|
|||
|
|
|||
|
我发现 FORTRAN 和 BASIC 非常相似,但也存在一些不同之处。这些语言的核心是不同的,但如果你了解一些 BASIC,你可以学习 FORTRAN,同样,如果你了解一些 FORTRAN,你也可以学习 BASIC。
|
|||
|
|
|||
|
如果你想探索这两种语言,有几点需要注意:
|
|||
|
|
|||
|
- **FORTRAN 77 使用全大写**,但后来的 FORTRAN 版本允许大小写混用,只要对变量、函数和子程序使用相同的大小写。大多数 BASIC 实现都不区分大小写,这意味着你可以自由地混合大小写字母。
|
|||
|
- **有许多不同版本的 BASIC**,但它们通常做同样的事情。如果你学会了一种 BASIC 实现方式,很容易学会另一种。注意 BASIC 解释器或编译器的警告或错误信息,查阅手册了解差异。
|
|||
|
- **某些 BASIC 实现需要使用行号**,例如 Bywater BASIC 和 GW-BASIC。更现代的 BASIC 版本允许你编写不使用行号的程序。FreeBASIC 需要使用 `-lang` 废弃选项编译带有行号的程序。
|
|||
|
|
|||
|
*(题图:MJ/dba28597-dd62-4ffe-bb4a-e38874a65239)*
|
|||
|
|
|||
|
--------------------------------------------------------------------------------
|
|||
|
|
|||
|
via: https://opensource.com/article/23/4/basic-vs-fortran-77
|
|||
|
|
|||
|
作者:[Jim Hall][a]
|
|||
|
选题:[lkxed][b]
|
|||
|
译者:ChatGPT
|
|||
|
校对:[wxy](https://github.com/wxy)
|
|||
|
|
|||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
|||
|
|
|||
|
[a]: https://opensource.com/users/jim-hall
|
|||
|
[b]: https://github.com/lkxed/
|
|||
|
[1]: https://sourceforge.net/projects/bwbasic/
|
|||
|
[2]: https://opensource.com/article/21/6/freedos-package-manager
|
|||
|
[3]: https://www.freebasic.net/
|
|||
|
[0]: https://img.linux.net.cn/data/attachment/album/202306/11/110557i6ef2ep92petw2d1.jpg
|