BASIC 與 FORTRAN 77:比較過去的編程語言
如果你和我一樣,在 20 世紀(jì)七八十年代使用計算機長大,你可能學(xué)過一種常見的個人計算機編程語言,名為 BASIC(全稱是 “初學(xué)者的通用符號指令代碼Beginner's All-purpose Symbolic Instruction Code”)。那個時期,包括
TRS-80、Apple II 和 IBM PC 在內(nèi)的每臺個人計算機都可以找到 BASIC 實現(xiàn)。當(dāng)時,我是一個自學(xué)的 BASIC 程序員,在嘗試了 Apple II 上的 AppleSoft BASIC 后,轉(zhuǎn)向 IBM PC 上的 GW-BASIC,后來在 DOS 上學(xué)習(xí)了 QuickBASIC。
我通過編寫一個示例程序來探索 BASIC 和 FORTRAN 77 中的 FOR 循環(huán),以將數(shù)字列表從 1 加到 10。
但是曾經(jīng),一種在科學(xué)編程領(lǐng)域受歡迎的語言是 FORTRAN(即 “公式翻譯FORmula TRANslation”)。盡管在 1990 年對該語言進行的規(guī)范以后,該名稱更常見的風(fēng)格是 “Fortran”。
當(dāng)我在 1990 年代初作為大學(xué)本科物理學(xué)生學(xué)習(xí)物理學(xué)時,我利用自己在 BASIC 上的經(jīng)驗學(xué)習(xí)了 FORTRAN 77。那時我意識到 BASIC 許多概念都來源于 FORTRAN。當(dāng)然,F(xiàn)ORTRAN 和 BASIC 在很多其他方面也存在差異,但我發(fā)現(xiàn)了解一點 BASIC 可以幫助我快速學(xué)習(xí) FORTRAN 編程。
我想通過使用兩種語言編寫相同的程序,展示它們之間的一些相似之處。通過編寫一個示例程序來探索 BASIC 和 FORTRAN 77 中的 FOR
循環(huán),這個程序?qū)?1 到 10 之間的數(shù)字相加。
Bywater BASIC
BASIC 存在許多種不同的版本,這取決于你的計算機,但該語言總體保持不變。我喜歡的一種 BASIC 版本是 Bywater BASIC,這是一種開源的 BASIC 實現(xiàn),適用于包括 Linux 和 DOS 在內(nèi)的不同平臺。
要在 FreeDOS 上使用 Bywater BASIC,你必須首先從 FreeDOS 1.3 Bonus CD 中 安裝該軟件包。然后進入 C:
目錄并輸入 bwbasic
命令,這將啟動 BASIC 解釋器。你可以在這個提示符下輸入程序:
bwBASIC:
Bywater BASIC 使用較早的 BASIC 編程標(biāo)準(zhǔn),需要你在每個程序指令上編寫一個行號。將行號視為索引。你可以使用行號輕松地引用程序中的任何指令。當(dāng)你將程序鍵入 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
命令查看你已經(jīng)輸入到解釋器中的程序:
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
循環(huán)。 FOR
是任何編程語言中最基本的循環(huán)構(gòu)造,允許你迭代一組值。在 Bywater BASIC 中,FOR
循環(huán)的一般語法看起來像這樣:
FOR 變量 = 起始值 TO 終止值
在這個示例程序中,指令 for i = 1 to 10
開始一個循環(huán),迭代值為 1 到 10。在每個循環(huán)中,變量 i
被設(shè)置為新值。
在 BASIC 中,所有到 next
指令前的指令都將作為 FOR
循環(huán)的一部分執(zhí)行。因為你可以將一個 FOR
循環(huán)放入另一個 FOR
循環(huán)中,Bywater BASIC 使用語法 NEXT 變量
來指定要迭代的循環(huán)變量。
在提示符下鍵入 run
來執(zhí)行程序:
bwBASIC: run
Add the numbers from 1 to 10 ...
55
Bywater BASIC 被稱為 BASIC 解釋器,因為只能從 Bywater BASIC 環(huán)境中運行程序。這意味著解釋器會處理與操作系統(tǒng)的交互的所有繁重工作,因此你的程序不需要自己完成這個工作。 這樣做的代價是,程序在解釋環(huán)境中運行會比它作為編譯程序運行慢一些。
FreeBASIC
另一個流行的 BASIC 實現(xiàn)是 FreeBASIC,這是一個開源的 BASIC 編譯器,適用于多個平臺,包括 Linux 和 DOS。要使用 FreeBASIC,你需要從 FreeDOS 1.3 Bonus CD 安裝 FreeBASIC 包,然后進入 C:
目錄,你會在這里找到 FreeBASIC 程序。
FreeBASIC 是一個編譯器,因此你首先需要創(chuàng)建一個包含程序指令的源文件,然后使用源代碼運行編譯器以創(chuàng)建一個可運行的程序。我編寫了一個類似于“將 1 到 10 的數(shù)字相加”的程序版本,將其保存為 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 實現(xiàn)了一種更現(xiàn)代的 BASIC 版本,使得編寫程序時不需要跟蹤行號更容易。
另一個主要的區(qū)別是你必須在源代碼中定義或聲明變量。使用 DIM
指令在 FreeBASIC 中聲明變量,例如 dim sum as integer
,以定義一個名為 sum
的整數(shù)變量。
現(xiàn)在可以在命令行上使用 fbc
編譯 BASIC 程序:
C:\DEVEL\FBC> fbc sum.bas
如果你的代碼沒有任何錯誤,編譯器將生成一個可以運行的程序。例如,我的程序現(xiàn)在稱為 sum
。運行我的程序?qū)?1 加到 10:
C:\DEVEL\FBC> sum
Add the numbers from 1 to 10 ...
55
FORTRAN 77
FORTRAN 編程語言類似于舊式和現(xiàn)代 BASIC 之間的混合體。FORTRAN 比 BASIC 更早出現(xiàn),而 BASIC 顯然從
FORTRAN 中汲取靈感,就像后來的 FORTRAN 版本從 BASIC 中獲得啟示一樣。你可以將 FORTRAN
程序以源代碼的形式寫成文件,但并不需要在每個地方使用行號。但是,F(xiàn)ORTRAN 77 在某些指令中使用行號(稱為標(biāo)簽),包括 FOR
循環(huán)。在 FORTRAN 77 中,FOR
實際上被稱為 DO
循環(huán),它執(zhí)行相同的功能并具有幾乎相同的用法。
在 FORTRAN 77 中,DO
循環(huán)的語法如下:
DO 行號 變量 = 起始值, 終止值
這種情況是需要行號來指示 DO
循環(huán)結(jié)束位置的一種情況。你在 BASIC 中使用了 NEXT
指令,但 FORTRAN 需要一個行標(biāo)簽。通常,該行是一個 CONTINUE
指令。
查看這個示例 FORTRAN 程序,了解如何使用 DO
循環(huán)來循環(huán)一組數(shù)字。我將此源文件保存為 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
。當(dāng)我學(xué)習(xí) FORTRAN 時,我從 C 編程中借鑒了一些東西,并以 PROGRAM MAIN
開始了我的所有 FORTRAN 程序,做法類似于 C 程序中的 main()
函數(shù),因為我不太可能使用名為 MAIN
的變量。
FORTRAN 中的 DO
循環(huán)類似于 BASIC 中的 FOR
循環(huán)。它迭代從 1 到 10 的值。變量 I
在每次循環(huán)中獲取新值。這樣可以將 1 到 10 的每個數(shù)字相加,并在完成時打印總和。
你可以在每個平臺上找到適合的 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
一點不同之處
我發(fā)現(xiàn) FORTRAN 和 BASIC 非常相似,但也存在一些不同之處。這些語言的核心是不同的,但如果你了解一些 BASIC,你可以學(xué)習(xí) FORTRAN,同樣,如果你了解一些 FORTRAN,你也可以學(xué)習(xí) BASIC。
如果你想探索這兩種語言,有幾點需要注意:
- FORTRAN 77 使用全大寫,但后來的 FORTRAN 版本允許大小寫混用,只要對變量、函數(shù)和子程序使用相同的大小寫。大多數(shù) BASIC 實現(xiàn)都不區(qū)分大小寫,這意味著你可以自由地混合大小寫字母。
- 有許多不同版本的 BASIC,但它們通常做同樣的事情。如果你學(xué)會了一種 BASIC 實現(xiàn)方式,很容易學(xué)會另一種。注意 BASIC 解釋器或編譯器的警告或錯誤信息,查閱手冊了解差異。
- 某些 BASIC 實現(xiàn)需要使用行號,例如 Bywater BASIC 和 GW-BASIC。更現(xiàn)代的 BASIC 版本允許你編寫不使用行號的程序。FreeBASIC 需要使用
-lang
廢棄選項編譯帶有行號的程序。