PDA

View Full Version : [OCAML] ha senso studiare questo linguaggio ?


Antares88
05-10-2009, 22:40
Oggi all'università (Ingegneria Informatica, Roma Tre) ho iniziato a seguire il corso di Programmazione Funzionale, in cui si usa il linguaggio OCAML, che supporta vari paradigmi (funzionale, imperativo, oop).

Sinceramente a una prima occhiata sono rimasto perplesso, non sono riuscito a cogliere i pregi e l'utilità di questo linguaggio, se non che il codice funzionale è molto più compatto (te credo, non c'è iterazione, si usano funzioni ricorsive a gogo che saranno anche belline e compatte ma sono anti intuitive imho).

Inoltre in termini di performance mi chiedo come faccia ad essere decente quando usando la ricorsione in altri linguaggi succede un puttanaio nello stack e la complessità asintotica aumenta....

Qualcuno mi può illuminare ? E soprattutto, volendo scegliere un linguaggio, non si poteva fare Python che anche lui supporta la programmazione funzionale ma almeno è moderno, ha librerie e ha utilità sul mercato del lavoro ?

DanieleC88
05-10-2009, 22:53
[...] e la complessità asintotica aumenta...
Non necessariamente, posso fornirti tanto per esempio l'algoritmo di un insertion sort iterativo e ricorsivo che hanno la stessa complessità asintotica. :)
Qualcuno mi può illuminare ? E soprattutto, volendo scegliere un linguaggio, non si poteva fare Python che anche lui supporta la programmazione funzionale ma almeno è moderno, ha librerie e ha utilità sul mercato del lavoro ?
Non me ne intendo di programmazione funzionale, rispondo alla questione Python: in realtà da quanto so Guido Van Rossum non è un grande fan della programmazione funzionale, per cui mi pare che in Python 3 sia stata un po' limitata. Per maggiori informazioni, aspetta cdimauro. :D

ciao ;)

gugoXX
06-10-2009, 07:08
Oggi all'università (Ingegneria Informatica, Roma Tre) ho iniziato a seguire il corso di Programmazione Funzionale, in cui si usa il linguaggio OCAML,

La risposta ce l'hai gia' in questa frase.
Ha senso studiare OCAML? Poiche' ti serve per l'esame un senso ce l'ha...

Ti servira' mai piu' OCAML in seguito? Non che io sappia. O probabilmente troppo poco per privilegiarlo a discapito di altri linguaggi piu' richiesti.

cdimauro
06-10-2009, 07:10
Oggi all'università (Ingegneria Informatica, Roma Tre) ho iniziato a seguire il corso di Programmazione Funzionale, in cui si usa il linguaggio OCAML, che supporta vari paradigmi (funzionale, imperativo, oop).

Sinceramente a una prima occhiata sono rimasto perplesso, non sono riuscito a cogliere i pregi e l'utilità di questo linguaggio, se non che il codice funzionale è molto più compatto (te credo, non c'è iterazione, si usano funzioni ricorsive a gogo che saranno anche belline e compatte ma sono anti intuitive imho).
:eek: Se c'è una cosa che apprezzo per la loro generale semplicità e intuitività sono le funzioni ricorsive. :stordita:
Inoltre in termini di performance mi chiedo come faccia ad essere decente quando usando la ricorsione in altri linguaggi succede un puttanaio nello stack e la complessità asintotica aumenta....
Questo dipende strettamente dall'algoritmo.

Comunque tante volte per implementare in maniera iterativa una funzione ricorsiva ti è comunque necessario uno stack in cui memorizzare valori intermedi, e qui si pongono diversi problemi.

