Plankalkül

来自testwiki
跳转到导航 跳转到搜索

Template:Infobox programming language PlankalkülTemplate:IPA-de)是康拉德·楚澤在1942至1945年间,出于工程目的而设计的一种编程语言。它是第一种为计算机设计的高级编程语言

“Kalkül”在德语中意为形式系统。如希尔伯特演绎系统原本名为“Hilbert-Kalkül”那样,“Plankalkül”指用于规划(planning)的形式系统[1]

描述

Template:CSS image crop Template:CSS image crop Plankalkül可比较于APL关系代数。它包括赋值语句、子例程、条件语句、迭代、浮点算术、阵列、层级记录结构、断言、例外处理和其他高级特征比如目标导向执行。Plankalkül提供了叫做“广义”(Template:Lang)的数据结构,它可以被用来表示几何结构[2]

Plankalkül的很多特征重现于后来的编程语言之中;一个例外是其特质性的使用占据多行的表示法。

Plankalkül的一些特征[3]

  • 只有局部变量,
  • 函数不支持递归,
  • 只支持传名调用
  • 合成类型是阵列和元组,
  • 包含条件表达式,
  • 包含for循环和while循环,
  • 没有goto

数据类型

在Plankalkül中唯一的原始数据类型是单一的“是否值”(Template:Lang-de)即布尔值。它被指称为标识符 S0。所有进一步的数据类型都是合成的,并且从原始类型通过“阵列”和“记录”的方式建造而成[4]

所以8位序列(这在现代计算中被当作字节)被指称为8×S0,而大小为 mn的布尔阵列,被描述为m×n×S0。还存在更短的表示法,可以将n×S0替代为S1n,它叫做“n是否值序列”(Template:Lang-de[4]

类型S0有两个可能的值0L。所以4位序列可以写为例如L00L,但是在这样的一个序列表示一个数的情况下,编程者可以使用十进制表示法的9[4]

Zuse还定义了S22×σ(或写为2σ)即有序对Template:Lang-de);S3m×σ列表Template:Lang-de),在元素数量不定时写为×σS4m×2σ即有序对列表(Template:Lang-de),在元素数量不定时写为×2σ。两个组件(component,Template:Lang-deστ结构Template:Lang-de)被写为(σ,τ)[4]

Plankalkül中类型(Template:Lang-de)构成自3个元素:结构(Template:Lang-de),语用意义(Template:Lang-de),和可能的限制(Template:Lang-de[4]。用户定义的类型被标示为字母A连带编号,比如A1,即第一个用户定义的类型。

例子

Zuse使用了来自象棋理论的很多例子[4]

A1 S13 棋盘的坐标(它的大小为8×8所以3位就足够了)。
A2 2×A1 棋盘的方格(例如L00,00L指称代数记谱法中的e2)。
A3 S14 棋子(例如00L0指称白)。
A4 (A2,A3) 棋盘上的棋子(例如L00,00L;00L0指称白在e2中)。
A5 64×A3 棋盘(棋子位置,描述64的方格都包含哪个棋子)。
A10 (A5,S0,S14,A2) 游戏状态(A5指称棋盘,S0指称行棋玩家,S14指称王车易位的可能性(2位给白棋2位给黒棋),A2指称关于哪个单元格有可能吃过路兵)。

标识符

标识符(Template:Lang-de)是字母字符连带编号[4]。针对变量有如下标识符种类[5]

特定的某种变量由写在种类之下的编号来标示[4],例如:V0Z2C31等等。

程序和子例程都被表达为过程Template:Lang-de),它被标记以字母P,跟随着一个程序编号(Template:Lang-de),或者以点号分隔的程序组编号与程序编号。例如:P12P37[4]

子例程P17的输出值保存在变量R0中,其他子例程能在标识符R170之下获得到它,而读取这个变量的值还意味着调用有关的子例程[4]

按索引访问元素

Plankalkül允许使用组件(component)索引(Template:Lang-de)访问变量的单独元素。例如,当一个程序接收输入于具有类型A10(游戏状态)的变量V0之中,那么V00给出棋盘状态,V00i给出在编号i方格中的棋子,而V00ij给出这个棋子的位编号j[4]

在现代编程语言中,这可以用描述为表示法类似于V0[0]V0[0][i]V0[0][i][j](尽管访问单一的位在现代编程语言中典型的使用位掩码)。

语法

由于变量的索引是垂直书写的,逻辑上一行的Plankalkül指令要求占据4或3物理行来书写。

一行包含变量种类,第二行标记以VTemplate:Lang-de)包含变量编号,第三行标记以KTemplate:Lang-de)包含组件索引,而第四行标记以STemplate:Lang-de)是类型描述。类型不是必需的,但是Zuse注释到这能帮助阅读和理解程序[4]

