Gibt es eine Möglichkeit, Scala-Quellcode in Java-Quellcode zu übersetzen?

Beste Antwort

Um Ihre Frage zu beantworten, hängt es davon ab, was Sie unter „Java-Code“ verstehen. Scala-Code ist legaler Java-Code. Sie müssen lediglich die Datei scala.jar zum Pfad der Java-Klasse hinzufügen. scalac ist nur ein Wrapper um den Java-Befehl, der das richtige Hauptobjekt übergibt und den Klassenpfad richtig festlegt. (Rufen Sie $ vim `which scalac` auf, um dieses Skript anzuzeigen.)

Wenn Sie beispielsweise einen Mac mit dem Typesafe Scala-Stack verwenden, können Sie den in myFile.scala gefundenen Scala-Code mit dem Befehl kompilieren :

java -Dscala.home=/Applications/typesafe-stack/ -D.scala.usejavacp=true -cp .:/Applications/typesafe-stack/lib/scala-library.jar:/Applications/typesafe-stack/lib/scala-compiler.jar scala.tools.nsc.Main myFile.scala

Ich werde im Folgenden einige weitere Erklärungen geben, aber gerne Änderungen von Scala-Experten akzeptieren.

Nehmen wir das folgende einfache Scala-Objekt (das ich kompiliert, aber nicht getestet habe …)

class Adder(val x:Int){

def add(y:Int) = x+y

def applyFunction(f: Int=>Int) = f(x)

}

Es ist eine dumme Methode. Es nimmt ein int an und ermöglicht es Ihnen dann, ein anderes int hinzuzufügen oder eine Funktion anzuwenden, die auf diese Ganzzahl angewendet wird.

Wir rufen scalac auf und generieren die Klassendateien. Jetzt können wir den Java-Dissasembler javap aufrufen, um die tatsächlich generierten Felder und Klassenmethoden anzuzeigen.

$ javap Adder

öffentliche Klasse Adder erweitert java.lang.Object implementiert scala.ScalaObject {public int x (); public int add (int); public int applyFunction (scala.Function1); öffentlicher Addierer (int); }

Dies ist ein perfektes Java-Objekt, das explizit mit Java implementiert werden kann.

Jetzt müssen Sie vorsichtig sein, wenn Sie fortgeschrittenere Scala-Techniken wie Merkmale verwenden.

Sehen wir uns diesen Codeblock an.

abstract class Thing {

def method:Unit

}

trait OtherThing {

def method { println("Hello")}

}

object Main{

def main(args: Array[String]) = {

val A = new Thing with OtherThing

A.method

}

}

Sie haben Eine abstrakte Klasse, deren Methode in einem Merkmal implementiert ist, das zur Zeit der Objektdefinition eingemischt wird.

Wenn Sie dies kompilieren, sehen Sie viele weitere Klassen mit funky $ -Symbolen und dem Wort anon. Das interessanteste ist die Klasse, die in Main $$ anon $ 1.class gefunden wird.

Wenn wir javap Main $$ anon $ 1 aufrufen, sehen wir, dass wir generat haben eine neue Klasse

public final class Main$$anon$1 extends Thing implements OtherThing{

public void method();

public Main$$anon$1();

}

verwendet Java-Schnittstellen und Unterklassen, um diese Klasse richtig darzustellen.

Genial, oder?

Antwort

Nein. Scala ist eine großartige Programmiersprache auf dem Papier, aber sie wird nicht abheben. Sehen Sie sich die Entwicklung seiner Verwendung in der folgenden Grafik an:

Können Sie die hellblaue Linie sehen, die Scala darstellt? Nein? Nun, es repräsentiert ungefähr 2\% der Pull-Anfragen in Github (siehe mehr Statistiken hier ). Die Kurve ist nicht nur flach, sondern sogar leicht rückläufig gegenüber 2,3\% vor fünf Jahren. Dies trotz Spark , dem beliebtesten Scala-Projekt, das 2014 veröffentlicht wurde.

Also, nein, Scala gibt es auf keinen Fall Ich werde abheben, obwohl viele von uns dachten, als wir die Sprache zum ersten Mal verwendeten. Was könnte schiefgehen? Eine Sprache, die in der bewährten JVM funktioniert und die Flexibilität bietet, nur als „besseres Java“ oder „voll funktionsfähig“ verwendet zu werden, oder sogar andere Feinheiten wie Schauspieler oder Zukunftsaussichten schienen ein Glücksfall zu sein.

Es stellt sich heraus, dass die Dinge in der Praxis anders funktionieren. Scala ist eine weitere Sprache, die Sie unterstützen müssen, es sei denn, Sie können alles in Scala tun, was sehr unwahrscheinlich ist. Zumindest werden Sie Scala und Java kombinieren. Warum beschränken Sie sich also nicht einfach auf Java? Dies scheint der Hauptgrund zu sein, warum LinkedIn beschlossen hat, die Verwendung von Scala in seinem Stack einzustellen.

Aber es wird tatsächlich schlimmer, dass Scala aufgrund seines Designs und seiner Flexibilität ein Problem ist, das an sich aufrechtzuerhalten ist . Es ist wie in C ++, aber schlimmer. Zum Beispiel können Sie erfahrene Scala-Programmierer dazu bringen, mit einem voll funktionsfähigen Codierungsstil verrückt zu werden, um eine verrückte Menge an Informationen in eine Codezeile zu packen, die ein Neuling nicht versteht. Wenn Sie also eine Scala-Codebasis beibehalten möchten, müssen Sie ziemlich genau festlegen, wie sie verwendet werden soll. Und dann müssen Sie Entwickler einstellen, die Scala auf diese spezielle Weise codieren können und wollen. Viel Glück damit. Sogar Twitter, das Scala-Kraftpaket, sagte, dass sie Scala nicht als Programmiersprache wählen würden, wenn sie es „heute“ (oder 2015, um mehr zu sein) tun müssten Beton). Yammer zog aus ähnlichen Gründen auch von Scala nach Java.

Es stellt sich also heraus, dass Scala nicht nur nicht abhebt, sondern in Wirklichkeit wahrscheinlich auf dem Weg nach unten ist, was nur durch die Popularität von Spark aufrechterhalten wird. Eigentlich ist Scala wirklich gut für Daten, daher macht die Wahl Sinn. Es würde mich jedoch nicht wundern, wenn die Leute im Laufe der Zeit Python als Standard-Spark-Sprache verwenden würden, wenn man bedenkt, wie beliebt es unter Data Scientists wird. P. >

Update:

Für diejenigen, die behaupten, dass Github keine gute Darstellung der Popularität der Sprache ist, hier ein paar mehr: Scala erscheint nicht einmal in Tiobes Top 20 , laut PyPL , basierend auf Google-Suchanfragen, seine Popularität beträgt 1,2\%, obwohl sie einen leichten Anstieg messen. Viele andere Indizes finden Sie hier . Ich glaube nicht, dass irgendetwas etwas zeigt, das der Sprache „Abheben“ nahe kommt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.