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 por Iverson).
Para evitar repetir el problema de los caracteres especiales de APL, J utiliza sólo el juego de caracteres ASCII básico , 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 J primarias (o primitivas ) 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, J trata muchos caracteres que en otros idiomas a menudo deben estar emparejados (como [] {} "" ``
o <>
) 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 con 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 lenguajes que admiten la programación orientada a objetos , el esquema de espacio de nombres jerárquico flexible de J (donde cada nombre existe en una configuración regional específica ) se puede utilizar eficazmente como marco para la programación orientada a objetos basada en clases y en prototipos .
Desde marzo de 2011, J es un software gratuito y de código abierto bajo la Licencia Pública General GNU versión 3 (GPLv3). [10] [11] [12] También se puede comprar la fuente bajo una licencia negociada. [13]
J permite un estilo y una composición de funciones sin puntos . Por lo tanto, sus programas pueden ser muy concisos y algunos programadores los consideran difíciles de leer.
El mensaje "¡Hola mundo!" El programa en J es:
'¡Hola Mundo!'
Esta implementación de hola mundo refleja el uso tradicional de J: los programas se ingresan en una sesión de intérprete J y se muestran los resultados de las expresiones. También es posible disponer 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!' salida ''
(Tenga en cuenta que las implementaciones j actuales instalan o jconsole
(porque Java usa jconsole), ijconsole
y probablemente lo instalen en /usr/bin o algún otro directorio (tal vez el directorio de la aplicación en OSX). Por lo tanto, aquí hay una dependencia del sistema que el usuario Tendría que resolver.)
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 ( ÷
).
Debido a que ASCII 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 mnemotécnico de las fichas 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=: +/ % #
+/
suma los elementos de la matriz. #
cuenta el número de elementos de la matriz. %
divide la suma por el número de elementos.Esta es una ejecución de prueba de la función:
avg 1 2 3 4
2.5
Arriba, promedio se define utilizando una serie de tres verbos ( +/
, %
y #
) denominada bifurcación . 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 promedio a cada subconjunto de rango 1 (cada fila) de m 17,2 22 21,2 26,4
El rango es un concepto crucial en J. Su significado en J es similar al significado de select
en SQL y de while
en C.
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. )
La siguiente es una implementación de Quicksort 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 las funciones que la componen.
clasificación rápida =: (( $:@ ( <#[ ) , ( =#[ ) , $:@ ( >#[ )) ( {~ ?@# )) ^: ( 1 <# )
La clasificación en J generalmente se logra usando los verbos incorporados (primitivos) /:
(sort up) y \:
(sort down). Las clasificaciones definidas por el usuario, como la clasificación rápida, arriba, normalmente tienen solo fines ilustrativos.
El siguiente ejemplo demuestra el uso del verbo de autorreferencia $:
para calcular recursivamente números de Fibonacci:
1 :` ( $:@-& 2 +$:@<: ) @. ( >& 2 )
Esta recursividad también se puede lograr haciendo referencia al verbo por su nombre, aunque, por supuesto, esto sólo es posible si el verbo tiene nombre:
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=: 50
NÓTESE BIEN. establezca n como el número de dígitos requeridos NB. precisión extendida 10 a la enésima * pi 314159265358979323846264338327950288419716939937510<.@o. 10x^n
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 automáticamente en múltiples tipos de datos: por ejemplo, el verbo i. busca dentro de matrices de cualquier tamaño para encontrar coincidencias:
3 1 4 1 5 9 yo . 3 1 NOTA. 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. encuentre el índice de la última aparición de 3 y de 1 0 3
Los programas de usuario pueden denominarse y utilizarse siempre que se permitan primitivas.
El poder de J proviene en gran medida 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 tu 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. Si bien los modificadores son poderosos individualmente, lo que permite
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.
J admite tres tipos simples:
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 bits: 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 formador 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 , exclusiva o , rotar , desplazar , no , etc. Por ejemplo,
1 0 0 1 0 0 1 0 +. 0 1 0 1 1 0 1 0 Nota. o 1 1 0 1 1 0 1 0
3 |. 1 0 1 1 0 0 1 1 1 1 1 NB. girar 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 se pueden formar en listas o matrices de dimensiones arbitrarias. Al igual que con los bits, las operaciones se realizan con todos los números de una matriz.
Las listas de bits se pueden convertir a números enteros usando el #.
verbo. Los números 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 están 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 8 bits de ancho (ASCII), pero J también admite otros literales ( Unicode ). Las operaciones numéricas y booleanas no se admiten en literales, pero sí se admiten operaciones orientadas a colecciones (como rotar).
Finalmente, hay un tipo de datos en cuadro. Normalmente, los datos se colocan en un cuadro mediante 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, cuando el resultado de C &
tiene una semántica de referencia, el resultado de J <
tiene una 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 J, <
mete los datos en una caja y permite trabajar con un array 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 la matriz de dimensiones arbitrarias. La mayoría de los algoritmos se pueden expresar de manera muy concisa utilizando operaciones en estas matrices.
Los arreglos de J están tipificados de manera homogénea, por ejemplo la lista 1 2 3
es una lista de números enteros a pesar de 1
ser un bit. En su mayor parte, este tipo de problemas son transparentes para los programadores. Sólo ciertas operaciones especializadas revelan diferencias de tipo. Por ejemplo, la lista 1.0 0.0 1.0 0.0
sería tratada exactamente igual, en la mayoría de las operaciones, 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 cuadros se utilizan para referirse a objetos (y clases). Los datos J tienen una semántica de valor, pero los objetos y las clases necesitan una semántica de referencia. [ cita necesaria ]
Otro pseudotipo, asociado con el nombre, en lugar del valor, es el archivo mapeado en memoria.
J tiene las facilidades habituales para detenerse por error o en lugares específicos dentro de los verbos. También tiene un depurador visual único, llamado Dissect, que ofrece una visualización interactiva en 2-D de la ejecución de una sola oración J. Debido a que una sola oración de J realiza tanto cálculo como una subrutina completa en lenguajes de nivel inferior, la presentación visual es bastante útil.
La documentación de J incluye un diccionario, con palabras en J identificadas como sustantivos, verbos, modificadores, etc. Las palabras principales se enumeran en el vocabulario, en el que sus respectivas partes del discurso se indican mediante marcas. 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 mayoritariamente independiente de la definición diádica, independientemente de si el verbo es un verbo primitivo o un verbo derivado.
J proporciona estructuras de control (detalles aquí) similares a otros lenguajes de procedimiento. Las palabras de control destacadas en cada categoría incluyen:
assert.
break.
continue.
for.
goto_label.
if. else. elseif.
return.
select. case.
throw.
try. catch.
while. whilst.
{{citation}}
: Falta o está vacío |title=
( ayuda )