44 votes

Est-ce que quelqu'un recommanderait d'apprendre J/K/APL?

Je suis tombé sur J/K/APL il y a quelques mois alors que je résolvais quelques problèmes de project euler, et j'ai été intrigué, pour le moins qu'on puisse dire. Pour chaque solution python de 20 lignes élégante que je produisais, il y avait une solution J époustouflante de 20 caractères qui tournait en un dixième du temps. J'ai été désireux d'apprendre un peu de J, et j'ai fait quelques tentatives pour apprendre le vocabulaire, mais j'ai trouvé la courbe d'apprentissage assez raide.

À ceux qui sont familiers avec ces langages, recommanderiez-vous d'investir du temps pour en apprendre un (je pense en particulier à J)? Je le ferais plus pour satisfaire ma curiosité que pour une avancée de carrière ou quelque chose du genre.

Quelques circonstances personnelles à prendre en considération, si cela vous intéresse :

  • J'aime les mathématiques, et je les utilise quotidiennement dans mon travail (en tant que mathématicien pour une start-up) mais honnêtement je ne me sens pas vraiment limité par les outils que j'utilise (comme python + NumPy) donc je ne peux pas utiliser cette excuse.
  • Je n'ai pas particulièrement envie de travailler dans l'industrie financière, qui semble être le principal point d'appel pour les utilisateurs de K au moins. De plus, je devrais vraiment apprendre le C# comme prochain langage car c'est le langage principal là où je travaille. Donc pratiquement parlant, J ne devrait presque certainement pas être le prochain langage que j'apprends.
  • Je suis plutôt familier avec MATLAB donc utiliser un langage de programmation basé sur des tableaux ne constituerait pas un changement de paradigme énorme.

Tout conseil de la part de ceux qui sont familiers avec ces langages serait grandement apprécié.

54voto

S.Lott Points 207588

Il y a des milliers d'années, j'étais programmeur en APL. Par milliers, je veux dire dans les années 70 quand l'ensemble de caractères personnalisé signifiait que nous avions des terminaux d'impression spéciaux avec le clavier et l'ensemble de caractères APL, des boules de type IBM Selectric avec les caractères spéciaux, etc.

Je suis allé à une conférence de Ken Iverson sur "Pourquoi l'APL était cool".

Son thèse était la suivante. Autrefois, la division longue était une entreprise mathématique sérieuse, réservée aux étudiants diplômés. La notation pour des choses comme les expansions décimales périodiques impliquait un grand tas de symboles mathématiques. Autrefois, même quelque chose comme un nombre "négatif" nécessitait une notation élaborée.

Au fil des années - à mesure que nous avons mieux compris ces abstractions - nous avons trouvé une notation beaucoup plus compacte pour des concepts complexes.

Le but de l'APL (et de J et K) est de résumer de grands algorithmes en une notation soignée.

De nos jours, je suis programmeur Python. Je trouve que mon exposition précoce à l'APL a déformé mon cerveau en me forçant à me demander "que signifie ceci?" et "est-ce une opération réutilisable?" et "quel est un résumé concis de tout ce flot algorithmique?"

Aussi, lorsque je poursuis les problèmes de Project Euler, la "programmation fonctionnelle lite" de Python appuyée par mes "souvenirs de l'APL imprégnés de gin" sont tous deux très utiles pour aborder les exercices.

17voto

estanford Points 839

J est mon langage de programmation principal pour Project Euler et pour un usage personnel au travail. Je n'ai jamais trouvé de meilleur langage pour le traitement de tableaux, et le paradigme de programmation tacite est à la fois utile et stimulant une fois que vous l'avez compris. (Utile car il est stimulant, en fait.) Atteindre une compétence de base dans le langage est difficile, et lire le code des autres est une activité intellectuellement disciplinée, mais la persévérance a des retombées importantes en raison de la puissance, de la flexibilité et de la concision du langage.

Cela dit, la raison pour laquelle je le réserve pour un usage personnel au travail est que (1) personne d'autre au travail ne l'utilise, (2) la courbe d'apprentissage est assez raide pour qu'il ne soit pas raisonnable de demander à mes collègues de l'apprendre, et (3) le fait que vous puissiez construire des programmes complexes en une seule ligne de code rend difficile la lecture d'une ligne de code, surtout si vous ne l'avez pas écrite vous-même. (Je m'attends à passer au moins une demi-heure à étudier une ligne de code qui utilise dix opérateurs ou plus, sauf s'ils sont utilisés de telle manière que je comprenne parfaitement les principes sous-jacents.)

