Template:Short description Template:Distinguish Template:Use dmy dates Template:Use list-defined references Template:Infobox programming language Plankalkül ({{#invoke:IPA|main}}) is a programming language designed for engineering purposes by Konrad Zuse between 1942 and 1945. It was the first high-level programming language to be designed for a computer. Zuse never implemented Plankalkül on any of his Z-series machines.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>

Kalkül (from Latin calculus) is the German term for a formal system—as in Hilbert-Kalkül, the original name for the Hilbert-style deduction system—so Plankalkül refers to a formal system for planning.<ref name="Zenil_2012"/>

History of programmingEdit

In the domain of creating computing machines, Zuse was self-taught, and developed them without knowledge about other mechanical computing machines that existed already – although later on (building the Z3) being inspired by Hilbert's and Ackermann's book on elementary mathematical logic (see Principles of Mathematical Logic).<ref name="Hellige_2004"/>Template:Rp To describe logical circuits, Zuse invented his own diagram and notation system, which he called "combinatorics of conditionals" (Template:Langx). After finishing the Z1 in 1938, Zuse discovered that the calculus he had independently devised already existed and was known as propositional calculus.<ref name="Rojas-Göktekin-Friedland-Krüger-Kuniß-Langmack_2004"/>Template:Rp What Zuse had in mind, however, needed to be much more powerful (propositional calculus is not Turing-complete and is not able to describe even simple arithmetic calculations<ref name="Turing_2013"/>). In May 1939, he described his plans for the development of what would become Plankalkül.<ref name="Hellige_2004"/>Template:Rp He wrote the following in his notebook:

Template:Verse translation

File:"Konrad Zuse-Haus" in Bruck 2.jpg
Historical marker on house in Template:Ill where Zuse worked on Plankalkül

While working on his doctoral dissertation, Zuse developed the first known formal system of algorithm notation<ref name="Knuth-Pardo_1976"/>Template:Rp capable of handling branches and loops.<ref name="Giloi_1997"/>Template:Rp<ref name="Hellige_2004"/>Template:Rp In 1942 he began writing a chess program in Plankalkül.<ref name="Hellige_2004"/>Template:Rp In 1944, Zuse met with the German logician and philosopher Heinrich Scholz, who expressed appreciation for Zuse's utilization of logical calculus.<ref name="Petzold_1992"/> In 1945, Zuse described Plankalkül in an unpublished book.<ref name="Zuse_1945"/> The collapse of Nazi Germany, however, prevented him from submitting his manuscript.<ref name="Giloi_1997"/>Template:Rp

At that time the only two working computers in the world were ENIAC and Harvard Mark I, neither of which used a compiler, and ENIAC needed to be reprogrammed for each task by changing how the wires were connected.<ref name="Rojas-Göktekin-Friedland-Krüger-Kuniß-Langmack_2004"/>Template:Rp

Although most of his computers were destroyed by Allied bombs, Zuse was able to rescue one machine, the Z4, and move it to the Alpine village of Hinterstein<ref name="Knuth-Pardo_1976"/>Template:Rp (part of Bad Hindelang).

Template:Cquote

Unable to continue building computers – which was also forbidden by the Allied Powers<ref name="Coy_2004"/> – Zuse devoted his time to the development of a higher-level programming model and language.<ref name="Giloi_1997"/>Template:Rp In 1948, he published a paper in the Archiv der Mathematik and presented at the Annual Meeting of the GAMM.<ref name="Hellige_2004"/>Template:Rp His work failed to attract much attention.Template:Citation needed In a 1957 lecture, Zuse expressed his hope that Plankalkül, "after some time as a Sleeping Beauty, will yet come to life."<ref name="Rojas-Göktekin-Friedland-Krüger-Kuniß-Langmack_2004"/>Template:Rp He expressed disappointment that the designers of ALGOL 58 never acknowledged the influence of Plankalkül on their own work.<ref name="Giloi_1997"/>Template:Rp<ref name="Knuth-Pardo_1976"/>Template:Rp

Plankalkül was republished with commentary in 1972.<ref name="Zuse_1972"/> The first compiler for Plankalkül was implemented by Joachim Hohmann in his 1975 dissertation.<ref name="Hohmann_1979"/> Other independent implementations followed in 1998<ref name="Mauerer_2016"/> and 2000 at the Free University of Berlin.<ref name="Rojas-Göktekin-Friedland-Krüger-Kuniß-Langmack_2004"/>Template:Rp

DescriptionEdit

Plankalkül has drawn comparisons to the language APL, and to relational algebra. It includes assignment statements, subroutines, conditional statements, iteration, floating-point arithmetic, arrays, hierarchical record structures, assertions, exception handling, and other advanced features such as goal-directed execution. The Plankalkül provides a data structure called generalized graph ({{#invoke:Lang|lang}}), which can be used to represent geometrical structures.<ref name="Giloi_1990"/>

Many features of the Plankalkül reappear in later programming languages; an exception is its idiosyncratic two-dimensional notation using multiple lines.

Some features of the Plankalkül:<ref name="Hellige_2004"/>Template:Rp

  • only local variables
  • functions do not support recursion
  • only supports call by value
  • composite types are arrays and tuples
  • contains conditional expressions
  • contains a for loop and a while loop
  • no goto

Data typesEdit

The only primitive data type in the Plankalkül is a single bit or Boolean (Template:Langx – yes-no value in Zuse's terminology). It is denoted by the identifier <math>S0</math>. All the further data types are composite, and build up from primitive by means of "arrays" and "records".<ref name="Bauer-Wössner_1972"/>Template:Rp

So, a sequence of eight bits (which in modern computing could be regarded as byte) is denoted by <math>8 \times S0</math>, and Boolean matrix of size <math>m</math> by <math>n</math>  is described by <math>m \times n \times S0</math>. There also exists a shortened notation, so one could write <math>S1 \cdot n</math> instead of <math>n \times S0</math>.<ref name="Bauer-Wössner_1972"/>Template:Rp

Type <math>S0</math> could have two possible values <math>0</math> and <math>L</math>. So 4-bit sequence could be written like L00L, but in cases where such a sequence represents a number, the programmer could use the decimal representation 9.<ref name="Bauer-Wössner_1972"/>Template:Rp

Record of two components <math>\sigma</math> and <math>\tau</math> is written as <math>(\sigma, \tau)</math>.<ref name="Bauer-Wössner_1972"/>Template:Rp

Type (Template:Langx) in Plankalkül consists of 3 elements: structured value (Template:Langx), pragmatic meaning (Template:Langx) and possible restriction on possible values (Template:Langx).<ref name="Bauer-Wössner_1972"/>Template:Rp User defined types are identified by letter A with number, like <math>A1</math> – first user defined type.

ExamplesEdit

Zuse used a lot of examples from chess theory:<ref name="Bauer-Wössner_1972"/>Template:Rp

<math>A1</math> <math>S1 \cdot 3</math> Coordinate of chess board (it has size 8x8 so 3 bits are just enough)
<math>A2</math> <math>2 \times A1</math> square of the board (for example L00, 00L denotes e2 in algebraic notation)
<math>A3</math> <math>S1 \cdot 4</math> piece (for example, 00L0 — white king)
<math>A4</math> <math>(A2, A3)</math> piece on a board (for example L00, 00L; 00L0 — white king on e2)
<math>A5</math> <math>64 \times A3</math> board (pieces positions, describes which piece each of 64 squares contains)
<math>A10</math> <math>(A5, S0, S1 \cdot 4, A2)</math> game state (<math>A5</math> — board, <math>S0</math> — player to move, <math>S1 \cdot 4</math> — possibility of castling (2 for white and 2 for black), <math>A2</math> — information about cell on which en passant move is possible

IdentifiersEdit

Identifiers are alphanumeric characters with a number.<ref name="Bauer-Wössner_1972"/>Template:Rp There are the following kinds of identifiers for variables:<ref name="Zuse_1945"/>Template:Rp

Particular variable of some kind is identified by number, written under the kind.<ref name="Bauer-Wössner_1972"/>Template:Rp For example:

<math>\begin{matrix} V \\ 0 \end{matrix}</math>, <math>\begin{matrix} Z \\ 2 \end{matrix}</math>, <math>\begin{matrix} C \\ 31 \end{matrix}</math> etc.

Programs and subprograms are marked with a letter P, followed by a program (and optionally a subprogram) number. For example <math>P13</math>, <math>P5 \cdot 7</math>.<ref name="Bauer-Wössner_1972"/>Template:Rp

Output value of program <math>P13</math> saved there in variable <math>\begin{matrix} R \\ 0 \end{matrix}</math> is available for other subprograms under the identifier <math>\begin{matrix} R17 \\ 0 \end{matrix}</math>, and reading value of that variable also means executing related subprogram.<ref name="Bauer-Wössner_1972"/>Template:Rp

Accessing elements by indexEdit

Plankalkül allows access for separate elements of variable by using "component index" (Template:Langx). When, for example, program receives input in variable <math>\begin{matrix} V \\ 0 \end{matrix}</math> of type <math>A10</math> (game state), then <math>\begin{matrix} V \\ 0 \\ 0 \end{matrix}</math> — gives board state, <math>\begin{matrix} V \\ 0 \\ 0 \cdot i \end{matrix}</math> — piece on square number i, and <math>\begin{matrix} V \\ 0 \\ 0 \cdot i \cdot j \end{matrix}</math> bit number j of that piece.<ref name="Bauer-Wössner_1972"/>Template:Rp

In modern programming languages, that would be described by notation similar to V0[0], V0[0][i], V0[0][i][j] (although to access a single bit in modern programming languages a bitmask is typically used).

Two-dimensional syntaxEdit

Because indexes of variables are written vertically, each Plankalkül instruction requires multiple rows to write down.Template:Citation needed

First row contains variable kind, then variable number marked with letter V (Template:Langx), then indexes of variable subcomponents marked with K (Template:Langx), and then (Template:Langx) marked with S, which describes variable type. Type is not required, but Zuse notes that this helps with reading and understanding the program.<ref name="Bauer-Wössner_1972"/>Template:Rp

In the line <math>S</math> types <math>S0</math> and <math>S1</math> could be shortened to <math>0</math> and <math>1</math>.<ref name="Bauer-Wössner_1972"/>Template:Rp

Examples:

l}
   & V \\ 
 V & 3 \\
 K & \\
 S & m \times 2 \times 1 \cdot n
\end{array}</math>
variable V3 — list of <math>m</math> pairs of values of type <math>S1 \cdot n</math>
l}
   & V \\ 
 V & 3 \\
 S & m \times 2 \times 1 \cdot n
\end{array}</math>
Row K could be skipped when it is empty. Therefore, this expression means the same as above.
l}
   & V \\ 
 V & 3 \\
 K & i \cdot 0 \cdot 7 \\
 S & 0
\end{array}</math>
Value of eights bit (index 7), of first (index 0) pair, of і-th element of variable V3, has Boolean type (<math>S0</math>).

Indexes could be not only constants. Variables could be used as indexes for other variables, and that is marked with a line, which shows in which component index would value of variable be used:

Using variable as index for other variable, in 2d Plankalül notation Z5-th element of variable V3. Equivalent to expression V3[Z5] in many modern programming languages.<ref name="Bauer-Wössner_1972"/>Template:Rp

Assignment operationEdit

Zuse introduced in his calculus an assignment operator, unknown in mathematics before him. He marked it with «<math>\Rightarrow</math>», and called it yields-sign (Template:Langx). Use of concept of assignment is one of the key differences between mathematics and computer science.<ref name="Knuth-Pardo_1976"/>Template:Rp

Zuse wrote that the expression:

<math>\begin{array}{r|lll}
   & Z + 1 & \Rightarrow & Z\\ 
 V & 1     &             & 1\\
\end{array}</math>

is analogous to the more traditional mathematical equation:

<math>\begin{array}{r|lll}
   & Z + 1 & =  & Z\\ 
 V & 1     &    & 1\\
 K & i     &    & i + 1\\
\end{array}</math>

There are claims that Konrad Zuse initially used the glyph File:Ergibt-Zeichen.png as a sign for assignment, and started to use <math>\Rightarrow</math> under the influence of Heinz Rutishauser.<ref name="Bauer-Wössner_1972"/>Template:Rp Knuth and Pardo believe that Zuse always wrote <math>\Rightarrow</math>, and that File:Ergibt-Zeichen.png was introduced by publishers of «Über den allgemeinen Plankalkül als Mittel zur Formulierung schematisch-kombinativer Aufgaben» in 1948.<ref name="Knuth-Pardo_1976"/>Template:Rp In the ALGOL 58 conference in Zürich, European participants proposed to use the assignment character introduced by Zuse, but the American delegation insisted on :=.<ref name="Bauer-Wössner_1972"/>Template:Rp

The variable that stores the result of an assignment (l-value) is written to the right side of assignment operator.<ref name="Knuth-Pardo_1976"/>Template:Rp The first assignment to the variable is considered to be a declaration.<ref name="Bauer-Wössner_1972"/>Template:Rp

The left side of assignment operator is used for an expression (Template:Langx), that defines which value will be assigned to the variable. Expressions could use arithmetic operators, Boolean operators, and comparison operators (<math>=, \neq, \leq</math> etc.).<ref name="Bauer-Wössner_1972"/>Template:Rp

The exponentiation operation is written similarly to the indexing operation - using lines in the two-dimensional notation:<ref name="Zuse_1945"/>Template:Rp

Exponentiation notation in Plankalkül

Control flowEdit

Boolean values were represented as integers with <syntaxhighlight lang="text" class="" style="" inline="1">FALSE=0</syntaxhighlight> and <syntaxhighlight lang="text" class="" style="" inline="1">TRUE=1</syntaxhighlight>. Conditional control flow took the form of a guarded statement <syntaxhighlight lang="text" class="" style="" inline="1">A -> B</syntaxhighlight>, which executed the block <syntaxhighlight lang="text" class="" style="" inline="1">B</syntaxhighlight> if <syntaxhighlight lang="text" class="" style="" inline="1">A</syntaxhighlight> was true. There was also an iteration operator, of the form <syntaxhighlight lang="text" class="" style="" inline="1">W { A -> X; B -> Y </syntaxhighlight>} which repeats until all guards are false.<ref name="Rojas_2001"/>

TerminologyEdit

Zuse called a single program a Rechenplan ("computation plan"). He envisioned what he called a Planfertigungsgerät ("plan assembly device"), which would automatically translate the mathematical formulation of a program into machine-readable punched film stock, something today would be called a translator or compiler.<ref name="Hellige_2004"/>Template:Rp

ExampleEdit

The original notation was two-dimensional, i.e. the indentation and thus spatial relation of different terminal symbols mattered in regard to the semantics spanning multiple lines. For a later implementation in the 1990s, a linear notation was developed.

The following example defines a function max3 (in a linear transcription) that calculates the maximum of three variables:

P1 max3 (V0[:8.0],V1[:8.0],V2[:8.0]) → R0[:8.0]
max(V0[:8.0],V1[:8.0]) → Z1[:8.0]
max(Z1[:8.0],V2[:8.0]) → R0[:8.0]
END
P2 max (V0[:8.0],V1[:8.0]) → R0[:8.0]
V0[:8.0] → Z1[:8.0]
(Z1[:8.0] < V1[:8.0]) → V1[:8.0] → Z1[:8.0]
Z1[:8.0] → R0[:8.0]
END

See alsoEdit

ReferencesEdit

Template:Reflist

Further readingEdit

|CitationClass=web }} (24 pages)

External linksEdit

  • {{#invoke:citation/CS1|citation

|CitationClass=web }} (NB. Plankalkül Java applets and documents.)

Template:Authority control