J (lenguaje de programación)

Lenguaje de programación
Yo
ParadigmaMatriz , funcional , orientada a objetos ( basada en clases , basada en prototipos ), a nivel de función , tácita
Diseñado porKenneth E. Iverson , Roger Hui
ReveladorJSoftware
Apareció por primera vez1990 ; hace 34 años ( 1990 )
Versión estable
J9.5 / 20 de diciembre de 2023 ; hace 10 meses [1] (2023-12-20)
Disciplina de mecanografíadinámica
Sistema operativoMultiplataforma : Windows , Linux , macOS , Android , iOS , Raspberry Pi [2]
LicenciaLicencia GPL versión 3
Sitio webwww.jsoftware.com
Implementaciones principales
Yo
Influenciado por
APL
Influenciado
NumPy , [3] SuperCollider [4]

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 caracteres especiales de APL, J utiliza únicamente el conjunto básico de caracteres ASCII , recurriendo al uso del punto y los dos puntos como flexiones [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, 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 el 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 del 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 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 de manera efectiva como un marco para programación orientada a objetos tanto basada en clases como basada en prototipos .

Desde marzo de 2011, J es un 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 comprar el código fuente bajo una licencia negociada. [13]

Ejemplos

J permite un estilo sin puntos y la composición de funciones , por lo que 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 de intérprete de J y se muestran los resultados de las expresiones. También es posible hacer que los scripts de J se ejecuten 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 j actuales instalan jconsoleo (porque jconsole es utilizado por Java), ijconsoley probablemente instalan esto en /usr/bin o algún otro directorio (quizás el directorio de la aplicación en OSX). Por lo tanto, hay una dependencia del sistema aquí que el usuario tendría que resolver).

Históricamente, APL solía /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 ( ÷).

Como ASCII no incluye un símbolo de división per se , J utiliza % para representar la división, como una aproximación visual o recordatorio. (Esto ilustra algo del carácter mnemotécnico de los símbolos de J y algunos de los dilemas que impone el uso de ASCII).

Definir una función J denominada avgpara calcular el promedio de una lista de números da como resultado:

 avg=: +/ % #
  • +/ Suma los elementos de la matriz.
  • # Cuenta el número de elementos en 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 42.5

