El lenguaje de programación J , desarrollado a principios de la década de 1990 por Kenneth E. Iverson y Roger Hui , [ 5 ] [ 6 ] es un lenguaje de programación de matrices basado principalmente en APL (también de Iverson).
Para evitar repetir el problema de los caracteres especiales de APL, J utiliza únicamente el conjunto básico de caracteres ASCII , recurriendo al uso del punto y los dos puntos como inflexiones [ 7 ] para formar palabras cortas similares a los dígrafos . La mayoría de estas palabras primarias (o primitivas ) de J sirven como símbolos matemáticos, y el punto o los dos puntos amplían el significado de los caracteres básicos disponibles. Además, muchos caracteres que en otros idiomas a menudo deben ir emparejados (como [] {} "" ``o <>) son tratados por J como palabras independientes o, cuando se flexionan, como raíces de un solo carácter de palabras de varios caracteres.
J es un lenguaje de programación de matrices muy conciso , idóneo para la programación matemática y estadística , especialmente para operaciones con matrices . También se ha utilizado en programación extrema [ 8 ] y análisis del rendimiento de redes [ 9 ] .
Al igual que los lenguajes FP y FL de John Backus , J admite la programación a nivel de funciones mediante sus características de programación tácita .
A diferencia de la mayoría de los lenguajes que admiten la programación orientada a objetos , el esquema de espacios de nombres jerárquico y flexible de J (donde cada nombre existe en una configuración regional específica ) puede utilizarse eficazmente como marco tanto para la programación orientada a objetos basada en clases como para la basada en prototipos .
Desde marzo de 2011, J es software libre y de código abierto bajo la Licencia Pública General GNU versión 3 (GPLv3). [ 10 ] [ 11 ] [ 12 ] También se puede adquirir el código fuente bajo una licencia negociada. [ 13 ]
Ejemplos
J permite la composición de funciones y estilos sin puntos . Por lo tanto, sus programas pueden ser muy concisos y algunos programadores los consideran difíciles de leer.
El programa "¡Hola, mundo!" en J es:
'¡Hola Mundo!'Esta implementación de "hola mundo" refleja el uso tradicional de J: los programas se introducen en una sesión del intérprete de J y se muestran los resultados de las expresiones. También es posible configurar la ejecución de scripts de J como programas independientes. Así es como se vería esto en un sistema Unix :
#!/bin/jc echo '¡Hola, mundo!' exit ''(Tenga en cuenta que las implementaciones actuales de j instalan una u jconsoleotra (porque jconsole es utilizado por Java), ijconsoley probablemente la instalen en /usr/bin o en algún otro directorio (quizás el directorio Application en macOS). Por lo tanto, existe una dependencia del sistema que el usuario tendría que resolver).
Históricamente, APL se utilizaba /para indicar el pliegue , por lo que +/1 2 3era equivalente a 1+2+3. Mientras tanto, la división se representaba con el símbolo matemático de división ( ÷).
Dado que ASCII no incluye un símbolo de división propiamente dicho , J utiliza % para representar la división, como aproximación visual o recordatorio. (Esto ilustra en parte el carácter mnemotécnico de los tokens de J y algunos de los dilemas que plantea el uso de ASCII).
Al definir una función J con un nombre específico avgpara calcular el promedio de una lista de números, se obtiene:
avg=:+/%#+/suma los elementos del array.#cuenta el número de elementos en el array.%divide la suma por el número de artículos.
Esta es una ejecución de prueba de la función:
avg12342.5Arriba, avg se define usando una secuencia de tres verbos ( +/, %, y #) denominada bifurcación . Específicamente, (V0 V1 V2) Nyes lo mismo que , (V0(Ny)) V1 (V2(Ny))lo que muestra parte del poder de J. (Aquí V0, V1 y V2 denotan verbos y Ny denota un sustantivo).
Algunos ejemplos de uso avg:
v=:?.20$100NB. un vector aleatoriov46 55 79 52 54 39 60 57 60 94 46 78 13 18 51 92 78 60 90 62 59.2avgv
4avg\vNB. Media móvil en periodos de tamaño 4 58 60 56 51,25 52,5 54 67,75 64,25 69,5 57,75 38,75 40 43,5 59,75 70,25 80 72,5m=:?.45$50Nota: una matriz aleatoriam46 5 29 2 4 39 10 7 10 44 46 28 13 18 1 42 28 10 40 12
avg"1mNota: aplicar el promedio a cada submatriz de rango 1 (cada fila) de m 17.2 22 21.2 26.4El rango es un concepto crucial en J.
La implementación de quicksort , del diccionario J, produce:
sel =: adverbio def 'u#[' quicksort =: verbo definir si. 1 >: # sí lo hago. y más. ( ordenación rápida y < sel e ) , ( y = sel e ) , ordenación rápida y > sel e =. y {~?# y fin. )A continuación se muestra una implementación del algoritmo Quicksort que demuestra la programación tácita . Esta consiste en componer funciones sin hacer referencia explícita a ninguna variable. La compatibilidad de J con los bucles y ganchos determina cómo se aplicarán los argumentos de esta función a sus funciones componentes.
clasificación rápida =: (( $:@ ( <#[ ) , ( =#[ ) , $:@ ( >#[ )) ( {~ ?@# )) ^: ( 1 <# )La ordenación en J se suele realizar mediante los verbos integrados (primitivos) /:(ordenar hacia arriba) y \:(ordenar hacia abajo). Las ordenaciones definidas por el usuario, como quicksort (arriba), suelen ser solo a modo de ejemplo.
El siguiente ejemplo demuestra el uso del verbo autorreferencial $:para calcular recursivamente los números de Fibonacci:
1 :` ( $:@-& 2 +$:@<: ) @. ( >& 2 )Esta recursión también puede lograrse haciendo referencia al verbo por su nombre, aunque, por supuesto, esto solo es posible si el verbo está nombrado:
fibonacci =: 1 :` ( fibonacci @-& 2 + fibonacci @<: ) @. ( >& 2 )La siguiente expresión muestra pi con n dígitos y demuestra las capacidades de precisión extendida de J:
n=:50NB. Establezca n como el número de dígitos requeridos NB. Precisión extendida 10 elevado a la enésima * pi 314159265358979323846264338327950288419716939937510<.@o.10x^n
Verbos y modificadores
Un programa o rutina —algo que toma datos como entrada y produce datos como salida— se llama verbo . J tiene un amplio conjunto de verbos predefinidos, todos los cuales funcionan automáticamente con múltiples tipos de datos: por ejemplo, el verbo i. busca coincidencias dentro de matrices de cualquier tamaño:
3 1 4 1 5 9 i . 3 1 NB. encuentra el índice de la primera aparición de 3 y de 1 0 1 3 1 4 1 5 9 i : 3 1 NB. encuentra el índice de la última aparición de 3 y de 1 0 3Los programas de usuario pueden nombrarse y utilizarse en cualquier lugar donde se permitan tipos de datos primitivos.
El poder de J proviene en gran medida de sus modificadores : símbolos que toman sustantivos y verbos como operandos y los aplican de una manera específica. Por ejemplo, el modificador / toma un operando, un verbo a su izquierda, y produce un verbo que aplica ese verbo entre cada elemento de su argumento. Es decir, +/ es un verbo, definido como 'aplicar + entre los elementos de tu argumento'. Por lo tanto, la oración
+/ 1 2 3 4 5produce el efecto de
1 + 2 + 3 + 4 + 5+/ 1 2 3 4 5 15J tiene aproximadamente dos docenas de estos modificadores. Todos ellos pueden aplicarse a cualquier verbo, incluso a un verbo escrito por el usuario, y los usuarios pueden escribir sus propios modificadores. Si bien los modificadores son poderosos individualmente, permitir
- ejecución repetida, es decir, hacer mientras
- ejecución condicional, es decir, si
- ejecución de subconjuntos regulares o irregulares de argumentos
Algunos de los modificadores controlan el orden en que se ejecutan los componentes, lo que permite combinarlos en cualquier orden para producir la variedad ilimitada de operaciones necesarias para la programación práctica.
Tipos y estructuras de datos
J admite tres tipos simples:
- Numérico
- Literal (Carácter)
- En caja
De estos, el numérico es el que tiene más variantes.
Uno de los tipos numéricos de J es el bit . Existen dos valores de bit: 0 y 1. Además, los bits pueden formar listas. Por ejemplo, 1 0 1 0 1 1 0 0 es una lista de ocho bits. Sintácticamente, el analizador de J la trata como una sola palabra. (El espacio se reconoce como un carácter que forma palabras entre lo que de otro modo serían palabras numéricas). Se admiten listas de longitud arbitraria.
Además, J admite todas las operaciones binarias habituales en estas listas, como AND , OR , OR exclusivo , rotación , desplazamiento , negación , etc. Por ejemplo,
1 0 0 1 0 0 1 0 +. 0 1 0 1 1 0 1 0 NB. o 1 1 0 1 1 0 1 0
3 |. 1 0 1 1 0 0 1 1 1 1 1 NB. rotar 1 0 0 1 1 1 1 1 1 0 1
J también admite matrices de bits de orden superior. Estas pueden formarse en matrices bidimensionales, tridimensionales, etc. Las operaciones descritas anteriormente funcionan igual de bien en estas matrices.
Otros tipos numéricos incluyen enteros (p. ej., 3, 42), números de coma flotante (3.14, 8.8e22), números complejos (0j1, 2.5j3e88), enteros de precisión extendida (12345678901234567890x) y fracciones racionales (de precisión extendida) (1r2, 3r4). Al igual que con los bits, estos se pueden organizar en listas o matrices de dimensiones arbitrarias. Al igual que con los bits, las operaciones se realizan sobre todos los números de una matriz.
Las listas de bits se pueden convertir a enteros usando el #.verbo. Los enteros se pueden convertir a listas de bits usando el #:verbo. (Al analizar J, .el punto y :los dos puntos son caracteres formadores de palabras. Nunca son tokens solos, a menos que vayan precedidos de espacios en blanco ).
J también admite el tipo literal (carácter). Los literales se encierran entre comillas, por ejemplo, 'a'o 'b'. También se admiten listas de literales utilizando la convención habitual de poner varios caracteres entre comillas, como 'abcdefg'. Normalmente, los literales individuales tienen un ancho de 8 bits (ASCII), pero J también admite otros literales ( Unicode ). No se admiten operaciones numéricas ni booleanas en literales, pero sí operaciones orientadas a colecciones (como rotar).
Finalmente, existe un tipo de dato en caja. Normalmente, los datos se colocan en una caja usando la <operación (sin argumento izquierdo; si hay un argumento izquierdo, esta sería la operación menor que ). Esto es análogo a la operación de C& (sin argumento izquierdo). Sin embargo, mientras que el resultado de C &tiene semántica de referencia, el resultado de J <tiene semántica de valor. En otras palabras, <es una función y produce un resultado. El resultado tiene 0 dimensiones, independientemente de la estructura de los datos contenidos. Desde el punto de vista de un programador de J, <coloca los datos en una caja y permite trabajar con una matriz de cajas (se puede ensamblar con otras cajas o se pueden hacer más copias de la caja).
<1 0 0 1 0 +---------+ |1 0 0 1 0| +---------+El único tipo de colección que ofrece J es el array de dimensiones arbitrarias. La mayoría de los algoritmos se pueden expresar de forma muy concisa utilizando operaciones sobre estos arrays.
Los arreglos de J tienen tipos homogéneos; por ejemplo, la lista 1 2 3 es una lista de enteros a pesar 1 de ser un bit. En general, este tipo de problemas de tipo son transparentes para los programadores. Solo ciertas operaciones especializadas revelan diferencias de tipo. Por ejemplo, la lista 1.0 0.0 1.0 0.0 sería tratada exactamente igual, por la mayoría de las operaciones, que la lista 1 0 1 0 .
J también admite matrices numéricas dispersas donde los valores distintos de cero se almacenan con sus índices. Este es un mecanismo eficiente cuando hay relativamente pocos valores distintos de cero.
J también admite objetos y clases, [ 14 ] pero estos son un vestigio de la forma en que se nombran las cosas y no son tipos de datos. En su lugar, se utilizan literales encapsulados para referirse a objetos (y clases). Los datos de J tienen semántica de valor, pero los objetos y las clases necesitan semántica de referencia.
Otro pseudotipo, asociado al nombre más que al valor, es el archivo mapeado en memoria.
Depuración

J cuenta con las funciones habituales para detenerse en caso de error o en puntos específicos dentro de los verbos. Además, dispone de un depurador visual único, llamado Dissect , que ofrece una visualización interactiva en 2D de la ejecución de una sola instrucción J. Dado que una sola instrucción J realiza tantos cálculos como una subrutina completa en lenguajes de bajo nivel, la visualización resulta muy útil.
Documentación
La documentación de J incluye un diccionario , donde las palabras en J se identifican como sustantivos , verbos , modificadores , etc. Las palabras primarias se enumeran en el vocabulario , donde sus respectivas partes de la oración se indican mediante marcado. Tenga en cuenta que los verbos tienen dos formas: monádica (argumentos solo a la derecha) y diádica (argumentos a la izquierda y a la derecha). Por ejemplo, en ' -1' el guion es un verbo monádico, y en ' 3-2' el guion es un verbo diádico. La definición monádica es en su mayoría independiente de la definición diádica, independientemente de si el verbo es un verbo primitivo o un verbo derivado.
Estructuras de control
J proporciona estructuras de control similares a otros lenguajes procedimentales. [ 15 ]
assert.break.continue.for.goto_label.if. else. elseif.return.select. case.throw.try. catch.while. whilst.
Véase también
- K (lenguaje de programación) – otro lenguaje influenciado por APL
- P : El lenguaje de KDB+ y una nueva versión combinada de K y KSQL.
Referencias
- ^ "Notas de la versión J9.7" .
- ^ "Jsoftware" .
- ^ Wes McKinney en la reunión de 2012 sobre Python para el análisis de datos.
- ^ Documentación de SuperCollider, Adverbios para operadores binarios
- ^ Una visión personal de APL , ensayo de KE Iverson de 1991 (enlace archivado)
- ^ Resumen de la historia de J por Roger Hui (19 de marzo de 2002)
- ^ Palabras J NuVoc
- ^ Bussell, Brian; Taylor, Stephen (2006). Desarrollo de software como proyecto de escritura colaborativa . Programación extrema y procesos ágiles en ingeniería de software. Oulu, Finlandia: Springer . pp. 21–31 . ISBN 978-3-540-35094-1.
- ^ Holt, Alan (2007). Análisis del rendimiento de la red: Uso del lenguaje de programación J. Springer . ISBN 978-1-84628-822-7.
- ^ Página de descarga del código fuente de Jsoftware
- ^ Eric Iverson (1 de marzo de 2011). "J Source GPL" . Lista de correo de programación J. Archivado del original el 23 de septiembre de 2016. Recuperado el 24 de junio de 2015 .
- ^ openj en GitHub
- ^ Política de abastecimiento de Jsoftware
- Capítulo 25: Programación Orientada a Objetos
- ^ (detalles aquí)
Enlaces externos
- Familia de lenguajes de programación APL
- lenguajes de programación de matrices
- Lenguajes de programación basados en clases
- Lenguajes de programación de tipado dinámico
- Lenguajes a nivel de función
- Lenguajes funcionales
- Lenguajes de programación multiparadigma
- Lenguajes de programación numérica
- Lenguajes de programación orientados a objetos
- Lenguajes de programación