K es un lenguaje de programación propietario para el procesamiento de matrices desarrollado por Arthur Whitney y comercializado por Kx Systems . El lenguaje sirve como base para kdb+ , una base de datos en memoria basada en columnas , y otros productos financieros relacionados. [1] El lenguaje, desarrollado originalmente en 1993, es una variante de APL y contiene elementos de Scheme . Los defensores del lenguaje destacan su velocidad, facilidad para manejar matrices y sintaxis expresiva. [2]
Historia
Antes de desarrollar K, Arthur Whitney había trabajado extensamente con APL, primero en IP Sharp Associates junto a Ken Iverson y Roger Hui , y luego en Morgan Stanley desarrollando aplicaciones financieras. En Morgan Stanley, Whitney ayudó a desarrollar A+ , una variante de APL, para facilitar la migración de aplicaciones APL desde computadoras mainframe IBM a una red de estaciones de trabajo Sun. A+ tenía un conjunto más pequeño de funciones primitivas y fue diseñado para la velocidad y para manejar grandes conjuntos de datos de series temporales. [3]
En 1993, Whitney dejó Morgan Stanley y desarrolló la primera versión del lenguaje K. Al mismo tiempo, formó Kx Systems para comercializar el producto y firmó un contrato exclusivo con Union Bank of Switzerland (UBS). Durante los cuatro años siguientes, desarrolló varias aplicaciones financieras y comerciales utilizando K para UBS.
El contrato finalizó en 1997 cuando UBS se fusionó con Swiss Bank . En 1998, Kx Systems lanzó kdb+, una base de datos construida sobre K. kdb era una base de datos en memoria , orientada a columnas e incluía ksql, un lenguaje de consulta con una sintaxis similar a SQL . Desde entonces, se han desarrollado varios productos financieros con K y kdb+. kdb+/tick y kdb+/taq se desarrollaron en 2001. kdb+, una versión de 64 bits de kdb+ se lanzó en 2003 y kdb+/tick y kdb+/taq se lanzaron en 2004. kdb+ incluía Q , un lenguaje que fusionaba las funciones del lenguaje subyacente K y ksql. [4]
Whitney lanzó un derivado de K llamado Shakti en 2018. [5]
Descripción general
K comparte características clave con APL . Ambos son lenguajes interpretados e interactivos que se destacan por su sintaxis concisa y expresiva. Tienen reglas de precedencia simples basadas en la evaluación de derecha a izquierda. Los lenguajes contienen un amplio conjunto de funciones primitivas diseñadas para procesar matrices. Estas funciones primitivas incluyen operaciones matemáticas que funcionan en matrices como objetos de datos completos y operaciones de matriz, como ordenar o invertir el orden de una matriz. Además, el lenguaje contiene operadores especiales que se combinan con funciones primitivas para realizar tipos de iteración y recursión. Como resultado, las transformaciones complejas y extendidas de un conjunto de datos se pueden expresar como una cadena de subexpresiones, donde cada enlace realiza un segmento del cálculo y pasa los resultados al siguiente enlace de la cadena.
Al igual que APL, las funciones y operadores primitivos se representan mediante caracteres simples o dobles; sin embargo, a diferencia de APL, K se limita al conjunto de caracteres ASCII (al igual que otra variante de APL, J ). Para permitir esto, el conjunto de funciones primitivas para K es más pequeño y está muy sobrecargado , y cada uno de los símbolos ASCII representa dos o más funciones u operaciones distintas. En una expresión dada, la función real a la que se hace referencia está determinada por el contexto. Como resultado, las expresiones K pueden ser opacas y difíciles de analizar para los humanos. Por ejemplo, en la siguiente expresión artificial, el signo de exclamación ! se refiere a tres funciones distintas:
2!!7!4
Leyendo de derecha a izquierda la primera !es la división módulo que se realiza en 7 y 4 dando como resultado 3. La siguiente !es la enumeración y enumera los números enteros menores que 3, dando como resultado la lista 0 1 2. La final !es la rotación donde la lista de la derecha se gira dos veces hacia la izquierda produciendo el resultado final de 2 0 1.
La segunda distinción fundamental de K es que las funciones son objetos de primera clase , un concepto tomado de Scheme . Las funciones de primera clase se pueden utilizar en los mismos contextos en los que se puede utilizar un valor de datos. Las funciones se pueden especificar como expresiones anónimas y se pueden utilizar directamente con otras expresiones. Las expresiones de función se especifican en K mediante llaves . Por ejemplo, en la siguiente expresión, una expresión cuadrática se define como una función y se aplica a los valores 0, 1, 2 y 3:
{( 3 * x ^ 2 ) + ( 2 * x ) +1 } ' ! 4
En K, las funciones con nombre son simplemente expresiones de función almacenadas en una variable de la misma manera que cualquier valor de datos se almacena en una variable.
a : 25
f : {( x ^ 2 ) - 1 }
Las funciones pueden pasarse como argumento a otra función o devolverse como resultado de una función.
Ejemplos
K es un lenguaje interpretado en el que se evalúa cada enunciado y se muestran sus resultados inmediatamente. Las expresiones literales, como las cadenas, se evalúan a sí mismas. En consecuencia, el programa Hello world es trivial:
"¡Hola Mundo!"
La siguiente expresión ordena una lista de cadenas por sus longitudes:
x @>#:' x
La expresión se evalúa de derecha a izquierda de la siguiente manera:
- #:'x devuelve la longitud de cada palabra en la lista x.
- > devuelve los índices que ordenarían una lista de valores en orden descendente.
- @ utiliza los valores enteros de la derecha para indexar en la lista original de cadenas.
Una función para determinar si un número es primo se puede escribir como:
{ &/ x !/: 2 _! x }
La función se evalúa de derecha a izquierda:
- !x enumera los números enteros positivos menores que x.
- 2_ elimina los dos primeros elementos de la enumeración (0 y 1).
- x!/: realiza la división módulo entre el entero original y cada valor de la lista truncada.
- &/ encuentra el valor mínimo de la lista del resultado del módulo.
Si x no es primo, uno de los valores devueltos por la operación módulo será 0 y, en consecuencia, el valor mínimo de la lista. Si x es primo, el valor mínimo será 1, porque x mod 2 es 1 para cualquier primo mayor que 2.
La siguiente función se puede utilizar para enumerar todos los números primos entre 1 y R con:
2 _& { &/ x !/: 2 _! x } '! R
La expresión se evalúa de derecha a izquierda.
- !R enumera los números enteros menores que R.
- ' aplica cada valor de la enumeración a la función de número primo de la izquierda. Esto devolverá una lista de 0 y 1.
- & devuelve los índices de la lista donde el valor es 1.
- 2_ eliminar los dos primeros elementos de la enumeración (0 y 1)
Productos financieros K
K es la base de una familia de productos financieros. Kdb+ es una base de datos en memoria basada en columnas con muchas de las mismas funciones de un sistema de gestión de bases de datos relacionales . La base de datos admite SQL , SQL-92 y ksql, un lenguaje de consulta con una sintaxis similar a SQL y diseñado para consultas basadas en columnas y análisis de matrices.
Kdb+ está disponible para varios sistemas operativos , incluidos Solaris , Linux , macOS y Windows (32 bits o 64 bits).
Véase también
- J , otro lenguaje inspirado en APL
- Q , el lenguaje de kdb+ y una nueva versión fusionada de K y ksql.
Referencias
- ^ "Sistemas Kx".
- ^ Iverson, Kenneth. "La notación como herramienta del pensamiento". Archivado desde el original el 20 de septiembre de 2013. Consultado el 23 de febrero de 2015 .
- ^ "Biografía y entrevista de Arthur".
- ^ Garland, Simon (28 de diciembre de 2004), Q Language Widening the Appeal of Vectors, Vector UK, archivado desde el original el 1 de enero de 2007
- ^ "Shakti".
Enlaces externos
- Sitio web oficial de Kx Systems
- Sitio web oficial de kdb+
- Descripción general de K (con un enlace a la tarjeta de referencia de K)
- Dennis Shasha - K como lenguaje de creación de prototipos
- K de Arthur Whitney (2005)
- oK REPL para un clon K
- Kona, una implementación de K3 de código abierto