热门问题
时间线
聊天
视角
Plankalkül
来自维基百科,自由的百科全书
Remove ads
Plankalkül(德语发音:[ˈplaːnkalkyːl])是康拉德·楚泽在1942至1945年间,出于工程目的而设计的一种编程语言。它是第一种为计算机设计的高级编程语言。
“Kalkül”在德语中意为形式系统。如希尔伯特演绎系统原本名为“Hilbert-Kalkül”那样,“Plankalkül”指用于规划(planning)的形式系统[3]。
描述
Zuse在1960年代的照片
Zuse在1945年基于继电器制造的Z4计算机
Plankalkül可比较于APL和关系代数。它包括赋值语句、子例程、条件语句、迭代、浮点算术、阵列、层级记录结构、断言、例外处理和其他高级特征比如目标导向执行。Plankalkül提供了叫做“广义图”(verallgemeinerter Graph)的数据结构,它可以被用来表示几何结构[4]。
Plankalkül的很多特征重现于后来的编程语言之中;一个例外是其特质性的使用占据多行的表示法。
Plankalkül的一些特征[5]:
在Plankalkül中唯一的原始数据类型是单一的“是否值”(德语:Ja-Nein-Werte)即布尔值。它被指称为标识符 。所有进一步的数据类型都是合成的,并且从原始类型通过“阵列”和“记录”的方式建造而成[6]。
所以8位序列(这在现代计算中被当作字节)被指称为,而大小为 乘的布尔阵列,被描述为。还存在更短的表示法,可以将替代为,它叫做“n位是否值序列”(德语:n-stellige Folge von Ja-Nein-Werten)[6]。
类型有两个可能的值和。所以4位序列可以写为例如,但是在这样的一个序列表示一个数的情况下,编程者可以使用十进制表示法的[6]。
Zuse还定义了为(或写为)即有序对(德语:Angabenpaar);为即列表(德语:Liste),在元素数量不定时写为;为即有序对列表(德语:Paarliste),在元素数量不定时写为。两个组件(component,德语:Glieder)和的结构(德语:Struktur)被写为[6]。
Plankalkül中类型(德语:Art)构成自3个元素:结构(德语:Struktur),语用意义(德语:Typ),和可能的限制(德语:Beschränkung)[6]。用户定义的类型被标示为字母连带编号,比如,即第一个用户定义的类型。
Remove ads
Zuse使用了来自象棋理论的很多例子[6]:
棋盘的坐标(它的大小为所以位就足够了)。 | ||
棋盘的方格(例如指称代数记谱法中的e2)。 | ||
棋子(例如指称白王)。 | ||
棋盘上的棋子(例如指称白王在e2中)。 | ||
棋盘(棋子位置,描述64的方格都包含哪个棋子)。 | ||
游戏状态(指称棋盘,指称行棋玩家,指称王车易位的可能性(位给白棋位给黒棋),指称关于哪个单元格有可能吃过路兵)。 |
Remove ads
标识符(德语:Bezeichnungen)是字母字符连带编号[6]。针对变量有如下标识符种类[7]:
- 输入值(德语:Eingabewerte, Variablen),标记以字母。
- 中间值,临时值(德语:Zwischenwerte),标记以字母。
- 常值(德语:Constanten),标记以字母。
- 输出值(德语:Resultatwerte),标记以字母。
特定的某种变量由写在种类之下的编号来标示[6],例如:,,等等。
程序和子例程都被表达为过程(德语:Rechenpläne),它被标记以字母,跟随着一个程序编号(德语:Nummer),或者以点号分隔的程序组编号与程序编号。例如:、[6]。
子例程的输出值保存在变量中,其他子例程能在标识符之下获得到它,而读取这个变量的值还意味着调用有关的子例程[6]。
Remove ads
Plankalkül允许使用组件(component)索引(德语:Komponenten-Index)访问变量的单独元素。例如,当一个程序接收输入于具有类型(游戏状态)的变量之中,那么给出棋盘状态,给出在编号方格中的棋子,而给出这个棋子的位编号[6]。
在现代编程语言中,这可以用描述为表示法类似于V0[0]
、V0[0][i]
、V0[0][i][j]
(尽管访问单一的位在现代编程语言中典型的使用位掩码)。
Remove ads
由于变量的索引是垂直书写的,逻辑上一行的Plankalkül指令要求占据4或3物理行来书写。
一行包含变量种类,第二行标记以(德语:Variablen-Index)包含变量编号,第三行标记以(德语:Komponenten-Index)包含组件索引,而第四行标记以(德语:Struktur-Index)是类型描述。类型不是必需的,但是Zuse注释到这能帮助阅读和理解程序[6]。
在行中类型前缀可以去掉,例如[6]:
,可以简写为。
进一步的类型前缀也可以去掉,例如:
,可以简写为。同义于。
变量的索引的例子:
变量,它是个有序对的类型的值的列表。 | |
行在其为空时可以越过。因此这个表达式含义同于前者。 | |
变量的第个有序对的第(索引)组件的第(索引)位,它拥有布尔类型。 |
索引可以不只是常值。变量可以被用作其他变量的索引,而这被标记为折线,它展示变量的值将在哪个组件索引中使用:
![]() |
变量的第个元素。等价于在很多现代语言中的表达式V3[Z5] [6]。
|
Remove ads
Zuse在他的演算中介入了赋值算子,这个概念未知于他之前的数学中。他将其标记为,并称其为产生符号(德语:Ergibt-Zeichen)。使用赋值的概念是在数学和计算机科学之间的关键差异[8]。
例如下列表达式:
向整数中间值增加数量。 | |
将值和合成为 所指称的合成值。 |
有人宣称Konrad Zuse最初使用图元作为赋值的符号,并在Heinz Rutishauser的影响下开始使用[6]。Knuth和Pardo相信Zuse总是写为,而
是»Über den allgemeinen Plankalkül als Mittel zur Formulierung schematisch-kombinativer Aufgaben«的出版商在1948年介入的[8]。在Zürich的ALGOL 58会议中,欧洲与会者提议使用Zuse介入的赋值符号,而美国代表团坚持采用
:=
[6]。
存储赋值结果的变量(左值)被写在赋值算子的右侧[8]。对一个变量的第一次赋值被认为是对它的初始化声明[6]。
赋值算子的左侧被用作表达式(德语:Ausdrücke),它定义哪个值将被赋值到这个变量。表达式可以使用算术算子、布尔算子和比较算子(,,等等)[6]。
Remove ads
布尔值被表示为整数,“否”()为,而“是”()为。条件控制流程采用守卫语句的形式,这里的加点箭头叫做“条件符号”(德语:Bedingt-Zeichen),它指示在为“是”的条件下执行块。迭代算子具有如下形式:
这里的表示“重复规划”(德语:Wiederholungsplan),它重复直到所有守卫成为“否”[9]。
算子和意图用在迭代运算之中,对变量进行递增索引的遍历,而对其进行递减索引的遍历,找出其符合特定条件的下一个(含第一个)元素。典型用法是将在局部变量中的符合条件元素赋值到中间变量之中,然后在用竖杠分隔出的后续语句之中,在前面语句成功找到符合条件的元素之时对此中间变量做进一步处理。
Remove ads
Zuse称呼一个单一的程序为“计算规划”(德语:Rechenplan)。他设想其所称谓的“规划组装设备”(德语:Planfertigungsgerät),能自动的将一个程序的数学公式转换成机器可读的打孔电影胶片,这是在今天称为翻译器或编译器的某种东西[5]。
下面的例子程序计算整数的阶乘:
这里的Zuse定义的用户类型表示全部整数。第一行包含“边界概要”(德语:Randauszug),它定义程序接受一个变元(实际参数),即叫做的一个整数,并返回叫做的一个整数。这个程序将赋值到,将赋值到。接着迭代算子执行重复运算,将从递减至的值,依次赋值到局部变量,这里将大于的值累乘至。当重复结束之时,值就包含了变元的阶乘。
Zuse还定义了用户类型表示自然数,表示非负整数,表示非负分数,表示全部分数,表示复数。迭代算子、和接受一个非负整数,只重复次而不赋值局部变量,重复时将从递增至的值赋值给局部变量;迭代算子、和接受两个非负整数并赋值到局部变量,在时从递增至,在时从递减至,在时从递增至而在时从递减至。使用,可以省略的初始值设置,和的守卫条件判断。
Remove ads
引用
延伸阅读
外部链接
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads