Pergunta

me deparei J / K / APL há alguns meses, enquanto trabalhava meu caminho através de problemas alguns Projeto Euler , e ficou intrigado, para dizer o mínimo. Para cada solução python 20 linhas de aparência elegante I produzido, haveria um caráter gobsmacking 20 Solução J que corria em um décimo do tempo. Eu estive interessado em aprender alguns J básico, e fizeram algumas tentativas de pegar o vocabulário, mas encontraram a curva de aprendizagem a ser bastante íngreme.

Para aqueles que estão familiarizados com estas línguas, que você recomendaria investir algum tempo para aprender um (eu estou pensando J, em particular)? Gostaria de fazê-lo mais para o propósito de satisfazer a minha curiosidade do que para progressão na carreira ou alguma coisa assim.

Algumas circunstâncias pessoais a considerar, se o cuidado de:

  • Eu amo a matemática, e usá-lo diariamente no meu trabalho (como um matemático para uma partida), mas para ser honesto eu realmente não sinto limitado pelas ferramentas que eu uso (como python + NumPy) para que eu não posso usar essa desculpa.
  • Não tenho nenhum desejo especial de trabalho na indústria financeira, o que parece ser o principal porto de escala para os usuários K, pelo menos. Além disso, eu realmente deve aprender C # como um próximo idioma como é o idioma principal, onde eu trabalho. Então, em termos práticos, J quase definitivamente não deve ser a próxima língua que eu aprender.
  • Estou razoavelmente familiarizados com MATLAB portanto, usando uma linguagem de programação baseada em array não constituiria uma mudança de paradigma tremenda.

Qualquer conselhos daqueles familiarizados com línguas seria muito apreciado.

Foi útil?

Solução

Milhares de anos atrás, eu era um programador de APL. Por milhares, eu de volta média nos anos 70, quando o conjunto de caracteres personalizado significava que tínhamos terminais especiais de impressão com o conjunto de teclado APL e caráter, e IBM typeballs Selectric com os caracteres especiais, etc.

Eu fui a uma palestra de Ken Iverson em "Por APL era legal".

Sua tese era esta. Era uma vez a divisão longa foi um empreendimento matemático sério, reservado para estudantes de graduação. Notação para coisas como repetir expansões decimais envolveu uma grande pilha de simbolismo matemático. Era uma vez até mesmo algo como um número "negativo" foi necessário notação elaborado.

Ao longo dos anos - como chegamos a uma melhor compreensão destas abstrações - que surgiu com a notação muito mais compacto para conceitos complexos

.

O ponto de APL (e J e K) é resumir grandes algoritmos para a notação arrumados.

Hoje em dia, eu sou um programador Python. Acho que a minha exposição precoce a APL deformado meu cérebro, forçando-me a perguntar "o que é que isso significa?" e "esta é uma operação reutilizável?" e "o que é um resumo conciso para tudo isso fluff algorítmica?"

Além disso, como eu perseguir os problemas Projeto Euler o "lite programação funcional" do Python apoiado por meu "Gin-embebido lembranças da APL" são ambos muito útil na resolução dos exercícios.

Outras dicas

J é a minha linguagem de programação principal para o Projeto Euler e para uso pessoal no trabalho. Eu nunca se deparar com uma linguagem melhor para processamento de matriz, eo paradigma de programação tácito é útil e instigante quando você pegar o jeito dele. (Útil porque é instigante, de fato.) Alcançando competências de nível básico na língua é difícil, e lendo o código de outras pessoas é uma atividade intelectual disciplinado, mas a perseverança tem grandes recompensas por causa do poder, flexibilidade e concisão da linguagem.

Dito isso, a razão pela qual eu reservá-lo para pessoal uso no trabalho é que (1) ninguém na usos trabalho de TI, (2) a curva de aprendizagem é bastante íngreme, de modo que não é razoável para mim a pedir aos meus colegas para buscá-lo, e (3) o fato de que você pode construir programas intrincados em uma linha de código faz com que seja difícil de ler uma linha de código, especialmente se você não escrevê-lo sozinho. (I esperar gastar pelo menos meia hora estudando uma linha de código que os operadores usos dez ou mais, a menos que eles foram usados ??em uma tal maneira que eu entendo os princípios subjacentes completamente.)

Alguns exemplos de diversão J apresenta:

1) Qualquer função definida para operar em um único número pode ser feito para operar em matrizes de classificação arbitrária. Por exemplo:

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)

É exactamente a mesma função, apenas a operar sobre os átomos (componentes) de um único elemento de uma matriz de entrada 1xN. Da mesma forma, você pode ter uma função definida para o trabalho em Rank-dois arrays (matrizes) e aplicá-la a qualquer matriz de posição superior apenas usando o "conjunto (classificação).

2) Você pode tomar apenas sobre qualquer função teoricamente invertida em J e invertê-lo por 'iteração-lo para trás'. Por exemplo,

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

Eu tenho trabalhado em J e APL para a maioria dos últimos 25 anos e podem absolutamente recomendar. Eu ainda reverter para um ou outro quando eu tiver qualquer forma de análise de dados ad-hoc para fazer e eu tê-lo usado no Projeto Euler também.

Se você está interessado no projeto Euler, em seguida, J é definitivamente o único a escolher. O seu apoio para inteiros precisão infinita e primos torná-lo um ajuste muito bom.

