Pregunta

Me encontré con J/K/APL hace unos meses mientras trabajaba en algunos proyecto euler problemas y estaba intrigado, por decir lo menos.Por cada solución Python de 20 líneas de aspecto elegante que produje, habría 20 asombrosas personaje Solución J que se ejecutó en una décima parte del tiempo.Tenía muchas ganas de aprender algo de J básico y he hecho algunos intentos de adquirir vocabulario, pero he descubierto que la curva de aprendizaje es bastante pronunciada.

A aquellos que estén familiarizados con estos idiomas, ¿recomendarían invertir algo de tiempo para aprender uno (estoy pensando en J en particular)?Lo haría más con el fin de satisfacer mi curiosidad que para avanzar en mi carrera o algo así.

Algunas circunstancias personales a considerar, si lo desea:

  • Me encantan las matemáticas y las uso a diario en mi trabajo (como matemático para una startup) pero, para ser honesto, no me siento limitado por las herramientas que uso (como Python + NumPy), así que no puedo usar esa excusa. .
  • No tengo ningún deseo particular de trabajar en la industria financiera, que parece ser el principal puerto de escala al menos para los usuarios de K.Además, debería aprender C# como siguiente idioma, ya que es el idioma principal en el que trabajo.En términos prácticos, J casi definitivamente no debería ser el próximo idioma que aprenda.
  • Estoy bastante familiarizado con MATLAB, por lo que utilizar un lenguaje de programación basado en matrices no constituiría un gran cambio de paradigma.

Cualquier consejo de aquellos familiarizados con estos idiomas será muy apreciado.

¿Fue útil?

Solución

Hace

Miles de años, yo era un programador de APL. Por miles, quiero decir allá por los años 70 cuando el conjunto de caracteres personalizado significaba que teníamos terminales especiales de impresión con el teclado y el conjunto de caracteres APL, y typeballs Selectric IBM con los caracteres especiales, etc.

Fui a una conferencia a cargo de Ken Iverson en "¿Por APL fuera fresco".

Su tesis era esto. Había una vez una división larga era un serio compromiso matemática, reservado a los estudiantes graduados. Notación para cosas como la repetición de las expansiones decimales implicado un gran montón de simbolismo matemático. Había una vez se requiere incluso algo así como un número "negativo" notación elaborado.

A través de los años - como llegamos a una mejor comprensión de estas abstracciones - Se nos ocurrió con la notación más compacta para conceptos complejos

.

El punto de APL (y J y K) es resumir grandes algoritmos en notación ordenado.

Hoy en día, soy un programador de Python. Encuentro que mi primera exposición a APL deformado por mi cerebro me obliga a preguntar "¿qué significa esto?" y "se trata de una operación reutilizable?" y "lo que es un resumen conciso de todo esto pelusa algorítmica?"

Además, como persigo la problemas Proyecto Euler la "Lite programación funcional" de Python respaldado por mi "remojadas con ginebra recuerdos de APL" son muy útiles en la lucha contra los ejercicios.

Otros consejos

J es mi lenguaje de programación principal para el Proyecto Euler y para su uso personal en el trabajo. Nunca he encontrado una mejor idioma para el procesamiento de señal, y el paradigma de programación tácito es a la vez útil y estimulante, una vez que el cuelgue de ella. (Útil porque se invita a la reflexión, de hecho.) Llegar a la competencia de nivel de entrada en el idioma es difícil, y la lectura de código de otras personas es una actividad intelectualmente disciplinado, pero la perseverancia tiene importantes beneficios debido a la potencia del lenguaje, la flexibilidad y la concisión.

Dicho esto, la razón por la que reservo para personal el uso en el trabajo es que (1) nadie más en el trabajo lo utiliza, (2) la curva de aprendizaje es bastante empinada, así que no es razonable para mí a mis colegas que recogerlo, y (3) el hecho de que se puede construir programas complejos en una línea de código que hace que sea difícil de leer una línea de código, especialmente si usted no ha escrito usted mismo. (Espero que pasar por lo menos media hora de estudiar una línea de código que utiliza diez o más operadores, a menos que se utilizaron de tal manera que entiendo los principios subyacentes a fondo.)

Algunos ejemplos de diversión J características:

1) Cualquier función definida para operar en un solo número puede ser hecho para operar en matrices de rango arbitrario. Por ejemplo:

NB. totient(n) = n * \prod_{p|n} (1 - 1/p)
totient=: * -.@%@~.&.q:

NB. Finding the totient of 10
totient 10

NB. Finding the totient of all numbers from 1 to 10
totient"0 (1+i.10)

Es exactamente la misma función, simplemente operando sobre los átomos (componentes de un solo elemento) de una matriz de entrada 1xN. Del mismo modo, se puede tomar una función definida a trabajar en el rango de dos matrices (matrices) y aplicarlo a cualquier matriz de rango más alto sólo mediante el uso de la conjunción "(ranking).

2) Usted puede tomar casi cualquier función invertible teóricamente en J y se invierte por 'la iteración hacia atrás'. Por ejemplo,