Per prima cosa il codice ti diventa più "complesso" e meno "semplice" da leggere (PGI, guarda che t'ho visto: metti giù la mazza! :D).

Secondo, o ti allochi una struttura statica (e quindi imponi già in partenza un preciso limite al tuo algoritmo), oppure ne usa una dinamica ma complicando ulteriormente il codice.
Qualcuno mi può illuminare ? E soprattutto, volendo scegliere un linguaggio, non si poteva fare Python che anche lui supporta la programmazione funzionale ma almeno è moderno, ha librerie e ha utilità sul mercato del lavoro ?
All'università è il docente che sceglie in base al bagaglio culturale che s'è fatto. Ci sono un sacco di matematici che trovano più affine la programmazione funzionale per ovvi motivi, e tendono usare quella. Non gli do torto per questo, li critico, invece, se rimangono chiuso nel loro orticello non aggiornandosi (sembra paradossale, ma proprio l'università è uno degli ambienti più reazionari).
Non me ne intendi programmazione funzionale, rispondo alla questione Python: in realtà da quanto so Guido Van Rossum non è un grande fan della programmazione funzionale, per cui mi pare che in Python 3 sia stata un po' limitata. Per maggiori informazioni, aspetta cdimauro. :D

ciao ;)
Sì, Guido non ama la programmazione funzionale, e nella versione 3 non ha eliminato alcuni costrutti (map, filter e reduce, se non erro), ma semplicemente li ha spostati in un'apposita libreria (mi sembra itertools).

Python supporta IN PARTE la programmazione funzionale, ma non è un linguaggio funzionale. Se ne distacca abbastanza.

Personalmente non ispira neppure a me la programmazione funzionale, fatta eccezione per alcuni costrutti che trovo comodi e abbastanza leggibili (se non si esagera, e qui alcuni se sanno qualcosa :D).

In generale trovo il codice troppo pieno di simboli e poco leggibile AI MIEI OCCHI (è una doverosa precisazione questa; d'altra parte ognuno ha i suoi gusti).

Anche se devo dire che l'approccio a pattern matching di Prolog prima e di Erlang adesso mi ha particolarmente affascinato. ;)

Comunque per la programmazione funzionale in Python consiglio questo documento (http://docs.python.org/dev/howto/functional.html).

^TiGeRShArK^
06-10-2009, 07:32
A 'sto punto avrebbe avuto più senso studiare F# imho che è quantomeno + moderno come linguaggio ed è molto molto simile ad ocaml (in pratica è possibile scrivere in F# codice ocaml senza determinate funzioni).
..guardando il lato positivo almeno avrai una buona base per studiare F# per conto tuo. :D

Kralizek
06-10-2009, 08:08
credo che studiare OCAML ti permette di sviluppare la forma mentis per passare dalla programmazione imperativa a quella funzionale.

E l'universitá deve dare solo la forma mentis, quindi thumb up!

shinya
06-10-2009, 09:16
...(te credo, non c'è iterazione, si usano funzioni ricorsive a gogo che saranno anche belline e compatte ma sono anti intuitive imho).

Dipende dal problema. Alcuni vengono espressi meglio ricorsivamente, altri no.


Inoltre in termini di performance mi chiedo come faccia ad essere decente quando usando la ricorsione in altri linguaggi succede un puttanaio nello stack e la complessità asintotica aumenta....
No, non è sempre vero.
http://stackoverflow.com/questions/310974/what-is-tail-call-optimization


Qualcuno mi può illuminare ? E soprattutto, volendo scegliere un linguaggio, non si poteva fare Python che anche lui supporta la programmazione funzionale ma almeno è moderno, ha librerie e ha utilità sul mercato del lavoro ?
F# sarà uno dei linguaggi ufficiali della prossima versione di Visual Studio... visto che è praticamente OCaml su .NET, magari qualcosa di utile da questo corso la tiri fuori...

fero86
06-10-2009, 13:27
Inoltre in termini di performance mi chiedo come faccia ad essere decente quando usando la ricorsione in altri linguaggi succede un puttanaio nello stack e la complessità asintotica aumenta.... la complessitá asintotica non aumenta affatto! il fattoriale ricorsivo é sempre O(N).
per quanto riguarda il "puttanaio" dello stack... tail-call optimization (http://en.wikipedia.org/wiki/Tail_call_optimization) :)
si tratta della stessa ottimizzazione che converte un fattoriale ricorsivo in un fattoriale iterativo.


Qualcuno mi può illuminare ? E soprattutto, volendo scegliere un linguaggio, non si poteva fare Python che anche lui supporta la programmazione funzionale ma almeno è moderno, ha librerie e ha utilità sul mercato del lavoro ? OCAML non sará il leading edge della tecnologia ma ad esso é stato ispirato F#, e quello si, é il leading edge della tecnologia.

marco.r
06-10-2009, 13:38
(te credo, non c'è iterazione, si usano funzioni ricorsive a gogo che saranno anche belline e compatte ma sono anti intuitive imho).

Penso sia una questione di abitudine. Una volta abituato ad entrambe le forme, trovo molto piu' semplice capire il comportamento di una versione ricorsiva invece che intuitiva, perche' c'e' meno contesto da tenere a mente

Visto che fai l'universita', "ragionare ricorsivamente" ti verra' naturale un po' alla volta.


Inoltre in termini di performance mi chiedo come faccia ad essere decente quando usando la ricorsione in altri linguaggi succede un puttanaio nello stack e la complessità asintotica aumenta....

Come ha fatto notare shinya si puo' scrivere codice ricorsivo efficiente e senza consumare stack.


Qualcuno mi può illuminare ? E soprattutto, volendo scegliere un linguaggio, non si poteva fare Python che anche lui supporta la programmazione funzionale ma almeno è moderno, ha librerie e ha utilità sul mercato del lavoro ?
Il supporto alla programmazione funzionale in python e' abbastanza limitato, e comunque direi che non e' piu' "moderno" (?) di ocaml. E' meno diffuso e ha meno librerie, ma se fosse questo il fattore discriminante programmeremmo ancora tutti in cobol o assembler.

marco.r
06-10-2009, 13:41
OCAML non sará il leading edge della tecnologia ma ad esso é stato ispirato F#, e quello si, é il leading edge della tecnologia.
Per arbitrari valori di tecnologia.
F# ha dalla sua un buon ide, ma dal punto di vista del linguaggio e dell'implementazione non vedo vantaggi rilevanti.

fero86
06-10-2009, 18:16
Per arbitrari valori di tecnologia.
F# ha dalla sua un buon ide, ma dal punto di vista del linguaggio e dell'implementazione non vedo vantaggi rilevanti. F# ha dalla sua .NET, non solo l'IDE.

Antares88
06-10-2009, 20:43
Grazie a tutti per i chiarimenti !

Mi avete rinfrancato, temevo di fare una cosa inutile. Spero di riuscire ad apprezzare meglio le particolarità di questo linguaggio nei prossimi tempi.

Certo che forse un corso così potevano metterlo a scelta o nella specialistica e dedicare quel tempo a qualcosa di più diffuso sul mercato del lavoro.

Vabbé, staremo a vedere. Dopo l'esame mi guardo questo F#.

marco.r
07-10-2009, 11:06
F# ha dalla sua .NET, non solo l'IDE.

Non e' necessariamente un vantaggio. Il framework e' pensato per un linguaggio ad oggetti, e richiede la rinuncia ad alcuni idiomi tipici della programmazione funzionale. Probabilmente col tempo questo un po' cambiera', ma per il momento e' cosi'. Senza contare che per lo stesso fatto alcune feature caratteristiche di ocaml (tipo il preprocessore) non sono disponibili.
Se il problema e' l'accesso a librerie esterne, si puo' comunque usare la FFI

javaboy
07-10-2009, 20:37
Grazie a tutti per i chiarimenti !

Mi avete rinfrancato, temevo di fare una cosa inutile. Spero di riuscire ad apprezzare meglio le particolarità di questo linguaggio nei prossimi tempi.

Certo che forse un corso così potevano metterlo a scelta o nella specialistica e dedicare quel tempo a qualcosa di più diffuso sul mercato del lavoro.

Vabbé, staremo a vedere. Dopo l'esame mi guardo questo F#.

Studiare OCAML va benissimo. Non è un vezzo del tuo docente ma un linguaggio molto utilizzato in ambito accademico.
I linguaggi funzionali sono utilizzati anche nel mondo del lavoro anche se in settori di nicchia come la bioinformatica o applicazioni statistiche. E' molto probabile che in futuro trovino maggiori campi di applicazione. A parte questo OCAML ti aprirà la mente più di 20 anni di PHP e 30 di COBOL.

L'unico esame realmente utile per il mondo del lavoro italiano dovrebbe avere questo titolo: "Come mantenere la calma quando si è costretti in 3 giorni a implementare l'ennesimo acrocchio per far fesso il cliente in barba a tutte le regole dell'ingegneria del software".

javaboy
07-10-2009, 20:43
:
Anche se devo dire che l'approccio a pattern matching di Prolog prima e di Erlang adesso mi ha particolarmente affascinato. ;)
.

E' bello vedere che non sono l'unico.

shinya
08-10-2009, 08:37
L'unico esame realmente utile per il mondo del lavoro italiano dovrebbe avere questo titolo: "Come mantenere la calma quando si è costretti in 3 giorni a implementare l'ennesimo acrocchio per far fesso il cliente in barba a tutte le regole dell'ingegneria del software".
Quoto! E aggiungo:"I feel your pain." :stordita:

fero86
08-10-2009, 12:33
I linguaggi funzionali sono utilizzati anche nel mondo del lavoro anche se in settori di nicchia come la bioinformatica o applicazioni statistiche. E' molto probabile che in futuro trovino maggiori campi di applicazione. ovviamente, altrimenti Microsoft non spingerebbe cosi tanto F# (addirittura creando in Visual Studio un ambiente di sviluppo anche per questo linguaggio e mettendolo quindi alla pari di C# e Visual Basic).
tempo fa gugoXX ha aperto un topic illuminante su questa questione: ormai giá da tempo abbiamo raggiunto dei limiti fisici e la corsa al Mhz (poi al Ghz) é finita, di conseguenza l'immediato futuro é completamente parallelilzzato e multicore. il motivo per cui in un simile contesto i linguaggi funzionali hanno la meglio é che un programma scritto in maniera puramente funzionale é anche automaticamente rientrante, e gli algoritmi rientranti sono piu facilmente parallelizzabili.

Mesh89
08-10-2009, 12:36
Wow, anch'io quest'anno faccio i funzionali :O Però faccio Lisp.

Cmq, per chi parlava di scarsa velocità, da quello che sento in giro, pare che Ocaml sia veramente una scheggia, molto più verso C++ e Java che Python e Ruby come performance (immagino sia compilato o JITtato), per dare un'idea.

http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=ocaml&lang2=python3&box=1

(non conoscendo OCaml e non essendo un grande cultore di Python, non posso verificare la bontà dei test)


PS: quando uscirà il linguaggio che sto sviluppando, dimenticherete in breve tempo tutti sti Python, OCaml, F#, Java e robaccia varia :P :P :P

!k-0t1c!
09-10-2009, 09:21
A dire il vero OCAML è lento. Con lento intendo fino a 2 ordini di grandezza più lento di F#. Ovviamente non parlo di F# su Mono, ed ovviamente come riferimento il meglio che si può trovare sono benchmark sintetici, ma il mio argomento è sostenuto da un gran conoscitore di OCAML, ovvero Jon Harrop. (*uno* dei post da cui emerge quanto dico (http://flyingfrogblog.blogspot.com/2009/04/f-vs-ocaml-vs-haskell-hash-table.html)).
Comunque vale la pena di imparare OCAML o F# se non altro per conoscere modi nuovi e spesso eleganti di affrontare problemi.


Cmq, per chi parlava di scarsa velocità, da quello che sento in giro, pare che Ocaml sia veramente una scheggia, molto più verso C++ e Java che Python e Ruby come performance (immagino sia compilato o JITtato), per dare un'idea.

http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=ocaml&lang2=python3&box=1

(non conoscendo OCaml e non essendo un grande cultore di Python, non posso verificare la bontà dei test)


PS: quando uscirà il linguaggio che sto sviluppando, dimenticherete in breve tempo tutti sti Python, OCaml, F#, Java e robaccia varia :P :P :P

Kralizek
09-10-2009, 10:12
PS: quando uscirà il linguaggio che sto sviluppando, dimenticherete in breve tempo tutti sti Python, OCaml, F#, Java e robaccia varia :P :P :P

Terrei questo post a futura memoria... DanieleC88 insegna! :P

fero86
09-10-2009, 17:53
Terrei questo post a futura memoria... DanieleC88 insegna! :P certo che sei veramente un infame... :D

DanieleC88
09-10-2009, 19:09
Terrei questo post a futura memoria... DanieleC88 insegna! :P
:ciapet:

Mesh89
10-10-2009, 15:30
certo che sei veramente un infame... :D

Cosa mi sto perdendo? O.o

banryu79
13-10-2009, 10:42
Cosa mi sto perdendo? O.o
Fai una ricerca nel forum per la stringa: "Implementare un sistema operativo per davvero" :D

Dominum
29-10-2009, 18:05
a è osibleeeeutilizzarecaml light su iphone?

Kralizek
29-10-2009, 18:42
a è osibleeeeutilizzarecaml light su iphone?

ho sempre voluto farlo: spegnere una camel light su un iphone... ah non parli di quello? :P

DanieleC88
29-10-2009, 18:49
ho sempre voluto farlo: spegnere una camel light su un iphone... ah non parli di quello? :P

:asd:
a è osibleeeeutilizzarecaml light su iphone?

Objective C o morte.

Dominum
29-10-2009, 18:51
scusate..tastiera impazzita....volevo chiedere se si puo utilizzare su iphone..mi farebbe comodo all'università...:D

cdimauro
29-10-2009, 20:21
Objective C o morte.
Morte. Anche perché le librerie utilizzate, COCOA, a quanto pare fanno cacare (confessione di qualche giorno fa di un mio collega che sta lavorando al porting di una nostra applicazione su iPhone).

Kralizek
29-10-2009, 20:24
è la prima volta che ne sento parlar male :S

fero86
31-10-2009, 13:05
è la prima volta che ne sento parlar male :S strano, io ho solo sentito parlar male di questa fantastica e assurda scelta della Apple: l'Objective C. questo sconosciuto.

non capisco proprio come gli sia saltato in mente di usare un linguaggio strampalato che non ha senso di esistere visto che c'é il C++ :mbe:

DanieleC88
31-10-2009, 13:08
strano, io ho solo sentito parlar male di questa fantastica e assurda scelta della Apple: l'Objective C. questo sconosciuto.

non capisco proprio come gli sia saltato in mente di usare un linguaggio strampalato che non ha senso di esistere visto che c'é il C++ :mbe:

Penso che Kralizek parlasse di COCOA. :p

fero86
31-10-2009, 13:08
Morte. non era una possibilitá scelta con ultimatum :D
il senso della frase era che per quante pippe mentali ci si possa fare, l'unica maniera nell'universo per programmare i dispositivi Apple é l'Objective C, e tra l'altro serve pure un Mac. conosco Daniele di persona e abbiamo giá provato a ragionarci insieme una volta, a me sembra vergognoso (altro che Microsoft, questo é veramente abuso di posizione, addirittura non dominante :asd: ).

Dominum
31-10-2009, 13:36
quello volvo saper io è se esiste un applicazione da installare su iphone che mi permetta di controollare i tipi di cio che scrivo in caml...e se le funxioni xono giuste!

DanieleC88
31-10-2009, 13:38
Cioè se ti aiuta a passare l'esame? :P

Forse... ma secondo me fai prima ad imparare il linguaggio: http://web.yl.is.s.u-tokyo.ac.jp/~tosh/ocaml-on-iphone/

^TiGeRShArK^
31-10-2009, 13:39
E' una scelta assolutamente legittima.
E tra l'altro Objetive C è oggettivamente meglio rispetto al C++.
Quanto a Cocoa a me ha fatto un'OTTIMA impressione, tant'è vero che è stata la prima ad introdurre il mediator al posto del solito controller nel pattern MVC.
Ed è inutile aggiungere che questa scelta è stata azzeccatissima.
Ai tempi c'era anche un ottimo articolo della sun sul confronto tra MVC (mi pare con le Swing) e Cocoa dove venivano messi in evidenza le migliori caratteristiche.
Ah..
e tra l'altro non c'è assolutamente paragone tra realizzare un interfaccia grafica che si integri perfettamente con il sistema operativo con XCode rispetto a tutti gli altri IDE che ho usato.
vabbè che c'è anche da dire che gli altri sistemi operativi NON hanno uno aspetto coerente, sono solo un accozzaglia di componenti diversi 'mmunseddati alla rinfusa....:mbe:

DanieleC88
31-10-2009, 13:42
E tra l'altro Objetive C è oggettivamente meglio rispetto al C++.

Questo "oggettivamente" non mi risulta. Personalmente ho provato a imparare un po' le basi dell'Objective C, così, anche per curiosità personale: non posso dire di saperci davvero programmare, ma ho visto abbastanza per capire che la sintassi mi salta pesante all'occhio, cosa che non mi succede col C++. Vantaggi sostanziali non ne ho trovati nell'Objective C, per cui soggettivamente posso dire che il C++ è un linguaggio migliore.

Mi potresti motivare meglio quell'oggettivamente? :)
ciao ;)

^TiGeRShArK^
31-10-2009, 13:48
Questo "oggettivamente" non mi risulta. Personalmente ho provato a imparare un po' le basi dell'Objective C, così, anche per curiosità personale: non posso dire di saperci davvero programmare, ma ho visto abbastanza per capire che la sintassi mi salta pesante all'occhio, cosa che non mi succede col C++. Vantaggi sostanziali non ne ho trovati nell'Objective C, per cui soggettivamente posso dire che il C++ è un linguaggio migliore.

Mi potresti motivare meglio quell'oggettivamente? :)
ciao ;)

..era una battuta col doppio senso di objective. :asd:
comunque quando inizi a farci un pò l'occhio e usi dei metodi con i named parameter la pulizia del codice no ha che da giovarci.
Comunque quanto a me preferisco oggettivamente C# e ruby all'objective C. :asd:
Dovresti chiedere il punto di vista di Gullo (o come si chiama :stordita: ) dato che lui lo usava, io ci ho solo giochicchiato un pò. :p

DanieleC88
31-10-2009, 13:51
..era una battuta col doppio senso di objective. :asd:
:doh:
Era talmente pessima che nemmeno io l'ho colta. :p
comunque quando inizi a farci un pò l'occhio e usi dei metodi con i named parameter la pulizia del codice no ha che da giovarci.
Comunque quanto a me preferisco oggettivamente C# e ruby all'objective C. :asd:
Dovresti chiedere il punto di vista di Gullo (o come si chiama :stordita: ) dato che lui lo usava, io ci ho solo giochicchiato un pò. :p
Ecco appunto, purtroppo ho troppa poca esperienza nel campo per giudicarlo concretamente, ma per il poco che ho fatto mi è sembrato un po' più "dispersivo", poi sarà che io sono troppo abiutato alla sintassi C++/Java e quindi parto prevenuto...

ciao ;)

cdimauro
31-10-2009, 15:52
non era una possibilitá scelta con ultimatum :D
il senso della frase era che per quante pippe mentali ci si possa fare, l'unica maniera nell'universo per programmare i dispositivi Apple é l'Objective C, e tra l'altro serve pure un Mac. conosco Daniele di persona e abbiamo giá provato a ragionarci insieme una volta, a me sembra vergognoso (altro che Microsoft, questo é veramente abuso di posizione, addirittura non dominante :asd: ).
Non ho avuto modo di lavorarci, ma da quel che dicono, concordo.

I miei colleghi della sezione mobile sviluppano applicazioni (giochi, in particolare) per Java (J2ME), Android (Java), C#/C++ (Windows Mobile), iPhone (ObjectiveC/COCOA), Non-mi-ricordo-come-si-chiama-la-piattaforma-Qualcomm-che-si-usa-negli-USA-per-i-telefonini (C++), NintendoDS (C++), e web (con Flash per il 2D, oppure Director per 3D), e finora si lamentano pesantemente soltanto della piattaforma iPhone.