S行中类型S前缀可以去掉,例如[4]

S|S1nm×S1nS0S1σ,可以简写为 S|1nm×1n01σ

进一步的类型A前缀也可以去掉,例如:

S|A1A2S0A3 σ,可以简写为 A|1203 σA0同义于S0

变量的索引的例子:

VV3KSm×2×1n 变量V3,它是m个有序对的类型S1n的值的列表。
VV3Sm×2×1n K行在其为空时可以越过。因此这个表达式含义同于前者。
VV3Ki07S0 变量V3的第i+1个有序对的第1(索引0)组件的第8(索引7)位,它拥有布尔类型S0

索引可以不只是常值。变量可以被用作其他变量的索引,而这被标记为折线,它展示变量的值将在哪个组件索引中使用:

使用变量作为其他变量的索引,出自第二版的Plankalül表示法。 变量V3的第Z5个元素。等价于在很多现代语言中的表达式V3[Z5][4]

赋值运算

Zuse在他的演算中介入了赋值算子,这个概念未知于他之前的数学中。他将其标记为,并称其为产生符号(Template:Lang-de)。使用赋值的概念是在数学和计算机科学之间的关键差异[6]

例如下列表达式:

Z+1ZV11S1n1n1n 向整数中间值Z1增加数量1
(V,V)RV010Sσσ2σ 将值V0V1合成为R0 所指称的合成值。

有人宣称Konrad Zuse最初使用图元作为赋值的符号,并在Template:En-link的影响下开始使用[4]Knuth和Pardo相信Zuse总是写为,而是»Über den allgemeinen Plankalkül als Mittel zur Formulierung schematisch-kombinativer Aufgaben«的出版商在1948年介入的[6]。在ZürichALGOL 58会议中,欧洲与会者提议使用Zuse介入的赋值符号,而美国代表团坚持采用:=[4]

存储赋值结果的变量(左值)被写在赋值算子的右侧[6]。对一个变量的第一次赋值被认为是对它的初始化声明[4]

赋值算子的左侧被用作表达式(Template:Lang-de),它定义哪个值将被赋值到这个变量。表达式可以使用算术算子、布尔算子和比较算子(=等等)[4]

控制流程

布尔值被表示为整数,“否”(nein)为0,而“是”(ja)为1。条件控制流程采用守卫语句𝒜˙𝒳的形式,这里的加点箭头叫做“条件符号”(Template:Lang-de),它指示在𝒜为“是”的条件下执行块𝒳。迭代算子具有如下形式:

W[𝒜˙𝒳˙𝒴]

这里的W表示“重复规划”(Template:Lang-de),它重复直到所有守卫成为“否”[7]

算子μx(xlR(x))λx(xlR(x))意图用在迭代运算之中,μx对变量l进行递增索引的遍历,而λx对其进行递减索引的遍历,找出其符合特定条件R()的下一个(含第一个)元素x。典型用法是将在局部变量x中的符合条件元素赋值到中间变量之中,然后在用竖杠|分隔出的后续语句之中,在前面语句成功找到符合条件的元素之时对此中间变量做进一步处理。

术语

Zuse称呼一个单一的程序为“计算规划”(Template:Lang-de)。他设想其所称谓的“规划组装设备”(Template:Lang-de),能自动的将一个程序的数学公式转换成机器可读的打孔电影胶片,这是在今天称为翻译器编译器的某种东西[3]

例子

下面的例子程序计算整数的阶乘

P1.1VKA|R(V)R001010VKA|1R01010|V+1Z00101010VKA|W2(Z)010[i>0˙1010[R×iR00101010]]

这里的Zuse定义的用户类型A10表示全部整数。第一行包含“边界概要”(Template:Lang-de),它定义程序P1.1接受一个变元(实际参数),即叫做V0的一个整数,并返回叫做R0的一个整数。这个程序将1赋值到R0,将V0+1赋值到Z0。接着迭代算子W2执行重复运算,将从Z01递减至0的值,依次赋值到局部变量i,这里将大于0i值累乘至R0。当重复结束之时,值R0就包含了变元的阶乘。

Zuse还定义了用户类型A8表示自然数,A9表示非负整数,A11表示非负分数,A12表示全部分数,A13表示复数。迭代算子W0W1W2接受一个非负整数nW0只重复n次而不赋值局部变量,W1重复时将从0递增至n1的值赋值给局部变量i;迭代算子W3W4W5接受两个非负整数(n,m)并赋值到局部变量iW3n<m时从n递增至m1W4n>m时从n递减至m+1W5n<m时从n递增至m1而在n>m时从n递减至m+1。使用W4(V0,0),可以省略V0+1的初始值设置,和i>0的守卫条件判断。

引用

Template:Reflist

延伸阅读

外部链接

Template:Normdaten Template:程序设计语言