NB. Converts an array of binary digits to a decimal number
(#.) 1 0 1
5

NB. Converts a decimal number to an array of binary digits
(#.^:_1) 5
1 0 1

He trabajado en J y APL para la mayor parte de los últimos 25 años y lo recomiendo encarecidamente tanto. Todavía revertir a uno u otro cuando tengo cualquier forma de análisis de datos ad-hoc que hacer y lo he utilizado en el Proyecto Euler también.

Si está interesado en el Proyecto Euler entonces J es definitivamente el lugar a elegir. Su apoyo a números enteros de precisión infinitos números primos y lo convierten en un ajuste muy bueno.

Me gano la vida con LPA desde 1980. Estoy buscando foward a continuar haciéndolo durante algunos años más. No sólo es muy divertido de usar APL, el lenguaje ofrece características de depuración pendientes. implementaciones modernas son lenguajes funcionales de pleno derecho y están tan bien orientado a objetos.

conocí a muchas personas en los últimos años preguntándome cuánto tiempo supongo que sería capaz de continuar con APL. Esos tipos eran dBase y PL / 1 y Algol y Pascal y Forth y C y Focus y otros programadores. ¿Lo tienes?!

J es un poco como un genio: que necesita ser mantenido dentro de una botella. El mantenimiento de una gran cantidad de software de proceso por lotes en el que J es un dolor grave. El mantenimiento de las interfaces (Windows o basadas en web, porque sí, puede configurar J para responder a Apache para producir una salida web) en J es un círculo experimental, poco conocido del infierno.

Por otro lado, el uso de J está bien si quieres: analizar, tamizar, analizar, crujido, etc algunos datos para jugar con él, para averiguar el grano fino de un algoritmo, o para impresionar a la internets por el camino más corto posible calcular cuántos triángulos encaja en un círculo o lo que no.

Vine muy cerca de la adición de J como un tema de oferta en mis carreras perfil en careers.stackoverflow.com , pero en última instancia, lo dejó fuera. Para mí, usando J está bien, produciendo J, sin embargo, no lo es.

EDIT:

Eso fue hace un tiempo. Todavía pienso mal de soluciones J completas en la producción (es decir, toda su MVC). Dado que la respuesta original, he utilizado J como COM en un proyecto de C #, donde J se proporciona con una matriz grande que sería torpe para manejar en C #, con gran satisfacción.

Parte de nuestro trabajo es hacer que los modelos de datos y el código hablar . No es fácil que la reducción de la calidad y la sintaxis muy concisa de J. Varios marcos, a diferencia de J tienen fácil de trabajo con el IDE de, y tienen el apoyo suficiente para permitir que uno para organizar el código de una forma humanamente legible. capacidades über-matriz de J no compensan lo que le falta.

Creo que los 3 puntos muestran que usted no necesita aprender J. Sin embargo, no puedo pensar en cualquier situación en la que el aprendizaje de un nuevo idioma es perjudicial.

Tomar tiempo para aprender algo que le interesa en (o cualquier idioma nuevo) siempre mejora sus otras habilidades de programación. Se aprende diferentes enfoques a los problemas que puede ser capaz de poner en práctica de manera diferente con otros idiomas.

Además, con la sintaxis mínima de J, sería un buen lenguaje para asegurar que está recibiendo resultados correctos cuando se implementa una solución en otro idioma.

En los días Eldar yo era un desarrollador de lenguaje APL, la codificación en 370 ensamblador. Porté J para OS2, pero nunca supe cómo usarlo para el trabajo real. Actualmente estoy trabajando en Java y PHP y Python estaba evaluando. Después de las 3 primeras secciones del tutorial de Python me llamaron la atención las muchas similitudes que tenía que APL, que me trajo aquí.

Me gustaría recomendar encarecidamente el aprendizaje de APL o J como un ejercicio intelectual. Se va a cambiar su forma de pensar acerca de la programación (deformar el cerebro) y probablemente ayudar a su codificación de Python. También hay algunos puestos de trabajo que hay para APL y programadores J, y probablemente menos programadores de puestos de trabajo.

Yo solía trabajar como programador de APL durante varios años en los años 1970. Me encanta el idioma, pero no lo he usado durante años.

Es un gran lenguaje para algunas cosas, pero realmente no puede invision utilizarlo para el desarrollo web, por ejemplo.

Lo que es ideal para las operaciones estadísticas y es la matriz. Se puede resolver un problema de programación revestimiento en 3 caracteres. Es mucho más fácil de demostrar la exactitud de que la aplicación de un LP que tiene páginas en C, por ejemplo.

Así que si quieres aprender por la alegría de aprender, digo ir por ella. Para mejorar sus perspectivas de empleo, así que probablemente hay un montón de otras cosas que aprender que impresionar a un empleador potencial más.

Esta es la confirmación divertida para mí, una persona años cincuenta y algo viejo.

El día de hoy, decidí aprender un nuevo lenguaje de programación siglo 21 después de un intervalo de 27 años haciendo la programación cero. Cogí Python, bastante al azar, temerosa de la interfaz gráfica de usuario basada y objeto del mundo en que todos vivimos orientados en este momento.

Para mi gran alegría, mis años ganándose la vida como un chico APL allá por los años 80 significa que estoy literalmente comprimir a través del material, con la comprensión instantánea :) Sólo pensé en compartir eso.

Sí, aprende APL/J/K, te dará una visión única de lo que es posible.

Señalo que la frase de @MPelletier "cuántos triángulos caben en un círculo" y lo implícito "... pero no para problemas del mundo real" es un poco miope.Sí, al IDE de J Software le faltan algunas cosas, pero crear el propio IDE no es un gran problema, y ​​un buen IDE puede enmascarar un mal lenguaje (la reducción de 20 líneas a 20 caracteres es no para ser estornudado.) He estado haciendo APL tanto tiempo como @KaiJaeger, si no más, y mi mente puede estar deformada, pero nunca he sido feliz programando con otra cosa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top