stringtranslate.com

J (lenguaje de programación)

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]

Ejemplos

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), ijconsoley 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 3era 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 avgpara 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 42.5

Arriba, promedio se define utilizando una serie de tres verbos ( +/, %y #) denominada bifurcación . Específicamente, (V0 V1 V2) Nyes 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 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 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 aleatoria  m46 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 selecten SQL y de whileen C.

La implementación de quicksort , del Diccionario J produce:

 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. )                         

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 

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 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.

Tipos de datos y estructuras.

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.

Depuración

Diseccionando la secuencia de Collatz a partir de 6

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.

Documentación

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.

Estructuras de Control

J proporciona estructuras de control (detalles aquí) similares a otros lenguajes de procedimiento. Las palabras de control destacadas en cada categoría incluyen:

Ver también

Referencias

  1. ^ "Notas de la versión J9.5".
  2. ^ "Jsoftware".
  3. ^ Wes McKinney en la reunión de 2012 sobre Python para análisis de datos
  4. ^ Documentación de SuperCollider, Adverbios para operadores binarios
  5. ^ Una visión personal de APL, ensayo de 1991 de KE Iverson (enlace archivado)
  6. ^ Descripción general 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 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 {{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 Fuente 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

enlaces externos