Eu faço a minha vida com APL desde 1980. Eu estou olhando para a frente a continuar a fazê-lo por mais alguns anos. Não é apenas muito divertido de usar APL, as ofertas de linguagem excelente depuração recursos. implementações modernas são de pleno direito linguagens funcionais e são objeto orientado também.

Eu conheci muitas pessoas ao longo dos anos me perguntando quanto tempo eu acho que eu seria capaz de continuar com APL. Esses caras eram dbase e PL / 1 e ALGOL e Pascal and Forth e C e Focus e outros programadores. Entendeu?!

J é um pouco como um gênio: ele precisa ser mantido dentro de uma garrafa. Manter um monte de software lote em J é uma dor séria. Manter interfaces (Windows ou web baseado, porque sim, você pode configurar J para responder a Apache para produzir uma saída web) em J é uma experimental, círculo pouco conhecido do inferno.

Por outro lado, usando J é bom se você quiser: parse, peneire, analisar, trituração, etc alguns dados para mexer com ele, para descobrir o grão fino de um algoritmo, ou para impressionar o internets com o menor caminho possível calcular quantos triângulos caber em um círculo ou que não.

Eu vim muito perto adicionando J como um disjuntor do negócio no meu perfil carreiras em careers.stackoverflow.com , mas eu finalmente deixou-o Fora. Para mim, usando J é bom, produzindo J, no entanto, não é.

EDIT:

Isso foi há um tempo atrás. Eu ainda acho mal de soluções completas J na produção (isto é, todo o seu MVC). Como a resposta original, eu usei J como um COM em um projeto C #, onde J é fornecido com uma grande matriz que seria desajeitado para gerir em C #, com grande satisfação.

Parte do nosso trabalho é fazer com que modelos e código de dados falam . Não é fácil colmatar essa qualidade e sintaxe muito concisa de J. Várias estruturas, ao contrário J, têm fácil de trabalhar-com IDE, e tem apoio suficiente para permitir um para organizar o código de uma forma humanamente legível. capacidades über-matriz de J não compensar o que falta.

Eu acho que os seus 3 pontos mostram que você não precisa de aprender J. No entanto, eu não consigo pensar em qualquer situação onde aprender uma nova língua é prejudicial.

Ter tempo para aprender algo que você está interessado em (ou qualquer nova linguagem) sempre melhora as suas outras habilidades de programação. Você aprende diferentes abordagens para os problemas que você pode ser capaz de implementar de forma diferente com outros idiomas.

Além disso, com a sintaxe mínima de J, seria uma boa linguagem para garantir que você está obtendo resultados corretos quando você implementar uma solução em outro idioma.

Para trás nos dias Eldar Eu era um desenvolvedor linguagem APL, codificação em 370 assembler. Eu portado J para OS2, mas nunca aprendeu a usá-lo para o trabalho real. Atualmente estou trabalhando em Java e PHP e estava avaliando Python. Após as primeiras 3 seções do Python tutorial Fiquei impressionado com as muitas semelhanças que tinha a APL, que me trouxe aqui.

Eu recomendo fortemente aprender APL ou J como um exercício intelectual. Vai mudar a sua maneira de pensar sobre a programação (entortar seu cérebro) e, provavelmente, ajudar o seu Python codificação. Além disso, existem alguns trabalhos lá fora para programadores APL e J, e provavelmente menos programadores do que postos de trabalho.

Eu costumava trabalhar como programador APL durante vários anos na década de 1970. Eu amo a língua, mas não tê-lo usado por anos.

É um grande idioma para algumas coisas, mas eu realmente não posso invision usá-lo para desenvolvimento web, por exemplo.

O que é ótimo para é operações estatísticas e de matriz. Você pode resolver um problema de programação forro em 3 caracteres. É muito mais fácil para demonstrar a veracidade de que a implementação de um LP que leva páginas em C, por exemplo.

Então, se você quer aprender isso para a alegria de aprender, eu digo para ela ir. Para melhorar suas perspectivas de emprego, bem provavelmente há muitas outras coisas para aprender que irá impressionar um potencial empregador muito mais.

Esta é a confirmação divertido para mim, um fifty-algo anos de idade pessoa.

Hoje cedo, eu decidi aprender uma nova linguagem de programação século 21 após um intervalo de 27 anos fazendo programação zero. Eu escolhi Python, muito ao acaso, com medo da gui baseado e orientado a objeto mundo em que todos vivemos agora.

Para minha alegria, meus anos ganhando a vida como um APL cara de volta no meio dos anos 80 início dos anos que eu estou literalmente fechar através do material, com compreensão instantânea :) Só pensei que eu iria partilhar isso.

Sim, aprender APL / J / K, que lhe dará uma visão única sobre o que é possível.

I salientar que de @ MPelletier "quantos triângulos caber em um círculo" e sua implícita "... mas não para os problemas do mundo real", é um pouco míope. Sim, IDE do J Software carece de algumas coisas, mas o próprio IDE construção de um não é um grande problema, e uma boa IDE pode mascarar a má língua (o encolhimento de 20 linhas de 20 caracteres é não para ser espirrou em .) Eu tenho feito APL enquanto @KaiJaeger tem, se não mais, e minha mente pode ser deformado, mas eu nunca ter sido programação feliz com qualquer outra coisa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top