你应该了解的 5 种古老编程语言
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
这篇文章最初发布在领英上。
有些人认为旧编程语言丑陋、过时、老旧且毫无用处。但对我来说,它们恰恰相反……是等待被重新发现的瑰宝。
一门古老的编程语言能教会你很多东西,也肯定能让你成为更优秀的开发者。如今人们习惯于语言提供的一切,但这其实并不好,因为它会迫使你停止思考。古老的编程语言缺少许多现代语言所具备的功能,但这并不意味着它们不够强大,因为它们仍然提供了所有必要的工具,让你能够自己实现各种功能。
为了说明这些编程是如何工作的,我们将使用一个名为“斐波那契列表”的非常基本的应用程序,它将简单地输出所请求的斐波那契数的列表,例如,如果我们请求 5,它应该返回 0、1、1、2、3、5。
让我们从我所知的最古老的编程语言开始……
FORTRAN(公式转换器 - 1957)
一种通用的命令式编程语言,主要适用于数值计算和科学计算。
program fibonacci
implicit none
integer :: a=0, b=1, num
write(*,'(a)',advance="no") "Enter a number: "
read(*,*) num
write(*,*) trim(fib(num, a, b))
contains
recursive function fib(num, a, b) result(fibo)
integer, intent(in) :: num, a, b
integer :: ab
character(1000) :: a_s, b_s, ab_s
character(1000) :: fibo
if(a > 0 .and. num > 1) then
ab = a + b
write(ab_s, '(I0)') ab
fibo = trim(ab_s) // " " // fib(num - 1, ab, a)
else if (a == 0) then
ab = a + b
write(a_s, '(I0)') a
write(b_s, '(I0)') b
write(ab_s, '(I0)') ab
fibo = trim(a_s) // " " // trim(b_s) // " " //
trim(ab_s) // " " // trim(fib(num - 1, ab, b))
else
fibo = ""
end if
return
end function fib
end program fibonacci
我们来看看……程序必须用 `<program>` 和 `<end program>` 标签括起来。变量在声明时需要指定类型。递归函数必须标记为 `<recursive>`。字符串变量的长度是固定的。`//` 用于连接字符串。整数和字符可以直接连接,无需任何转换。由于字符串长度固定,我们需要进行大量的修剪以避免占用额外的空间。函数可以返回零个、一个或多个值。
为了编译这个程序……我使用了 Linux 自带的 GFORTRAN,但也可以通过执行“sudo apt-get install gfortran”命令轻松安装。由于它是一个 GNU 应用程序……它并不是真正的 Fortran 编译器……它是用 C 语言编写的。
GFORTRAN -WALL -C "NAME_OF_FILE.F95"
GFORTRAN -WALL -O "NAME_OF_EXEC" "NAME_OF_FILE.F95"
您可以在这里阅读我的 FORTRAN 入门介绍。
COBOL(通用对象商业语言 - 1959 年)
一种编译型的、类似英语的计算机编程语言,专为商业用途而设计。
它是命令式的、程序化的,并且自 2002 年以来,它是面向对象的。
IDENTIFICATION DIVISION.
PROGRAM-ID. fibonacci.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 USER-NUMBER PIC 9(3).
01 A PIC 9(3).
01 B PIC 9(3).
01 AB PIC 9(3).
01 COUNTER PIC 9(3).
01 COUNTER-SPACES PIC 9(3).
PROCEDURE DIVISION.
PROGRAM-BEGIN.
MOVE 0 TO A.
MOVE 1 TO B.
DISPLAY "Enter a number: ".
ACCEPT USER-NUMBER.
PERFORM GET-FIBO WITH TEST AFTER UNTIL USER-NUMBER = 1.
DISPLAY " ".
PROGRAM-DONE.
STOP RUN.
GET-FIBO.
IF A = 0
COMPUTE AB = A + B
INSPECT AB TALLYING COUNTER FOR CHARACTERS
INSPECT AB TALLYING COUNTER-SPACES FOR LEADING ZEROS
COMPUTE COUNTER-SPACES = COUNTER-SPACES - COUNTER
DISPLAY 0 " " 1 " " AB(COUNTER:COUNTER-SPACES) WITH NO ADVANCING
COMPUTE USER-NUMBER = USER-NUMBER - 1
MOVE AB TO A
ELSE
MOVE 0 TO COUNTER
MOVE 0 TO COUNTER-SPACES
COMPUTE AB = A + B
INSPECT AB TALLYING COUNTER FOR CHARACTERS
INSPECT AB TALLYING COUNTER-SPACES FOR LEADING ZEROS
IF COUNTER-SPACES = 0
DISPLAY " " AB WITH NO ADVANCING
END-IF
IF COUNTER-SPACES = 1
COMPUTE COUNTER = COUNTER - COUNTER-SPACES
DISPLAY " " AB(COUNTER:COUNTER) WITH NO ADVANCING
END-IF
IF COUNTER-SPACES = 2
COMPUTE COUNTER-SPACES = COUNTER-SPACES - COUNTER
DISPLAY " " AB(COUNTER:COUNTER-SPACES) WITH NO ADVANCING
END-IF
COMPUTE USER-NUMBER = USER-NUMBER - 1
MOVE A TO B
MOVE AB TO A
END-IF.
正如我们所见……COBOL 的规则非常严格……它有“部门”和“节”。变量必须首先声明,并且不能在它所属的节之外的任何地方声明。将值移动到变量中与将值赋给变量是不同的。COBOL 中没有 IF-ELSE 语句。您可以检查变量以获取其长度或零的数量。
我知道你一定很想知道“PIC 9”到底是什么意思……嗯……“9”代表数值,“X”代表字母数字,“S”代表符号,“V”代表小数。
为了编译这个程序……我使用了 Open-Cobol,可以通过执行“sudo apt-get install open-cobol”轻松安装。作为一个 GNU 应用程序……它并不是真正的 Cobol 编译器……它是用 C 语言编写的。
COBC -X -FREE -O "NAME_OF_FILE" "NAME_OF_FILE.COB"
您可以在这里阅读我的 Cobol 入门介绍。
Simula(仿真编程语言 - 1962 年)
Algol 60 的超集。被认为是第一个面向对象的编程语言。
begin
integer num;
text result;
procedure fib(num, a, b);
integer num, a, b;
begin
if a > 0 and num > 1 then
begin
OutInt(a+b,3);
fib(num - 1, a + b, a);
end;
if a = 0 then
begin
OutInt(a,3);
OutInt(b,3);
OutInt(a+b,3);
fib(num - 1, a + b, b);
end;
end;
OutText("Enter a number: ");
OutImage;
num := InInt;
fib(num,0,1)
OutImage;
end
每个程序都以“Begin - End”开头。变量需要类型。我们可以有全局变量和局部变量。“OutInt”用于在屏幕上打印整数,“OutText”用于打印字符串。“OutImage”用于打印空行。整数变量使用“="”赋值,字符串变量使用“:="”。
编译时,我使用了 GNU CIM,它是一个将 Simula 代码转译为 C 代码的转译器。您可以从这里安装它。
cim "NAME_OF_FILE.cim"
您可以在这里阅读我的Simula入门介绍。
Snobol(面向字符串的符号语言 - 1967)
命令式和非结构化编程语言。此外,它还是目标导向的。
* Fibonacci Sequence
define('fibo(num,a,b)temp','fib') :(fibo_end)
fib fibo = eq(a,0) a ' ' b ' ' ( a + b )
num = num - 1
a = a + b :s(fib0)
fib0 gt(num,1) :s(fib1)f(return)
fib1 fibo = gt(a,0) fibo ' ' ( a + b )
num = num - 1
temp = a
a = a + b
b = temp :s(fib0)f(return)
fibo_end
output = 'Enter a number: '
num = input
output = fibo(num,0,1)
end
变量不需要数据类型,它的类型取决于赋值。定义方法时,我们需要指定方法结束或失败时要调用什么函数。对于每个部分,我们需要判断它是否有效,并根据结果跳转到下一个部分。“if”条件语句需要单独存在,并根据结果跳转到其他部分。在本例中,“gt(num,1)”就是一个“if”语句。
要进行编译,我们首先需要构建编译器……顺便说一下,它是一个 C 应用程序。
WGET FTP://FTP.ULTIMATE.COM/SNOBOL/SNOBOL4-1.5.TAR.GZ
TAR –ZXVF SNOBOL4-1.5.TAR.GZ && CD SNOBOL4-1.5
SUDO APT-GET INSTALL M4
SUDO MAKE INSTALL
要跑步,我们需要做……
snobol "NAME_OF_FILE.sno"
您可以在这里阅读我的Snobol入门介绍。
Algol68(算法语言 - 1968)
Algol是Algol系列命令式编程语言(Algol58、Algol60和Algol68)的一部分。它是史上最具影响力的语言之一,衍生出了Simula、B、Pascal和C等众多语言。
BEGIN
print("Enter a number: ");
INT num = read int;
PROC fib = (INT num, a, b)VOID:
IF a > 0 THEN
IF num > 1 THEN
printf(($g(0)x$, a + b));
fib(num-1, a+b, a)
FI
ELIF a = 0 THEN
printf(($g(0)x$, a + b));
fib(num-1, a+b, b)
FI;
printf(($g(0)x$, 0, 1));
fib(num,0,1);
print(newline)
END
所有应用程序都以 BEGIN-END 开头。变量需要类型。过程可以有零个或多个参数。返回最后一个值,并且必须始终返回一个值。打印数字时会显示符号,因此我们需要格式化其输出。这很可能是第一个使用“ELIF”语句的编程语言,并且使用“FI”语句来结束“IF”语句。“;”用于结束一行。
要进行编译,我们首先需要安装 Algol68Genie。
SUDO APT-GET INSTALL -Y ALGOL68G
然后我们就可以简单地……
a68g "NAME_OF_FILE.a68g"
你可以在这里阅读我的 Algol68 入门介绍。
奖励部分
我知道……五种语言不够……所以为什么不加入一种额外的语言呢……一种我一直很感兴趣的语言,因为它的名字对于一种编程语言来说似乎有点奇怪 -;)
闲聊 (1972)
一种面向对象、动态类型、反射式编程语言。
Smalltalk 对 Objective-C、Java、Python、Ruby 等许多语言都产生了影响……
| number fib result |
result := ''.
fib := [:num :a :b |
a > 0 & (num asNumber > 1) ifTrue: [
result := result , (a + b) asString , ' ' ,
(fib value: (num asNumber - 1) value: (a + b) value: a).
] ifFalse: [
a = 0 ifTrue: [
result := a asString , ' ' , b asString , ' ' , (a + b) asString , ' ' ,
(fib value: (num asNumber - 1) value: (a + b) value: b).
].
].
].
Transcript show: 'Enter a number: '.
num := stdin nextLine.
Transcript show: (fib value: num value: 0 value: 1); cr.
变量声明在“|”之间。赋值使用“:="”。“IF”语句比较特殊,它被定义为“ifTrue”和“ifFalse”,而“[]”用于分隔代码块。我们使用“Transcript show”,否则文本会被像这样“This is a text”括起来,而不是“This is a text”。如果您对“value:”感到疑惑,它是用来调用参数的。
编译时,我们将使用 GNU Smalltalk,它可以像这样安装:
sudo apt-get install gnu-smalltalk
而他们只是……
gst "NAME_OF_FILE.st"
你可以在这里阅读我的 Smalltalk 入门介绍。
就这样啦 :) 希望你玩得开心 ;) 我学习它们的时候也很有意思……它们确实让我成为了一个更好的开发者……没错……我的确也遇到过很多挫折……但这正是编程的乐趣所在 ;)
吹嘘。
文章来源:https://dev.to/blag/5-old-programming-languages-you-should-know-about-3ofe










