Парадигма | Процедурный |
---|---|
Разработано | Конрад Цузе |
Впервые появился | 1948 ( 1948 ) | – концепция впервые опубликована
Основные внедрения | |
Plankalkül-Compiler , Свободный университет Берлина, 2000 г. | |
Под влиянием | |
Суперплан , АЛГОЛ 58 [1] |
Plankalkül ( немецкое произношение: [ˈplaːnkalkyːl] ) — язык программирования, разработанный для инженерных целей Конрадом Цузе между 1942 и 1945 годами. Это был первый язык программирования высокого уровня , разработанный для компьютера.
Kalkül (от латинского calculus ) — немецкий термин для формальной системы , как в Hilbert-Kalkül , первоначальном названии дедуктивной системы в стиле Гильберта , поэтому Plankalkül относится к формальной системе планирования. [2]
В области создания вычислительных машин Цузе был самоучкой и разрабатывал их, не имея знаний о других уже существовавших механических вычислительных машинах, хотя позже (при создании Z3 ) он был вдохновлен книгой Гильберта и Аккермана по элементарной математической логике (см. Принципы математической логики ). [3] : 113, 152, 216 Для описания логических схем Цузе придумал собственную схему и систему обозначений, которую назвал «комбинаторикой условных выражений» ( нем . Bedingungskombinatorik ). Закончив Z1 в 1938 году, Цузе обнаружил, что независимо разработанное им исчисление уже существовало и было известно как исчисление высказываний . [4] : 3 Однако Цузе имел в виду нечто гораздо более мощное (исчисление высказываний не является полным по Тьюрингу и не способно описывать даже простые арифметические вычисления [5] ). В мае 1939 года он описал свои планы по развитию того, что впоследствии стало Планкалкюлем. [3] : 113, 152, 216 Он записал в своей записной книжке следующее:
Seit etwa einem halben Jahr allmähliches Einführen в формальной логике. Viele meiner früheren Gedanken habe ich dort wiedergefunden. (Bedingungskombinatorik = Aussagenlogik; Lehre von den Intervallen = Gebietenkalkül). Я планирую выполнить Aufsetzung des Plankalküls. Hierzu sind eine Reihe von Begriffen zu klären. | Почти полгода постепенного введения в формальную логику. Я заново открыл там много своих прежних мыслей. (комбинаторика условных выражений = исчисление высказываний ; изучение интервалов = теория решеток ). Теперь я планирую принять "Исчисление планов" на это. Для этого нужно прояснить ряд понятий. |
—Записная книжка Конрада Цузе [4] : 3 |
Работая над докторской диссертацией, Цузе разработал первую известную формальную систему записи алгоритмов [6] : 9, способную обрабатывать ветви и циклы. [7] : 18 [3] : 56 В 1942 году он начал писать шахматную программу на языке Plankalkül. [3] : 216–217 В 1944 году Цузе встретился с немецким логиком и философом Генрихом Шольцем , который выразил признательность Цузе за использование логического исчисления . [8] В 1945 году Цузе описал Plankalkül в неопубликованной книге. [9] Однако крах нацистской Германии помешал ему представить свою рукопись. [7] : 18
В то время в мире существовало всего два работающих компьютера: ENIAC и Harvard Mark I , ни один из которых не использовал компилятор, и ENIAC приходилось перепрограммировать для каждой задачи, меняя способ подключения проводов. [4] : 3
Хотя большинство его компьютеров были уничтожены бомбами союзников, Цузе удалось спасти одну машину, Z4 , и перевезти ее в альпийскую деревню Хинтерштайн [6] : 8 (часть Бад-Хинделанга ).
Первая попытка разработать алгоритмический язык была предпринята в 1948 году К. Цузе. Его обозначения были весьма общими, но предложение так и не получило должного внимания.
— Хайнц Рутисхаузер , создатель АЛГОЛА
Не имея возможности продолжать строить компьютеры, что также было запрещено союзными державами [10] , Цузе посвятил свое время разработке модели и языка программирования более высокого уровня. [7] : 18 В 1948 году он опубликовал статью в Archiv der Mathematik и представил ее на ежегодном собрании GAMM . [ 3] : 89 Его работа не привлекла особого внимания. [ необходима цитата ] В лекции 1957 года Цузе выразил надежду, что Plankalkül, «после некоторого времени в виде Спящей красавицы , все же оживет». [4] : 3 Он выразил разочарование тем, что разработчики ALGOL 58 никогда не признавали влияние Plankalkül на их собственную работу. [7] : 18 [6] : 15
Plankalkül был переиздан с комментариями в 1972 году. [11] Первый компилятор для Plankalkül был реализован Иоахимом Хохманном в его диссертации 1975 года. [12] Другие независимые реализации последовали в 1998 [13] и 2000 годах в Свободном университете Берлина . [4] : 2
Plankalkül проводит сравнения с языком APL и реляционной алгеброй . Он включает в себя операторы присваивания, подпрограммы , условные операторы, итерацию, арифметику с плавающей точкой , массивы, иерархические структуры записей, утверждения, обработку исключений и другие расширенные функции, такие как целенаправленное выполнение. Plankalkül предоставляет структуру данных, называемую обобщенным графом ( verallgemeinerter Graph ), которая может использоваться для представления геометрических структур. [14]
Многие черты Планкалкюля вновь появляются в более поздних языках программирования; исключением является его своеобразная двумерная нотация с использованием нескольких строк.
Некоторые особенности Планкалкюля: [3] : 217
Единственный примитивный тип данных в Plankalkül — это один бит или Boolean ( нем . Ja-Nein-Werte — значение «да-нет» в терминологии Цузе). Он обозначается идентификатором . Все последующие типы данных являются составными и строятся из примитивных с помощью «массивов» и «записей». [15] : 679
Так, последовательность из восьми бит (которая в современных вычислениях может рассматриваться как байт ) обозначается как , а булева матрица размером описывается как . Существует также сокращенная запись, поэтому можно написать вместо . [15] : 679
Тип может иметь два возможных значения и . Таким образом, 4-битная последовательность может быть записана как L00L, но в случаях, когда такая последовательность представляет число, программист может использовать десятичное представление 9. [15] : 679
Запись двух компонентов и записывается как . [15] : 679
Тип ( нем . Art ) в Plankalkül состоит из 3 элементов: структурированное значение ( нем . Struktur ), прагматическое значение ( нем . Typ ) и возможное ограничение возможных значений ( нем . Beschränkung ). [15] : 679 Пользовательские типы обозначаются буквой A с цифрой, например – первый пользовательский тип.
Цузе использовал много примеров из теории шахмат: [15] : 680
Координаты шахматной доски (она имеет размер 8x8, поэтому 3 бита вполне достаточно) | ||
квадрат доски (например, L00, 00L обозначает e2 в алгебраической нотации ) | ||
фигура (например, 00L0 — белый король) | ||
фигура на доске (например, L00, 00L; 00L0 — белый король на e2) | ||
доска (расположение фигур, описание того, какая фигура находится на каждом из 64 квадратов) | ||
состояние игры ( — доска, — игрок, который должен сделать ход, — возможность рокировки (2 для белых и 2 для черных), — информация о клетке, на которой возможен ход на проходе |
Идентификаторы — это буквенно-цифровые символы с номером. [15] : 679 Существуют следующие виды идентификаторов для переменных: [9] : 10
Конкретная переменная некоторого вида идентифицируется числом, написанным под видом. [15] : 679 Например:
Программы и подпрограммы обозначаются буквой P, за которой следует номер программы (и, возможно, подпрограммы). Например , . [15] : 679
Выходное значение программы, сохраненное в переменной, доступно для других подпрограмм под этим идентификатором , а чтение значения этой переменной также означает выполнение связанной подпрограммы. [15] : 680
Plankalkül позволяет получить доступ к отдельным элементам переменной с помощью «индекса компонента» ( нем . Komponenten-Index ). Когда, например, программа получает входные данные в переменной типа (состояние игры), то — выдает состояние доски, — фигуру на поле номер i и бит номер j этой фигуры. [15] : 680
В современных языках программирования это можно описать с помощью записи, похожей на V0[0]
, V0[0][i]
, V0[0][i][j]
(хотя для доступа к отдельному биту в современных языках программирования обычно используется битовая маска ).
Поскольку индексы переменных записываются вертикально, для записи каждой инструкции Plankalkül требуется несколько строк. [ необходима ссылка ]
Первая строка содержит вид переменной, затем номер переменной, обозначенный буквой V ( нем . Variablen-Index ), затем индексы подкомпонентов переменной, обозначенные буквой K ( нем . Komponenten-Index ), а затем ( нем . Struktur-Index ), обозначенные буквой S, которая описывает тип переменной. Тип не обязателен, но Цузе отмечает, что это помогает при чтении и понимании программы. [15] : 681
В строках типов и можно сократить до и . [15] : 681
Примеры:
переменная V3 — список пар значений типа | |
Строка K может быть пропущена, если она пуста. Поэтому это выражение означает то же самое, что и выше. | |
Значение восьмого бита (индекс 7), первой (индекс 0) пары, і-го элемента переменной V3, имеет логический тип ( ). |
Индексы могут быть не только константами. Переменные могут использоваться как индексы для других переменных, и это отмечено линией, которая показывает, в каком компоненте индекса будет использоваться значение переменной:
Z5-й элемент переменной V3. Эквивалент выражения V3[Z5] во многих современных языках программирования. [15] : 681 |
Цузе ввел в свое исчисление оператор присваивания, неизвестный в математике до него. Он обозначил его « », и назвал его yields-sign ( нем . Ergibt-Zeichen ). Использование концепции присваивания является одним из ключевых различий между математикой и информатикой. [6] : 14
Цузе писал, что выражение:
аналогично более традиционному математическому уравнению:
Есть утверждения, что Конрад Цузе изначально использовал этот глифкак знак для назначения, и начал использоваться под влиянием Хайнца Рутисхаузера . [15] : 681 Кнут и Пардо считают, что Цузе всегда писал , и чтобыл введен издателями «Über den allgemeinen Plankalkül als Mittel zur Formulierung Schetisch-Kombinativer Aufgaben » в 1948 году . делегация настаивала на . [15] : 681 :=
Переменная, которая хранит результат присваивания ( l-value ), записывается в правую часть оператора присваивания. [6] : 14 Первое присваивание переменной считается объявлением. [15] : 681
Левая часть оператора присваивания используется для выражения ( нем . Ausdruck ), которое определяет, какое значение будет присвоено переменной. Выражения могут использовать арифметические операторы, булевы операторы и операторы сравнения ( и т. д.). [15] : 682
Операция возведения в степень записывается аналогично операции индексации — с использованием строк в двумерной нотации: [9] : 45
Булевы значения были представлены как целые числа с FALSE=0
и TRUE=1
. Условный поток управления принял форму защищенного оператора A -> B
, который выполнял блок, B
если A
был истинным. Также был оператор итерации в форме W { A -> X; B -> Y
} , который повторяется до тех пор, пока все охранники не станут ложными. [16]
Цузе назвал одну программу Rechenplan («план вычислений»). Он представлял себе то, что он назвал Planfertigungsgerät («устройство сборки плана»), которое автоматически переводило бы математическую формулировку программы в машиночитаемую перфорированную кинопленку , что сегодня называется транслятором или компилятором . [3] : 45, 104, 105
Первоначальная нотация была двумерной. [ необходимо пояснение ] Для более поздней реализации в 1990-х годах была разработана линейная нотация.
В следующем примере определяется функция max3
(в линейной транскрипции), которая вычисляет максимальное из трех переменных:
P1 макс3 (V0[:8.0],V1[:8.0],V2[:8.0]) → R0[:8.0]макс(V0[:8.0],V1[:8.0]) → Z1[:8.0]max(Z1[:8.0],V2[:8.0]) → R0[:8.0]КОНЕЦP2 макс (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]КОНЕЦ