Paradigma | Procesal |
---|---|
Diseñado por | Konrad Zuse |
Apareció por primera vez | 1948 ( 1948 ) | : se publicó el primer concepto
Implementaciones principales | |
Compilador de calco de plancton de la FU Berlín en 2000 | |
Influenciado | |
Superplan , ALGOL 58 [1] |
Plankalkül ( pronunciación alemana: [ˈplaːnkalkyːl] ) es un lenguaje de programación diseñado para fines de ingeniería por Konrad Zuse entre 1942 y 1945. Fue el primer lenguaje de programación de alto nivel diseñado para una computadora.
Kalkül (del latín calculus ) es el término alemán para un sistema formal —como en Hilbert-Kalkül , el nombre original del sistema de deducción de estilo Hilbert— , por lo que Plankalkül se refiere a un sistema formal para la planificación. [2]
En el campo de la creación de máquinas de computación, Zuse fue autodidacta y las desarrolló sin conocimiento sobre otras máquinas de computación mecánicas que ya existían, aunque más tarde (construyendo la Z3 ) se inspiró en el libro de Hilbert y Ackermann sobre lógica matemática elemental (ver Principios de lógica matemática ). [3] : 113, 152, 216 Para describir circuitos lógicos, Zuse inventó su propio diagrama y sistema de notación, al que llamó "combinatoria de condicionales" ( en alemán : Bedingungskombinatorik ). Después de terminar la Z1 en 1938, Zuse descubrió que el cálculo que había ideado independientemente ya existía y se conocía como cálculo proposicional . [4] : 3 Sin embargo, lo que Zuse tenía en mente necesitaba ser mucho más poderoso (el cálculo proposicional no es Turing-completo y no es capaz de describir ni siquiera cálculos aritméticos simples [5] ). En mayo de 1939, describió sus planes para el desarrollo de lo que se convertiría en Plankalkül. [3] : 113, 152, 216 Escribió lo siguiente en su cuaderno:
Seit etwa einem halben Jahr allmähliches Einführen in die formale Logik. Viele meiner früheren Gedanken habe ich dort wiedergefunden. (Bedingungskombinatorik = Aussagenlogik; Lehre von den Intervallen = Gebietenkalkül). Ich plane jetzt die Aufsetzung des 'Plankalküls'. Hierzu sind eine Reihe von Begriffen zu klären. | Casi medio año de introducción gradual a la lógica formal. Allí redescubrí muchas de mis reflexiones anteriores (combinatoria de condicionales = cálculo proposicional ; estudio de intervalos = teoría de retículos ). Ahora planeo incorporar el "Cálculo de planes" a esta materia. Para ello es necesario aclarar una serie de conceptos. |
—Cuaderno de Konrad Zuse [4] : 3 |
Mientras trabajaba en su tesis doctoral, Zuse desarrolló el primer sistema formal conocido de notación de algoritmos [6] : 9 capaz de manejar ramas y bucles. [7] : 18 [3] : 56 En 1942 comenzó a escribir un programa de ajedrez en Plankalkül. [3] : 216–217 En 1944, Zuse se reunió con el lógico y filósofo alemán Heinrich Scholz , quien expresó su aprecio por la utilización del cálculo lógico por parte de Zuse . [8] En 1945, Zuse describió Plankalkül en un libro inédito. [9] Sin embargo, el colapso de la Alemania nazi le impidió enviar su manuscrito. [7] : 18
En ese momento, las únicas dos computadoras que funcionaban en el mundo eran ENIAC y Harvard Mark I , ninguna de las cuales usaba un compilador, y ENIAC necesitaba ser reprogramada para cada tarea cambiando la forma en que se conectaban los cables. [4] : 3
Aunque la mayoría de sus computadoras fueron destruidas por las bombas aliadas, Zuse pudo rescatar una máquina, la Z4 , y trasladarla al pueblo alpino de Hinterstein [6] : 8 (parte de Bad Hindelang ).
El primer intento de idear un lenguaje algorítmico lo realizó K. Zuse en 1948. Su notación era bastante general, pero la propuesta nunca alcanzó la consideración que merecía.
— Heinz Rutishauser , creador de ALGOL
Incapaz de seguir construyendo computadoras –lo que también estaba prohibido por las Potencias Aliadas [10] – Zuse dedicó su tiempo al desarrollo de un modelo y lenguaje de programación de nivel superior. [7] : 18 En 1948, publicó un artículo en el Archiv der Mathematik y lo presentó en la Reunión Anual del GAMM . [3] : 89 Su trabajo no logró atraer mucha atención. [ cita requerida ] En una conferencia de 1957, Zuse expresó su esperanza de que Plankalkül, "después de algún tiempo como La Bella Durmiente , aún cobrara vida". [4] : 3 Expresó su decepción porque los diseñadores de ALGOL 58 nunca reconocieron la influencia de Plankalkül en su propio trabajo. [7] : 18 [6] : 15
Plankalkül se volvió a publicar con comentarios en 1972. [11] El primer compilador para Plankalkül fue implementado por Joachim Hohmann en su disertación de 1975. [12] Otras implementaciones independientes siguieron en 1998 [13] y 2000 en la Universidad Libre de Berlín . [4] : 2
Plankalkül ha sido comparado con el lenguaje APL y con el álgebra relacional . Incluye instrucciones de asignación, subrutinas , instrucciones condicionales, iteración, aritmética de punto flotante , matrices, estructuras de registros jerárquicos, aserciones, manejo de excepciones y otras características avanzadas como la ejecución dirigida a objetivos. Plankalkül proporciona una estructura de datos llamada gráfico generalizado ( verallgemeinerter Graph ), que se puede utilizar para representar estructuras geométricas. [14]
Muchas características del Plankalkül reaparecen en lenguajes de programación posteriores; una excepción es su notación bidimensional idiosincrásica que utiliza múltiples líneas.
Algunas características del Plankalkül: [3] : 217
El único tipo de datos primitivo en el Plankalkül es un bit único o booleano ( en alemán : Ja-Nein-Werte – valor sí-no en la terminología de Zuse). Se denota por el identificador . Todos los demás tipos de datos son compuestos y se construyen a partir de primitivos por medio de "matrices" y "registros". [15] : 679
Por lo tanto, una secuencia de ocho bits (que en la informática moderna podría considerarse como byte ) se denota por , y una matriz booleana de tamaño por se describe por . También existe una notación abreviada, por lo que se podría escribir en lugar de . [15] : 679
El tipo puede tener dos valores posibles y . Por lo tanto, una secuencia de 4 bits se puede escribir como L00L, pero en los casos en que dicha secuencia represente un número, el programador puede utilizar la representación decimal 9. [15] : 679
Registro de dos componentes y se escribe como . [15] : 679
El tipo ( en alemán : Art ) en Plankalkül consta de 3 elementos: valor estructurado ( en alemán : Struktur ), significado pragmático ( en alemán : Typ ) y posible restricción de valores posibles ( en alemán : Beschränkung ). [15] : 679 Los tipos definidos por el usuario se identifican con la letra A con un número, como – primer tipo definido por el usuario.
Zuse utilizó muchos ejemplos de la teoría del ajedrez: [15] : 680
Coordenadas del tablero de ajedrez (tiene un tamaño de 8x8 por lo que 3 piezas son suficientes) | ||
cuadrado del tablero (por ejemplo L00, 00L denota e2 en notación algebraica ) | ||
pieza (por ejemplo, 00L0 — rey blanco) | ||
pieza en un tablero (por ejemplo L00, 00L; 00L0 — rey blanco en e2) | ||
Tablero (posiciones de las piezas, describe qué pieza contiene cada uno de los 64 cuadrados) | ||
Estado del juego ( — tablero, — jugador a mover, — posibilidad de enroque (2 para blancas y 2 para negras), — información sobre la casilla en la que es posible realizar un movimiento al paso |
Los identificadores son caracteres alfanuméricos con un número. [15] : 679 Existen los siguientes tipos de identificadores para variables: [9] : 10
Una variable particular de algún tipo se identifica mediante un número, escrito debajo del tipo. [15] : 679 Por ejemplo:
Los programas y subprogramas se marcan con una letra P, seguida de un número de programa (y opcionalmente de subprograma). Por ejemplo , . [15] : 679
El valor de salida del programa guardado allí en la variable está disponible para otros subprogramas bajo el identificador , y leer el valor de esa variable también significa ejecutar el subprograma relacionado. [15] : 680
Plankalkül permite el acceso a elementos separados de una variable mediante el uso del "índice de componentes" ( en alemán : Komponenten-Index ). Cuando, por ejemplo, el programa recibe una entrada en una variable de tipo (estado del juego), entonces — proporciona el estado del tablero, — la pieza en la casilla número i y el número de bit j de esa pieza. [15] : 680
En los lenguajes de programación modernos, esto se describiría mediante una notación similar a V0[0]
, V0[0][i]
, V0[0][i][j]
(aunque para acceder a un solo bit en los lenguajes de programación modernos normalmente se utiliza una máscara de bits ).
Debido a que los índices de las variables se escriben verticalmente, cada instrucción de Plankalkül requiere varias filas para escribirse. [ cita requerida ]
La primera fila contiene el tipo de variable, luego el número de variable marcado con la letra V ( en alemán : Variablen-Index ), luego los índices de los subcomponentes de la variable marcados con K ( en alemán : Komponenten-Index ) y luego ( en alemán : Struktur-Index ) marcados con S, que describe el tipo de variable. El tipo no es obligatorio, pero Zuse señala que esto ayuda a leer y comprender el programa. [15] : 681
En los tipos de línea y se podría acortar a y . [15] : 681
Ejemplos:
variable V3 — lista de pares de valores de tipo | |
La fila K se puede omitir cuando está vacía. Por lo tanto, esta expresión significa lo mismo que la anterior. | |
El valor de ocho bits (índice 7), del primer par (índice 0), del i-ésimo elemento de la variable V3, tiene tipo booleano ( ). |
Los índices no solo pueden ser constantes. Las variables pueden utilizarse como índices para otras variables, y esto se marca con una línea que muestra en qué componente se utilizaría el valor del índice de la variable:
Elemento Z5 de la variable V3. Equivalente a la expresión V3[Z5] en muchos lenguajes de programación modernos. [15] : 681 |
Zuse introdujo en su cálculo un operador de asignación, desconocido en matemáticas hasta entonces. Lo marcó con « » y lo llamó signo de rendimiento ( en alemán : Ergibt-Zeichen ). El uso del concepto de asignación es una de las diferencias clave entre las matemáticas y la informática. [6] : 14
Zuse escribió que la expresión:
es análoga a la ecuación matemática más tradicional:
Hay afirmaciones de que Konrad Zuse utilizó inicialmente el glifocomo señal de asignación, y comenzó a usarse bajo la influencia de Heinz Rutishauser . [15] : 681 Knuth y Pardo creen que Zuse siempre escribió , y quefue introducido por los editores de «Über den allgemeinen Plankalkül als Mittel zur Formulierung esquematisch-kombinativer Aufgaben» en 1948. [6] : 14 En la conferencia ALGOL 58 en Zurich, los participantes europeos propusieron utilizar el carácter de asignación introducido por Zuse, pero el americano La delegación insistió :=
. [15] : 681
La variable que almacena el resultado de una asignación ( valor l ) se escribe en el lado derecho del operador de asignación. [6] : 14 La primera asignación a la variable se considera una declaración. [15] : 681
El lado izquierdo del operador de asignación se utiliza para una expresión ( en alemán : Ausdruck ), que define qué valor se asignará a la variable. Las expresiones pueden utilizar operadores aritméticos, operadores booleanos y operadores de comparación ( etc.). [15] : 682
La operación de exponenciación se escribe de manera similar a la operación de indexación, utilizando líneas en la notación bidimensional: [9] : 45
Los valores booleanos se representaban como números enteros con FALSE=0
y TRUE=1
. El flujo de control condicional tomó la forma de una declaración protegida A -> B
, que ejecutaba el bloque B
si A
era verdadero. También había un operador de iteración, de la forma W { A -> X; B -> Y
} que se repetía hasta que todas las protecciones fueran falsas. [16]
Zuse denominó a un único programa Rechenplan ("plan de cálculo"). Imaginó lo que llamó Planfertigungsgerät ("dispositivo de montaje de planes"), que traduciría automáticamente la formulación matemática de un programa en una película perforada legible por máquina , algo que hoy se llamaría traductor o compilador . [3] : 45, 104, 105
La notación original era bidimensional. [ aclaración necesaria ] Para una implementación posterior en la década de 1990, se desarrolló una notación lineal.
El siguiente ejemplo define una función max3
(en una transcripción lineal) que calcula el máximo de tres variables:
P1 máx3 (V0[:8.0],V1[:8.0],V2[:8.0]) → R0[:8.0]máx(V0[:8.0],V1[:8.0]) → Z1[:8.0]máx(Z1[:8.0],V2[:8.0]) → R0[:8.0]FINP2 máx. (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]FIN