View Full Version : Classifica di utilizzo linguaggi di programmazione.
Non so se ne eravate a conoscenza, io l'ho trovata pochi giorni fa. L'indice TIOBE effettua delle misurazioni consultando varie fonti e classifica mese per mese i linguaggi di programmazione e la loro curva di adozione / abbandono.
Molto interessante notare come il secondo linguaggio piu' usato del mondo (al contrario di quanti possano pensare) sia proprio il C.
Ecco un grafico di adozione dal 2001 ad oggi:
http://www.tiobe.com/content/paperinfo/tpci/images/tpci_trends.png
La classifica completa dell'adozione dei primi 50 linguaggi di programmazione la trovate qui:
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
EDIT: Povero C# ... :asd:
chissà perchè java è andato giù nel 2004 - 2005, per poi risalire...
Il motivo è stato spiegato: Google cambio delle cose che variarono i dati utilizzati dall'indice TIOBE in modo che Java praticamente crollò. In quel periodo i dati infatti non sono attendibili e non credo che siano stati normalizzati per far fronte al cambiamento.
khelidan1980
10-04-2008, 17:36
mi fa un po strano quella cassifica,python dovrebbe essere più usato di C# eppure se si va a vedere gli annunci di lavoro c'è un rapporto tipo di 300 a 1(valore a caso giusto per sottolineare che stiamo su una differenza di diversi ordini di grandezza) in favore di quest'ultimo
mi fa un po strano quella cassifica,python dovrebbe essere più usato di C# eppure se si va a vedere gli annunci di lavoro c'è un rapporto tipo di 300 a 1(valore a caso giusto per sottolineare che stiamo su una differenza di diversi ordini di grandezza) in favore di quest'ultimo
Ci sono anche molti progetti dove si usa Python dove non sono previste offerte di lavoro. Ormai Python è diventato il linguaggio di estensione predefinito di moltissimi progetti Open Source e la sua capillarità arriva anche dove non ci sono offerte di lavoro... In sostanza le offerte di lavoro non sempre sono rappresentative della situazione di un linguaggio.
Altrimenti C stava sotto al Fortran, eppure continua a essere il linguaggio di riferimento in ambiente Unix e derivati.
EDIT: Inoltre nelle università si è abbandonato praticamnete del tutto il Pascal e l'Ada e ci si è spostati completamente su Java, cosa che invece non è successo con il C, che rimane il linguaggio di riferimento per i corsi di Sistemi Operativi e i corsi di Compilatori. A me sembra ch e i campi in cui C predominava siano rimasti invariati anche oggi come adozione, soprattutto nel mondo pratico.
m.distrutti
10-04-2008, 17:46
gia anche a me sembra strano, il python si sta diffondendo moltissimo
tra l'altro il php??? intende il modulo per programmare per piattaforme desktop? perche se intende php per web non ha molto senso unirli tutti insieme XD
secondo me il C e' ancora diffuso per il semplice motivo delle scuole:D (con tanto di rispetto allo zio dei linguaggi :-))
non penso si riferisca ad aziende questo grafico, altrimenti sarebbe un bel po diverso :P
cmq cos'e' successo nel 2003-04 o.o?
gia anche a me sembra strano, il python si sta diffondendo moltissimo
tra l'altro il php??? intende il modulo per programmare per piattaforme desktop? perche se intende php per web non ha molto senso unirli tutti insieme XD
secondo me il C e' ancora diffuso per il semplice motivo delle scuole:D (con tanto di rispetto allo zio dei linguaggi :-))
non penso si riferisca ad aziende questo grafico, altrimenti sarebbe un bel po diverso :P
cmq cos'e' successo nel 2003-04 o.o?
Il grafico non si riferisce nè alle aziende nè alle scuole ;)
Si riferisce quanto piu' possibile ad una situazione globale (che include anche le aziende e le scuole, ovvio). E' chiaro che molti linguaggi hanno ambiti differenti, ma questo grafico non tiene traccia dell'ambito, ma solo della curva di adozione. Nel senso che ci sono piu' programmatori VB al mondo che programmatori C++ :eek:
khelidan1980
10-04-2008, 17:54
Ci sono anche molti progetti dove si usa Python dove non sono previste offerte di lavoro. Ormai Python è diventato il linguaggio di estensione predefinito di moltissimi progetti Open Source e la sua capillarità arriva anche dove non ci sono offerte di lavoro...
Su questo son d'accordo,infatti ho sottolineato il fatto che la differenza è diversi ordini di grandezza,insomma mi sarei aspettato C# almeno un po più su visto il netto divario in ambito lavorativo,non dico che la classifica sia falsata,solo mi sarei aspettato altri risultati!Considerando che comunque sono due linguaggi recenti,ovvio che il discorso sul C non sta in piedi
banryu79
10-04-2008, 17:57
Nel senso che ci sono piu' programmatori VB al mondo che programmatori C++ :eek:
Non so perchè ma a me questa cosa non mi stupisce :D
Non so perchè ma a me questa cosa non mi stupisce :D
In un certo senso non stupisce neanche me, ma vedere Java e C al primo e al secondo posto per poi vedere un VB immediatamente al terzo, un po di stupore me lo da... :stordita:
EDIT: Francamente pensavo se la battesse con i linguaggi di pari livello, non che andasse ad intralciare i testicoli dei linguaggi C-like. :p
Mi aspettavo piu' combattimento con Delphi... :stordita:
Molto interessante notare come il secondo linguaggio piu' usato del mondo (al contrario di quanti possano pensare) sia proprio il C.
Che spiega come mai la stragrande maggioranza dei progetti software non rientra nei tempi e nel budget...
non ho letto gli interventi, ho solo visto il grafico, ma... chissà perché tra il 2004 e il 2005 c'è stata una specie di stravolgimento :mbe:
curioso.
tomminno
10-04-2008, 18:30
Che C# sia così poco usato mi sembra strano, addirittura meno di VB (che poi quale VB VB6 o VB.NET?)
Il crollo nell'utilizzo di C++ è purtroppo molto realistico, ma per lo meno non c'è da rifare tutti i programmi ogni 2 anni o ad ogni cambio di sistema operativo.
Ogni riferimento al non funzionamento di VS2003 su Vista e all'impossibile porting di applicazioni dal (ASP).NET 1.1 al 2.0 è puramente voluto.
non ho letto gli interventi, ho solo visto il grafico, ma... chissà perché tra il 2004 e il 2005 c'è stata una specie di stravolgimento :mbe:
curioso.
Motivazione al post #3
Che spiega come mai la stragrande maggioranza dei progetti software non rientra nei tempi e nel budget...
Bhè sarebbe interessante vedere delle statistiche sui tempi e sui budget dei progetti basati su C e dei progetti basati sui linguaggi che in linea teorica avrebbero una produttività tale da farli rientrare. :stordita:
EDIT: Povero C# ... :asd:
Povero Ruby. Dovrebbe stare molto più in alto imho. :O
C, C++ e Java ormai hanno fatto il loro tempo. A guardare il grafico hanno un trend negativo da almeno 7 anni. Probabilmente fra una decina di anni li vedremo combattere per non uscire dal grafico. :)
Povero Ruby. Dovrebbe stare molto più in alto imho. :O
C, C++ e Java ormai hanno fatto il loro tempo. A guardare il grafico hanno un trend negativo da almeno 7 anni. Probabilmente fra una decina di anni li vedremo combattere per non uscire dal grafico. :)
Mah, io la vedo diversamente. c++0x è alle porte, Java può sempre evolvere anche con pesanti cambiamenti sintattici, l'ultima revisione C del 99 non è ancora supportata da tutti i compilatori e quindi neanche prende ancora il volo, stanno nascendo le prime implementazioni di librerie standard C++ che sfruttano il parallelismo...
Sono decenni che si cerca di far prevalicare un linguaggio sull'altro, eppure ognuno rimane attaccato al proprio ambito di utilizzo come una cozza.
Sono d'accordo che Ruby merita di piu' però è anche vero che solo ultimamente si sta avendo un bombardamento mediatico su questo linguaggio, soprattutto grazie a Rails piu' che a Ruby stesso :stordita:
E poi Java sta diventando sempre piu' interessante proprio in questi ultimi anni :sofico:
In ultimo, penso che un linguaggio sia appena neonato dopo i primi dieci anni di vita.
EDIT: Pure tu una frase di Dijkstra in sign :stordita:
Mah, io la vedo diversamente. c++0x è alle porte, Java può sempre evolvere anche con pesanti cambiamenti sintattici, l'ultima revisione C del 99 non è ancora supportata da tutti i compilatori e quindi neanche prende ancora il volo, stanno nascendo le prime implementazioni di librerie standard C++ che sfruttano il parallelismo...
Sono decenni che si cerca di far prevalicare un linguaggio sull'altro, eppure ognuno rimane attaccato al proprio ambito di utilizzo come una cozza.
C99 purtroppo dubito che lo vedremo mai decollare. I cambiamenti allo standard sono piuttosto modesti eppure da quello che so, dopo quasi un decennio, non c'è neanche un compilatore che lo implementi completamente. C++0x invece è una modifica del linguaggio e delle librerie molto più corposa. Penso che dipenderà tutto da quanto ci impiegheranno MS, Intel, Gnu e soci ad implementarlo e da come si sarà evoluto il mercato nel frattempo.
Certo che useranno lo stesso impegno con cui si sono dedicati a C99 ci vorrà un vero miracolo perché C++0x veda la luce in tempi brevi. Microsoft ormai è tutta C# e .NET mentre Apple sta facendo di tutto per abbandonare Carbon e C++ per passare a Cocoa e Objective-C/Python/Ruby. Su Linux invece la distribuzione dominante usa Gnome che è scritto in C.
Sono d'accordo che Ruby merita di piu' però è anche vero che solo ultimamente si sta avendo un bombardamento mediatico su questo linguaggio, soprattutto grazie a Rails piu' che a Ruby stesso :stordita:
È una cospirazione ad opera dei fan del bisicione :asd:
EDIT: Pure tu una frase di Dijkstra in sign :stordita:
Onore ad uno dei più grandi geni dell'informatica. :ave:
Sono rimasto deluso pure per Prolog, pensavo ci fosse una curva di adozione maggiore... :cry:
Onore ad uno dei più grandi geni dell'informatica.
http://www.cs.utexas.edu/~EWD/EWDwww.jpg
:ave:
Aria fritta direi.
Ognuno scelga la statistica che piu' gli piace.
http://radar.oreilly.com/archives/plangtrend-thumb.png
http://www.welton.it/articles/images/googlehits.png
http://www.welton.it/articles/images/jobsperhits.png
EDIT: Pure tu una frase di Dijkstra in sign :stordita:
arrogance is measured in nano-Dijkstras (http://youtube.com/watch?v=s7ROTJKkhuI)
:asd:
Aria fritta direi.
Ognuno scelga la statistica che piu' gli piace.
http://radar.oreilly.com/archives/plangtrend-thumb.png
http://www.welton.it/articles/images/googlehits.png
http://www.welton.it/articles/images/jobsperhits.png
Se compari meramente dei grafici è chiaro che ottieni aria fritta. Bisogna vedere cosa includono i dati di quei linguaggi. Se misuri solo i posti di lavoro associati a un linguaggio è chiaro che ottieni dati differenti da una statistica che tiene conto, per esempio, del grado di adozione considerando, per esempio, il numero di tutorial scritti per un determinato linguaggio.
La statistica tira fuori dei dati anche considerando i dati iniziali presi come campioni.
Se compari meramente dei grafici è chiaro che ottieni aria fritta. Bisogna vedere cosa includono i dati di quei linguaggi. Se misuri solo i posti di lavoro associati a un linguaggio è chiaro che ottieni dati differenti da una statistica che tiene conto, per esempio, del grado di adozione considerando, per esempio, il numero di tutorial scritti per un determinato linguaggio.
La statistica tira fuori dei dati anche considerando i dati iniziali presi come campioni.
Esatto.
Dalle statistiche puoi far venire fuori quello che vuoi.
Con i grafici e' ancora piu' facile.
Esatto.
Dalle statistiche puoi far venire fuori quello che vuoi.
Con i grafici e' ancora piu' facile.
Quello che vuoi ma in base ai dati campione presi. E' chiaro che quelle statistiche non sono verità assolute ma comunque un minimo di decenza quei dati ce l'hanno se leggi il modo in cui i dati vengono raccolti e da quali fonti.
Io posso pure fare statistiche su quali posizioni l'adecco richiede e stilare una classifica dei linguaggi relativi al lavoro su Adecco, ma è chiaro che l'indice TIOBE prende come campioni realtà molto piu' ampie.
Oh, entrare in possesso di quei dati ci vogliono 3500$ :sofico:
Quello che vuoi ma in base ai dati campione presi. E' chiaro che quelle statistiche non sono verità assolute ma comunque un minimo di decenza quei dati ce l'hanno se leggi il modo in cui i dati vengono raccolti e da quali fonti.
Io posso pure fare statistiche su quali posizioni l'adecco richiede e stilare una classifica dei linguaggi relativi al lavoro su Adecco, ma è chiaro che l'indice TIOBE prende come campioni realtà molto piu' ampie.
Oh, entrare in possesso di quei dati ci vogliono 3500$ :sofico:
Guarda, provo anche io, vediamo cosa viene fuori.
Fonte google. ricerca "[Linguaggio] language"
- Assembly 1.720.000
- C 1.450.000
- Java 826.000
- C# 690.000
- javascript 511.000
- visual basic 480.000
- sql 399.000
- Python 189.000
- ruby 123.000
A che servono queste statistiche?
Dicono quale e' il linguaggio piu' diffuso?
Qual e' quello piu' usato?
Quello piu' bello?
Quello con piu' righe di codice?
Cosa dicono? Esattamente quello con piu' pagine (tra quelle da loro indicizzate) con scritto sopra "[Linguaggio] language"
E chi se ne frega?
(Se leggi e' esattamente il metodo usato da Tiobe, solo pesati fra piu' motori di ricerca)
nuovoUtente86
11-04-2008, 00:23
cosa che invece non è successo con il C, che rimane il linguaggio di riferimento per i corsi di Sistemi Operativi e i corsi di Compilatori.
Magari: io ho fatto i 2 esami in JAVA, a dire il vero quello di SO comprendeva anche una parte in C++
Magari: io ho fatto i 2 esami in JAVA, a dire il vero quello di SO comprendeva anche una parte in C++
Posso chiederti cosa avete fatto al corso di SO con Java? :eek:
khelidan1980
11-04-2008, 01:16
Posso chiederti cosa avete fatto al corso di SO con Java? :eek:
A quanto pare viene usato:
http://www.apogeonline.com/libri/88-503-2100-7/scheda
Se mi prendono (:tie:) la settimana prossima inizio un corso per programmatore sistemista.
Però vorrei iniziare a studiare un linguaggio per i fatti miei per un futuro lavorativo.
A leggere questa discussione però non mi sono fatto proprio un'idea di dove spinga il mercato da qui a cinque anni..
A quanto pare viene usato:
http://www.apogeonline.com/libri/88-503-2100-7/scheda
Si io quel libro ce l'ho (l'edizione vecchia) ma Java viene semplicemente usato per illustrare gli algoritmi di base come ad esempio l'algoritmo dell'ascensore e altre cose minori. Ma all'atto pratico, a mio modo di vedere, usare Java per un corso di sistemi operativi non ha senso, se poi non si sa fare una fork() in C, gestire processi e saperli sincronizzare, gestire delle socket a livello un po piu' basso di quello che propina Java, soprattutto le famose chiamate ioctl() ecc. ecc.
Uno che queste cose le conosce a livello di C/glibc passare a Java è una fesseria (in fondo ci sono le API) ma uno che tratta degli argomenti a un cosi alto livello, se dovesse vedere una socket unix si mette a piangere in aramaico...
Questi sono i nuovi corsi dei nuovi ordinamenti? :confused:
Tra l'altro la teoria tratta i sistemi Unix e poi la pratica usa Java, il piu' agnostico dei linguaggi, che senso ha? :D
Se mi prendono (:tie:) la settimana prossima inizio un corso per programmatore sistemista.
Però vorrei iniziare a studiare un linguaggio per i fatti miei per un futuro lavorativo.
A leggere questa discussione però non mi sono fatto proprio un'idea di dove spinga il mercato da qui a cinque anni..
Se intendi lavorare in italia, lascia perdere la programmazione di sistema... :asd:
Ti ritrovi disoccupato. In italia pare vanno le aziende di servizi e consulenza. Quà da noi si buttano tutti sul web e sulla produzione di gestionali: JEE, C# web oriented, ASP, PHP, parecchio SQL, applicazioni web in generale, web services & application servers a go go. Allora hai la possibilità di lavorare.
Tutto l'opposto di quello a cui sono interessato io, insomma. :sofico:
Se mi prendono (:tie:) la settimana prossima inizio un corso per programmatore sistemista.
Però vorrei iniziare a studiare un linguaggio per i fatti miei per un futuro lavorativo.
A leggere questa discussione però non mi sono fatto proprio un'idea di dove spinga il mercato da qui a cinque anni..
Io ho gusti e tendenze eretiche, ma tra i dieci linguaggi del grafico non ne vedo nessuno di adatto per le problematiche che si affronteranno tra 5-6 anni, a meno che non subisca ulteriori (e rilevanti) modifiche. In ogni caso puntare su un linguaggio e' sbagliato, punta a cercare di capirne decentemente due o tre tra i piu' diffusi.
Io ho gusti e tendenze eretiche, ma tra i dieci linguaggi del grafico non ne vedo nessuno di adatto per le problematiche che si affronteranno tra 5-6 anni, a meno che non subisca ulteriori (e rilevanti) modifiche.
Mi interessa la faccenda.
Avresti qualche spunto in piu'. Qualcuno ha pensato qualcosa in merito?
In ogni caso puntare su un linguaggio e' sbagliato, punta a cercare di capirne decentemente due o tre tra i piu' diffusi.
Questo e' sicuro.
Se io mi fossi fermato a quest'ora conoscerei solo il Basic2.0 e l'assembly del 6502.
Nel nostro mestiere e' intrinesca una predisposizione e una volonta' nel continuare a guardarsi in giro ed aggiornarsi.
In pratica se si vuole continuare ad essere dei professionisti del campo si ci si deve aggiornare e si dovra' sempre studiare.
D'altronde e' quello che hanno insegnato a fare per 20 anni di vita. Studiare e pensare. La cosa che dovremmo saper fare meglio.
ramarromarrone
11-04-2008, 09:33
Molto interessante notare come il secondo linguaggio piu' usato del mondo (al contrario di quanti possano pensare) sia proprio il C.
EDIT: Povero C# ... :asd:
ma anche no...c e java sono ovviamente i linguaggi dominanti solo in questo forum c# e python sembrano essere chissà che...
Il C professonalmente viene usato in mercati di nicchia come gli embedded. E neppure li' dappertutto ormai.
C'e' qualche altra azienda che fa uso ancora di C? A me non risulta cosi' tanto utilizzato.
Relativamente al C# in Italia, classicamente piu' indietro (5 anni +/-), ti do ragione.
Ma se vai sui siti di "Offro Lavoro" all'estero, in posti come Londra, Dubai, NewYork o KualaLumpur, troverai una percentuale non indifferente di aziende cerca gente che conosce C# e tecnologie affini. C# e Java sono richiesti allo stesso modo (e spesso anche insieme).
C++ di meno, C meno ancora.
Secondo la classifica fatta usando Google, il primo linguaggio sarebbe l'assembly. Cosa significherebbe? Mi sa che a queste classifiche si vuol far dire qualcosa che non e' il loro vero significato.
ma anche no...c e java sono ovviamente i linguaggi dominanti solo in questo forum c# e python sembrano essere chissà che...
Ma anche no. C#, Java e Python sono piu' o meno richiesti allo stesso modo nel mondo del lavoro e chi rimane ancorato al C ne e' tagliato fuori.
khelidan1980
11-04-2008, 10:22
Questi sono i nuovi corsi dei nuovi ordinamenti? :confused:
Tra l'altro la teoria tratta i sistemi Unix e poi la pratica usa Java, il piu' agnostico dei linguaggi, che senso ha? :D
Non credo,io ho fatto il nuovo ordinamento e ho studiato sistemi con il C,usando il libro del tanenbaum,quello con minix! ;)
Penso dipenda dalla scelta del docente,che comunque a quanto mi risulta,abbastanza singolare
Per l'esperienza che mi sono fatto molto molto della cultura universitaria sopratutto con il nuovo ordinamento dipende dal trovare docenti in gamba
ma anche no...c e java sono ovviamente i linguaggi dominanti solo in questo forum c# e python sembrano essere chissà che...
Hai segato c,c# java e python....e quali sarebbero il linguaggi che vanno per la maggiore secondo te?
ramarromarrone
11-04-2008, 10:57
Hai segato c,c# java e python....e quali sarebbero il linguaggi che vanno per la maggiore secondo te?
no no io ho sempre sostenuto che java il prims e poi c fossero i + usati
la mia era una risposta a quelli di questo forum che sostengono che tutto è c# e python...ed è inutile perdere tempo con c/c++ ...
non è così in quanto i primi sono java,c,VB,php,c++...
khelidan1980
11-04-2008, 10:58
no no io ho sempre sostenuto che java il prims e poi c fossero i + usati
la mia era una risposta a quelli di questo forum che sostengono che tutto è c# e python...ed è inutile perdere tempo con c/c++ ...
non è così in quanto i primi sono java,c,VB,php,c++...
ahh ok,avevo capito male dal tuo post! ;)
P.s: php...purtroppo,ho ancora gli incubi....
ramarromarrone
11-04-2008, 10:59
Ma anche no. C#, Java e Python sono piu' o meno richiesti allo stesso modo nel mondo del lavoro e chi rimane ancorato al C ne e' tagliato fuori.
io vedo aziende che chiedono java,c,php in primis....un pò meno che richiedono c#
python proprio non l'ho mai visto chiedere
poi magari il mercato del lavoro è differente in inghilterra e tu ne saprai certamente più di me....
io dico quello che vedo in giro..
Mi interessa la faccenda.
Avresti qualche spunto in piu'. Qualcuno ha pensato qualcosa in merito?
Io volevo aprire un topic a riguardo, e magari lo possiamo anche aprire, ma qualcuno di voi ha avuto esperienze di sviluppo con metodologie stile Language Oriented?
http://en.wikipedia.org/wiki/Language-oriented_programming
http://www.onboard.jetbrains.com/is1/articles/04/10/lop/
http://martinfowler.com/articles/languageWorkbench.html
Sto studiando un pò Groovy e vedo spuntare come funghi interventi sullo scrivere uno o più Domain Specific Language per risolvere i problemi, invece di mappare la soluzione ad un linguaggio unico.
Voi che ne pensate? Avete avuto esperienze? (forse è meglio aprire un altro topic per questo)
Ma quali sarebbero le tue fonti scusa.
Ho preso Monster.it
c# 288
java 863
C++ 274
Il C non posso metterlo perche' vengono fuori risultati inattendibili.
Vengono fuori 2000 richieste che contengono la parola C (Come "Patente C", "Trinciatura stampi C-26/B", "Attrezzista C.N.C" ,"nel C.C. di Roma", etc.)
Se qualcuno volesse contare quelli che ci interessano...
Sulle prime 8 pagine il linguaggio C da solo c'e' solo 2 volte. (Ovvero 2/200 annunci. Se il trend continuasse per tutti i 2000 risultati, ne risulterebbe una richiesta pari a 20 annunci di lavoro)
In tutte le altre e' C/C++
Python non lo metto perche' non voglio deprimere cdimauro.
E un po' mi dispiace che non sia cosi' diffuso, perche' da quel poco che lo conosco lo ritengo decisamente meglio del C, e se ben usato anche piu' fruttuoso del C++.
nuovoUtente86
11-04-2008, 12:45
Posso chiederti cosa avete fatto al corso di SO con Java? :eek:
La programmazione in concorrenza!Su windows poi quest' argomento è stato ripreso anche in C++!Mentre per architettura Unix sempre in C++ si è fatto qualcosa sulle fork e sulle pipe!
cdimauro
11-04-2008, 13:42
ma anche no...c e java sono ovviamente i linguaggi dominanti solo in questo forum c# e python sembrano essere chissà che...
Sembrano essere molto più produttivi: c'è qualcosa di male/sbagliato in ciò?
no no io ho sempre sostenuto che java il prims e poi c fossero i + usati
la mia era una risposta a quelli di questo forum che sostengono che tutto è c# e python...ed è inutile perdere tempo con c/c++ ...
non è così in quanto i primi sono java,c,VB,php,c++...
Qui mi pare che non sia mai stata messa in discussione la DIFFUSIONE dei linguaggi, quanto la loro PRODUTTIVITA'.
Se ricordi male ti consiglio di andare a rileggerti le precedenti discussioni, anziché affermare delle cose palesemente false e mettendole, tra l'altro, in bocca alla gente. :rolleyes:
Io volevo aprire un topic a riguardo, e magari lo possiamo anche aprire, ma qualcuno di voi ha avuto esperienze di sviluppo con metodologie stile Language Oriented?
http://en.wikipedia.org/wiki/Language-oriented_programming
http://www.onboard.jetbrains.com/is1/articles/04/10/lop/
http://martinfowler.com/articles/languageWorkbench.html
Sto studiando un pò Groovy e vedo spuntare come funghi interventi sullo scrivere uno o più Domain Specific Language per risolvere i problemi, invece di mappare la soluzione ad un linguaggio unico.
Voi che ne pensate? Avete avuto esperienze? (forse è meglio aprire un altro topic per questo)
No, ma i DSL soffrono di alcuni problemi non indifferenti:
1) devono essere realizzati (e ciò richiede tempo);
2) non ci sono strumenti come librerie/framework e ambienti di sviluppo;
3) se hai altre situazioni in cui sfruttare le peculiarità per cui sono nati, li puoi buttare.
La produttività non è legata esclusivamente all'uso di un linguaggio. ;)
Python non lo metto perche' non voglio deprimere cdimauro.
Ma non mi deprimo affatto: è la realtà, e si deve accettare. :)
Comunque la sua diffusione sta aumentando, e penso che in futuro troverà sempre più spazio.
Java non s'è diffuso dall'oggi al domani. ;)
E un po' mi dispiace che non sia cosi' diffuso, perche' da quel poco che lo conosco lo ritengo decisamente meglio del C, e se ben usato anche piu' fruttuoso del C++.
Yup. :)
yorkeiser
11-04-2008, 18:49
Sembrano essere molto più produttivi: c'è qualcosa di male/sbagliato in ciò?
E perchè il c# dovrebbe essere "più produttivo" (ammesso che la produttività possa dipendere dal linguaggio, piuttosto che dallo sviluppatore) del Java ?
khelidan1980
11-04-2008, 19:29
E perchè il c# dovrebbe essere "più produttivo" (ammesso che la produttività possa dipendere dal linguaggio, piuttosto che dallo sviluppatore) del Java ?
penso si riferisse a C/C++
mindwings
11-04-2008, 20:28
ma dei linguaggi funzionali non c'è nessuna traccia ? :eek:
eppure tutti i linguaggi "contemporanei" pescano features da lì.
ma dei linguaggi funzionali non c'è nessuna traccia ? :eek:
eppure tutti i linguaggi "contemporanei" pescano features da lì.
L'unico che conosce della lista sono CAML e ML che stanno nei fondi bassi della classifica...
cdimauro
11-04-2008, 22:13
E perchè il c# dovrebbe essere "più produttivo" (ammesso che la produttività possa dipendere dal linguaggio, piuttosto che dallo sviluppatore) del Java ?
penso si riferisse a C/C++
No, anche a Java. Non mi pare si possano fare cose così http://www.hwupgrade.it/forum/showpost.php?p=21782883&postcount=296
public IEnumerable<string> GetFromInt(int src)
{
// Spettacolo. Spero sia comprensibile
// Restutisco le stringhe che hanno il bit corrispondente ad 1
var strs =
from t in Enumerable.Range(0,32)
where ( ( src & (1<<t)) !=0 )
select assoc[t];
return strs;
}
;)
L'unico che conosce della lista sono CAML e ML che stanno nei fondi bassi della classifica...
Il C# e il Python hanno la parte di programmazione funzionale.
Es: una versione funzionale dell'algoritmo del fattoriale in C#
Func<int, int> fac = null;
fac = x => ((x == 0) ? 1 : x * fac(x - 1));
So che non e' rigorosa, ma rende l'idea sulla possibilita' dei funzionali.
Il C# e il Python hanno la parte di programmazione funzionale.
Es: una versione funzionale dell'algoritmo del fattoriale in C#
Func<int, int> fac = null;
fac = x => ((x == 0) ? 1 : x * fac(x - 1));
So che non e' rigorosa, ma rende l'idea sulla possibilita' dei funzionali.
Si ok ma io intendevo linguaggi puramente funzionali.
Si ok ma io intendevo linguaggi puramente funzionali.
Mmmh. Non sono diffusi perche' penso siano limitati ad ambiti strettamente matematici o accademici.
Non so se si riesce a fare un sito web, un web-service, una gui-application, un gioco, un gestionale, o altri esempi piu' "classici".
Mi sbagliero', ma senza un apporto imperativo alcune cose vengono fuori proprio contorte, e la leggibilita' e' un requisito oramai fondamentale.
Es:
//Stampo in versione funzionale. Eccessivo, ma solo per studio.
stringhe.ForEachElement(t => Console.WriteLine(t));
//Quella sopra e' la versione funzionale del codice seguente
foreach (string s in stringhe)
{
Console.WriteLine(s);
}
La versione funzionale qui mi sembra davvero eccessiva
cdimauro
12-04-2008, 00:39
Linguaggi puramente funzionali è difficile trovarne.
Comunque ripeto, mi sarei aspettato di piu' da Prolog, che è un linguaggio che tra l'altro adoro:
factorial(0, 1).
factorial(N, VALUE) :-
PREN is N - 1,
factorial(PREN, SUBVALUE),
VALUE is SUBVALUE * N.
?- factorial(3, X).
X = 6
yes
Inoltre è decisamente orientato all'intelligenza artificiale, quando scrivo:
?- mjordan(figone).
yes
Mi emoziono :rotfl:
cdimauro
12-04-2008, 09:31
Il Prolog l'ho studiato con piacere all'università, e apprezzo il principio su cui si basa il suo motore inferenziale, ma sintatticamente non mi attira, e come linguaggio poi è rimasto defilato e riservato alla nicchia I.A..
Non offre molto oltre al paradigma logico.
Inoltre a supporto non ha librerie/framework e IDE paragonabili a quelli di altri linguaggi.
m.distrutti
12-04-2008, 09:42
di funzionale puro io conosco solo il lisp(il common mi sembra che non sia gia + funzionale in quanto hanno aggiunto le iterazioni e altra roba)
e devo dire che e' stato molto istruttivo nelle ricorsioni :D
EDIT: visto che siamo in tema di lisp ahah http://en.wikipedia.org/wiki/Game_Oriented_Assembly_Lisp
Mmmh. Non sono diffusi perche' penso siano limitati ad ambiti strettamente matematici o accademici.
Non so se si riesce a fare un sito web, un web-service, una gui-application, un gioco, un gestionale, o altri esempi piu' "classici".
Non sono molto diffusi ma si usano in molti ambiti.
Yahoo Stores ad esempio era scritto inizialmente in lisp. Ci sono poi diversi web framework basati sulle continuazioni che sono decisamente interessanti.
Per quel che riguarda gui e giochi non ci sono molti esempi perche' spesso mancano le librerie, anche se finalmente le cose stanno cambiando (binding per gtk, opengl, sdl, etc. ormai sono maturi).
Mi sbagliero', ma senza un apporto imperativo alcune cose vengono fuori proprio contorte, e la leggibilita' e' un requisito oramai fondamentale.
Es:
//Stampo in versione funzionale. Eccessivo, ma solo per studio.
stringhe.ForEachElement(t => Console.WriteLine(t));
//Quella sopra e' la versione funzionale del codice seguente
foreach (string s in stringhe)
{
Console.WriteLine(s);
}
La versione funzionale qui mi sembra davvero eccessiva
A me non sembra molto meno leggibile, spesso e' questione di abitudine.
Tieni pure presente che si tratta di C#, dove l'aspetto funzionale e' ancora secondario rispetto quello imperativo. Ad esempio ti tocca costruire al volo una lambda expression invece di poter passare direttamente il metodo da chiamare
di funzionale puro io conosco solo il lisp(il common mi sembra che non sia gia + funzionale in quanto hanno aggiunto le iterazioni e altra roba)
Ad essere pignoli lisp e' multiparadigma, visto che supporta fin da sempre loop e iterazioni (e, come dicevo nell'altro thread, pure il famigerato goto :p ). common lisp supporta anche la OOP, seppure in un modo molto originale (e complicato).
Scheme e' un dialetto funzionale (ma non puro).
No, anche a Java. Non mi pare si possano fare cose così http://www.hwupgrade.it/forum/showpost.php?p=21782883&postcount=296
public IEnumerable<string> GetFromInt(int src)
{
// Spettacolo. Spero sia comprensibile
// Restutisco le stringhe che hanno il bit corrispondente ad 1
var strs =
from t in Enumerable.Range(0,32)
where ( ( src & (1<<t)) !=0 )
select assoc[t];
return strs;
}
;)
penso che questo abbia a che vedere con l'incomprensibilità del codice più che con la produttività :asd:
m.distrutti
12-04-2008, 13:20
Ad essere pignoli lisp e' multiparadigma, visto che supporta fin da sempre loop e iterazioni (e, come dicevo nell'altro thread, pure il famigerato goto :p ). common lisp supporta anche la OOP, seppure in un modo molto originale (e complicato).
Scheme e' un dialetto funzionale (ma non puro).
oddio sinceramente per come me lo hanno insegnato all'uni era completamente funzionale, le prime versioni di sicuro (o almeno cosi mi ha detto il prof T.T)
oddio sinceramente per come me lo hanno insegnato all'uni era completamente funzionale, le prime versioni di sicuro (o almeno cosi mi ha detto il prof T.T)
impossibile :eek: è sempre stato multiparadigma
oddio sinceramente per come me lo hanno insegnato all'uni era completamente funzionale, le prime versioni di sicuro (o almeno cosi mi ha detto il prof T.T)
E' nato multiparadigma. Costrutti come label, goto e loop ci sono stati fin da subito, in quanto McCarthy voleva risultasse abbastanza familiare anche ai programmatori fortran. Alla lunga poi e' risultato piu' comodo l'aspetto funzionale ed e' diventato quello principale.
m.distrutti
12-04-2008, 14:38
E' nato multiparadigma. Costrutti come label, goto e loop ci sono stati fin da subito, in quanto McCarthy voleva risultasse abbastanza familiare anche ai programmatori fortran. Alla lunga poi e' risultato piu' comodo l'aspetto funzionale ed e' diventato quello principale.
non metto in dubbio la vostra esperienza :D , in qualsiasi caso mi hanno illustrato solo metodologie ricorsive e funzionali,per il resto mi ricordo molto bene che il prof durante l'introduzione specificò che il lisp nacque funzionale e poi si evolse con altri costrutti iterativi etc...
:mc: :mc:
Che io sappia di linguaggi 'puramente' funzionali ce ne sono pochi... dove con 'puro' intendo senza side effects.
Io conosco solo haskell.
cdimauro
12-04-2008, 18:11
penso che questo abbia a che vedere con l'incomprensibilità del codice più che con la produttività :asd:
Opinabile: richiama molto le query SQL. :O
Comunque sempre più comprensibile di roba come i generic, di cui però nessuno "stranamente" si lamenta della scarsa leggibilità (perché fanno comodo). :stordita:
Opinabile: richiama molto le query SQL. :O
Comunque sempre più comprensibile di roba come i generic, di cui però nessuno "stranamente" si lamenta della scarsa leggibilità (perché fanno comodo). :stordita:
i generics si possono usare in maniera perfettamente leggibile, non è questione di strumento o non strumento, ma di come lo usi.
anzi a dirla tutta quando non c'erano i generics si faceva anche di peggio per ovviare alla mancanza.. ecco perchè ne è valsa la pena IMHO :D
assomiglia a una query SQL solo perchè le parole chiave sono from, select e where? :fagiano:
vediamo se ho imparato qualcosa... se fosse stato leggibile non avrebbe avuto bisogno di spiegare cosa faceva il codice :Prrr:
cdimauro
12-04-2008, 21:35
Ricorda che SQL è la contrazione di SEQUEL, che a sua volta è un acronimo di Simple English QUEry Language. Quindi prova a leggere quel pezzo di codice in inglese, e dimmi se non è "leggibile"... :cool:
Quanto ai generic, fanno concorrenza ai template del C++ quanto a scarsa leggibilità. Che poi abbiano risolto alcuni problemi non ci piove, ma la sintassi per usarli è tutt'altra che "agile" alla lettura.
E non si tratta di come si usa lo strumento: è proprio la sintassi dei generic a essere ben poco leggibile (con tutta quell'accozzaglia di simboli, poi).
A me non sembra molto meno leggibile, spesso e' questione di abitudine.
Tieni pure presente che si tratta di C#, dove l'aspetto funzionale e' ancora secondario rispetto quello imperativo. Ad esempio ti tocca costruire al volo una lambda expression invece di poter passare direttamente il metodo da chiamare
Non ho capito quest'appunto.
In che senso mi tocca costruire al volo la labmda espression?
Qui ho costruito al volo una lambda expression, ovvero l'azione da richiamare per ciascun elemento dell'array di stringhe (In realta' non e' un array, ma facciamo finta che lo sia)
stringhe.ForEachElement(t => Console.WriteLine(t));
Altrimenti avrei potuto scrivere
Action<string> azione= t => Console.WriteLine(t);
stringhe.ForEachElement(azione);
Di cosa altro dovrei sentire la mancanza che non ho?
E non si tratta di come si usa lo strumento: è proprio la sintassi dei generic a essere ben poco leggibile (con tutta quell'accozzaglia di simboli, poi).
I Generics sono "brutti" quando si definiscono, ma quando si usano non sono cosi' brutti...
E capita poche volte di dover definire dei nuovi generics.
Ricorda che SQL è la contrazione di SEQUEL, che a sua volta è un acronimo di Simple English QUEry Language. Quindi prova a leggere quel pezzo di codice in inglese, e dimmi se non è "leggibile"... :cool:
Quanto ai generic, fanno concorrenza ai template del C++ quanto a scarsa leggibilità. Che poi abbiano risolto alcuni problemi non ci piove, ma la sintassi per usarli è tutt'altra che "agile" alla lettura.
E non si tratta di come si usa lo strumento: è proprio la sintassi dei generic a essere ben poco leggibile (con tutta quell'accozzaglia di simboli, poi).
so cos'è SQL ma non ci azzecca niente con SQL, usa solo le stesse parole chiave. sta di fatto che se non ci fosse stato il commento non sarei riuscito a capire il significato di quella riga di codice, quindi leggibile mi sembra una parola grossa (poi potrà avere un sacco di altre qualità).
lo leggo in inglese:
prendo t in un range da 0 a 32 e dove se WTF! src & (1<<t)? WTF! != 0? WTF! restituisco assoc[t]
come vedi sono ben 3 WTF/minuto :asd:
per quanto riguarda i generics spero che non me li stai paragonando ai template di c++. prima di tutto i template sono diversi ordini di grandezza più complessi, poi la sintassi dei generics fondamentalmente non ha nulla di così orrendo, solo che ci sono delle funzionalità particolamente avanzate che la possono far diventare un mostro. detto questo raramente (ma probabilmente MAI visto che basterebbe strutturare le classi in maniera diversa) serve usarle queste funzionalità e quindi direi che nel 99% dei casi viene fuori una cosa pulita.
@cdimauro
secondo me il linguaggio perfetto per te è scala :O
so cos'è SQL ma non ci azzecca niente con SQL, usa solo le stesse parole chiave.
L'esempio era un esempio sfortunato di "LINQ to Object"
In realta' e' molto simile all'SQL, ed e' stato introdotto apposta per aiutare proprio in quell'ambito.
Metto qui un mio esempio di "LINQ to SQL", dove potrai vedere le affinita'.
LDBProvaDataContext e' una Connessione a Database,
Users e' la tabella dei clienti.
Ogni cliente ha piu' ordini, gli ordini sono su un'altra tabella in FK
Si vuole stampare tutti gli utenti che hanno piu' di 4 ordini,
il cui nome inizia con "Mr." e il cui ID e' piu' grande di 6.
using (LDBProvaDataContext context = new LDBProvaDataContext())
{
var query = from Cliente in context.Users
where Cliente.Orders.Count > 4
&& Cliente.UserName.StartsWith("Mr.")
&& Cliente.IDUser>6
select Cliente;
foreach(var Cliente in query)
{
Console.WriteLine(Cliente);
}
}
nota la comodita' della trasformazione implicita del database da "relazionale" ad "oggetti".
La comodita' di chiedere cose come
Cliente.Orders.Count > 4
E' assolutamente piu' leggibile che la controparte SQL (Anche se scritta da un umano)
Ovviamente viene generata un'istruzione SQL.
Andando a leggere il log, l'istruzione SQL automaticamente generata e' la seguente:
SELECT [t0].[IDUser], [t0].[UserName]
FROM [dbo].[User] AS [t0]
WHERE (((
SELECT COUNT(*)
FROM [dbo].[Order] AS [t1]
WHERE [t1].[IDUser] = [t0].[IDUser]
)) > @p0) AND ([t0].[UserName] LIKE @p1) AND ([t0].[IDUser] > @p2)
parametri passati:
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [4]
-- @p1: Input VarChar (Size = 4; Prec = 0; Scale = 0) [Mr.%]
-- @p2: Input Int (Size = 0; Prec = 0; Scale = 0) [6]
Il tutto fortemente tipizzato e controllato in fase di compilazione.
Non ho capito quest'appunto.
In che senso mi tocca costruire al volo la labmda espression?
Qui ho costruito al volo una lambda expression, ovvero l'azione da richiamare per ciascun elemento dell'array di stringhe (In realta' non e' un array, ma facciamo finta che lo sia)
stringhe.ForEachElement(t => Console.WriteLine(t));
Altrimenti avrei potuto scrivere
Action<string> azione= t => Console.WriteLine(t);
stringhe.ForEachElement(azione);
Di cosa altro dovrei sentire la mancanza che non ho?
Intendevo dire che sarebbe molto piu' chiaro poter semplicemente scrivere
stringhe.ForEachElement( Console.WriteLine );
L'idea e' che non dovresti essere costretto a costruire una funzione anonima solo per passarla come argomento quando ne hai gia' una normale che lo fa. E' poco... funzionale :stordita:, tanto da scrivere in piu' per qualcosa che si usa spesso.
Intendevo dire che sarebbe molto piu' chiaro poter semplicemente scrivere
stringhe.ForEachElement( Console.WriteLine );
L'idea e' che non dovresti essere costretto a costruire una funzione anonima solo per passarla come argomento quando ne hai gia' una normale che lo fa. E' poco... funzionale :stordita:, tanto da scrivere in piu' per qualcosa che si usa spesso.
Hai ragione....
e infatti si puo' fare anche quella.
E' solo che stavo facendo studi sulle lambda expression.
stringhe.ForEach(Console.WriteLine);
E' perfettamente legale.
ForEachElement fra l'altro era una mia Extension, da applicarsi alle enumerazioni.
Le Liste (che sono un derivato delle enumerazioni) posseggono la Foreach, sulla quale si puo' epsrimere direttamente un'azione esattamente come tu hai scritto.
elaboro un attimo quanto appena scritto.
Il fatto di evitare di scrivere esplicitamente l'argomento diventa comodo quando vuoi scrivere codice "point free", combinando le funzioni tra di loro.
Supponi ad esempio di non avere una sequenza di stringhe, ma una di coppie di stringhe,e di voler stampare la piu' lunga.
In versione "standard" devi scrivere qualcosa del genere
coppie.ForEachElement(t => Console.WriteLine( Longest(t)));
In versione "funzionale seria", potresti scrivere
coppie.ForEachElement(Console.WriteLine o Longest );
dove o e' l'operatore di composizione di funzioni
(f o g)(x) = f(g(x)) (che al momento ovviamente non esiste in C#).
Diventa piu' chiara (meno parentesi che rompono) e soprattutto non devi spostarti a cercare dove "va a finire" l'argomento, semplicemente leggi da destra a sinistra le operazioni che vengono effettuate, in una sorta di pipe-line
Hai ragione....
e infatti si puo' fare anche quella.
E' solo che stavo facendo studi sulle lambda expression.
strling.ForEach(Console.WriteLine);
E' perfettamente legale.
ForEachElement fra l'altro e' una mia Extension, da applicarsi alle enumerazioni.
Le Liste (che sono un derivato delle enumerazioni) posseggono la Foreach, sulla quale si puo' epsrimere direttamente un'azione esattamente come tu hai scritto.
Ah ecco :p. Porta pazienza, ma non conosco C# se non molto superficialmente .
Ah ecco :p. Porta pazienza, ma non conosco C# se non molto superficialmente .
Siamo pari. Io non conosco le Lambda Expression se non superficialmente :)
Le sto approfondendo proprio in questo periodo, per cercare di capire appieno le potenzialita' della programmazione Funzionale.
cdimauro
13-04-2008, 07:33
so cos'è SQL ma non ci azzecca niente con SQL, usa solo le stesse parole chiave. sta di fatto che se non ci fosse stato il commento non sarei riuscito a capire il significato di quella riga di codice, quindi leggibile mi sembra una parola grossa (poi potrà avere un sacco di altre qualità).
lo leggo in inglese:
prendo t in un range da 0 a 32 e dove se WTF! src & (1<<t)? WTF! != 0? WTF! restituisco assoc[t]
come vedi sono ben 3 WTF/minuto :asd:
Su questo vedo che t'ha già risposto "gugo". :D
Aggiungo soltanto che l'unica cosa poco chiara in quel pezzo di codice è
(src & (1<<t)) !=0
ma questo dipende più che altro dal linguaggio, che è C-like. :fagiano:
per quanto riguarda i generics spero che non me li stai paragonando ai template di c++. prima di tutto i template sono diversi ordini di grandezza più complessi,
Ho detto che gli fanno concorrenza, in quanto la sintassi può rivelarsi similmente orrida.
Poi so benissimo che i template sono più complessi. Non mi sono mai piaciuti perché li considero delle macro "mascherate", e le macro, a parte ai tempi di cui usavo l'assembly che erano necessarie, mi hanno fatto sempre schifo.
poi la sintassi dei generics fondamentalmente non ha nulla di così orrendo, solo che ci sono delle funzionalità particolamente avanzate che la possono far diventare un mostro. detto questo raramente (ma probabilmente MAI visto che basterebbe strutturare le classi in maniera diversa) serve usarle queste funzionalità e quindi direi che nel 99% dei casi viene fuori una cosa pulita.
E' proprio la loro sintassi che "genera mostri".
Poi l'implementazione di Java è oggettivamente una porcata: è una pezza che hanno voluto aggiungere al linguaggio pur di implementare questa funzionalità senza andare a toccare la virtual machine. :Puke:
@cdimauro
secondo me il linguaggio perfetto per te è scala :O
Mi trovo benissimo con Python, grazie. :cool:
L'esempio era un esempio sfortunato di "LINQ to Object"
In realta' e' molto simile all'SQL, ed e' stato introdotto apposta per aiutare proprio in quell'ambito.
...
non metto in dubbio nulla di tutto ciò, è evidente che possa essere usato in maniera analoga a una query SQL (o meglio OQL), semplicemente dicevo che quel particolare codice non è così facile da leggere.
agli inizi C# mi aveva attratto, ma secondo me sta facendo la fine del C++, cioè ci buttano dentro di tutto con il risultato di creare una sintassi ultracomplicata e poco omogenea. sarà che a me non sono mai piaciuti troppi paradigmi tutti insieme :p
Aggiungo soltanto che l'unica cosa poco chiara in quel pezzo di codice è
(src & (1<<t)) !=0
ma questo dipende più che altro dal linguaggio, che è C-like.
difatti io mi riferivo a quello, ma non dipende in nessun modo dalla sintassi C like. anche se cambi i simboli non cambia niente
per i generics hai ragione a dire che li hanno introdotti in ritardo, ma non vedo questi grandi danni alla sintassi. continuo a pensare che List<String> è più che sufficiente per fare qualsiasi cosa :fagiano:
Mi trovo benissimo con Python, grazie.
def eval(t: Tree, env: Environment): int = t match {
case Sum(l, r) => eval(l, env) + eval(r, env)
case Var(n) => env(n)
case Const(v) => v
}
beh non ti viene voglia di usarlo? vediamo come lo faresti in python :sofico:
Va bene, mi avete convinto.
Rifattorizzo (Si puo' ancora vero?)
public IEnumerable<string> GetFromInt(int src)
{
BitArray bitSrc = new BitArray(src);
// Spettacolo. Spero sia comprensibile
// Restutisco le stringhe che hanno il bit corrispondente ad 1
var strs =
from index in Enumerable.Range(0, 32)
where bitSrc[index]==true
select assoc[index];
return strs;
}
Va meglio? E' piu' umana?
Tieni anche conto che si sta cucinando un qualcosa che e' uscito da un bassissimo livello. Un registro di configurazione del processore.
C# non va proprio a nozze con concetti come questo, nel senso che pochi si metterebbero a gestire ancora maschere di bit per gestire la logica dei propri dati.
Non ho capito invece cosa staresti proponendo di fare in Python.
Una funzione a cui si passa un albero e un "contesto?" e restituisce un intero.
Poi mi perdo un po'.
Se l'albero e' Sum(sinstro, destro) allora restituisco la ricorsione della funzione stessa valutata sul sinistro sommata a queilla valutata sul destro.
Se l'albero e' una variabile allora passo la variaible del contesto
Se l'albero e' una costante, allora restituisco la costante.
Cosa fa? Somma tutti i nodi di un albero binario?
Ma c'e' altro vero?
si ora è un pò meno oscuro :D il problema principale come hai detto anche te è l'uso della maschera di bit per cui più di tanto non si può fare (l'unica sarebbe creare una classe che astrae la maschera di bit)
la funzione che ho riportato sopra è una funzione che valuta il valore di un'espressione. in particolare dimostra una interessante caratteristica di scala, cioè il pattern matching
Sum, Var e Const sono sottoclassi di Tree e in pratica costituiscono la tassonomia dei possibili nodi presenti nell'albero.
quando viene chiamata la funzione si controlla se t matcha uno dei possibili casi elencati. ad esempio supponiamo che t sia di tipo Sum.
se i rispettivi parametri sono l e r (da notare la potenza di questa sintassi) allora viene restituito eval(l, env) + eval(r, env)
attraverso la ricorsione viene valutata l'intera espressione contenuta nell'albero. :cool:
c'è da dire che scala è di una complessità tale che probabilmente non lo userò mai sul serio :D
tomminno
13-04-2008, 15:29
Opinabile: richiama molto le query SQL. :O
Comunque sempre più comprensibile di roba come i generic, di cui però nessuno "stranamente" si lamenta della scarsa leggibilità (perché fanno comodo). :stordita:
Cosa c'è di poco leggibile nei generics?
tomminno
13-04-2008, 15:30
E perchè il c# dovrebbe essere "più produttivo" (ammesso che la produttività possa dipendere dal linguaggio, piuttosto che dallo sviluppatore) del Java ?
Dipende dal contesto.
Intanto C# si integra meglio con gli applicativi Microsoft.
Inoltre il fatto di avere un solo IDE di riferimento fa si che le cose si facciano sempre allo stesso modo.
Mi sono imbattuto nei webservice in Java. In questo ambito C# è molto più produttivo.
tomminno
13-04-2008, 15:34
Quanto ai generic, fanno concorrenza ai template del C++ quanto a scarsa leggibilità. Che poi abbiano risolto alcuni problemi non ci piove, ma la sintassi per usarli è tutt'altra che "agile" alla lettura.
E non si tratta di come si usa lo strumento: è proprio la sintassi dei generic a essere ben poco leggibile (con tutta quell'accozzaglia di simboli, poi).
In C++ la sintassi dei template non aiuta, risulta molto verbosa e può anche essere poco leggibile, ma in C# proprio no.
Quale accozzaglia di simboli?
Lo where per le restrizioni sul tipo generics (tra l'altro introdotte anche nel C++ prossimo venturo)?
per i generics ci si riferisce a cosa del tipo (in java):
public static <T extends Object & Comparable<? super T>>
T max(Collection<? extends T> coll)
i template forse sono anche peggio però
per i generics ci si riferisce a cosa del tipo (in java):
public static <T extends Object & Comparable<? super T>>
T max(Collection<? extends T> coll)
i template forse sono anche peggio però
Lo stesso esempio fatto da Cay Horstmann...
l'ho preso dalla documentazione sul sito di sun :fagiano:
tomminno
13-04-2008, 16:35
per i generics ci si riferisce a cosa del tipo (in java):
public static <T extends Object & Comparable<? super T>>
T max(Collection<? extends T> coll)
i template forse sono anche peggio però
Con i template del C++ non hai modo di imporre limitazioni sul tipo, quindi da questo punto di vista la dichiarazione si semplifica.
Effettivamente in Java con i generics non hanno fatto un bel lavoro.
Con i template del C++ non hai modo di imporre limitazioni sul tipo, quindi da questo punto di vista la dichiarazione si semplifica.
Effettivamente in Java con i generics non hanno fatto un bel lavoro.
In realta' la restrizione sul tipo c'e' in C++, se il tipo non e' "compatibile" l'istanziazione non compila.
Il problema e' un altro: non e' elegante e naturale definire restrizioni sui tipi, non e' facile raggrupparle tutte nello stesso luogo, i messaggi d'errore sono spesso quanto meno oscuri.
template <typename T>
void Something(const T& obj)
{
T aCopy(obj);
aCopy.DoSomething();
}
Something() puo' essere istanziato solo con tipi che definiscono l'azione DoSomething() ed un costruttore di copia.
cdimauro
13-04-2008, 16:54
non metto in dubbio nulla di tutto ciò, è evidente che possa essere usato in maniera analoga a una query SQL (o meglio OQL), semplicemente dicevo che quel particolare codice non è così facile da leggere.
agli inizi C# mi aveva attratto, ma secondo me sta facendo la fine del C++, cioè ci buttano dentro di tutto con il risultato di creare una sintassi ultracomplicata e poco omogenea. sarà che a me non sono mai piaciuti troppi paradigmi tutti insieme :p
Ti lamenti di C#, ma Java non è certo messo meglio (tutt'altro), e C++ con la prossima versione dimostrerà che può fare anche peggio in termini di leggibilità del codice. :asd:
difatti io mi riferivo a quello, ma non dipende in nessun modo dalla sintassi C like. anche se cambi i simboli non cambia niente
Se metti keyword al posto di qualche simbolo di sicuro si leggerà meglio. :O
per i generics hai ragione a dire che li hanno introdotti in ritardo, ma non vedo questi grandi danni alla sintassi. continuo a pensare che List<String> è più che sufficiente per fare qualsiasi cosa :fagiano:
Ma sai benissimo che non ci si limita soltanto a quelle forme. Dopo, infatti, hai riportato qualche esempio di codice particolarmente indigesto. :|
def eval(t: Tree, env: Environment): int = t match {
case Sum(l, r) => eval(l, env) + eval(r, env)
case Var(n) => env(n)
case Const(v) => v
}
beh non ti viene voglia di usarlo? vediamo come lo faresti in python :sofico:
Se me lo traduci in qualcosa di più umano (e leggibile), magari posso provare a "portarlo" in Python. :asd:
A parte gli scherzi, ho letto la tua spiegazione e provo a riprodurre l'equivalente Python:
def eval(t, env):
if isinstance(t, Sum): return eval(t.l, env) + eval(t.r, env)
elif isinstance(t, Var): return env(t.n)
elif isinstance(t, Const): return t.v
Visto che aderiamo alla campagna "no if" :asd: :
Evaluator = {Sum : lambda t, env: eval(t.l, env) + eval(t.r, env),
Var : lambda t, env: env(t.n),
Const : lambda t, env: t.v}
def eval(t, env): return Evaluator[type(t)](t, env)
:cool:
Cosa c'è di poco leggibile nei generics?
Kont3 mi ha anticipato. :p
In C++ la sintassi dei template non aiuta, risulta molto verbosa e può anche essere poco leggibile, ma in C# proprio no.
class C<T>: B<IComparable<T>>
Oppure:
Pair<int,string> pair = new Pair<int,string> { First = 1, Second = “two” };
Non mi sembra molto diverso da Java.
Tra l'altro c'è un'inutile ripetizione (<int,string>), che rende il codice più "verboso".
Quale accozzaglia di simboli?
Lo where per le restrizioni sul tipo generics (tra l'altro introdotte anche nel C++ prossimo venturo)?
Questa accozzaglia:
delegate R Func<T1,R>(T1 arg1);
delegate R Func<T1,T2,R>(T1 arg1, T2 arg2);
class C
{
public C<T> Cast<T>();
}
class C<T> : C
{
public C<T> Where(Func<T,bool> predicate);
public C<U> Select<U>(Func<T,U> selector);
public C<V> SelectMany<U,V>(Func<T,C<U>> selector,
Func<T,U,V> resultSelector);
public C<V> Join<U,K,V>(C<U> inner, Func<T,K> outerKeySelector,
Func<U,K> innerKeySelector, Func<T,U,V> resultSelector);
public C<V> GroupJoin<U,K,V>(C<U> inner, Func<T,K> outerKeySelector,
Func<U,K> innerKeySelector, Func<T,C<U>,V> resultSelector);
public O<T> OrderBy<K>(Func<T,K> keySelector);
public O<T> OrderByDescending<K>(Func<T,K> keySelector);
public C<G<K,T>> GroupBy<K>(Func<T,K> keySelector);
public C<G<K,E>> GroupBy<K,E>(Func<T,K> keySelector,
Func<T,E> elementSelector);
}
class O<T> : C<T>
{
public O<T> ThenBy<K>(Func<T,K> keySelector);
public O<T> ThenByDescending<K>(Func<T,K> keySelector);
}
class G<K,T> : C<T>
{
public K Key { get; }
}
O anche questa:
Expression<Func<int,int>> exp = x => x + 1;
Non mi sembrano il massimo della leggibilità.
Poi, sia chiaro: a me non piace proprio la sintassi C-like, eh! ;)
Visto che aderiamo alla campagna "no if" :asd: :
Evaluator = {Sum : lambda t, env: eval(t.l, env) + eval(t.r, env),
Var : lambda t, env: env(t.n),
Const : lambda t, env: t.v}
def eval(t, env): return Evaluator[type(t)](t, env)
:cool:
Questo non aderisce pero' alla campagna "Leggiamo il codice senza farci venire mal di testa" :muro:
tomminno
13-04-2008, 17:37
Kont3 mi ha anticipato. :p
class C<T>: B<IComparable<T>>
E dove sarebbe l'illeggibilità?
IComparable<T> è un'interfaccia del framework .NET, è illeggible anche questo?
class C<T> : B<int>
L'interfaccia IComparable si estende ai generics con IComparable<T>, i generics si dichiarano con le parentesi angolari e l'ereditarietà con i :, dati questi assunti cosa c'è di illeggibile?
Oppure:
Pair<int,string> pair = new Pair<int,string> { First = 1, Second = “two” };
Non mi sembra molto diverso da Java.
Tra l'altro c'è un'inutile ripetizione (<int,string>), che rende il codice più "verboso".
Qui di illeggibile proprio non c'è niente, visto che rispecchia il modo di dichiarare e istanziare le variabili in tutti i linguaggi C-like, eccetto forse l'ultima parte che inizializza i campi di Pair.
Questa accozzaglia:
delegate R Func<T1,R>(T1 arg1);
delegate R Func<T1,T2,R>(T1 arg1, T2 arg2);
class C
{
public C<T> Cast<T>();
}
class C<T> : C
{
public C<T> Where(Func<T,bool> predicate);
public C<U> Select<U>(Func<T,U> selector);
public C<V> SelectMany<U,V>(Func<T,C<U>> selector,
Func<T,U,V> resultSelector);
public C<V> Join<U,K,V>(C<U> inner, Func<T,K> outerKeySelector,
Func<U,K> innerKeySelector, Func<T,U,V> resultSelector);
public C<V> GroupJoin<U,K,V>(C<U> inner, Func<T,K> outerKeySelector,
Func<U,K> innerKeySelector, Func<T,C<U>,V> resultSelector);
public O<T> OrderBy<K>(Func<T,K> keySelector);
public O<T> OrderByDescending<K>(Func<T,K> keySelector);
public C<G<K,T>> GroupBy<K>(Func<T,K> keySelector);
public C<G<K,E>> GroupBy<K,E>(Func<T,K> keySelector,
Func<T,E> elementSelector);
}
class O<T> : C<T>
{
public O<T> ThenBy<K>(Func<T,K> keySelector);
public O<T> ThenByDescending<K>(Func<T,K> keySelector);
}
class G<K,T> : C<T>
{
public K Key { get; }
}
Queste sono tutte dichiarazioni di interfacce, anche se per i nomi potevano scegliere qualcosa di più comprensibile, e per i delegati hanno scelto lo stesso nome, della serie obfuscated C#.
E' chiaro che si può sempre scrivere del codice poco leggibile.
Magari è semplicemente complicato, quale sarebbe l'equivalente senza generics? Risulterebbe più chiaro?
O anche questa:
Expression<Func<int,int>> exp = x => x + 1;
Non mi sembrano il massimo della leggibilità.
Poi, sia chiaro: a me non piace proprio la sintassi C-like, eh! ;)
Questa no infatti è LINQ e non ha sintassi C-like ;)
template <typename T>
void Something(const T& obj)
{
T aCopy(obj);
aCopy.DoSomething();
}
Something() puo' essere istanziato solo con tipi che definiscono l'azione DoSomething() ed un costruttore di copia.
E' un po' problematico in effetti quando quel T non e' un tipo semplice ma (ad esempio) un typedef definito in una classe template e pure lui magari template... tutta questa composizione te la ritrovi nell'output del compilatore in caso di errore. Se poi ci sono di mezzo operatori ridefiniti il divertimento e' garantito.
Esercizio: prendere un qualsiasi codice di esempio per l'uso delle boost, cambiare un carattere a caso, e contare quante pagine di errori saltano fuori. Una volta provai le librerie per i grafi, nell'esempio c'erano un operator () invece di un operator [], e mi saltarono fuori 15 pagine assolutamente incomprensibili :asd:
Evaluator = {Sum : lambda t, env: eval(t.l, env) + eval(t.r, env),
Var : lambda t, env: env(t.n),
Const : lambda t, env: t.v}
def eval(t, env): return Evaluator[type(t)](t, env)
Non ha molto senso fare un equivalente, visto che python manca di tipi algebrici, pattern matching e compagnia.
Tanto vale usare il metodo classico
class Sum:
def eval(self,env):
return self.left.eval(env) + self.right.eval(env)
class Var:
def eval(self,env):
return env[self.n]
eccetera.
cdimauro
14-04-2008, 09:45
Questo non aderisce pero' alla campagna "Leggiamo il codice senza farci venire mal di testa" :muro:
Vabbé, ho solo tradotto il codice cos'è com'era... :|
Ecco la versione "readable":
def EvalSum(t, env): return eval(t.l, env) + eval(t.r, env)
def EvalVar(t, env): return env(t.n)
def EvalConst(t, env): return t.v
ClassToFunctionMap = {Sum : EvalSum,
Var : EvalVar,
Const : EvalConst}
def eval(t, env):
Class = type(t)
Function = ClassToFunctionMap[Class]
return Function(t, env)
Così va meglio? :flower:
E dove sarebbe l'illeggibilità?
IComparable<T> è un'interfaccia del framework .NET, è illeggible anche questo?
class C<T> : B<int>
L'interfaccia IComparable si estende ai generics con IComparable<T>, i generics si dichiarano con le parentesi angolari e l'ereditarietà con i :, dati questi assunti cosa c'è di illeggibile?
Qui di illeggibile proprio non c'è niente, visto che rispecchia il modo di dichiarare e istanziare le variabili in tutti i linguaggi C-like, eccetto forse l'ultima parte che inizializza i campi di Pair.
Queste sono tutte dichiarazioni di interfacce, anche se per i nomi potevano scegliere qualcosa di più comprensibile, e per i delegati hanno scelto lo stesso nome, della serie obfuscated C#.
E' chiaro che si può sempre scrivere del codice poco leggibile.
Magari è semplicemente complicato, quale sarebbe l'equivalente senza generics? Risulterebbe più chiaro?
Questa no infatti è LINQ e non ha sintassi C-like ;)
Questo no (anche se usa un simbolismo tipico di questa famiglia di linguaggi), ma il resto sì, e come dicevo a me non piace proprio. Non mi ci trovo. E penso che l'uso di keyword al posto di simboli migliorerebbe molto la leggibilità (fermo restando che, come dicevi, si può sempre scrivere codice poco leggibile).
Comunque a parte i nomi usati, continuo a vedere quel codice ben poco chiaro. :|
Evaluator = {Sum : lambda t, env: eval(t.l, env) + eval(t.r, env),
Var : lambda t, env: env(t.n),
Const : lambda t, env: t.v}
def eval(t, env): return Evaluator[type(t)](t, env)
Non ha molto senso fare un equivalente, visto che python manca di tipi algebrici, pattern matching e compagnia.
Tanto vale usare il metodo classico
class Sum:
def eval(self,env):
return self.left.eval(env) + self.right.eval(env)
class Var:
def eval(self,env):
return env[self.n]
eccetera.
Concordo, e non perché a Python mancano quelle funzionalità: Sum, Var e Const sono sottoclassi di Tree, ed è perfettamente naturale che ognuna esponga il suo "modo" di "essere valutata".
Insomma, è programmazione a oggetti "da manuale", come si suol dire, col vantaggio non indifferente di non generare NESSUN tipo di "if", né "esplicito" (usando istruzioni come if, match/switch) né implicito (usando tipi di dati come dizionari, che almeno qualche controllo devono farlo). ;)
Ecco la versione "readable":
def EvalSum(t, env): return eval(t.l, env) + eval(t.r, env)
def EvalVar(t, env): return env(t.n)
def EvalConst(t, env): return t.v
ClassToFunctionMap = {Sum : EvalSum,
Var : EvalVar,
Const : EvalConst}
def eval(t, env):
Class = type(t)
Function = ClassToFunctionMap[Class]
return Function(t, env)
Così va meglio? :flower:
Molto meglio!
Curiosita', non si puo' scrivere qualcosa tipo:
def eval(t, env):
return ClassToFunctionMap[type(t)](t, env)
E poi vedo quel doppio t che sicuramente si puo' consolidare in qualche modo.
Tipo:
return GetFunctionFrom(t).Eval(env)
Magari dando un nome decente a 'env'. Tiro a caso la sintassi perche' per mia fortuna non conosco Python :D
Comunque a parte i nomi usati, continuo a vedere quel codice ben poco chiaro. :|
Cesare, quel codice e' poco chiaro solo per i nomi. La sintassi dei Generics e' ok. Se poi non ti piace la sintassi C-like e' una questione di gusti.
cdimauro
14-04-2008, 10:41
Molto meglio!
Curiosita', non si puo' scrivere qualcosa tipo:
def eval(t, env):
return ClassToFunctionMap[type(t)](t, env)
Sì, certo, ed è quello che avrei fatto normalmente: ho aggiunto delle variabili intermedie soltanto per rendere più chiaro su cosa stavo lavorando.
E poi vedo quel doppio t che sicuramente si puo' consolidare in qualche modo.
Tipo:
return GetFunctionFrom(t).Eval(env)
Magari dando un nome decente a 'env'. Tiro a caso la sintassi perche' per mia fortuna non conosco Python :D
ROTLF. Sì, che si può fare:
return t.GetFunction()(env)
Supponendo che il metodo GetFunction di t restituisca a sua volta una funzione (o metodo).
Ancora meglio, come dicevo prima, avere un metodo eval per la classe Tree e i suoi "figli", in modo da ricorrere alla sola e semplice programmazione a oggetti. :)
Cesare, quel codice e' poco chiaro solo per i nomi. La sintassi dei Generics e' ok. Se poi non ti piace la sintassi C-like e' una questione di gusti.
Indubbiamente, ma l'ho detto: non mi piace proprio quella sintassi. :|
Sì, che si può fare:
return t.GetFunction()(env)
Supponendo che il metodo GetFunction di t restituisca a sua volta una funzione (o metodo).
Ecco si', meglio ancora. Mi urtano un po' le doppie parentesi tonde (gusto personale), quindi aggiungerei un .eval() ma l'idea e' quella.
cdimauro
14-04-2008, 11:09
Il problema delle parentesi tonde "ripetute" è che la prima volta si richiama il metodo, che però restituisce una funzione che, a sua volta, dev'essere invocata, da cui le altre due parentesi.
In Python qualunque "chiamata" (ma mi sembra che anche in C/C++/Java sia così) deve prevedere necessariamente l'uso delle parentesi. Questo serve a evidenziare la differenza fra l'accesso ad attribuiti, dall'esecuzione.
Si potrebbe, al limite, utilizzare una variabile locale per memorizzare la funzione, per chiamarla poi dopo. Così:
Function = t.GetFunction()
return Function(env)
Ma onestamente non mi piace molto. :|
Il problema delle parentesi tonde "ripetute" è che la prima volta si richiama il metodo, che però restituisce una funzione che, a sua volta, dev'essere invocata, da cui le altre due parentesi.
In Python qualunque "chiamata" (ma mi sembra che anche in C/C++/Java sia così) deve prevedere necessariamente l'uso delle parentesi. Questo serve a evidenziare la differenza fra l'accesso ad attribuiti, dall'esecuzione.
Si' Cesare ok :D
Parlo in generale, anche in C++ non amo cose come:
GetFunctor()(args)
Preferisco:
GetFunctor().Execute(args)
E' piu' chiaro e descrive meglio le intenzioni del codice.
In Python quindi direi di ritornare un qualcosa che definisca un metodo eval() nel nostro caso. Assolutamente da bannare variabili temporanee!
cdimauro
14-04-2008, 11:30
Chiarissimo e fattibilissimo. :)
A proposito di statistiche...
Ne ho trovata una, utilissima.
Ma non l'ho postata qui in questa sezione perche' un po' mi vergognavo...
http://www.hwupgrade.it/forum/showthread.php?p=22053583#post22053583
:D
cdimauro
17-04-2008, 08:48
:eek: :eek: :eek: :asd: :asd: :asd:
A proposito di statistiche...
Ne ho trovata una, utilissima.
Ma non l'ho postata qui in questa sezione perche' un po' mi vergognavo...
http://www.hwupgrade.it/forum/showthread.php?p=22053583#post22053583
:D
Tu gli dai una barra di cioccolata e loro ti danno la password? :rolleyes:
Va bhè, evito di essere volgare... :sofico:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.