Er der en måde at oversætte Scala-kildekode til Java-kildekode?

Bedste svar

For at besvare dit spørgsmål afhænger det af, hvad du mener med “java-kode”. Scala-kode er lovlig java-kode, du skal bare tilføje scala.jar til Java-klassestien. scalac er bare en indpakning omkring java-kommandoen, der sender det korrekte hovedobjekt og indstiller klassestien korrekt. (ring $ vim `hvilken skalac` for at se dette script).

Hvis du f.eks. er på en Mac med Typesafe Scala-stakken, kan du faktisk kompilere Scala-kode, der findes i myFile.scala ved hjælp af kommandoen :

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

Jeg vil give nogle flere forklaringer nedenfor, men vil med glæde acceptere redigeringer fra Scala-eksperter derude.

Lad os tage følgende enkle scala-objekt (som jeg kompilerede, men ikke testede …)

class Adder(val x:Int){

def add(y:Int) = x+y

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

}

Det er en dum metode. Det tager et int, og giver dig derefter mulighed for at tilføje et andet int til det eller anvende en funktion, der til dette heltal.

Vi kalder scalac og genererer klassefilerne. Nu kan vi kalde java dissasembler, javap for at se de faktiske genererede felter og klassemetoder.

$ javap Adder

public class Adder udvider java.lang.Object implementerer scala.ScalaObject {public int x (); offentlig int tilføj (int); public int applyFunction (scala.Function1); offentlig Adder (int); }

Dette er et helt lykkeligt Java-objekt, der kunne implementeres eksplicit ved hjælp af Java.

Nu skal du være forsigtig, når du bruger mere avancerede Scala-teknikker, såsom træk.

Lad os se på denne kodeblok

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

}

}

Du har en abstrakt klasse, der har sin metode implementeret i et træk, der er blandet ind på objektdefinitionstidspunktet.

Når du kompilerer dette, vil du se mange flere klasser med funky $ symboler og ordet anon. Det mest interessante er klassen, der findes i Main $$ anon $ 1.class.

Opkald til javap Main $$ anon $ 1 ser vi, at vi har generat redigerede en ny klasse

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

public void method();

public Main$$anon$1();

}

der bruger java-grænseflader og underklasse til korrekt at repræsentere denne klasse.

Awesome, right?

Svar

Nej Scala er et godt programmeringssprog på papir, men det vil ikke tage fart. Se på udviklingen af ​​dets anvendelse i nedenstående graf:

Kan du se den lyseblå linje, der repræsenterer Scala? Ingen? Nå repræsenterer det omkring 2\% af pull-anmodningerne i Github (se mere statistik her ). Kurven er ikke kun flad, den er faktisk lidt lavere end 2,3\% for fem år siden. Det er på trods af Spark , det mest populære Scala-projekt, der blev frigivet i 2014.

Så nej, der er ingen måde Scala er vil tage afsted på trods af hvad mange af os troede første gang vi brugte sproget. Hvad kan gå galt? Et sprog, der fungerer i den velafprøvede JVM, og som giver fleksibiliteten til at blive brugt som “en bedre java” eller gå “fuldt funktionsdygtigt”, eller endda andre finesser som skuespillere eller futures virkede som en gave.

Det viser sig, at ting fungerer anderledes i praksis. Scala er endnu et andet sprog, som du bliver nødt til at støtte, medmindre du kan gøre alt i Scala, hvilket er meget usandsynligt. I det mindste vil du kombinere Scala og Java, så hvorfor ikke bare begrænse dig til Java? Det ser ud til at være hovedårsagen til, at LinkedIn besluttede at udfase deres brug af Scala i deres stack.

Men det bliver faktisk værre, Scala på grund af dets design og fleksibilitet er en smerte at opretholde i sig selv . Det er som C ++, men værre. For eksempel kan du få ekspert Scala-programmører til at gå nødder med fuldt funktionel kodningsstil til at pakke en skør mængde information i en kodelinje, som en nybegynder ikke forstår. Så hvis du vil opretholde en Scala-kodebase, skal du være temmelig streng med hensyn til “hvordan” du bruger den. Og så skal du gå ud og ansætte udviklere, der kan og er villige til at kode Scala på den særlige måde. Held og lykke med det. Selv Twitter, Scala-kraftværket, sagde, at de ikke ville vælge Scala som deres programmeringssprog, hvis de skulle gøre det “i dag” (eller i 2015 for at være mere beton). Yammer flyttede også væk fra Scala til Java af lignende grunde.

Så det viser sig, at Scala ikke kun tager fart, men det er i virkeligheden sandsynligvis på vej ned, kun vedligeholdt af Sparks popularitet. Faktisk er Scala virkelig god til data, så valget giver mening. Imidlertid ville jeg ikke blive overrasket, hvis folk over tid ender med at bruge Python som standard Spark-sprog i betragtning af hvor populært det bliver blandt dataforskere.

Opdatering:

For dem, der hævder, at Github ikke er en god repræsentation af sprogets popularitet, her er et par mere: Scala vises ikke engang i Tiobes top 20 ifølge PyPL , baseret på Google søger, dens popularitet er 1,2\%, selvom de måler en lille stigning. Du kan finde mange andre indeks her . Jeg tror ikke, nogen viser noget, der er tæt på sproget “tager fart”.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *