K (мова програмування)
K — мова обробки масивів розроблена Артуром Уітні та комерціалізована Kx Systems. Раніше мова слугувала основою для бази даних kdb, та пов'язаних фінансових продуктів (наразі компанія використовує Q). Розроблена в 1993, є варіантом мови APL та містить елементи Scheme. Прихильники мови наголошують на її швидкості, простоті роботи з масивами та виразному синтаксисі.
K | |
---|---|
Парадигма | векторна, функційна |
Дата появи | 1993 |
Творці | Артур Уітні |
Розробник | Kx Systems |
Система типізації | динамічна, строга |
Під впливом від | A+, APL, Scheme |
Вебсайт | kx.com |
Назва K є скороченням фрази «Keys for kingdom», «Ключі до королівства», «Ключі до керування»[1].
Огляд
Основні особливості K спільні з APL. Обоє вони інтерпретовані, інтерактивні, з виразним синтаксисом. Також вони мають прості правила пріорітетів операцій: обчислення проводяться справа наліво. Мови містять багатий набір примітивних функцій для роботи з масивами. Вони включають математичні операції які працюють над масивами, операції з масивами, такі як сортування чи реверс. Також існують спеціальні оператори, що в комбінації з примітивними функціями дають певну подобу ітерацій та рекурсії. В результаті складні перетворення набору даних можуть виражатись ланцюгом виразів, в якому кожен елемент виконує певну частину роботи, і передає результат наступному.
Як і в APL, примітивні функції та оператори представлені одинарними та подвійними символами, але на відміну від APL, K обмежився набором символів ASCII (як і в J). Щоб це стало можливим, набір примітивних функцій в K менший, і дуже перевантажений, кожен ASCII символ позначає дві, чи більше різних операцій. В результаті K вирази можуть бути незрозумілими й складними для аналізу. Наприклад в наступному виразі, знак оклику “!” позначає три різні функції:
2!!7!4
Якщо читати справа наліво, то перший ! - остача від ділення. Остача від ділення 7 на 4 - 3. Наступний знак оклику - створює впорядкований список всіх цілих що менші за 3, і дає в результаті список 0 1 2. Останній знак оклику - циклічний зсув вліво, на 2 позиції, який дає нам список 2 0 1.
Іншою ключовою відмінністю K є те, що функції теж є звичайними даними. Такий підхід запозичений з Scheme. Функції можуть описуватись за допомогою виразів, і підставлятись в інші вирази. Функції в K задаються фігурними дужками. Наприклад в наступному виразі квадратичний вираз записується як функція і застосовується до значень 0 1 2 3:
{(3*x^2)+(2*x)+1}'!4
В K, іменовані функції - це просто результати обчислення функційного виразу, записаний в змінну, так само як і інші значення змінних.
x:25 f:{(x^2)-1}
На додачу, функції можна передавати як аргументи іншим функціям, чи повертати як результат функції.
Приклади
K - інтерпретована мова програмування, і кожен вираз обчислюється й миттєво відображається. Рядки обчислюються самі в себе. Тому програма Hello world виглядає тривіально:
"Hello world!"
Список рядків можна задати так:
("row1";"row2";"row3")
Наступний вираз сортує список каталогів у корені файлової системи Linux (у реалізації kona):
folders[<#:'folders:!"/"]
Він обчислюється справа наліво таким чином:
- !"/" повертає список назв каталогів у "/"
- folders: !"/" записує цей список у змінну "folders"
- #:' працює як функція map у Лісп - застосовує оператор # (визначити довжину вектора) до кожного елементу справа. Оскільки справа у нас folders, це означає що на виході ми отримуємо список довжин назв каталогів.
- < повертає порядкові індекси елементів відсотрованих за зростанням. Наприклад, < 1 2 3 0 4 поверне 3 0 1 2 4. Сортування індексів відбувається за розрядами
- folders[x] робить вибірку з списку folders по індексам, вказаним у x. Оскільки індекси відображають правильний порядок елементів, на виході отримується список сортованих по довжині рядків.
Функцію що визначає чи число є простим можна написати так:
{&/x!/:2_!x}
Так вона обчислюється справа наліво:
- !x створює список додатних цілих менших за x.
- 2_ викидає зі списку два перші елементи (0 та 1).
- x!/: знаходить остачу від ділення початкового числа, і кожного значення в списку.
- &/ знаходить мінімальне значення в списку остач.
Якщо x не просте, тоді одна з остач буде 0, і відповідно 0 буде найменшим значенням списку. Якщо x - просте, то мінімальним значенням буде 1, бо остача від ділення будь-якого числа на 2 дорівнює 1 для будь-якого простого числа більшого за 2.
Наступну функцію можна використати для перелічення всіх простих чисел між 1 та R:
2_&{&/x!/:2_!x}'!R
Справа наліво обчислюється так:
- !R список чисел менших за R.
- ' передати кожне число списку функції зліва. Це дасть список нулів та одиниць.
- & поверне індекси списку зі значенням 1. Вони водночас і будуть відповідними простими числами
- 2_ викреслить 0 і 1 зі списку простих
Посилання
- Kx Systems
- kona - Вільна реалізація K3.2
- code.kx.com username:anonymous, password:anonymous
- K not C (укр.)
- Q For Mortals: A Tutorial in Q Programming, by Jeffry A Borror, AISBN 78-1434829016.
- Dennis Shasha - K as a Prototyping Language
- A Shallow Introduction to the K programming language
- Michael Schidlowsky - Screencast comparing solutions of a specific problem in K vs. Java