Quelques exemples de fonctionnalités amusantes de J :

1) Toute fonction définie pour opérer sur un seul nombre peut être amenée à opérer sur des tableaux de rang arbitraire. Par exemple :

totient=: * -.@%@~.&.q:

NB. Trouver le totient de 10
totient 10

NB. Trouver le totient de tous les nombres de 1 à 10
totient"0 (1+i.10)

C'est exactement la même fonction, elle opère simplement sur les atomes (composants à élément unique) d'un tableau d'entrée 1xN. De même, vous pouvez prendre une fonction définie pour travailler sur des tableaux de rang deux (matrices) et l'appliquer à n'importe quel tableau de rang supérieur en utilisant simplement la conjonction " (rang).

2) Vous pouvez prendre à peu près n'importe quelle fonction théoriquement inversible en J et l'inverser en l' 'itérant à l'envers'. Par exemple,

NB. Convertit un tableau de chiffres binaires en un nombre décimal
(#.) 1 0 1
5

NB. Convertit un nombre décimal en un tableau de chiffres binaires
(#.^:_1) 5
1 0 1

16voto

Duncan Points 141

J'ai travaillé en J et APL pendant la majeure partie des 25 dernières années et je peux les recommander vivement tous les deux. Je reviens toujours à l'un ou à l'autre lorsque j'ai n'importe quelle forme d'analyse de données ad hoc à faire et je l'ai utilisé dans Project Euler également.

Si vous êtes intéressé par Project Euler, alors J est définitivement le bon choix. Son support pour les entiers de précision infinie et les nombres premiers en font un très bon choix.

14voto

Je gagne ma vie avec APL depuis 1980. J'ai hâte de continuer à le faire pendant encore quelques années à venir. Ce n’est pas seulement très amusant d'utiliser APL, le langage offre des fonctionnalités de débogage exceptionnelles. Les implémentations modernes sont des langages fonctionnels à part entière et sont également orientées objet.

J'ai rencontré beaucoup de gens au fil des ans me demandant combien de temps je pense pouvoir continuer avec APL. Ces gars-là étaient des programmeurs de dbase, PL/1, ALGOL, Pascal, Forth, C, Focus et autres. Tu piges ?!

13voto

MPelletier Points 8326

J est un peu comme un génie : il doit être gardé à l'intérieur d'une bouteille. Maintenir beaucoup de logiciels batch en J est une vraie galère. Maintenir des interfaces (basées sur Windows ou le web, car oui, vous pouvez configurer J pour répondre à Apache et produire une sortie web) en J est un cercle de l'enfer expérimental et peu connu.

En revanche, utiliser J est bien si vous souhaitez : analyser, trier, analyser, bricoler, etc des données pour jouer avec, pour comprendre les subtilités d'un algorithme, ou pour impressionner les internets avec la façon la plus courte possible de calculer combien de triangles rentrent dans un cercle ou autre.

J'ai été très tenté d'ajouter J comme un critère rédhibitoire sur mon profil professionnel sur careers.stackoverflow.com, mais je l'ai finalement laissé de côté. Pour moi, utiliser J est bien, mais produire du J, en revanche, ne l'est pas.

EDIT :

C'était il y a un moment. Je continue à avoir une mauvaise opinion des solutions complètes en J en production (c'est-à-dire, tout votre MVC). Depuis la réponse initiale, j'ai utilisé J comme un COM dans un projet C#, où J est fourni avec une grande matrice qui serait compliqué à gérer en C#, avec une grande satisfaction.

Une partie de notre travail consiste à faire parler les modèles de données et le code. Il n'est pas facile de combler le fossé entre la qualité et la syntaxe très concise de J. Plusieurs frameworks, contrairement à J, ont des IDE faciles à utiliser, et ont un soutien suffisant pour permettre de structurer le code de manière lisible pour un humain. Les capacités über-matrice de J ne compensent pas ce qu'il lui manque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X