Ich habe festgestellt, dass die IDE-Unterstützung bei weitem nicht so gut ist, aber die Sprache selbst unterstützt funktionale Programmiersprachen viel sauberer.
Ich habe festgestellt, dass die IDE-Unterstützung bei weitem nicht so gut ist, aber die Sprache selbst unterstützt funktionale Programmiersprachen viel sauberer.
Antworten:
Ich programmiere Scala jetzt seit mehr als einem Jahr, also versuche ich, mich ein Jahr zurückzusetzen, um diese Frage zu beantworten.
Die obigen Punkte waren mehr oder weniger das, was ich von Scala hielt, bevor ich anfing, es zu lernen.
Im Laufe eines Jahres habe ich Folgendes herausgefunden:
Nun, ich denke Scala ist zu komplex. Es fühlt sich an wie C ++, da es eine Vielzahl von unterschiedlichen Methoden zur Ausführung von Dingen hat. Einige würden dies "Reichtum", "Ausdruckskraft" oder "Kraft" nennen, aber Ihre Laufleistung kann variieren. In vielen realen Projekten müssten Sie künstlich einschränken, welche Sprachfunktionen Sie verwenden möchten und welche nicht, damit alle beteiligten Entwickler dieselbe Teilmenge der Sprache sprechen können.
Für die funktionale Programmierung bevorzuge ich Clojure , das viel einfacher als Scala ist.
Lass den heiligen Krieg beginnen ;-)
Vor ungefähr einem Jahr, als ich immer frustrierter über die Zukunft der Produkte meines Startups wurde, wenn ich weiterhin Java verwendete, entschloss ich mich, Scala auszuprobieren. Ich habe zu der Zeit bereits in JavaScript und Python programmiert, Ruby war auch eine gute Alternative, aber ich suchte nach einer statisch typisierten Sprache, vorzugsweise einer, die auf der JVM ausgeführt werden kann.
Ich habe wirklich versucht, Scala zu mögen, aber ich fand den Code äußerst hässlich und schwer zu verstehen. Ich wunderte mich dramatisch, dass wenn Scala unsere beste Antwort auf Java war, ich mit Sicherheit verarscht und verurteilt wurde, mit einer Sprache weiterzuarbeiten, die ich doch nicht mochte ...
Glücklicherweise erfuhr ich wenig später von Fantom . Oh Mann, habe ich es geliebt? Für mich war es Amerikas Glanzantwort auf die deutsche Bürokratie! Es entsprach den Anforderungen, die ich in Scala suchte, aber viel eleganter . Es hatte Vim- , Eclipse- und Netbeans- Integration, ein nettes Web-Framework , ausgereifte Produkte , eine kleine, aber unglaublich hilfreiche Community ... Dynamische und statische Typisierung! Ich freute mich!
(Ich könnte weitermachen, aber dieser Beitrag soll sich mit Scala befassen, nicht mit Fantom, also höre ich hier auf. Meine Präferenz ist klar , trotzdem gibt es diesen Beitrag , der die beiden miteinander vergleicht. Ich konnte nie verstehen, warum Fantom im Vergleich zu Scala so wenig Aufmerksamkeit erhält. Aber anscheinend bin ich nicht der Einzige, wenn Sie diesen Podcast [ mp3 ] bis zum Ende anhören .)
Als ich mich vor 2 Jahren mit Scala beschäftigte, sah es für mich fremd und einschüchternd aus. Irgendwann stellte ich fest, dass die Kernsprache tatsächlich viel einfacher ist als Java, aber ihre Syntax und Semantik so flexibel sind, dass Sie neue Sprachkonstrukte wie diese erstellen können, auch ohne eine Makrofunktion. Seitdem bin ich für alle meine Java-Projekte vollständig auf Scala umgestiegen, weil ich damit ohne zu viel Code schreiben kann.
Ich mag Clojure, aber es gibt Situationen, in denen die Plattform das Kompilieren von statischem Bytecode (Android, Applets, ...) erfordert, und während Sie dies tun können, ist es in Scala einfach da.
Während Sie mit Scala viele Probleme funktional lösen können, finde ich häufig Probleme, bei denen sich die Verwendung von Klassen natürlicher anfühlt. Das macht die Dinge etwas komplexer, aber bei weitem nicht die Komplexität und die Schmerzen von C ++.
Der größte Vorteil für mich, als ich anfing, die Sprache zu lernen, war, dass ich so programmieren konnte, wie ich es in Java getan habe, nur ohne das Rauschen (ein bisschen wie beim Starten von Groovy), aber irgendwann möchten Sie versuchen, tiefer in die Macht einzutauchen der Sprache - sie wächst mit dir.
Über die IDE-Frage: Nachdem ich Emacs für alles verwendet hatte, verschwanden alle meine IDE-Probleme :-)
Ich mag Scala aus vielen Gründen, aber es gibt einen, der oft übersehen wird: seine Einfachheit.
Scala ist vielleicht nicht so einfach wie Oberon, aber es ist viel einfacher als einige andere Sprachen. Die Scala-Sprachspezifikation umfasst ca. 160 Seiten, die Java-Sprachspezifikation ca. 600 Seiten (nur die Sprache, nicht die JVM oder die Bibliotheken!), Die ECMA-334 C # -Sprachspezifikation (die AFAIK einer Teilmenge von Visual C # 2.0 entspricht) ~ 440 Seiten (das sind keine Informationen wie das Verständnis von LINQ-Abfragen, Lambda-Ausdrücke, Erweiterungsmethoden, generische Co- und Contravariance dynamic
, optionale Argumente mit Standardwerten, Schlüsselwortargumente usw. var
). Selbst der aktuelle Entwurf für ECMAScript 5.1 ist mit ~ 210 Seiten größer. Und natürlich meine eigene "Standard" -Sprache, Ruby, deren aktueller ISO-Entwurf ~ 310 Seiten umfasst und die nur eine fast unbrauchbar kleine Teilmenge der Schnittmenge von Ruby 1.8.6, 1.9.1 und 1.9.2 angibt.
Das ist scheiße an Scala:
Der Nullzeiger war anfangs eine ziemlich schlechte Idee. Hoare nannte es seinen "Milliarden-Dollar-Fehler", aber Scala ist noch schlimmer. Es hat Objekte mit den Namen null, null, none und null. null ist für die Interoperabilität mit Java. Null ist der Nullzeiger der W3C-DOM-Spezifikation, Keine ist das, durch das Null ersetzt werden sollte, und Nil ist ein leeres Element.
Wenn sich Sprachkonstruktionen als hacky herausstellen, ist es normalerweise der Programmierer, der die Schuld trägt und nicht die Sprache. In Scala enthält die Kernsprache jedoch bereits Bibliotheksklassen, deren einziges dokumentiertes Verhalten "Dies ist ein Hack" ist. Glaubst du es nicht? Durchsuchen Sie das scaladoc nach scala.xml.Group.
Last not least ist Scala schlecht dokumentiert. Kaum eine der Scala-Klassen in der offiziellen Dokumentation enthält Beispielcode. Scala ist bedeutend schwerer zu erlernen als Java und erfordert fundierte Kenntnisse in der Informatik.
Um nicht mit einem Scala-Hasser verwechselt zu werden, liebe ich Folgendes:
null
ist Javas Nullzeiger, Null
ist der "Typ" davon. None
ist ein möglicher "Zustand" Option[T]
einer Sammlung mit einem oder null Elementen. Nil
ist eine leere Liste. Es klingt zwar beängstigend, ist es aber nicht. Diese Typen sind nicht austauschbar oder austauschbar und verhalten sich genau so, wie sie sollten.
Scala ist komplex. Daran führt kein Weg vorbei! Die Syntax ist äußerst flexibel und kann auf zahlreiche Arten angepasst werden (vor allem Operatoren / Infix-Notation) - und das Typsystem bietet mehr verschiedene Funktionen als jede andere Sprache, die ich kenne.
Die Dinge sind also nicht so einfach wie zB in Haskell: Typeclasses, um sie alle abzudecken.
Während Scala versucht, funktionale Programmierung, OO, prozedurale Programmierung und Java-Bibliotheken sowie eigene Ideen zusammenzustellen, entstehen schließlich viele Konzepte , die irgendwie "in die gleiche Richtung" zu gehen scheinen:
Die Wahl zwischen ihnen scheint zunächst schwierig zu sein, und man könnte sich leicht fragen, ob man für ein Problem die richtige Lösung gefunden hat . Es ist sogar leicht möglich, durch Missbrauch von implicit
s hackiges Zeug zu produzieren .
Aber das Interessante ist: Scala funktioniert. Es ist manchmal schwer zu verstehen, warum (insbesondere herauszufinden, durch welche impliziten Konvertierungen + Vererbung + ... ein Objekt Funktionalität hat X
), aber Sie müssen sich die meiste Zeit nicht darum kümmern.
Schreiben Sie Scala so einfach wie möglich und es wird funktionieren. Lassen Sie sich nicht von allem verwirren, was möglich ist, und verwenden Sie nur das, was Sie brauchen. Und wenn Sie etwas brauchen, können Sie sicher sein, dass Scala es irgendwie hat;)
Und je besser Sie werden, desto mehr können Sie Scala mit Operatoren, Impliziten, Monaden, Funky-Syntax anpassen ... und schließlich etwas in der Nähe eines DSL finden, das Ihr Problem perfekt angeht.
Schließlich haben Sie immer die Möglichkeit, Scala als viel besseres Java mit einer saubereren, einfacheren Syntax, Typinferenz und einigen funktionalen Merkmalen zu verwenden.
Es ist eine ausgezeichnete Sprache, die in vielerlei Hinsicht einfacher ist als Java.
Die meisten Leute werden es nicht mögen, ob Java-Programmierer oder nicht, aus den gleichen Gründen, wie die meisten Leute, ob Programmierer oder nicht, nicht gerne neue Programmiersprachen lernen. Ich vermute, dass die meisten Leute, die eine Programmiersprache gelernt haben, das gar nicht gern gelernt haben.
Wenn Sie sich Sorgen machen, dass eine Sprache so kompliziert ist wie C ++, würde ich Clojure wie die Pest vermeiden. Das Wimmern, dass Scala komplizierter ist als Clojure, ist zum Ausweichargument für Menschen geworden, die eine oder beide Sprachen nicht kennen.
Clojure verfügt über Makros, dh Sie können die Syntax der Sprache beliebig ändern, sodass Sie nicht nur "unzählige verschiedene Arten, Dinge zu tun", sondern auch eine nahezu unbegrenzte Anzahl von Arten, Dinge zu tun. Und keine dieser neuen Syntaxen, die die Programmierer mit den Makros erstellen, wird irgendwo in der Sprachspezifikation dokumentiert.
"Wir können jedoch die Verwendung von Makros vermeiden oder festlegen, welche Makros in unserem Code zulässig sind", sagen Sie. Herzlichen Glückwunsch, Sie müssen jetzt "künstlich begrenzen, welche Sprachfunktionen Sie verwenden werden und welche nicht", und genau das haben die plappernden Idioten, die Clojure of Scala verwenden, als Grund herangezogen, Scala zu meiden.
Ich mag die granulareren Typen der Scala-Bibliothek sehr. Anscheinend war die neue Sammlungsbibliothek gut durchdacht. Ich mag auch, wie es die Menge an Code reduziert, die für einfache Klassen erforderlich ist, und die funktionalen Konzepte, die es hinzufügt. Auch die Typinferenz ist sehr hilfreich. Es fühlt sich an wie Java ohne die Stützräder. Nach einer Weile mit C # fühlt sich Scala tatsächlich wie ein Konkurrent, wobei Java immer noch nützlich ist, aber zurückgelassen wird.
Als Java-Programmierer fand ich Scala zunächst interessant. Nachdem ich mich jedoch eine Weile damit beschäftigt hatte (und auf fast alle von anderen gelisteten Positiven / Negativen gestoßen war), fühlte ich mich sehr "meh" gegenüber. Die Sprachverbesserungen werden durch die geringere Verfügbarkeit von Toolsets ausgeglichen. Ich konnte mir einfach keinen entscheidenden Grund für einen Umstieg einfallen lassen. Es ist gut, aber nicht "besser genug", um einen Wechsel zu rechtfertigen. Hat auch diesen subjektiven Aufregungsfaktor nicht (wie Clojure scheint).