Plankalkül

Plankalkül是康拉德·楚泽在1942至1945年间，出于工程目的而设计的一种编程语言。它是第一种为计算机设计的高级编程语言。
“Kalkül”在德语中意为形式系统。如希尔伯特演绎系统原本名为“Hilbert-Kalkül”那样，“Plankalkül”指用于规划（planning）的形式系统。
描述.
Plankalkül可比较于APL和关系代数。它包括赋值语句、子例程、条件语句、迭代、浮点算术、阵列、层级记录结构、断言、例外处理和其他高级特征比如目标导向执行。Plankalkül提供了叫做“广义图”（verallgemeinerter Graph）的数据结构，它可以被用来表示几何结构。
Plankalkül的很多特征重现于后来的编程语言之中；一个例外是其特质性的使用占据多行的表示法。
Plankalkül的一些特征：
数据类型.
在Plankalkül中唯一的原始数据类型是单一的“是否值”（Ja-Nein-Werte）即布尔值。它被指称为标识符 formula_1。所有进一步的数据类型都是合成的，并且从原始类型通过“阵列”和“记录”的方式建造而成。
所以8位序列（这在现代计算中被当作字节）被指称为formula_2，而大小为 formula_3乘formula_4的布尔阵列，被描述为formula_5。还存在更短的表示法，可以将formula_6替代为formula_7，它叫做“n位是否值序列”（n-stellige Folge von Ja-Nein-Werten）。
类型formula_1有两个可能的值formula_9和formula_10。所以4位序列可以写为例如formula_11，但是在这样的一个序列表示一个数的情况下，编程者可以使用十进制表示法的formula_12。
Zuse还定义了formula_13为formula_14（或写为formula_15）即有序对（Angabenpaar）；formula_16为formula_17即列表（Liste），在元素数量不定时写为formula_18；formula_19为formula_20即有序对列表（Paarliste），在元素数量不定时写为formula_21。两个组件（component，Glieder）formula_22和formula_23的结构（Struktur）被写为formula_24。
Plankalkül中类型（Art）构成自3个元素：结构（Struktur），语用意义（Typ），和可能的限制（Beschränkung）。用户定义的类型被标示为字母formula_25连带编号，比如formula_26，即第一个用户定义的类型。
例子.
Zuse使用了来自象棋理论的很多例子：
标识符.
标识符（Bezeichnungen）是字母字符连带编号。针对变量有如下标识符种类：
特定的某种变量由写在种类之下的编号来标示，例如：formula_31，formula_32，formula_33等等。
程序和子例程都被表达为过程（Rechenpläne），它被标记以字母formula_34，跟随着一个程序编号（Nummer），或者以点号分隔的程序组编号与程序编号。例如：formula_35、formula_36。
子例程formula_37的输出值保存在变量formula_38中，其他子例程能在标识符formula_39之下获得到它，而读取这个变量的值还意味着调用有关的子例程。
按索引访问元素.
Plankalkül允许使用组件（component）索引（Komponenten-Index）访问变量的单独元素。例如，当一个程序接收输入于具有类型formula_40（游戏状态）的变量formula_31之中，那么formula_42给出棋盘状态，formula_43给出在编号formula_44方格中的棋子，而formula_45给出这个棋子的位编号formula_46。
在现代编程语言中，这可以用描述为表示法类似于codice_3、codice_3、codice_3（尽管访问单一的位在现代编程语言中典型的使用位掩码）。
语法.
由于变量的索引是垂直书写的，逻辑上一行的Plankalkül指令要求占据4或3物理行来书写。
一行包含变量种类，第二行标记以formula_27（Variablen-Index）包含变量编号，第三行标记以formula_48（Komponenten-Index）包含组件索引，而第四行标记以formula_49（Struktur-Index）是类型描述。类型不是必需的，但是Zuse注释到这能帮助阅读和理解程序。
在formula_49行中类型formula_49前缀可以去掉，例如：
formula_52，可以简写为formula_53。
进一步的类型formula_25前缀也可以去掉，例如：
formula_55，可以简写为formula_56。formula_57同义于formula_1。
变量的索引的例子：
索引可以不只是常值。变量可以被用作其他变量的索引，而这被标记为折线，它展示变量的值将在哪个组件索引中使用：
赋值运算.
Zuse在他的演算中介入了赋值算子，这个概念未知于他之前的数学中。他将其标记为formula_59，并称其为产生符号（Ergibt-Zeichen）。使用赋值的概念是在数学和计算机科学之间的关键差异。
例如下列表达式：
有人宣称Konrad Zuse最初使用图元，并在的影响下开始使用formula_59。Knuth和Pardo相信Zuse总是写为formula_59，而»Über den allgemeinen Plankalkül als Mittel zur Formulierung schematisch-kombinativer Aufgaben«的出版商在1948年介入的。在Zürich的ALGOL 58会议中，欧洲与会者提议使用Zuse介入的赋值符号，而美国代表团坚持采用codice_6。
存储赋值结果的变量（左值）被写在赋值算子的右侧。对一个变量的第一次赋值被认为是对它的初始化声明。
赋值算子的左侧被用作表达式（Ausdrücke），它定义哪个值将被赋值到这个变量。表达式可以使用算术算子、布尔算子和比较算子（formula_62，formula_63，formula_64等等）。
控制流程.
布尔值被表示为整数，“否”（formula_65）为formula_9，而“是”（formula_67）为formula_68。条件控制流程采用守卫语句formula_69的形式，这里的加点箭头叫做“条件符号”（Bedingt-Zeichen），它指示在formula_70为“是”的条件下执行块formula_71。迭代算子具有如下形式：
这里的formula_73表示“重复规划”（Wiederholungsplan），它重复直到所有守卫成为“否”。
算子formula_74和formula_75意图用在迭代运算之中，formula_76对变量formula_77进行递增索引的遍历，而formula_78对其进行递减索引的遍历，找出其符合特定条件formula_79的下一个（含第一个）元素formula_80。典型用法是将在局部变量formula_80中的符合条件元素赋值到中间变量之中，然后在用竖杠formula_82分隔出的后续语句之中，在前面语句成功找到符合条件的元素之时对此中间变量做进一步处理。
术语.
Zuse称呼一个单一的程序为“计算规划”（Rechenplan）。他设想其所称谓的“规划组装设备”（Planfertigungsgerät），能自动的将一个程序的数学公式转换成机器可读的打孔电影胶片，这是在今天称为翻译器或编译器的某种东西。
例子.
下面的例子程序计算整数的阶乘：
formula_83
这里的Zuse定义的用户类型formula_40表示全部整数。第一行包含“边界概要”（Randauszug），它定义程序formula_85接受一个变元（实际参数），即叫做formula_31的一个整数，并返回叫做formula_38的一个整数。这个程序将formula_68赋值到formula_38，将formula_90赋值到formula_91。接着迭代算子formula_92执行重复运算，将从formula_93递减至formula_9的值，依次赋值到局部变量formula_44，这里将大于formula_9的formula_44值累乘至formula_38。当重复结束之时，值formula_38就包含了变元的阶乘。
Zuse还定义了用户类型formula_100表示自然数，formula_101表示非负整数，formula_102表示非负分数，formula_103表示全部分数，formula_104表示复数。迭代算子formula_105、formula_106和formula_92接受一个非负整数formula_4，formula_105只重复formula_4次而不赋值局部变量，formula_106重复时将从formula_9递增至formula_113的值赋值给局部变量formula_44；迭代算子formula_115、formula_116和formula_117接受两个非负整数formula_118并赋值到局部变量formula_44，formula_115在formula_121时从formula_4递增至formula_123，formula_116在formula_125时从formula_4递减至formula_127，formula_117在formula_121时从formula_4递增至formula_123而在formula_125时从formula_4递减至formula_127。使用formula_135，可以省略formula_90的初始值设置，和formula_137的守卫条件判断。