CPL (язык программирования)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:26, 2 июня 2016.
CPL
Парадигма Мульипарадигменный: процедурный, функциональный, структурный, императивный
Разработчики Кембриджский университет, Лондонский универсистет
Первый   появившийся 1960-е
Печать дисциплины статическая
Под влиянием
Алгол-60
Влияние
BCPL, POP-2, B, C

Combined Programming Language (CPL) — язык программирования, создан в 1960-х. Язык является совместной разработкой кембриджского и лондонского университетов. Предшественник языка BCPL, являющийся предшественником языка Си. До подключения к проекту лондонцев «С» было первой буквой от «Cambridge», а потом официально расшифровывалось как «Combined».

История

CPL совместно разрабатывался лабораторией математики Кембриджского университета и Лондонским университетом, в связи с чем был неофициально прозван "Cambridge plus London". В 1963 году была опубликована документация по языку, и он был независимо реализован на компьютере "Титан" в Кембридже, и на компьютере "Атлас" в Лондоне.

На развитие языка сильно повлиял Алгол-60, но CPL проектировался как язык общего назначения, и поэтому получился более сложным и менее лаконичным. CPL должен был занять нишу Алгола в качестве языка для обработки данных в бизнесе и позволить программисту совместить высокоуровневые абстракции с возможностями низкоуровневых языков.

Тем не менее, язык медленно развивался, а первый его компилятор появился только в 1970-х. В связи с этим язык так и не стал популярным, и его использование прекратилось в 70-е годы прошлого века.

"Потомки" CPL

На основе языка BCPL (Basic CPL/Bootstrap CPL), который представлял из себя значительно упрощённую версию языка CPL и предназначался для системного программирования, и, в особенности, для написания компиляторов. Первый компилятор для BCPL был создан в 1967 году, до появления полноценного компилятора CPL. На основе BCPL был создан язык B, потомком которого является язык Си.

Описание языка

Структура программы

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

Типы данных

real Действительное число. Точность и диапазон значений зависят от реализации.
integer Целое число. Диапазон значений зависит от реализации.
complex Комплексное число. Реализовано как упорядоченная пара элементов типа real.
Boolean Логическая переменная.
logical Битовый массив, длина зависит от реализации.
long logical Битовый массив большего или равного размера, чем logical, длина зависит от реализации.
string Последовательность символов из алфавита CPL.
label Метка для команд.
general Неопределённый тип, тип переменной может меняться в процессе выполнения.
file Структура данных, описывающая файл. Необходима для организации ввода-вывода при работе с файлами.
array Массив. Пример объявления: real 2 array A, где 2 — размерность массива. Количество элементов задаётся вызовом специальной функции Array.
list Список элементов по аналогии с LISP. Пример: list L = a, b, c

Константы

  • Числовые константы задаются в десятичной нотации: 59, +8.76, -0.35
  • Логические константы задаются в восьмеричной или двоичной системе счисления с указанием нужной системы: 8 777, 8|55, 2 1110000 |. Символ | указывает, следует ли разбирать константу слева-направо, или справа-налево.
  • Строковые константы задаются строкой символов, заключённой в одинарные кавычки: 'string'
  • Логические константы задаются константой true или false

Выражения

CPL использует два типа выражений: left-hand и right-hand. Left-hand выражения указывают адрес, по которому будет записано значение, right-hand вычисляются для получения значения. В отличие от более поздних языков, слитное написание двух названий переменных интерпретируется как их перемножение (например, bc — это умножение b на c).

Операторы

  • + - x /
  • Унарные + и -
  • ↑ (возведение в степень)
  •  := (присваивание)
  • ~ (логическое НЕ)
  • /\ (логическое И)
  • \/ (логическое ИЛИ)
  • imp (следование)
  • < ≤ = ≠ > ≥
  • → (аналог тернарного оператора в Си)
  • where (аналог let в LISP, например: p : = ax ↑ 2 + bx + c/x where x = 2a ↑ 2 + b)
  • result of (используется для возвращения результата в функциях, состоящих из более чем одного оператора)

Условный оператор

Существует три формы условного оператора:

  • if ... then do ...
  • unless ... then do ...
  • test ... then do ... or do ...

Оператор цикла

Существуют следующие разновидности оператора цикла:

  • while ... do ...
  • until ... do ...
  • ... repeat while ...
  • ... repeat until ...
  • for v = 1, 3, 6, 10 do ...
  • for v = step 1, 2, 10 (эквивалентно for (v = 1; v < 10; v += 2) в Си)

Такая форма может конкатенироваться, например: for v = step 0, 1, 10 then step 40, 2, 60

Функции

Функция объявляется следующим образом:

function F [x, y] = ax ↑ 2 + 2bxy + cy ↑ 2

В случае, если функция рекурсивна, она должна быть помечена ключевым словом rec

Если функция состоит из более чем одного выражения, для возврата значения должен использоваться оператор result of

Ввод-вывод

Ввод-вывод в CPL осуществляется с помощью потоков. Одновременно программа может считывать данные только из одного потока. Для открытия потока на считывание используется функция Input, для считывания данных используются следующие функции:

  • Read (считывает данные в переменные типа real или integer)
  • Readsymbol, Nextsymbol и Lastsymbol, предоставляющие функционал для работы с потоком как с перфолентой
  • Read2 и Read8 для считывания битовых массивов

Для вывода данных используются следующие функции:

  • Write для вывода значения переменной
  • Write2 и Write8 для вывода значений битового массива
  • Writesymbol для работы как с перфолентой
  • Layout для установления формата вывода (количество столбцов и строк в блоке)

Особенности языка

  • Множественная инициализация real a, b = 5, 6. real a, b = 5 (значение присвоится обоим переменным).
  • Возможность множественного присваивания: a, b := b, a.
  • Необычный для современных языков способ сочетания функциональной и императивной парадигм
  • Большое количество разнообразных операторов циклов
  • Наличие большого количества операторов, отсутствующих в раскладке современных клавиатур

Примеры кода

Рекурсивное вычисление факториала

rec function Fact[x] = (x = 0) -> 1, xFact[x — 1]

Итерационное вычисление факториала

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

Расчёт функции Эйлера

function Euler [function Fct, real Eps; integer Tim]= result of
§1 dec §1.1 real Mn, Ds, Sum
integer i, t
index n=0
m = Array [real, (0, 15)] §1.1
i, t, m[0] := 0, 0, Fct[0]
Sum := m[0]/2
§1.2 i := i + 1
Mn := Fct[i]
for k = step 0, 1, n do
m[k], Mn := Mn, (Mn + m[k])/2
test Mod[Mn] < Mod[m[n]] /\ n < 15
then do Ds, n, m[n+l] := Mn/2, n+1, Mn
or do Ds := Mn
Sum := Sum + Dt
t := (Mod[Ds] < Eps) -> t + 1, 0 §1.1
repeat while t < Tim
result := Sum §1.

Поиск максимального элемента массива

Max(Items, ValueFunction) = value of
§ (Best, BestVal) = (NIL, -∞)
while Items do §
(Item, Val) = (Head(Items), ValueFunction(Head(Items)))
if Val > BestVal then (Best, BestVal) := (Item, Val)
Items := Rest(Items) §⃒
result is Best §⃒

Список источников

  1. The main features of CPL
  2. Википедия