# Fragen zu Scala



## Empire Phoenix (14. Sep 2009)

Nachdem im Dinosurier Thema bereits öfters Scala erwähnt worden war, habe ich mcih jetzt entschieden etwas mehr darüber erfahren zu wollen.

Folgende fragen sind die interessanten:

Ist Scala eine funktionale Sprache?
Benutzt Scala Threads oder Prozesse?
Wie wird in Scala Communication zwischen Prozessen/Threads behandelt?
Wie sind die Io Systeme integreit (von wegen funktional)?
Kann ich einen kurzen beispielcode für die Mischung von Java und Scala haben? (nichts besonderes, nur das man mal nen Besipiel sieht)


----------



## Landei (14. Sep 2009)

Empire Phoenix hat gesagt.:


> Nachdem im Dinosurier Thema bereits öfters Scala erwähnt worden war, habe ich mcih jetzt entschieden etwas mehr darüber erfahren zu wollen.
> 
> Folgende fragen sind die interessanten:
> 
> Ist Scala eine funktionale Sprache?


Auch. Scala ist eine Mischung aus OO und funktional (z.B. ist jede Funktion auch ein Objekt). Man kann es deshalb sowohl als "besseres Java" als auch als "einfacheres Haskell" verwenden. Ideal ist natürlich eine ausgewogene Mischung, wo sich beide Konzepte ergänzen.



> Benutzt Scala Threads oder Prozesse?


In Scala stehen Threads zur Verfügung, allerdings ist es üblicher, Aktoren zu verwenden (ein Konzept, das aus der funktionalen Sprache Erlang stammt), die eine höhere Abstraktion bieten und besser skalieren (z.B. können sich mehrere Aktoren einen Thread teilen).



> Wie wird in Scala Communication zwischen Prozessen/Threads behandelt?


Wie in Java auch. Aber wie gesagt werden Aktoren bevorzugt, die immutable Messages austauschen.



> Wie sind die Io Systeme integreit (von wegen funktional)?


Kein Monaden-Kram wie in Haskell, sondern einfach Java-Klassen ein bisschen hübscher verpackt. Scala ist keine "rein" funktionale Sprache, Seiteneffekte sind erlaubt.
Die XML-Verarbeitung wird dir gefallen: XML-Literale sind im Code erlaubt, darauf sind auch XPath-ähnliche Operationen definiert.



> Kann ich einen kurzen beispielcode für die Mischung von Java und Scala haben? (nichts besonderes, nur das man mal nen Besipiel sieht)


Du kannst (mit minimalen syntaktischen Unterschieden) einfach Java-Klassen und Methoden aufrufen, also new java.util.Date() oder System.out.println("Hi!") würde einfach so funktionieren.

Ich habe in meinem Blog ein paar Seiten zum Scala-Lernen aufgezählt. Wenn du gern selbst rumprobierst, ist besonders Simply Scala zu empfehlen.

Viel Spaß beim Ausprobieren!


----------



## ice-breaker (14. Sep 2009)

Landei hat gesagt.:


> In Scala stehen Threads zur Verfügung, allerdings ist es üblicher, Aktoren zu verwenden (ein Konzept, das aus der funktionalen Sprache Erlang stammt), die eine höhere Abstraktion bieten und besser skalieren (z.B. können sich mehrere Aktoren einen Thread teilen).


wie funktioniert das, dass sich mehrere Aktoren einen Thread teilen? ???:L
Laufen die Aktionen der Akteure nacheinander? Also so ThreadPool mäßig oder wie funktioniert das?
Du hast mein Interesse geweckt


----------



## Landei (14. Sep 2009)

Ich bin nicht der Aktoren-Experte, und habe selbst noch keine "ernsthaft" eingesetzt. Im Hintergrund wird wohl soetwas wie ein Threadpool rumdödeln, und man hat wohl auch ein gewissen Einfluss darauf, ob jeder Actor seinen eigenen Thread bekommt oder sich mehrere einen teilen. Ich habe nur gehört, dass die Implementierung recht robust ist, und durchaus zehntausende Aktoren in einem System koexistieren können. Größtes Plus ist, dass nichts synchronisiert werden muss (zumindest wenn man sich an den Kontrakt hält, dass Messages unveränderlich sein sollen).

Aktor-Code sieht oft recht elegant aus, und von Threads ist weit und breit nichts zu sehen: pingpong.scala | The Scala Programming Language
Hier eine kurze Einführung: Scala Actors: A Short Tutorial | The Scala Programming Language


----------



## Gelöschtes Mitglied 6946 (14. Sep 2009)

Ich stell einfach mal frecherweise 'ne eigene Frage hier rein. Nämlich: Unter welchen Bedingungen kann ich Scala innerhalb von Java aufrufen? Also kann ich per Scala einfach jars erzeugen, die ich unter Java verwenden kann und falls ja, gibt es Einschränkungen in irgendeiner Art und Weise?


----------



## bygones (14. Sep 2009)

ex'ratt hat gesagt.:


