]]> ]]>
Править | Обсудить | История

CPL

Дата создания:
1963
Создан под влиянием:
Повлиял на:
Парадигма:
Типизация:
Реализации и версии (свернуть все | развернуть все):
Язык программирования

CPL (от Combined Programming Language, до того — Cambridge Programming Language) — язык программирования, разработанный совместно Кембриджем и Лондонским университетом в 1960х годах. Иногда аббревиатура в шутку расшифровывается как Cambridge Plus London.

В 1963 году была опубликована статья “The main features of CPL”, описывающая основные возможности языка. Язык создавался под влиянием Algol, но предназначался для решения более широкого круга задач, в частности, для исследований в области программирования и разработки компиляторов, и поэтому стал гораздо более громоздким.

Из-за сложности и размера языка первые работающие компиляторы были созданы гораздо позже, чем его теоретическое описание, — около 1970 года. Они были предназначены для двух схожих машин — Атлас в Лондоне и Титан в Кембридже. CPL так и не стал популярным и прекратил свое существование в середине 1970х годов, успев, впрочем, оказать влияние на создание BCPL.

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

Определения и команды состоят из выражений; CPL позволяет строить сложные выражения из простого набора базовых командных форм.

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

Язык реализует следующий набор базовых типов данных: числовые index, integer, real, complex, булевский logical, метки label, строки string и структуры данных array и list. Более сложные структуры данных могут создаваться комбинированием базовых типов. Любопытно, что строковые константы заключаются в ориентированные кавычки и — решение, которое редко встречается в современных языках.

Возможности языка CPL:

  • солидный набор управляющих команд, в том числе циклов (которые почти в полном составе перешли в BCPL),
  • механизм определения и вызова пользовательских функций (function) и процедур (routine). Функции не должны иметь побочных эффектов, но могут возвращать значение типа функция. Процедуры могут передаваться как аргументы в другие процедуры. Тем самым CPL реализует зачатки функционального программирования.
  • несколько различных механизмов задания выражений и получения их результатов. Сюда относятся: слово where, которое позволяет определять локальную переменную для использования в пределах выражения; слово result of, которое позволяет использовать блок как выражение; условные выражения вида b→e1,e2, возвращающие разные выражения в зависимости от значения логической переменной; и команды одновременного присваивания.
  • механизмы ввода-вывода данных разных типов через соответствующие потоки. Потоков каждого типа может быть несколько; команды Input и Output позволяют задавать номер потока, который будет использоваться как текущий для программы, а функции Source и Destination — узнавать номер текущего потока.

Элементы синтаксиса:

Регистрозависимость да
Присваивание значения переменной <varname> := <value>
Объявление переменной <type> <varname>
Объявление переменной с присваиванием значения <type> <varname> = <value>
Группировка выражений § ... §
Блок § ... §
Равенство =
Неравенство
Сравнение < > ≤ ≥
Если - то if <condition> then do <trueBlock>
Если - то - иначе test <condition> then do <trueBlock> or do <falseBlock>
Цикл с предусловием while <condition> do <loopBody> / until <condition> do <loopBody>
Цикл с постусловием <loopBody> repeat while <condition> / <loopBody> repeat until <condition>
Цикл for - next для диапазона целых чисел с инкрементом на 1 for i = step 1, 1, 10 do <loopBody>

Примеры:

Hello, World!:

Пример для версий CPL

В общем случае команда Write принимает на вход список значений, но можно выводить и строковую константу, как здесь.

Write(Hello, World!’)

Факториал:

Пример для версий CPL

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

rec function Fact1[x] = (x = 0) → 1, xFact1[x — 1]

Факториал:

Пример для версий CPL

(Пример взят из описания языка) Здесь приведено итеративное определение факториала.

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

В теле цикла используется одновременное присвоение новых значений переменным. Поскольку обе переменные используют маленькие имена, язык позволяет пропустить знак умножения между ними — xf трактуется как x * f.

function Fact2[x] = result of
    § real f = 1
      until x = 0 do
          f, x := xf, x — 1
      result : = f §

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам