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 matriz basado principalmente en APL (también por Iverson).
Diseñada por | Kenneth E. Iverson , Roger Hui |
---|---|
Desarrollador | JSoftware |
Apareció por primera vez | 1990 |
Lanzamiento estable | J901 / 15 de diciembre de 2019 [1] |
Disciplina de mecanografía | dinámica |
SO | Multiplataforma : Windows , Linux , macOS , Android , iOS , Raspberry Pi [2] |
Licencia | GPLv3 |
Sitio web | www |
Implementaciones importantes | |
J | |
Influenciado por | |
APL | |
Influenciado | |
NumPy , [3] SuperCollider [4] |
Para evitar repetir el problema de caracteres especiales APL, J usa sólo 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 las palabras J primarias (o primitivas ) sirven como símbolos matemáticos, con el punto o dos puntos extendiendo el significado de los caracteres básicos disponibles. Además, muchos caracteres que en otros idiomas a menudo deben emparejarse (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 y es más adecuado para la programación matemática y estadística , especialmente cuando se realizan operaciones en matrices . También se ha utilizado en programación extrema [8] y análisis de rendimiento de redes . [9]
Al igual que los lenguajes FP y FL de John Backus , J admite la programación a nivel de función a través de sus características de programación tácita .
A diferencia de la mayoría de los idiomas que el apoyo de programación orientado a objetos , J flexibles jerárquica espacio de nombres de esquema (donde existe todo nombre en una determinada localidad ) puede ser utilizado eficazmente como un marco para ambos basado en clases y basado en prototipos de programación orientado a objetos.
Desde marzo de 2011, J es un software gratuito y de código abierto bajo la GNU General Public License versión 3 (GPLv3). [10] [11] [12] También se puede comprar fuente bajo una licencia negociada. [13]
Ejemplos de
J permite la composición de funciones y estilos sin puntos . Por lo tanto, sus programas pueden ser muy breves y algunos programadores los consideran difíciles de leer .
El mensaje "¡Hola, mundo!" programa en J es
'¡Hola Mundo!'
Esta implementación de hello world refleja el uso tradicional de J: los programas se ingresan en una sesión de intérprete de J y se muestran los resultados de las expresiones. También es posible hacer que los scripts J se ejecuten como programas independientes. Así es como podría verse esto en un sistema Unix :
#! / bin / jc echo '¡Hola, mundo!' salir ''
Históricamente, APL solía /
indicar el pliegue , por lo que +/1 2 3
era equivalente a 1+2+3
. Mientras tanto, la división se representó con el símbolo de división matemática ( ÷
), que se implementó tachando un signo menos y dos puntos (en los terminales de texto en papel EBCDIC y ASCII ). Debido a que ASCII en general no admite sobreataques de una manera independiente del dispositivo y no incluye un símbolo de división per se , J usa% para representar la división, como una aproximación visual o un recordatorio. (Esto ilustra algo del carácter mnemónico de los tokens de J y algunos de los dilemas impuestos por el uso de ASCII).
Definir una función J nombrada avg
para calcular el promedio de una lista de números produce:
avg=: +/ % #
Esta es una ejecución de prueba de la función:
avg 1 2 3 4
2.5
#
cuenta el número de elementos de la matriz. +/
suma los elementos de la matriz. %
divide la suma por el número de elementos. Por encima, promedio se define mediante un tren de tres verbos ( +/
, %
y #
) denominado un tenedor . Específicamente (V0 V1 V2) Ny
es el mismo (V0(Ny)) V1 (V2(Ny))
que muestra algo del poder de J. (Aquí V0, V1 y V2 denotan verbos y Ny denota un sustantivo).
Algunos ejemplos de uso avg
:
v=: ?. 20 $100
NÓTESE BIEN. un vector aleatoriov
46 55 79 52 54 39 60 57 60 94 46 78 13 18 51 92 78 60 90 62 59,2avg v
4 avg\ v
NÓTESE BIEN. media móvil en períodos 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,5
m=: ?. 4 5 $50
NÓTESE BIEN. una matriz aleatoriam
46 5 29 2 439 10 7 10 4446 28 13 18 142 28 10 40 12
avg"1 m
NÓTESE BIEN. aplicar prom a cada subarreglo de rango 1 (cada fila) de m 17.2 22 21.2 26.4
Rango es un concepto fundamental en J. Su importancia en J es similar al significado de select
en SQL y while
en C .
La implementación de quicksort , del Diccionario J, produce:
sel =: adverbio def 'u # [' ordenación rápida =: verbo definir si. 1 >: # Y lo hacen. y más. ( ordenación rápida y < sel e ) , ( y = sel e ) , ordenación rápida y > sel e =. y {~? # y final. )
La siguiente es una implementación de clasificación rápida que demuestra la programación tácita . Esto último implica componer funciones juntas y no hacer referencia explícita a ninguna variable. El soporte de J para bifurcaciones y ganchos dicta reglas sobre cómo los argumentos aplicados a esta función se aplicarán a sus funciones componentes.
ordenación rápida =: (( $: @ ( <# [ ) , ( = # [ ) , $: @ ( > # [ )) ( {~ ? @ # )) ^: ( 1 <# )
La ordenación en J generalmente se logra usando los verbos incorporados (primitivos) /:
(ordenar hacia arriba) y \:
(ordenar hacia abajo). Las clasificaciones definidas por el usuario, como la clasificación rápida, arriba, generalmente son solo para ilustración.
El siguiente ejemplo demuestra el uso del verbo de autorreferencia $:
para calcular recursivamente números de fibonacci:
1 : ` ( $: @ - y 2 + $: @ <: ) @. ( > Y 2 )
Esta recursividad también se puede lograr refiriéndose al verbo por su nombre, aunque esto, por supuesto, solo es posible si el verbo se nombra:
Fibonacci =: 1 : ` ( Fibonacci @ - y 2 + Fibonacci @ <: ) @. ( > Y 2 )
La siguiente expresión exhibe pi con n dígitos y demuestra las capacidades de precisión extendidas de J:
n=: 50
NÓTESE BIEN. establezca n como el número de dígitos necesarios NB. precisión extendida 10 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 rico conjunto de verbos predefinidos, todos los cuales funcionan en múltiples tipos de datos automáticamente: por ejemplo, el verbo i. busca dentro de matrices de cualquier tamaño para encontrar coincidencias:
3 1 4 1 5 9 i . 3 1 NB. encuentre el índice de la primera aparición de 3 y de 1 0 1 3 1 4 1 5 9 i : 3 1 NB. encontrar el índice de la última aparición de 3 y de 1 0 3
Los programas de usuario se pueden nombrar y utilizar siempre que se permitan primitivas.
El poder de J proviene en gran parte de sus modificadores : símbolos que toman sustantivos y verbos como operandos y aplican los operandos 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 su argumento 'Por lo tanto, la oración
+ / 1 2 3 4 5
produce el efecto de
1 + 2 + 3 + 4 + 5 + / 1 2 3 4 5 15
J 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. Mientras que los modificadores son poderosos individualmente, permitiendo
- 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 que los modificadores se combinen 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 (personaje)
- En caja
De estos, el numérico tiene la mayor cantidad de variantes.
Uno de los tipos numéricos de J es el bit . Hay dos valores de bit: 0 y 1 . Además, los bits se pueden formar en listas. Por ejemplo, 1 0 1 0 1 1 0 0
es una lista de ocho bits. Sintácticamente, el analizador J lo trata como una palabra. (El carácter de espacio se reconoce como un carácter de formación de 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 y , o , exclusivo o , rotar , desplazar , no , 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. Se pueden formar en matrices bidimensionales, tridimensionales, etc. Las operaciones anteriores funcionan igualmente bien en estas matrices.
Otros tipos numéricos incluyen entero (p. Ej., 3, 42), punto flotante (3.14, 8.8e22), complejo (0j1, 2.5j3e88), entero de precisión extendida (12345678901234567890x) y fracción racional (precisión extendida) (1r2, 3r4). Al igual que con los bits, estos pueden formarse en listas o matrices de dimensiones arbitrarias. Al igual que con los bits, las operaciones se realizan en todos los números de una matriz.
Las listas de bits se pueden convertir a números enteros usando el #.
verbo. Los enteros se pueden convertir en listas de bits usando el #:
verbo. (Al analizar J, .
(punto) y :
(dos puntos) son caracteres que forman palabras. Nunca son tokens solos, a menos que estén precedidos por espacios en blanco ).
J también admite el tipo literal (carácter). Los literales se incluyen entre comillas, por ejemplo, 'a'
o 'b'
. Las listas de literales también se admiten mediante 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 ). Las operaciones numéricas y booleanas no se admiten en literales, pero sí se admiten las operaciones orientadas a colecciones (como rotar).
Finalmente, hay un tipo de datos en caja. Por lo general, los datos se colocan en un cuadro usando la <
operación (sin un argumento a la izquierda; si hay un argumento a la izquierda, esta sería la operación menor que ). Esto es análogo a la operación de C&
(sin argumento a la izquierda). Sin embargo, donde 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 en J, <
pone los datos en una caja y permite trabajar con un arreglo de cajas (se puede ensamblar con otras cajas y / 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 la matriz de dimensiones arbitrarias. La mayoría de los algoritmos se pueden expresar de forma muy concisa mediante operaciones en estas matrices.
Las matrices de J están escritas de forma homogénea, por ejemplo, la lista 1 2 3
es una lista de enteros a pesar de 1
ser un poco. En su mayor parte, este tipo de problemas de tipo son transparentes para los programadores. Solo ciertas operaciones especializadas revelan diferencias de tipo. Por ejemplo, la 1.0 0.0 1.0 0.0
mayoría de las operaciones tratarían la lista exactamente igual que la lista 1 0 1 0
.
J también admite matrices numéricas dispersas donde se almacenan valores distintos de cero con sus índices. Este es un mecanismo eficiente donde relativamente pocos valores son distintos de cero.
J también admite objetos y clases, [14] pero estos son un artefacto de la forma en que se nombran las cosas y no son tipos de datos. En cambio, los literales en caja se utilizan para referirse a objetos (y clases). Los datos J tienen semántica de valor, pero los objetos y las clases necesitan semántica de referencia. [ cita requerida ]
Otro pseudo-tipo, asociado con el nombre, más que con el valor, es el archivo mapeado en memoria.
Depuración
J tiene las facilidades habituales para detenerse ante un error o en lugares específicos dentro de los verbos. También tiene un depurador visual único, llamado Dissect , que brinda una visualización interactiva en 2-D de la ejecución de una sola oración en J. Debido a que una sola oración de J realiza tantos cálculos como una subrutina completa en lenguajes de nivel inferior, la presentación visual es bastante útil.
Documentación
La documentación de J incluye un diccionario , con palabras en J identificadas como sustantivos , verbos , modificadores , etc. Las palabras primarias se enumeran en el vocabulario , en el que sus respectivas partes del discurso 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 guión es un verbo monádico, y en " 3-2
" el guión es un verbo diádico. La definición monádica es mayormente 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 (detalles aquí) similares a otros lenguajes de procedimiento. Las palabras de control prominentes en cada categoría incluyen:
assert.
break.
continue.
for.
goto_label.
if. else. elseif.
return.
select. case.
throw.
try. catch.
while. whilst.
Ver también
- K (lenguaje de programación) - otro lenguaje influenciado por APL
- Q - El lenguaje de KDB + y una nueva versión fusionada de K y KSQL.
Referencias
- ^ "Versión de J901 el 15 de diciembre de 2019" .
- ^ https://www.jsoftware.com/#/README
- ^ Wes McKinney en 2012 reunión Python para análisis de datos
- ^ Documentación de SuperCollider, Adverbios para operadores binarios
- ^ Una vista personal de APL , ensayo de 1991 de KE Iverson (enlace archivado)
- ^ Descripción general de la historia de J por Roger Hui (19 de marzo de 2002)
- ^ Palabras de 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 , págs. 21–31, ISBN 978-3-540-35094-1 Falta o vacío
|title=
( ayuda ) - ^ Holt, Alan (2007), Network Performance Analysis: Using the J Programming Language , Springer , ISBN 978-1-84628-822-7
- ^ Página de descarga de fuentes de Jsoftware
- ^ Eric Iverson (1 de marzo de 2011). "J Source GPL" . J lista de distribución de correo de programación .
- ^ openj en GitHub
- ^ Política de abastecimiento de Jsoftware
- ^ Capítulo 25: Programación orientada a objetos
enlaces externos
- Sitio web oficial - JSoftware, creadores de J
- jsource en GitHub - Repositorio
- Learning J - Introducción al lenguaje de programación J por Roger Stokes