CPL (від Combined Programming Language, до того - Cambridge Programming Language) - мова програмування, розроблений спільно Кембриджем і Лондонським університетом в 1960х роках. Іноді абревіатура жартома розшифровується як Cambridge Plus London.
Через складність і розміру мови перші працюють компілятори були створені набагато пізніше, ніж його теоретичний опис, - близько 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 - дізнаватися номер поточного потоку.
Елементи синтаксису:
У загальному випадку команда Write приймає на вхід список значень, але можна виводити і строкову константу, як тут.
Факторіал:
(Приклад узятий з опису мови) Тут наведено рекурсивне визначення факторіала. Для реалізації різних сценаріїв обробки для різних значень аргументу замість умовного переходу if використовується умовний вираз.
Факторіал:
(Приклад узятий з опису мови) Тут наведено итеративное визначення факторіала.
Вираз result of дозволяє використовувати блок або складову команду як вираз. Для цього тіло блоку має містити привласнення значення змінної result. У блоці можна визначати локальні змінні і не можна створювати побічні ефекти (наприклад, змінювати значення зовнішніх змінних). Найчастіше це вираз використовується при визначенні функцій.
У тілі циклу використовується одночасне присвоєння нових значень змінним. Оскільки обидві змінні використовують маленькі імена, мова дозволяє пропустити знак множення між ними - xf трактується як x * f.