Ho notato che il supporto IDE non è affatto buono, ma il linguaggio stesso supporta gli idiomi di programmazione funzionale in modo molto più pulito.
Ho notato che il supporto IDE non è affatto buono, ma il linguaggio stesso supporta gli idiomi di programmazione funzionale in modo molto più pulito.
Risposte:
Sto programmando Scala da più di un anno, quindi cercherò di tornare indietro di un anno per rispondere a questa domanda.
I punti sopra erano più o meno ciò che pensavo di Scala prima di iniziare a impararlo.
Nel corso di un anno, ecco cosa ho scoperto:
Beh, penso che Scala sia troppo complessa. Sembra C ++ in quanto ha una miriade di modi diversi di fare le cose. Alcuni chiamerebbero questa "ricchezza", "espressività" o "potere", ma il tuo chilometraggio può variare. In molti progetti del mondo reale dovresti limitare artificialmente quali funzionalità linguistiche utilizzerai e quali no, in modo che tutti gli sviluppatori coinvolti possano parlare lo stesso sottoinsieme della lingua.
Per la programmazione funzionale preferisco Clojure , che è molto più semplice di Scala.
Che la guerra santa abbia inizio ;-)
Circa un anno fa, mentre diventavo sempre più frustrato per il futuro dei prodotti della mia startup se continuavo a usare Java, ho deciso di provare Scala. Stavo già programmando in JavaScript e Python al momento, anche Ruby era una buona alternativa, ma stavo cercando un linguaggio tipicamente statico, preferibilmente uno che potesse essere eseguito su JVM.
Ho davvero provato ad amare Scala, l'ho fatto davvero, ma ho scoperto che il suo codice è assolutamente brutto e difficile da capire. Mi chiedevo drammaticamente che se Scala fosse la nostra migliore risposta a Java, allora ero sicuramente fregato e condannato a continuare a lavorare con una lingua che non mi piaceva dopo tutto ...
Fortunatamente, non molto tempo dopo, ho scoperto Fantom . Oh amico, l'ho adorato! Per me, è stata come la risposta dello splendore americano alla burocrazia tedesca! Corrispondeva ai requisiti che stavo cercando a Scala, ma molto più elegantemente . Aveva l' integrazione di Vim , Eclipse e Netbeans , un bel framework web , prodotti maturi con esso in esecuzione, una piccola ma incredibilmente utile community ... Digitazione dinamica e statica! Mi sono rallegrato!
(Potrei continuare, ma questo post dovrebbe riguardare Scala, non Fantom, quindi mi fermo qui. La mia preferenza è chiara , tuttavia c'è questo post che mette a confronto i due. Non ho mai capito perché Fantom riceva così poca attenzione rispetto a Scala. Ma a quanto pare non sono l'unico, se ascolti questo podcast [ mp3 ] fino alla fine.)
Quando mi sono dilettato inizialmente con Scala 2 anni fa, mi è sembrato estraneo e intimidatorio. Ad un certo punto ho scoperto che il linguaggio principale è in realtà molto più semplice di Java, ma la sua sintassi e semantica sono così flessibili che puoi creare nuovi costrutti di linguaggio simili, anche senza una funzione macro. Da allora sono passato completamente a Scala per tutti i miei progetti Java, perché mi consente di scrivere senza troppo codice boilerplate.
Mi piace Clojure, ma ci sono situazioni in cui la piattaforma ha bisogno di te per compilare in bytecode statico (Android, applet, ...) e mentre puoi farlo, in Scala, è proprio lì.
Mentre Scala ti consente di risolvere molti problemi in modo funzionale, trovo spesso problemi in cui l'uso delle classi sembra più naturale. Ciò rende le cose un po 'più complesse, ma in nessun posto vicino alle complessità e ai dolori del C ++.
Il più grande takeaway per me quando ho iniziato davvero ad imparare la lingua era che potevo programmare solo in Java, proprio senza il rumore (un po 'come quando avvii Groovy), ma alla fine vuoi provare ad immergerti più in profondità nel potere della lingua - cresce con te.
Informazioni sulla domanda IDE: dopo aver usato Emacs per tutto, tutti i miei problemi IDE sono scomparsi :-)
Mi piace Scala per molte ragioni, ma ce n'è una che viene spesso trascurata: la sua semplicità.
Scala potrebbe non essere semplice come, diciamo, Oberon, ma è molto più semplice di alcune altre lingue. La specifica del linguaggio Scala è ~ 160 pagine, la specifica del linguaggio Java è ~ 600 (solo la lingua, non la JVM o le librerie!), La specifica del linguaggio C # ECMA-334 (che AFAIK corrisponde a un sottoinsieme di Visual C # 2.0) è ~ 440 pagine (questo è senza elementi come la comprensione delle query LINQ, le espressioni lambda, i metodi di estensione, la co-e la contraddizione generici dynamic
, argomenti opzionali con valori predefiniti, argomenti di parole chiave, var
). Anche l'attuale bozza per ECMAScript 5.1 è più grande a ~ 210 pagine. E ovviamente il mio linguaggio "predefinito", Ruby, il cui attuale ISO Draft pesa circa ~ 310 pagine, che specifica solo un sottoinsieme quasi insolitamente piccolo dell'intersezione di Ruby 1.8.6, 1.9.1 e 1.9.2.
Ecco cosa fa schifo di Scala:
Il puntatore null era una pessima idea per cominciare. Hoare lo ha definito il suo "errore di miliardi di dollari", ma Scala è anche peggio. Ha oggetti chiamati null, Null, None e Nil. null è per l'interoperabilità con Java. Null è il puntatore null dalla specifica DOM W3C, None è ciò che null avrebbe dovuto essere sostituito e Nil è qualcosa di vuoto.
Quando i costrutti della lingua risultano essere confusi, di solito è la responsabilità del programmatore e non la lingua. In Scala, tuttavia, il linguaggio principale contiene già classi di librerie il cui unico comportamento documentato è "Questo è un trucco". Non ci credi? Cerca nello scaladoc per scala.xml.Group.
Infine, Scala è mal documentata. Quasi nessuna delle classi scala nella documentazione ufficiale viene fornita con un codice di esempio. Scala è significativamente più difficile da imparare rispetto a Java e richiede una profonda conoscenza dell'informatica.
Per evitare di essere scambiato per un odiatore di Scala, ecco cosa mi piace:
null
è il puntatore null di Java, ne Null
è il "tipo". None
è un possibile "stato" di Option[T]
, una raccolta con uno o zero elementi. Nil
è un elenco vuoto. Mentre vuoi farlo sembrare spaventoso, non lo è. Questi tipi non sono sostituibili o intercambiabili tra loro e si comportano esattamente come dovrebbero.
Scala è complessa. Assolutamente no! La sua sintassi è estremamente flessibile e può essere personalizzata in numerosi modi (soprattutto operatori / notazione infografica) - e il sistema dei tipi ha caratteristiche più diverse rispetto a qualsiasi altra lingua che conosco.
Quindi le cose non sono così dritte come ad esempio in Haskell: Typeclasses per coprirle tutte.
Mentre Scala cerca di mettere insieme programmazione funzionale, OO, programmazione procedurale e librerie Java, nonché idee proprie, alla fine arriviamo a molti concetti che sembrano in qualche modo andare "nella stessa direzione":
La scelta tra questi sembra inizialmente difficile e ci si potrebbe facilmente chiedere se si è trovata la soluzione corretta a qualche problema. È anche facilmente possibile produrre roba da schifo abusando di implicit
s.
Ma la cosa interessante è che Scala funziona. A volte è difficile capire perché (soprattutto capire quali conversioni implicite + eredità + ... alcuni oggetti hanno funzionalità X
), ma la maggior parte delle volte non devi preoccuparti di questo.
Scrivi Scala nel modo più semplice possibile e funzionerà. Non essere confuso da tutto ciò che è possibile e usa solo ciò di cui hai bisogno. E se hai bisogno di qualcosa, puoi essere sicuro che in qualche modo Scala ce l'ha;)
E meglio ottieni, più sarai in grado di personalizzare Scala con operatori, impliciti, monadi, sintassi funky ... e finalmente ottenere qualcosa di simile a un DSL che risolverà perfettamente il tuo problema.
Dopotutto, hai sempre la possibilità di usare Scala come un Java molto migliore con sintassi più semplice e pulita, inferenza di tipo e alcune funzionalità.
È un linguaggio eccellente che è più semplice di Java in molti modi.
Alla maggior parte delle persone non piacerà, programmatore Java o no, per gli stessi motivi per cui la maggior parte delle persone, programmatori o meno, non ama imparare nuovi linguaggi di programmazione. Ho il sospetto che alla maggior parte delle persone che hanno imparato un linguaggio di programmazione non piaceva nemmeno impararlo.
Se sei preoccupato che un linguaggio sia complicato come il C ++, eviterei Clojure come la peste. Lamentare che Scala sia più complicato di Clojure è diventato l'argomento fallback per le persone che sono completamente ignoranti riguardo a una o entrambe le lingue.
Clojure ha macro, il che significa che puoi modificare la sintassi del linguaggio quanto vuoi, dandoti non solo "una miriade di modi diversi di fare le cose" ma un numero quasi infinito di modi di fare le cose. E nessuna di questa nuova sintassi che i programmatori stanno creando con le macro sarà documentata ovunque nelle specifiche del linguaggio.
"Ma possiamo evitare di usare le macro o regolare quali sono consentite nel nostro codice", dici. Congratulazioni, ora devi "limitare artificialmente quali caratteristiche linguistiche utilizzerai e cosa no", che è esattamente ciò che gli idioti borbottanti che usano Clojure di Scala hanno usato come motivo per evitare che Scala iniziasse.
Mi piacciono molto i tipi più granulari della biblioteca Scala. Sembra che la nuova biblioteca delle collezioni sia stata ben pensata. Mi piace anche come riduce la quantità di codice richiesta per le classi semplici e i concetti funzionali che aggiunge. Anche la sua deduzione di tipo è molto utile. Sembra Java senza le ruote di allenamento. Dopo aver usato C # per un po ', Scala in realtà si sente come un concorrente, con Java ancora utile ma lasciato indietro.
Come programmatore Java, inizialmente ho trovato Scala interessante. Tuttavia, dopo essermi dilettato per un po '(e aver incontrato quasi tutti gli aspetti positivi / negativi già elencati da altri), mi è stato lasciato molto "meh" nei suoi confronti. I miglioramenti della lingua sono compensati dalla minore disponibilità di set di strumenti. Non riuscivo a trovare un motivo preciso per passare. È buono, ma non è "abbastanza meglio" per fare un caso per il passaggio. Non ha nemmeno quel fattore soggettivo di eccitazione (come sembra Clojure).