K (мова програмування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
K
Парадигма: векторна, функційна
Дата появи: 1993
Творці: Артур Уітні
Розробник: Kx Systems
Система типізації: динамічна, строга
Під впливом від: A+, APL, Scheme

K — мова обробки масивів розроблена Артуром Уітні та комерціалізована Kx Systems. Раніше мова слугувала основою для бази даних kdb, та пов'язаних фінансових продуктів (наразі компанія використовує Q). Розроблена в 1993, є варіантом мови APL та містить елементи Scheme. Прихильники мови наголошують на її швидкості, простоті роботи з масивами та виразному синтаксисі.

Назва 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:!"/"]

Він обчислюється справа наліво таким чином:

  1.  !"/" повертає список назв каталогів у "/"
  2. folders: !"/" записує цей список у змінну "folders"
  3. #:' працює як функція map у Лісп - застосовує оператор # (визначити довжину вектору) до кожного елементу справа. Оскільки справа у нас folders, це означає що на виході ми отримуємо список довжин назв каталогів.
  4. < повертає порядкові індекси елементів відсотрованих за зростанням. Наприклад, < 1 2 3 0 4 поверне 3 0 1 2 4. Сортування індексів відбувається за розрядами
  5. folders[x] робить вибірку з списку folders по індексам, вказаним у x. Оскільки індекси відображають правильний порядок елементів, на виході отримується список сортованих по довжині рядків.

Функцію що визначає чи число є простим можна написати так:

{&/x!/:2_!x}

Так вона обчислюється справа наліво:

  1.  !x створює список додатніх цілих менших за x.
  2. 2_ викидає зі списку два перші елементи (0 та 1).
  3. x!/: знаходить остачу від ділення початкового числа, і кожного значення в списку.
  4. &/ знаходить мінімальне значення в списку остач.

Якщо x не просте, тоді одна з остач буде 0, і відповідно 0 буде найменшим значенням списку. Якщо x - просте, то мінімальним значенням буде 1, бо остача від ділення будь-якого числа на 2 дорівнює 1 для будь-якого простого числа більшого за 2.

Наступну функцію можна використати для перелічення всіх простих чисел між 1 та R:

2_&{&/x!/:2_!x}'!R

Справа наліво обчислюється так:

  1.  !R список чисел менших за R.
  2. ' передати кожне число списку функції зліва. Це дасть список нулів та одиниць.
  3. & поверне індекси списку зі значенням 1. Вони водночас і будуть відповідними простими числами
  4. 2_ викреслить 0 і 1 зі списку простих

Дивіться також[ред.ред. код]

  • APL, перша векторна мова програмування
  • J, інша мова створена під впливом APL



Посилання[ред.ред. код]