Topic: Dopo Python? J!  (Letto 2612 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2.045
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of your Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of your Python code
Dopo Python? J!
« il: Settembre 08, 2013, 17:28 »
Ogni tanto spuntano sul forum discussioni del tipo "che linguaggio imparare dopo Python?". Anche io, conoscendo ormai Python abbastanza bene, ho deciso di ampliare gli orizzonti, imparando prima Javascript e la sintassi di LESS e Coffeescript (per sviluppare un sito), poi decidendo di imparare un linguaggio completamente nuovo e diverso da Python. Di solito la scelta ricade su uno tra Java, Javascript o Ruby, ma tutti questi sono in un modo o nell'altro simili a Python (paradigma imperativo).

Personalmente, alla fine ero indeciso tra Haskell e... J. J è un linguaggio poco conosciuto che prima avevo visto solo nel forum di Project Euler. La maggior parte delle soluzioni in J erano sempre un paio di linee di codice! :D Sono rimasto incuriosito e ho fatto una breve ricerca su J. In poche parole (cit. Wikipedia):

"J is a very terse array programming language, and is most suited to mathematical and statistical programming, especially when performing operations on matrices."

Alla fine ho deciso di buttarmi su J e di posticipare Haskell. Ora, dopo 1 settimana credo di aver capito abbastanza bene le basi del linguaggio e devo dire di essere rimasto veramente impressionato. Lo consiglio a tutti coloro che hanno voglia di imparare qualcosa di completamente nuovo e diverso!
Inizialmente può apparire oscuro e criptico, ma dopo un po' ci si fa l'abitudine e si riesce ad apprezzare la concisione e l'espressività del linguaggio. Tutto si basa sugli array, che sono il datatype principale e il corrispettivo delle funzioni sono i verbi. Ci sono poi avverbi, congiunzioni, gerundi e agende (lol).

Giusto per fare un esempio, questa è la soluzione al problema 47 di Project Euler:
[codice=j]{. >: I. 16= 4 +/\ (#@([:~.q:))"0 >:i.14e4[/codice]

Io lo trovo un linguaggio veramente interessante, voi cosa ne pensate? ;)



P.S. Non ho menzionato la parte più interessante: esiste uno stile (tacit programming) che consiste nel definire le funzioni senza specificare gli argomenti e senza specificarli nel corpo della funzione :D Per fare un esempio classico (nel mondo di J):
[codice=j]avg=:+/%#[/codice]

avg è un verbo che calcola la media degli elementi di un array. La sua definizione è costituita da 3 verbi: +/ (/ è un avverbio che corrisponde a fold dei linguaggi puramente funzionali, quindi inserisce il verbo + tra gli elementi dell'array), % effettua la divisione e # equivale a len().

In pratica quando viene applicato:
[codice=j]
   avg 1 2 3
2
   avg 1 2 3 4
2.5[/codice]

(f g h) y viene trasformato in (f y) g (h y) <=> (+/ y) % (# y). y è l'argomento, quindi (nel primo caso): (+/ 1 2 3) % (# 1 2 3) => 6 % 3 => 2.
La "struttura" di verbi (f g h) si chiama fork ed è solo una delle cose interessantissime di J ;).
« Ultima modifica: Settembre 08, 2013, 17:38 da Python »

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re: Dopo Python? J!
« Risposta #1 il: Settembre 08, 2013, 22:05 »
Che dire, ad ognuno il suo! E' da tempo che ho visto J e sinceramente ho sempre deciso di non guardarmelo per una serie di motivi.
Non che non possa essere carino, ma io non ho piu' il tempo e la testa per mettermi a fare qualcosa che temo abbia prospettive zero nel mio futuro.
Ovviamente piu' uno si esercita la testa da giovane meglio fa, quindi non devi assolutamente prendere questo come un consiglio a non proseguire con J.

Posso dire che la maggior parte dei linguaggi che ho studiato non mi convincono fino in fondo. Fra questi, per esempio Haskell.

Per me J e' incompatibile con i miei valori: sono per la leggibilita' estrema, la densita' semantica per me e' un difetto. Ovviamente c'e' chi la ricerca.

Riguardo "tacit programming", fuori dalla comunita' di discendenza APL, e' noto come point-free programming (per esempio in Haskell).
Fuori dalla comunita' di quelli che usano linguaggi dove e' comune fare point-free programming, e' noto come pointless programming, per enfatizzare i vantaggi di questo stile di programmazione. ;)

Ovviamente e' splendido chiamare lo stile point-free in linguaggi come Haskell. Per esempio, un filter-map si scrive:

mf = (. map) . (.) . filter

Almeno secondo wikipedia. Io scopro che quando gioco con Haskell mi diverte molto perdere ore invece che scrivendo codice funzionante cercando di convertire pezzi crescentemente complicati di codice in pf style. L'alternativa e' che mi metto a progettare sistemi di tipi e monadi e non combino comunque una fava. Voglio dire... mi diverte anche molto avere tutte ste possibilita', peccato che poi non combini molto: e si che Haskell sarebbe un linguaggio molto produttivo.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.869
  • Punti reputazione: 9
    • Mostra profilo
Re: Dopo Python? J!
« Risposta #2 il: Settembre 09, 2013, 09:42 »
fantastico! ma non avevamo abbandonato perl proprio per evitare questo genere di cose?

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2.045
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of your Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of your Python code
Re: Dopo Python? J!
« Risposta #3 il: Settembre 09, 2013, 18:37 »
Citazione
Non che non possa essere carino, ma io non ho piu' il tempo e la testa per mettermi a fare qualcosa che temo abbia prospettive zero nel mio futuro.

Si beh, non ho iniziato a impararlo per metterlo nel curriculum, ma per divertimento, come hai capito :).

Citazione
Riguardo "tacit programming", fuori dalla comunita' di discendenza APL, e' noto come point-free programming (per esempio in Haskell).
Fuori dalla comunita' di quelli che usano linguaggi dove e' comune fare point-free programming, e' noto come pointless programming, per enfatizzare i vantaggi di questo stile di programmazione. ;)
Ovviamente e' splendido chiamare lo stile point-free in linguaggi come Haskell. Per esempio, un filter-map si scrive:

mf = (. map) . (.) . filter

Almeno secondo wikipedia. Io scopro che quando gioco con Haskell mi diverte molto perdere ore invece che scrivendo codice funzionante cercando di convertire pezzi crescentemente complicati di codice in pf style. L'alternativa e' che mi metto a progettare sistemi di tipi e monadi e non combino comunque una fava. Voglio dire... mi diverte anche molto avere tutte ste possibilita', peccato che poi non combini molto: e si che Haskell sarebbe un linguaggio molto produttivo.

O.o Pointless programming?! Che insolenza!
Però in effetti fa perdere un sacco di tempo :D Non per il fatto di essere "tacit", ma perché risulta proprio come una sfida: perdo tipo 20 minuti buoni a convertire in stile "tacit" un verbo definito esplicitamente :D Alla fine, quando ci si riesce, è proprio una cosa splendida.

Penso che quando mi sarò stufato con Project Euler in J, e quando avrò una solida conoscenza di J (quindi tra un bel po') passerò ad approfondire C, invece di imparare un nuovo linguaggio. Ho sempre evitato di andare a fondo ai puntatori, malloc e compagnia :).

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2.045
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of your Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of your Python code
Re: Dopo Python? J!
« Risposta #4 il: Settembre 09, 2013, 18:42 »
fantastico! ma non avevamo abbandonato perl proprio per evitare questo genere di cose?

Ma ovvio, perché Perl è brutto!

A parte gli scherzi, non credo qualcuno usi J per mettere in piedi un sito web, per dire. Per quello infatti siamo passati a Python ;). Invece, io vedo J come il linguaggio di scripting dell'ambito scientifico, un po' come erano considerati i linguaggi di scripting qualche tempo fa rispetto ai colossi. Se hai bisogno di fare un grafico veloce, analizzare dati in qualsiasi forma/formato, allora usi J. È lo Tkinter dell'ambito scientifico direi.

Per quel che riguarda la chiarezza del codice io non credo sia poco leggibile. Rispetto a Python sì, lo è, perché se una persona a digiuno di programmazione legge un programma Python e conosce un minimo di inglese, allora capisce a grandi linee la logica del programma. Invece, una volta in possesso delle basi di J (e con un po' di allenamento) lo trovo chiaro e, soprattutto, veramente conciso. La concisione di J lo rende leggibile.
« Ultima modifica: Settembre 09, 2013, 18:45 da Python »

Offline Bakuriu

  • python sapiens sapiens
  • ******
  • Post: 2.267
  • Punti reputazione: 2
  • Katon, Goukakyuu no jutsu!
    • Mostra profilo
    • Jack's Blackboard - Il mio blog
Re: Dopo Python? J!
« Risposta #5 il: Settembre 09, 2013, 20:41 »
Ma a me pare semplicemente la "fotocopia" di APL.
Sicuramente è un linguaggio molto potente, video dimostrativo obbligatorio: Conway's Game Of Life in APL, in 80 byte implementa il game of life "a video"(nel senso che l'evoluzione delle generazioni viene mostrata in una finestra a parte, di continuo)
ma non fa al caso mio. In particolare o l'impressione che qualunque programma "grosso" risulti essere poco mantenibile.

Almeno secondo wikipedia. Io scopro che quando gioco con Haskell mi diverte molto perdere ore invece che scrivendo codice funzionante cercando di convertire pezzi crescentemente complicati di codice in pf style. L'alternativa e' che mi metto a progettare sistemi di tipi e monadi e non combino comunque una fava. Voglio dire... mi diverte anche molto avere tutte ste possibilita', peccato che poi non combini molto: e si che Haskell sarebbe un linguaggio molto produttivo.

Anche qui, link obbligatorio: The Evolution of an Haskell Programmer.
Haskell è un linguaggio che voglio imparare appunto per questo. L'anno scorso ho seguito un corso di teoria delle categorie(su cui sto facendo una tesina relativa alla formalizzazione di game semantics tra l'altro), e mi pare interessante andare a vedere come queste può essere usata all'interno di un linguaggio di programmazione vero e proprio.
« Ultima modifica: Settembre 09, 2013, 20:48 da Bakuriu »

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2.045
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of your Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of your Python code
Re: Dopo Python? J!
« Risposta #6 il: Settembre 09, 2013, 21:04 »
Più che la fotocopia è la sintesi di APL e i linguaggi FP e FL. In particolare sostituisce a tutti i caratteri Unicode di APL un equivalente ASCII. Non essendo abituato a quei caratteri lo trovo più difficile da leggere di J.

Per i programmi grossi non credo sia un problema, a patto che tutti i contributori conoscano bene J e si attengano a delle linee guida. Se il codice è commentato a sufficienza poi, non deve essere troppo difficile seguirlo. Che non ci siano progetti grossi (e famosi) in J è vero, ma probabilmente perché non ci sono programmatori J a sufficienza e/o costerebbe troppo trovarli e assumerli.

Il video comunque è bellissimo e dimostra la potenza di questa famiglia di linguaggi!

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2.045
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of your Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of your Python code
Re: Dopo Python? J!
« Risposta #7 il: Settembre 09, 2013, 22:30 »
Oo sono rimasto stupefatto nel vedere Flame_Alchemist 12 nella classifica di Project Euler (limitatamente ai linguaggi APL/J/K):
Citazione
12  Flame_Alchemist   Italy    167 6 APL/J/K

Ha risolto 167 problemi! Sarebbe ora che partecipasse a questo thread allora!

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.869
  • Punti reputazione: 9
    • Mostra profilo
Re: Dopo Python? J!
« Risposta #8 il: Settembre 10, 2013, 09:01 »
Citazione
Invece, io vedo J come il linguaggio di scripting dell'ambito scientifico
Ma guarda, mica tanto...
La grande lezione del successo di Python nell'ambito scientifico è gli scienziati non sono hacker che fanno ricerca nel tempo libero, ma sono ricercatori che hanno medie (talvolta mediocri) conoscenze di programmazione, e vogliono un linguaggio chiaro e leggibile, che renda facile capire se un risultato inaspettato è una scoperta da nobel o un baco da polli.
Un vero scienziato è fin troppo impegnato a tenere a mente le equazioni, i nomi, i concetti della propria disciplina, non ha energie e tempo da sprecare per capire che "{. >: I. 16= 4 +/\ (#@([:~.q:))"0 >:i.14e4" è la soluzione di un problema matematico. Uno scienziato, anche in python, userà un ciclo for invece di una list comprehension... Un vero scienziato vuole scrivere codice parlante, simile a pseudo-codice, perché quando poi lo fa girare tra i colleghi, tutti devono potersi orientare, magari anche senza conoscere python...

Offline Flame_Alchemist

  • python sapiens
  • *****
  • Post: 509
  • Punti reputazione: 1
    • Mostra profilo
    • compscient
Re: Dopo Python? J!
« Risposta #9 il: Settembre 13, 2013, 11:25 »
Visto che sono stato chiamato in causa, intervengo.
Non li ho risolti tutti in J, diversi sono stati fatti in Python, e alcuni in C (per esempio il 153). J tende a portare ancora piu' all'estremo l'idea di Haskell che le funzioni devono essere componibili.
E' un linguaggio che ha alcune caratteristiche molto interessanti (i gia' nominati fork/hook sono la piu' visibile); mentre altre sono abbastanza scomode: il fatto di avere funzioni di arita' massima 2 (a meno di ricorrere a trucchi inserendo in box -- simili a struct del C) e sempre da mettere in notazione infissa (come `f` in haskell, per interderci). L'error reporting e' molto scarso.

L'ottimo pandas e' ispirato a J, e Wes McKinney sta cercando un esperto di APL/J/K. Inoltre sul suo blog e' da un po' che predica la necessita' di un "embedded array expression compiler" in NumPy. Se usate emacs (infedeli!), inoltre, il J mode che c'e' su github funziona particolarmente male, quindi potrebbe essere un incentivo per convertirvi a vim (il cui j.vim funziona bene).

Citazione
Per i programmi grossi non credo sia un problema, a patto che tutti i contributori conoscano bene J e si attengano a delle linee guida. Se il codice è commentato a sufficienza poi, non deve essere troppo difficile seguirlo.
J punta molto sulla REPL. La risposta dei programmatori J a chi dice "come fate a correggere un errore che trovate 6 mesi dopo nel vostro codice?" e' "noi nel tempo che tu impieghi a trovare l'errore abbiamo riscritto tutto". E' forse una risposta un po' estremista -- non so quanto vera. J (e specialmente K) e' molto usato nell'ambito finanziario e immagino che comunque abbiano scritto diversi milioni di righe di J/K.

Citazione
La grande lezione del successo di Python nell'ambito scientifico è gli scienziati non sono hacker che fanno ricerca nel tempo libero, ma sono ricercatori che hanno medie (talvolta mediocri) conoscenze di programmazione,
E infatti usano quell'aberrazione che e' R.

Offline Aezio

  • python neanderthalensis
  • ****
  • Post: 327
  • Punti reputazione: 1
    • Mostra profilo
Re: Dopo Python? J!
« Risposta #10 il: Settembre 13, 2013, 11:52 »
Citazione
E infatti usano quell'aberrazione che e' R.

Cos'ha di cosi' osceno R? (non e' una critica, e' ignoranza)

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2.045
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of your Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of your Python code
Re: Dopo Python? J!
« Risposta #11 il: Settembre 13, 2013, 16:01 »
il fatto di avere funzioni di arita' massima 2 (a meno di ricorrere a trucchi inserendo in box -- simili a struct del C) e sempre da mettere in notazione infissa (come `f` in haskell, per interderci).

Questo si, vero. Finora ho sempre aggirato il problema in qualche modo, ma avevo pensato anche io ai box. Mi sembra l'unica soluzione se si vuole percorrere quella strada. In teoria non sarebbe necessario, perché si dovrebbero usare array/tabelle, però...

Citazione
Se usate emacs (infedeli!), inoltre, il J mode che c'e' su github funziona particolarmente male, quindi potrebbe essere un incentivo per convertirvi a vim (il cui j.vim funziona bene).

Ahah, io che uso Vim ho trovato questo (penso sia lo stesso che dici tu):
https://github.com/guersam/vim-j

È perfetto, però in J si usa così tanto il REPL che uso Vim solo per incollare il codice finale e salvare i file... Finora non ho scritto grandi programmi ma solo soluzioni a problemi di Project Euler :D
Per chi è interessato sono qui:
https://github.com/rubik/project-euler-j

Appena risolvo un problema lo aggiorno. Tutto il codice è mio, a parte dei pezzi in un paio di problemi che ho preso direttamente dalla sezione "Essays" della wiki :party: (numeri romani e conversione numeri-lettere mi pare).

Offline Flame_Alchemist

  • python sapiens
  • *****
  • Post: 509
  • Punti reputazione: 1
    • Mostra profilo
    • compscient
Re: Dopo Python? J!
« Risposta #12 il: Settembre 13, 2013, 18:55 »
Citazione
Cos'ha di cosi' osceno R? (non e' una critica, e' ignoranza)
Cosi', in ordine sparso:
- = e <- sono uguali, tranne in un caso, molto specifico.
- implementazione standard particolarmente lenta;
- importare una libreria puo' cambiare le funzioni "built-in", (apply(ice.cream, 2, is.numeric) da' un risultato sbagliato, mentre aggiungere library(Hmisc) sopra lo fa funzionare)
- conversioni implicite. apply(...) converte automaticamente gli argomenti in matrici/vettori, anche se sono dataframe (che sono una bestia diversa).
- 4/5 (non ricordo) modi per accedere ad una colonna di un dataframe.
- N/A dappertutto quando si importano dati non completi, ma nessun warning. NaN e' una cosa diversa ma is.na(x) ritorna TRUE se x e' NaN.
- mille funzioni con nomi tipo sapply, tapply, vapply, etc.
- oop particolarmente orrenda (direte voi: e' un linguaggio funzionale, cosa pretendi? Posso rispondere sia con CLOS sia con OCaml).
- e, ultimo, aggiungere parentesi in piu' attorno alle operazioni rallenta l'esecuzione.
Sono cose che magari a qualcuno sono comode, ma ad un programmatore tipicamente lo fanno rabbrividire. Molte cose tra quelle che ho nominato (me ne accorgo ora) sono anche contro lo zen di Python.

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2.045
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of your Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of your Python code
Re: Dopo Python? J!
« Risposta #13 il: Settembre 13, 2013, 19:14 »
- e, ultimo, aggiungere parentesi in piu' attorno alle operazioni rallenta l'esecuzione.

LOL! Questa è spettacolare ahah :X

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re: Dopo Python? J!
« Risposta #14 il: Settembre 13, 2013, 23:56 »
- e, ultimo, aggiungere parentesi in piu' attorno alle operazioni rallenta l'esecuzione.

LOL! Questa è spettacolare ahah :X

Volevano evitare di assomigliare a lisp...