Arriba, avg se define usando una serie de tres verbos ( +/, %, y #) denominados fork . Específicamente, (V0 V1 V2) Nyes lo mismo que (V0(Ny)) V1 (V2(Ny))lo que muestra parte de la potencia de J. (Aquí V0, V1 y V2 denotan verbos y Ny denota un sustantivo).

Algunos ejemplos de uso avg:

 v=: ?. 20 $100 NB. un vector aleatorio  v46 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 NB. Promedio 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 NB. una matriz aleatoria  m46 5 29 2 439 10 7 10 4446 28 13 18 142 28 10 40 12
 avg"1 m NB. aplicar avg a cada submatriz de rango 1 (cada fila) de m 17,2 22 21,2 26,4

El rango es un concepto crucial en J. Su importancia en J es similar a la importancia de selecten SQL y de whileen C.

Al implementar quicksort del diccionario J se obtiene lo siguiente:

 sel =: adverbio def 'u#[' quicksort =: verbo definir si. 1 >: # 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 de quicksort que demuestra la programación tácita . Esta última 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 se aplicarán los argumentos aplicados a esta función a sus funciones componentes.

 clasificación rápida =: (( $:@ ( <#[ ) , ( =#[ ) , $:@ ( >#[ )) ( {~ ?@# )) ^: ( 1 <# )       

La ordenación en J se suele realizar mediante los verbos incorporados (primitivos) /:(sort up) y \:(sort down). Las ordenaciones definidas por el usuario, como quicksort, que se muestra más arriba, suelen tener un carácter meramente ilustrativo.

El siguiente ejemplo demuestra el uso del verbo autorreferencia $:para calcular recursivamente números de Fibonacci:

1 :` ( $:@-& 2 +$:@<: ) @. ( >& 2 )

Esta recursión también se puede lograr haciendo referencia al verbo por su nombre, aunque, por supuesto, esto solo 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 extendidas de J:

 n=: 50 NB. Establezca n como el número de dígitos requeridos  NB. Precisión extendida 10 a la n * pi 314159265358979323846264338327950288419716939937510<.@o. 10x^n 

Verbos y modificadores

Un programa o rutina (algo que toma datos como entrada y produce datos como salida) se denomina verbo . J tiene un amplio conjunto de verbos predefinidos, todos los cuales funcionan en múltiples tipos de datos de manera automática: 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 ocurrencia de 3, y de 1 0 1 3 1 4 1 5 9 i : 3 1 NB. encuentre el índice de la última ocurrencia de 3, y de 1 0 3                     

Los programas de usuario pueden nombrarse y usarse dondequiera que se permitan primitivos.

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 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. Si bien los modificadores son poderosos individualmente, lo que permite

  • ejecución repetida, es decir, do-while
  • 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 . 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 sintáctico de J la 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 , o exclusivo , 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 Nota: 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 matrices bidimensionales, tridimensionales, etc. Las operaciones anteriores funcionan igualmente bien en estas matrices.

Otros tipos numéricos incluyen enteros (p. ej., 3, 42), coma flotante (3.14, 8.8e22), complejos (0j1, 2.5j3e88), enteros de precisión extendida (12345678901234567890x) y fracciones racionales (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 en números enteros mediante el uso del #.verbo. Los números enteros se pueden convertir en listas de bits mediante el uso del #:verbo. (Al analizar J, .(punto) y :(dos puntos) son caracteres que forman palabras. Nunca son tokens solos, a menos que estén precedidos por caracteres de espacio 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 ). Las operaciones numéricas y booleanas no se admiten en literales, pero sí se admiten operaciones orientadas a colecciones (como rotar).

Por último, existe un tipo de datos en caja. Normalmente, los datos se colocan en una caja 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, 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 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 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 tienen tipos homogéneos; por ejemplo, la lista 1 2 3 es una lista de números enteros a pesar de 1 ser un bit. En la mayoría de los casos, 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 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, se utilizan literales encajonados para hacer referencia a objetos (y clases). Los datos de J tienen semántica de valor, pero los objetos y las clases necesitan semántica de referencia. [ cita requerida ]

Otro pseudotipo, asociado con el nombre, en lugar del valor, es el archivo mapeado en memoria.

Depuración

Diseccionando la secuencia de Collatz a partir del 6

J tiene las funciones habituales para detenerse en caso de 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 2D de la ejecución de una sola oración de J. Debido a que una sola oración de J realiza tantos cálculos como una subrutina completa en lenguajes de nivel inferior, la visualización 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 se indican sus respectivas partes del discurso 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 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 (detalles aquí) similares a otros lenguajes procedimentales. Las palabras de control más importantes en cada categoría incluyen:

  • assert.
  • break.
  • continue.
  • for.
  • goto_label.
  • if. else. elseif.
  • return.
  • select. case.
  • throw.
  • try. catch.
  • while. whilst.

Véase también

Referencias

  1. ^ "Notas de la versión J9.5".
  2. ^ "Software J".
  3. ^ Wes McKinney en la reunión de 2012 sobre Python para el análisis de datos
  4. ^ Documentación de SuperCollider, Adverbios para operadores binarios
  5. ^ Una visión personal de APL, ensayo de KE Iverson de 1991 (enlace archivado)
  6. ^ Panorama de la historia de J por Roger Hui (19 de marzo de 2002)
  7. ^ Palabras de J NuVoc
  8. ^ Bussell, Brian; Taylor, Stephen (2006), "Desarrollo de software como un 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 {{citation}}: Falta o está vacío |title=( ayuda )
  9. ^ Holt, Alan (2007), Análisis del rendimiento de la red: uso del lenguaje de programación J , Springer , ISBN 978-1-84628-822-7
  10. ^ Página de descarga del código fuente de Jsoftware
  11. ^ Eric Iverson (1 de marzo de 2011). «J Source GPL». Lista de correo de programación J. Archivado desde el original el 23 de septiembre de 2016. Consultado el 24 de junio de 2015 .
  12. ^ openj en GitHub
  13. ^ Política de abastecimiento de Jsoftware
  14. ^ Capítulo 25: Programación orientada a objetos
  • Sitio web oficial – JSoftware, creadores de J
  • jsource en GitHub – Repositorio de código fuente
  • J-Wiki
  • Aprendiendo J: una introducción al lenguaje de programación J por Roger Stokes

Retrieved from "https://en.wikipedia.org/w/index.php?title=J_(programming_language)&oldid=1246865066"