Планкалькюль (от нем. Plankalkül — «исчисление планов» или «формальная система для планирования вычислений») — исторически первый в мире язык программирования высокого уровня. Он был разработан выдающимся немецким инженером и пионером вычислительной техники Конрадом Цузе в период с 1942 по 1945 год. Язык предназначался для программирования первых электромеханических вычислительных машин, в частности, компьютеров Z3 и Z4. Планкалькюль заложил фундаментальные теоретические основы структурного программирования задолго до появления широко известных американских языков, таких как Фортран или Алгол.

История создания и публикации

Разработка языка происходила в сложнейших условиях изоляции Германии во время Второй мировой войны. Концепция Планкалькюля базировалась на глубоком изучении математической логики и трудов философских школ 1920–1930-х годов (в частности, Венского кружка и логических позитивистов). Первые черновые наброски формальной системы вычислений Цузе сделал в мае 1939 года, придя к выводу о необходимости унифицировать управление своими вычислительными устройствами (его первая машина Z1, завершенная в 1938 году, еще не имела системы программирования).

К 1942 году Конрад Цузе довел язык до состояния практической применимости и написал на нем сложный алгоритм — программу для игры в шахматы. В 1944 году он продемонстрировал свои наработки немецкому логику Генриху Шольцу, который высоко оценил теоретическую мощь предложенной системы. К 1945 году Цузе подготовил полноценную рукопись книги, подробно описывающей Планкалькюль, однако крушение нацистской Германии сделало публикацию невозможной.

Большинство созданных Цузе компьютеров было уничтожено в ходе бомбардировок союзников. Инженеру удалось спасти лишь одну машину — Z4, с которой он укрылся в небольшой альпийской деревне Гинтерштайн. Находясь там и не имея возможности вести практические инженерные разработки в условиях послевоенной оккупации, Цузе сосредоточился на шлифовке теоретических аспектов своего языка.

Первая официальная публикация материалов о Планкалькюле состоялась лишь в 1948 году в немецком научном журнале «Архив математики» (Archiv der Mathematik). По утверждениям самого создателя, именно из этой публикации американские инженеры могли почерпнуть многие фундаментальные идеи, которые впоследствии легли в основу западных языков программирования.

Парадигмы и синтаксис

Планкалькюль предвосхитил множество концепций, ставших стандартом для современных языков программирования. В нем были реализованы операторы присваивания, вызов подпрограмм, условные переходы, циклические конструкции (итерации) и сложные структуры данных (массивы и записи).

Уникальной и наиболее поразительной чертой Планкалькюля был его двумерный (матричный) синтаксис. В отличие от современных языков, где программный код пишется в виде последовательных линейных строк, программа на Планкалькюле записывалась в виде своеобразной таблицы или матрицы. Это было прямым следствием влияния классической математической логики. Операторы и инструкции располагались по горизонтали, а метаданные переменных (такие как тип или индекс) записывались вертикально под именем самой переменной. В этом двухмерном квадрате первая строка отводилась под идентификатор переменной, вторая — под ее порядковый номер, а последующие строки — под индексы.

Современная линейная транскрипция Планкалькюля, используемая в некоторых энциклопедиях, является лишь поздней адаптацией, созданной в 1990-е годы для удобства чтения; оригинальный язык мыслился исключительно в двух измерениях.

Типы данных и переменные

Архитектура типов данных была строго минималистичной. В Планкалькюле существовал только один базовый (атомарный) примитивный тип данных — бит (логическое значение), который имел системный идентификатор s0.

Все остальные структуры данных представляли собой массивы битов. Например, понятия «байт» как отдельного типа не существовало; он описывался просто как массив из 8 битов. Язык поддерживал пользовательские типы данных, которые обозначались буквой «A» с порядковым номером. Так, в своей шахматной программе Цузе ввел тип A1, обозначающий 3 бита, что было достаточно для кодирования координаты одной из восьми клеток шахматной доски.

Именование переменных подчинялось строжайшей логической дисциплине. Не допускалось использование произвольных смысловых имен (в отличие от современных языков). Каждая переменная начиналась со строго определенной буквы, которая декларировала ее роль в программе, после чего следовал ее порядковый номер (например, V1, V2, Z13): 1. V (от нем. Variablen) — входные данные программы. 2. R (от нем. Resultate) — выходные данные (результаты). 3. Z (от нем. Zwischenwerte) — промежуточные (временные) переменные, используемые внутри алгоритма. 4. C (от нем. Constanten) — неизменяемые константы. 5. P (от нем. Programme) — идентификаторы программ и подпрограмм (функций).

Управляющие конструкции

Присваивание в языке обозначалось с помощью символа стрелки. Эта математическая нотация была логически понятной: значение левой части передавалось в правую.

Условный оператор базировался на логической истинности (поскольку все переменные концептуально сводились к битам). Конструкция вида:

  A -> B

означала, что выражение и присваивание `A -> B` выполняется только в том случае, если переменная `A` равна единице (истинна).

Для организации циклов (итераций) использовались фигурные скобки. Программист указывал число повторений перед скобками, а внутри них помещал тело цикла. Число повторений могло быть задано как константой, так и переменной. Пример синтаксической концепции цикла:

  8 { тело итерации }

В языке были реализованы массивы без использования традиционных квадратных скобок. Индекс элемента массива записывался непосредственно после имени переменной или под ним в матричной нотации. При этом сам индекс мог являться другой переменной, что позволяло осуществлять динамический перебор элементов. При работе с многомерными матрицами индексы перечислялись последовательно.

Ограничения языка

Несмотря на свою феноменальную прогрессивность для 1940-х годов, Планкалькюль имел ряд жестких архитектурных ограничений: 1. Отсутствие рекурсии: Подпрограммы не могли вызывать сами себя. 2. Локальная область видимости: Поддерживались только локальные переменные, что, с одной стороны, защищало от побочных эффектов, но с другой — усложняло архитектуру. 3. Передача параметров: В функции аргументы могли передаваться исключительно по значению (создавалась копия данных), передача по ссылке не поддерживалась.

Планкалькюль так и не стал рабочим инструментом промышленной разработки из-за отсутствия в 1940-е годы аппаратной базы и компиляторов, способных транслировать его сложный двухмерный синтаксис. Тем не менее, он вошел в историю информатики как блестящий пример независимой инженерной мысли, предвосхитившей развитие целой научной дисциплины.

См. также

Пролог (язык программирования) Ratfor

Смотреть видео