CPL (язык программирования)
Последнее изменение этой страницы: 16:26, 2 июня 2016.
Парадигма | Мульипарадигменный: процедурный, функциональный, структурный, императивный |
---|---|
Разработчики | Кембриджский университет, Лондонский универсистет |
Первый появившийся | 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 §⃒
ISSN 2542-0356
Следуй за Полисом
Оставайся в курсе последних событий
Лицензия
Если не указано иное, содержание этой страницы доступно по лицензии Creative Commons «Attribution-NonCommercial-NoDerivatives» 4.0, а примеры кода – по лицензии Apache 2.0. Подробнее см. Условия использования.