> Ich stell einfach mal frecherweise 'ne eigene Frage hier rein. Nämlich: Unter welchen Bedingungen kann ich Scala innerhalb von Java aufrufen? Also kann ich per Scala einfach jars erzeugen, die ich unter Java verwenden kann und falls ja, gibt es Einschränkungen in irgendeiner Art und Weise?



Scala laeuft auf der VM, also ja... auf dem Zielsystem muss Scala dennnoch bekannt sein


----------



## Landei (14. Sep 2009)

Wenn die verwendeten Scala-Standardbibliotheken vorliegen, kann man Scala von Java aus aufrufen, aber das funktioniert aus verschiedenen Gründen nicht so gut wie die andere Richtung:
- Scala erlaubt Klassen- oder Methodennamen wie + oder ::, für die man die richtige "Übersetzung" kennen muss
- Scala-Objektnamen enden (im class-file) mit einem zusätzlichen $, um Namens-Clashs zu verhindern
- Scala-Varargs können (soweit ich weiß) nicht als Varargs von Java aufgerufen werden
- Scala-Felder sind (soweit ich weiß) intern als Methoden realisiert und so aufgerufen werden
- gewisse Konstrukte wie Manifests usw. werden wahrscheinlich nicht funktionieren
...

Solange man Kontrolle über den Scala-Code hat, ist das allerdings weniger wild, weil man dann die Klassen "java-freundlich" gestalten kann (es gibt z.B. eine Annotation, die dir automatisch getter und setter erzeugt usw.). Im Endeffekt bleibt immer noch der Decompiler, aus dessen Ergebnis man meist gut erkennen kann, was man aufzurufen hat.

Ich habe das alles noch nicht selbst ausprobiert, sondern hauptsächlich aus Blogs, PDFs und den Diskussionen auf Nabble - Scala Programming Language forum aufgeschnappt. Prinzipiell sind alle Probleme lösbar, und in der Vergangenheit sind auch schon Änderungen durchgeführt worden, um diese Aufrufrichtung zu erleichtern (wobei der "normale" Weg immer sein wird, Java aus Scala aufzurufen).

Für kleinere Projekte würde ich immer empfehlen, komplett auf Scala umzusteigen, denn der Aufwand ist etwa genausogroß, nur zukunftssicherer (die interne Repräsentation kann sich eben hin und wieder mal ändern).


----------



## Empire Phoenix (15. Sep 2009)

Zu den Aktoren nochmals, dereren unabhängigkeit von synchronize ist aber nur gegeben wenn man reines Scala hat oder?

Ich meine wenn die auf einzelne Java Objecte zugreifen muss das dann ja auch wieder synchronized werden, oder gibt es dafür eine andere Lösung?


----------



## Landei (15. Sep 2009)

Aktoren sollen nur unveränderliche Daten als Messages senden, und dann ist Synchronisierung nicht nötig - das ist ja gerade der Witz an der Sache. Wenn du dich an diese Konvention hälst (egal ob mit einem Scala- oder Java-Objekt als Message) kann nichts passieren, wenn nicht - selber Schuld.

Leider gibt es in Scala bisher keinen Weg, Unveränderlichkeit zu garantieren (Fan und D arbeiten wohl an sowas), da muss man für die Freiheit, die man hat, mit ein wenig Disziplin "bezahlen"...


----------



## Empire Phoenix (15. Sep 2009)

Kurz für Webserver würde sich Sala zb gut eignen (Anfrage,Verarbeitung statischer daten(aka SQL rückgaben ändern sich nicht),Antwort))

Für zb ein Spiel wäre es aber absolut ungeeignet, wenn man davona usgeht das es zb ein World object gibt, weil sich dieses zwangsläufig ändern muss?


----------



## Landei (15. Sep 2009)

Für eine Webanwendung eignet sich Scala prächtig (es gibt z.B. das Lift-Framework für Webanwendungen)

Für Spiele sehe ich auch kein Problem. Das "World"-Objekt darf sich natürlich verändern, man darf es halt nur nicht als Message von einem Aktor an einen anderen senden - groooßer Unterschied. Wenn du als Aktoren das "World"-Objekt, eine Bergziege und einen In-Game-Chat hast, dann dürfen diese drei sich nur "Briefe" (unveränderliche Objekte) schicken und keine "Briefbomben" (veränderliche Objekte), und schon sind alle glücklich.

Nochmal: Aktoren selbst können veränderlich sein so viel sie wollen, Hauptsache sie behalten ihre Veränderlichkeit schön für sich, indem sie nur unveränderliche Botschaften versenden und empfangen. Die Probleme mit Threads entstehen ja auch nicht durch veränderliche Daten "an sich", sonder nur durch die veränderliche Daten, auf die von mehreren Threads zugegriffen wird.


----------



## 0x7F800000 (15. Sep 2009)

Ja, aber auf OpenGL kann man mit Scala auch höchstens genauso "gut" zugreifen, wie von Java aus ;(
naja, wen juckt's^^


----------

